/*!
* surveyjs - Survey JavaScript library v1.8.12
* Copyright (c) 2015-2020 Devsoft Baltic OÜ - http://surveyjs.io/
* License: MIT (http://www.opensource.org/licenses/mit-license.php)
*/
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("react"));
else if(typeof define === 'function' && define.amd)
define("Survey", ["react"], factory);
else if(typeof exports === 'object')
exports["Survey"] = factory(require("react"));
else
root["Survey"] = factory(root["React"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_3__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // identity function for calling harmony imports with the correct context
/******/ __webpack_require__.i = function(value) { return value; };
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 142);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __assign; });
/* harmony export (immutable) */ __webpack_exports__["b"] = __extends;
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __decorate; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __spreadArrays; });
var __assign = Object["assign"] ||
function (target) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p))
target[p] = s[p];
}
return target;
};
function __extends(thisClass, baseClass) {
for (var p in baseClass)
if (baseClass.hasOwnProperty(p))
thisClass[p] = baseClass[p];
function __() {
this.constructor = thisClass;
}
thisClass.prototype =
baseClass === null
? Object.create(baseClass)
: ((__.prototype = baseClass.prototype), new __());
}
var __decorate = function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3
? target
: desc === null
? (desc = Object.getOwnPropertyDescriptor(target, key))
: desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if ((d = decorators[i]))
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __spreadArrays = function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++)
s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__localization_english__ = __webpack_require__(46);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return surveyLocalization; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return surveyStrings; });
var surveyLocalization = {
currentLocaleValue: "",
defaultLocaleValue: "en",
locales: {},
localeNames: {},
supportedLocales: [],
get currentLocale() {
return this.currentLocaleValue === this.defaultLocaleValue
? ""
: this.currentLocaleValue;
},
set currentLocale(val) {
if (val === "cz")
val = "cs";
this.currentLocaleValue = val;
},
get defaultLocale() {
return this.defaultLocaleValue;
},
set defaultLocale(val) {
if (val === "cz")
val = "cs";
this.defaultLocaleValue = val;
},
getLocaleStrings: function (loc) {
return this.locales[loc];
},
getCurrentStrings: function () {
var loc = this.currentLocale
? this.locales[this.currentLocale]
: this.locales[this.defaultLocale];
if (!loc)
loc = this.locales[this.defaultLocale];
return loc;
},
getString: function (strName) {
var loc = this.getCurrentStrings();
if (!loc[strName])
loc = this.locales[this.defaultLocale];
var result = loc[strName];
if (result === undefined) {
result = this.locales["en"][strName];
}
return result;
},
getLocales: function () {
var res = [];
res.push("");
if (this.supportedLocales && this.supportedLocales.length > 0) {
for (var i = 0; i < this.supportedLocales.length; i++) {
res.push(this.supportedLocales[i]);
}
}
else {
for (var key in this.locales) {
res.push(key);
}
}
res.sort();
return res;
},
};
var surveyStrings = __WEBPACK_IMPORTED_MODULE_0__localization_english__["a" /* englishStrings */];
surveyLocalization.locales["en"] = __WEBPACK_IMPORTED_MODULE_0__localization_english__["a" /* englishStrings */];
surveyLocalization.localeNames["en"] = "english";
/***/ }),
/* 2 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony export (immutable) */ __webpack_exports__["d"] = property;
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return JsonObjectProperty; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return CustomPropertiesCollection; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return JsonMetadataClass; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return JsonMetadata; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return JsonError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "m", function() { return JsonUnknownPropertyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return JsonMissingTypeErrorBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return JsonMissingTypeError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return JsonIncorrectTypeError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return JsonRequiredPropertyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return JsonObject; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Serializer; });
function ensureLocString(target, options, key) {
var locString = target.getLocalizableString(key);
if (!locString) {
locString = target.createLocalizableString(key, target, true);
if (typeof options.localizable === "object" && typeof options.localizable.onGetTextCallback === "function") {
locString.onGetTextCallback = options.localizable.onGetTextCallback;
}
}
}
function property(options) {
return function (target, key) {
if (!options || !options.localizable) {
Object.defineProperty(target, key, {
get: function () { return this.getPropertyValue(key, !!options ? options.defaultValue || this[options.defaultSource] : undefined); },
set: function (val) { this.setPropertyValue(key, val); }
});
}
else {
Object.defineProperty(target, key, {
get: function () { ensureLocString(this, options, key); return this.getLocalizableStringText(key, options.defaultValue || this[options.defaultSource]); },
set: function (val) { ensureLocString(this, options, key); this.setLocalizableStringText(key, val); }
});
Object.defineProperty(target, options.localizable === true ? "loc" + key.charAt(0).toUpperCase() + key.slice(1) : options.localizable.name, {
get: function () {
ensureLocString(this, options, key);
return this.getLocalizableString(key);
}
});
}
};
}
var JsonObjectProperty = /** @class */ (function () {
function JsonObjectProperty(classInfo, name, isRequired) {
if (isRequired === void 0) { isRequired = false; }
this.name = name;
this.typeValue = null;
this.choicesValue = null;
this.baseValue = null;
this.isRequiredValue = false;
this.isUniqueValue = false;
this.readOnlyValue = null;
this.visibleValue = null;
this.isLocalizableValue = null;
this.choicesfunc = null;
this.dependedProperties = null;
this.isSerializable = true;
this.isLightSerializable = true;
this.isCustom = false;
this.isDynamicChoices = false; //TODO obsolete, use dependsOn attribute
this.isBindable = false;
this.className = null;
this.alternativeName = null;
this.classNamePart = null;
this.baseClassName = null;
this.defaultValueValue = null;
this.serializationProperty = null;
this.displayName = null;
this.category = "";
this.categoryIndex = -1;
this.visibleIndex = -1;
this.nextToProperty = null;
this.showMode = null;
this.maxLength = -1;
this.layout = null;
this.onGetValue = null;
this.onSetValue = null;
this.visibleIf = null;
this.isArray = false;
this.classInfoValue = classInfo;
this.isRequiredValue = isRequired;
}
Object.defineProperty(JsonObjectProperty.prototype, "classInfo", {
get: function () {
return this.classInfoValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "type", {
get: function () {
return this.typeValue ? this.typeValue : "string";
},
set: function (value) {
if (value === "itemvalues")
value = "itemvalue[]";
this.typeValue = value;
if (this.typeValue.indexOf("[]") === this.typeValue.length - 2) {
this.isArray = true;
this.className = this.typeValue.substr(0, this.typeValue.length - 2);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "isRequired", {
get: function () {
return this.isRequiredValue;
},
set: function (val) {
this.isRequiredValue = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "isUnique", {
get: function () {
return this.isUniqueValue;
},
set: function (val) {
this.isUniqueValue = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "hasToUseGetValue", {
get: function () {
return this.onGetValue || this.serializationProperty;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "defaultValue", {
get: function () {
var result = this.defaultValueValue;
if (!!JsonObjectProperty.getItemValuesDefaultValue &&
JsonObject.metaData.isDescendantOf(this.className, "itemvalue")) {
result = JsonObjectProperty.getItemValuesDefaultValue(this.defaultValueValue || []);
}
return result;
},
set: function (newValue) {
this.defaultValueValue = newValue;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.isDefaultValue = function (value) {
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(this.defaultValue))
return this.defaultValue == value;
return ((value === false && (this.type == "boolean" || this.type == "switch")) ||
value === "" ||
__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(value));
};
JsonObjectProperty.prototype.getValue = function (obj) {
if (this.onGetValue)
return this.onGetValue(obj);
if (this.serializationProperty && !!obj[this.serializationProperty])
return obj[this.serializationProperty].getJson();
return obj[this.name];
};
JsonObjectProperty.prototype.getPropertyValue = function (obj) {
if (this.isLocalizable) {
return !!obj[this.serializationProperty]
? obj[this.serializationProperty].text
: null;
}
return this.getValue(obj);
};
Object.defineProperty(JsonObjectProperty.prototype, "hasToUseSetValue", {
get: function () {
return this.onSetValue || this.serializationProperty;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.setValue = function (obj, value, jsonConv) {
if (this.onSetValue) {
this.onSetValue(obj, value, jsonConv);
}
else {
if (this.serializationProperty && !!obj[this.serializationProperty])
obj[this.serializationProperty].setJson(value);
else {
if (value && typeof value === "string") {
if (this.type == "number") {
value = parseInt(value);
}
if (this.type == "boolean" || this.type == "switch") {
value = value.toLowerCase() === "true";
}
}
obj[this.name] = value;
}
}
};
JsonObjectProperty.prototype.getObjType = function (objType) {
if (!this.classNamePart)
return objType;
return objType.replace(this.classNamePart, "");
};
JsonObjectProperty.prototype.getClassName = function (className) {
if (className)
className = className.toLowerCase();
return this.classNamePart && className.indexOf(this.classNamePart) < 0
? className + this.classNamePart
: className;
};
Object.defineProperty(JsonObjectProperty.prototype, "choices", {
/**
* Depricated, please use getChoices
*/
get: function () {
return this.getChoices(null);
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "hasChoices", {
get: function () {
return !!this.choicesValue || !!this.choicesfunc;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.getChoices = function (obj, choicesCallback) {
if (choicesCallback === void 0) { choicesCallback = null; }
if (this.choicesValue != null)
return this.choicesValue;
if (this.choicesfunc != null)
return this.choicesfunc(obj, choicesCallback);
return null;
};
JsonObjectProperty.prototype.setChoices = function (value, valueFunc) {
if (valueFunc === void 0) { valueFunc = null; }
this.choicesValue = value;
this.choicesfunc = valueFunc;
};
JsonObjectProperty.prototype.getBaseValue = function () {
if (!this.baseValue)
return "";
if (typeof this.baseValue == "function")
return this.baseValue();
return this.baseValue;
};
JsonObjectProperty.prototype.setBaseValue = function (val) {
this.baseValue = val;
};
Object.defineProperty(JsonObjectProperty.prototype, "readOnly", {
get: function () {
return this.readOnlyValue != null ? this.readOnlyValue : false;
},
set: function (val) {
this.readOnlyValue = val;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.isVisible = function (layout, obj) {
if (obj === void 0) { obj = null; }
var isLayout = !this.layout || this.layout == layout;
if (!this.visible || !isLayout)
return false;
if (!!this.visibleIf && !!obj)
return this.visibleIf(obj);
return true;
};
Object.defineProperty(JsonObjectProperty.prototype, "visible", {
get: function () {
return this.visibleValue != null ? this.visibleValue : true;
},
set: function (val) {
this.visibleValue = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "isLocalizable", {
get: function () {
return this.isLocalizableValue != null ? this.isLocalizableValue : false;
},
set: function (val) {
this.isLocalizableValue = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "dataList", {
get: function () {
return Array.isArray(this.dataListValue) ? this.dataListValue : [];
},
set: function (val) {
this.dataListValue = val;
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.mergeWith = function (prop) {
var valuesNames = JsonObjectProperty.mergableValues;
for (var i = 0; i < valuesNames.length; i++) {
this.mergeValue(prop, valuesNames[i]);
}
};
JsonObjectProperty.prototype.addDependedProperty = function (name) {
if (!this.dependedProperties) {
this.dependedProperties = [];
}
if (this.dependedProperties.indexOf(name) < 0) {
this.dependedProperties.push(name);
}
};
JsonObjectProperty.prototype.getDependedProperties = function () {
return !!this.dependedProperties ? this.dependedProperties : [];
};
JsonObjectProperty.prototype.mergeValue = function (prop, valueName) {
if (this[valueName] == null && prop[valueName] != null) {
this[valueName] = prop[valueName];
}
};
JsonObjectProperty.mergableValues = [
"typeValue",
"choicesValue",
"baseValue",
"readOnlyValue",
"visibleValue",
"isSerializable",
"isLightSerializable",
"isCustom",
"isBindable",
"isUnique",
"isDynamicChoices",
"isLocalizableValue",
"className",
"alternativeName",
"layout",
"classNamePart",
"baseClassName",
"defaultValue",
"serializationProperty",
"onGetValue",
"onSetValue",
"displayName",
"category",
"categoryIndex",
"visibleIndex",
"nextToProperty",
"showMode",
"dependedProperties",
"visibleIf",
"onPropertyEditorUpdate",
"maxLength",
"maxValue",
"minValue",
"dataListValue",
];
return JsonObjectProperty;
}());
var CustomPropertiesCollection = /** @class */ (function () {
function CustomPropertiesCollection() {
}
CustomPropertiesCollection.addProperty = function (className, property) {
className = className.toLowerCase();
var props = CustomPropertiesCollection.properties;
if (!props[className]) {
props[className] = [];
}
props[className].push(property);
};
CustomPropertiesCollection.removeProperty = function (className, propertyName) {
className = className.toLowerCase();
var props = CustomPropertiesCollection.properties;
if (!props[className])
return;
var properties = props[className];
for (var i = 0; i < properties.length; i++) {
if (properties[i].name == propertyName) {
props[className].splice(i, 1);
break;
}
}
};
CustomPropertiesCollection.addClass = function (className, parentClassName) {
className = className.toLowerCase();
if (parentClassName) {
parentClassName = parentClassName.toLowerCase();
}
CustomPropertiesCollection.parentClasses[className] = parentClassName;
};
CustomPropertiesCollection.getProperties = function (className) {
className = className.toLowerCase();
var res = [];
var props = CustomPropertiesCollection.properties;
while (className) {
var properties = props[className];
if (properties) {
for (var i = 0; i < properties.length; i++) {
res.push(properties[i]);
}
}
className = CustomPropertiesCollection.parentClasses[className];
}
return res;
};
CustomPropertiesCollection.createProperties = function (obj) {
if (!obj || !obj.getType)
return;
CustomPropertiesCollection.createPropertiesCore(obj, obj.getType());
};
CustomPropertiesCollection.createPropertiesCore = function (obj, className) {
var props = CustomPropertiesCollection.properties;
if (props[className]) {
CustomPropertiesCollection.createPropertiesInObj(obj, props[className]);
}
var parentClass = CustomPropertiesCollection.parentClasses[className];
if (parentClass) {
CustomPropertiesCollection.createPropertiesCore(obj, parentClass);
}
};
CustomPropertiesCollection.createPropertiesInObj = function (obj, properties) {
for (var i = 0; i < properties.length; i++) {
CustomPropertiesCollection.createPropertyInObj(obj, properties[i]);
}
};
CustomPropertiesCollection.createPropertyInObj = function (obj, prop) {
if (obj[prop.name] || obj.hasOwnProperty(prop.name))
return;
if (prop.isLocalizable &&
prop.serializationProperty &&
!obj[prop.serializationProperty] &&
obj.createCustomLocalizableObj) {
obj.createCustomLocalizableObj(prop.name);
var locDesc = {
get: function () {
return obj.getLocalizableString(prop.name);
},
};
Object.defineProperty(obj, prop.serializationProperty, locDesc);
var desc = {
get: function () {
return obj.getLocalizableStringText(prop.name, prop.defaultValue);
},
set: function (v) {
obj.setLocalizableStringText(prop.name, v);
},
};
Object.defineProperty(obj, prop.name, desc);
}
else {
var defaultValue = prop.defaultValue;
var isArrayProp = false;
if (typeof obj.createNewArray === "function") {
if (JsonObject.metaData.isDescendantOf(prop.className, "itemvalue")) {
obj.createNewArray(prop.name, function (item) {
item.locOwner = obj;
item.ownerPropertyName = prop.name;
});
isArrayProp = true;
}
//It is a simple array property
if (prop.type === "multiplevalues") {
obj.createNewArray(prop.name);
isArrayProp = true;
}
if (isArrayProp) {
if (Array.isArray(defaultValue)) {
obj.setPropertyValue(prop.name, defaultValue);
}
defaultValue = null;
}
}
if (!!obj.getPropertyValue && !!obj.setPropertyValue) {
var desc = {
get: function () {
if (!!prop.onGetValue) {
return prop.onGetValue(obj);
}
return obj.getPropertyValue(prop.name, defaultValue);
},
set: function (v) {
if (!!prop.onSetValue) {
prop.onSetValue(obj, v, null);
}
else {
obj.setPropertyValue(prop.name, v);
}
},
};
Object.defineProperty(obj, prop.name, desc);
}
}
};
CustomPropertiesCollection.properties = {};
CustomPropertiesCollection.parentClasses = {};
return CustomPropertiesCollection;
}());
var JsonMetadataClass = /** @class */ (function () {
function JsonMetadataClass(name, properties, creator, parentName) {
if (creator === void 0) { creator = null; }
if (parentName === void 0) { parentName = null; }
this.name = name;
this.creator = creator;
this.parentName = parentName;
this.properties = null;
name = name.toLowerCase();
if (this.parentName) {
this.parentName = this.parentName.toLowerCase();
CustomPropertiesCollection.addClass(name, this.parentName);
}
this.properties = new Array();
for (var i = 0; i < properties.length; i++) {
var prop = this.createProperty(properties[i]);
if (prop) {
this.properties.push(prop);
}
}
}
JsonMetadataClass.prototype.find = function (name) {
for (var i = 0; i < this.properties.length; i++) {
if (this.properties[i].name == name)
return this.properties[i];
}
return null;
};
JsonMetadataClass.prototype.createProperty = function (propInfo) {
var propertyName = typeof propInfo === "string" ? propInfo : propInfo.name;
if (!propertyName)
return;
var propertyType = null;
var typeIndex = propertyName.indexOf(JsonMetadataClass.typeSymbol);
if (typeIndex > -1) {
propertyType = propertyName.substring(typeIndex + 1);
propertyName = propertyName.substring(0, typeIndex);
}
var isRequired = this.getIsPropertyNameRequired(propertyName) || !!propInfo.isRequired;
propertyName = this.getPropertyName(propertyName);
var prop = new JsonObjectProperty(this, propertyName, isRequired);
if (propertyType) {
prop.type = propertyType;
}
if (typeof propInfo === "object") {
if (propInfo.type) {
prop.type = propInfo.type;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.default)) {
prop.defaultValue = propInfo.default;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.isSerializable)) {
prop.isSerializable = propInfo.isSerializable;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.isLightSerializable)) {
prop.isLightSerializable = propInfo.isLightSerializable;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.maxLength)) {
prop.maxLength = propInfo.maxLength;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.displayName)) {
prop.displayName = propInfo.displayName;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.category)) {
prop.category = propInfo.category;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.categoryIndex)) {
prop.categoryIndex = propInfo.categoryIndex;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.nextToProperty)) {
prop.nextToProperty = propInfo.nextToProperty;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.visibleIndex)) {
prop.visibleIndex = propInfo.visibleIndex;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.showMode)) {
prop.showMode = propInfo.showMode;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.maxValue)) {
prop.maxValue = propInfo.maxValue;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.minValue)) {
prop.minValue = propInfo.minValue;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.dataList)) {
prop.dataList = propInfo.dataList;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.isDynamicChoices)) {
prop.isDynamicChoices = propInfo.isDynamicChoices;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.isBindable)) {
prop.isBindable = propInfo.isBindable;
}
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(propInfo.isUnique)) {
prop.isUnique = propInfo.isUnique;
}
if (propInfo.visible === true || propInfo.visible === false) {
prop.visible = propInfo.visible;
}
if (!!propInfo.visibleIf) {
prop.visibleIf = propInfo.visibleIf;
}
if (!!propInfo.onPropertyEditorUpdate) {
prop.onPropertyEditorUpdate = propInfo.onPropertyEditorUpdate;
}
if (propInfo.readOnly === true) {
prop.readOnly = true;
}
if (propInfo.choices) {
var choicesFunc = typeof propInfo.choices === "function" ? propInfo.choices : null;
var choicesValue = typeof propInfo.choices !== "function" ? propInfo.choices : null;
prop.setChoices(choicesValue, choicesFunc);
}
if (!!propInfo.baseValue) {
prop.setBaseValue(propInfo.baseValue);
}
if (propInfo.onGetValue) {
prop.onGetValue = propInfo.onGetValue;
}
if (propInfo.onSetValue) {
prop.onSetValue = propInfo.onSetValue;
}
if (propInfo.isLocalizable) {
propInfo.serializationProperty = "loc" + prop.name;
}
if (propInfo.serializationProperty) {
prop.serializationProperty = propInfo.serializationProperty;
var s;
if (prop.serializationProperty &&
prop.serializationProperty.indexOf("loc") == 0) {
prop.isLocalizable = true;
}
}
if (propInfo.isLocalizable) {
prop.isLocalizable = propInfo.isLocalizable;
}
if (propInfo.className) {
prop.className = propInfo.className;
}
if (propInfo.baseClassName) {
prop.baseClassName = propInfo.baseClassName;
}
if (propInfo.classNamePart) {
prop.classNamePart = propInfo.classNamePart;
}
if (propInfo.alternativeName) {
prop.alternativeName = propInfo.alternativeName;
}
if (propInfo.layout) {
prop.layout = propInfo.layout;
}
if (propInfo.dependsOn) {
this.addDependsOnProperties(prop, propInfo.dependsOn);
}
}
return prop;
};
JsonMetadataClass.prototype.addDependsOnProperties = function (prop, dependsOn) {
if (Array.isArray(dependsOn)) {
for (var i = 0; i < dependsOn.length; i++) {
this.addDependsOnProperty(prop, dependsOn[i]);
}
}
else {
this.addDependsOnProperty(prop, dependsOn);
}
};
JsonMetadataClass.prototype.addDependsOnProperty = function (prop, dependsOn) {
var property = this.find(dependsOn);
if (!property) {
property = Serializer.findProperty(this.parentName, dependsOn);
}
if (!property)
return;
property.addDependedProperty(prop.name);
};
JsonMetadataClass.prototype.getIsPropertyNameRequired = function (propertyName) {
return (propertyName.length > 0 &&
propertyName[0] == JsonMetadataClass.requiredSymbol);
};
JsonMetadataClass.prototype.getPropertyName = function (propertyName) {
if (!this.getIsPropertyNameRequired(propertyName))
return propertyName;
propertyName = propertyName.slice(1);
return propertyName;
};
JsonMetadataClass.requiredSymbol = "!";
JsonMetadataClass.typeSymbol = ":";
return JsonMetadataClass;
}());
var JsonMetadata = /** @class */ (function () {
function JsonMetadata() {
this.classes = {};
this.alternativeNames = {};
this.childrenClasses = {};
this.classProperties = {};
this.classHashProperties = {};
}
JsonMetadata.prototype.addClass = function (name, properties, creator, parentName) {
if (creator === void 0) { creator = null; }
if (parentName === void 0) { parentName = null; }
name = name.toLowerCase();
var metaDataClass = new JsonMetadataClass(name, properties, creator, parentName);
this.classes[name] = metaDataClass;
if (parentName) {
parentName = parentName.toLowerCase();
var children = this.childrenClasses[parentName];
if (!children) {
this.childrenClasses[parentName] = [];
}
this.childrenClasses[parentName].push(metaDataClass);
}
return metaDataClass;
};
JsonMetadata.prototype.removeClass = function (name) {
var metaClass = this.findClass(name);
if (!metaClass)
return;
delete this.classes[metaClass.name];
if (!!metaClass.parentName) {
var index = this.childrenClasses[metaClass.parentName].indexOf(metaClass);
if (index > -1) {
this.childrenClasses[metaClass.parentName].splice(index, 1);
}
}
};
JsonMetadata.prototype.overrideClassCreatore = function (name, creator) {
this.overrideClassCreator(name, creator);
};
JsonMetadata.prototype.overrideClassCreator = function (name, creator) {
name = name.toLowerCase();
var metaDataClass = this.findClass(name);
if (metaDataClass) {
metaDataClass.creator = creator;
}
};
JsonMetadata.prototype.getProperties = function (className) {
var metaClass = this.findClass(className);
if (!metaClass)
return [];
var properties = this.classProperties[metaClass.name];
if (!!properties)
return properties;
this.fillPropertiesForClass(metaClass.name);
return this.classProperties[metaClass.name];
};
JsonMetadata.prototype.getHashProperties = function (className) {
var metaClass = this.findClass(className);
if (!metaClass)
return {};
var properties = this.classHashProperties[metaClass.name];
if (!!properties)
return properties;
this.fillPropertiesForClass(metaClass.name);
return this.classHashProperties[metaClass.name];
};
JsonMetadata.prototype.fillPropertiesForClass = function (className) {
var properties = new Array();
var hashProperties = {};
this.fillProperties(className, properties, hashProperties);
this.classProperties[className] = properties;
this.classHashProperties[className] = hashProperties;
};
JsonMetadata.prototype.getPropertiesByObj = function (obj) {
if (!obj || !obj.getType)
return [];
var res = {};
var props = this.getProperties(obj.getType());
for (var i = 0; i < props.length; i++) {
res[props[i].name] = props[i];
}
var dynamicProps = !!obj.getDynamicType
? this.getProperties(obj.getDynamicType())
: null;
if (dynamicProps && dynamicProps.length > 0) {
for (var i = 0; i < dynamicProps.length; i++) {
var dProp = dynamicProps[i];
if (!!res[dProp.name])
continue;
res[dProp.name] = dProp;
}
}
return Object.keys(res).map(function (key) { return res[key]; });
};
JsonMetadata.prototype.getDynamicPropertiesByObj = function (obj, dynamicType) {
if (dynamicType === void 0) { dynamicType = null; }
if (!obj || !obj.getType || (!obj.getDynamicType && !dynamicType))
return [];
var dType = !!dynamicType ? dynamicType : obj.getDynamicType();
if (!dType)
return [];
var dynamicProps = this.getProperties(dType);
if (!dynamicProps || dynamicProps.length == 0)
return [];
var hash = {};
var props = this.getProperties(obj.getType());
for (var i = 0; i < props.length; i++) {
hash[props[i].name] = props[i];
}
var res = [];
for (var i = 0; i < dynamicProps.length; i++) {
var dProp = dynamicProps[i];
if (!hash[dProp.name]) {
res.push(dProp);
}
}
return res;
};
JsonMetadata.prototype.findProperty = function (className, propertyName) {
var hash = this.getHashProperties(className);
var res = hash[propertyName];
return !!res ? res : null;
};
JsonMetadata.prototype.findProperties = function (className, propertyNames) {
var result = [];
var hash = this.getHashProperties(className);
for (var i = 0; i < propertyNames.length; i++) {
var prop = hash[propertyNames[i]];
if (prop) {
result.push(prop);
}
}
return result;
};
JsonMetadata.prototype.getAllPropertiesByName = function (propertyName) {
var res = new Array();
var classes = this.getAllClasses();
for (var i = 0; i < classes.length; i++) {
var classInfo = this.findClass(classes[i]);
for (var j = 0; j < classInfo.properties.length; j++) {
if (classInfo.properties[j].name == propertyName) {
res.push(classInfo.properties[j]);
break;
}
}
}
return res;
};
JsonMetadata.prototype.getAllClasses = function () {
var res = new Array();
for (var name in this.classes) {
res.push(name);
}
return res;
};
JsonMetadata.prototype.createClass = function (name, json) {
if (json === void 0) { json = undefined; }
name = name.toLowerCase();
var metaDataClass = this.findClass(name);
if (!metaDataClass)
return null;
if (metaDataClass.creator)
return metaDataClass.creator(json);
var parentName = metaDataClass.parentName;
while (parentName) {
metaDataClass = this.findClass(parentName);
if (!metaDataClass)
return null;
parentName = metaDataClass.parentName;
if (metaDataClass.creator)
return this.createCustomType(name, metaDataClass.creator, json);
}
return null;
};
JsonMetadata.prototype.createCustomType = function (name, creator, json) {
if (json === void 0) { json = undefined; }
name = name.toLowerCase();
var res = creator(json);
var customTypeName = name;
var customTemplateName = res.getTemplate
? res.getTemplate()
: res.getType();
res.getType = function () {
return customTypeName;
};
res.getTemplate = function () {
return customTemplateName;
};
CustomPropertiesCollection.createProperties(res);
return res;
};
JsonMetadata.prototype.getChildrenClasses = function (name, canBeCreated) {
if (canBeCreated === void 0) { canBeCreated = false; }
name = name.toLowerCase();
var result = [];
this.fillChildrenClasses(name, canBeCreated, result);
return result;
};
JsonMetadata.prototype.getRequiredProperties = function (name) {
var properties = this.getProperties(name);
var res = [];
for (var i = 0; i < properties.length; i++) {
if (properties[i].isRequired) {
res.push(properties[i].name);
}
}
return res;
};
JsonMetadata.prototype.addProperties = function (className, propertiesInfos) {
className = className.toLowerCase();
var metaDataClass = this.findClass(className);
for (var i = 0; i < propertiesInfos.length; i++) {
this.addCustomPropertyCore(metaDataClass, propertiesInfos[i]);
}
};
JsonMetadata.prototype.addProperty = function (className, propertyInfo) {
return this.addCustomPropertyCore(this.findClass(className), propertyInfo);
};
JsonMetadata.prototype.addCustomPropertyCore = function (metaDataClass, propertyInfo) {
if (!metaDataClass)
return null;
var property = metaDataClass.createProperty(propertyInfo);
if (property) {
property.isCustom = true;
this.addPropertyToClass(metaDataClass, property);
this.emptyClassPropertiesHash(metaDataClass);
CustomPropertiesCollection.addProperty(metaDataClass.name, property);
}
return property;
};
JsonMetadata.prototype.removeProperty = function (className, propertyName) {
var metaDataClass = this.findClass(className);
if (!metaDataClass)
return false;
var property = metaDataClass.find(propertyName);
if (property) {
this.removePropertyFromClass(metaDataClass, property);
this.emptyClassPropertiesHash(metaDataClass);
CustomPropertiesCollection.removeProperty(metaDataClass.name, propertyName);
}
};
JsonMetadata.prototype.addPropertyToClass = function (metaDataClass, property) {
if (metaDataClass.find(property.name) != null)
return;
metaDataClass.properties.push(property);
};
JsonMetadata.prototype.removePropertyFromClass = function (metaDataClass, property) {
var index = metaDataClass.properties.indexOf(property);
if (index < 0)
return;
metaDataClass.properties.splice(index, 1);
};
JsonMetadata.prototype.emptyClassPropertiesHash = function (metaDataClass) {
this.classProperties[metaDataClass.name] = null;
this.classHashProperties[metaDataClass.name] = null;
var childClasses = this.getChildrenClasses(metaDataClass.name);
for (var i = 0; i < childClasses.length; i++) {
this.classProperties[childClasses[i].name] = null;
this.classHashProperties[childClasses[i].name] = null;
}
};
JsonMetadata.prototype.fillChildrenClasses = function (name, canBeCreated, result) {
var children = this.childrenClasses[name];
if (!children)
return;
for (var i = 0; i < children.length; i++) {
if (!canBeCreated || children[i].creator) {
result.push(children[i]);
}
this.fillChildrenClasses(children[i].name, canBeCreated, result);
}
};
JsonMetadata.prototype.findClass = function (name) {
name = name.toLowerCase();
var res = this.classes[name];
if (!res) {
var newName = this.alternativeNames[name];
if (!!newName && newName != name)
return this.findClass(newName);
}
return res;
};
JsonMetadata.prototype.isDescendantOf = function (className, ancestorClassName) {
if (!className || !ancestorClassName) {
return false;
}
className = className.toLowerCase();
ancestorClassName = ancestorClassName.toLowerCase();
var class_ = this.findClass(className);
if (!class_) {
return false;
}
var parentClass = class_;
do {
if (parentClass.name === ancestorClassName) {
return true;
}
parentClass = this.classes[parentClass.parentName];
} while (!!parentClass);
return false;
};
JsonMetadata.prototype.addAlterNativeClassName = function (name, alternativeName) {
this.alternativeNames[alternativeName.toLowerCase()] = name.toLowerCase();
};
JsonMetadata.prototype.fillProperties = function (name, list, hash) {
var metaDataClass = this.findClass(name);
if (!metaDataClass)
return;
if (metaDataClass.parentName) {
this.fillProperties(metaDataClass.parentName, list, hash);
}
for (var i = 0; i < metaDataClass.properties.length; i++) {
var prop = metaDataClass.properties[i];
this.addPropertyCore(prop, list, hash);
hash[prop.name] = prop;
}
};
JsonMetadata.prototype.addPropertyCore = function (property, list, hash) {
if (!hash[property.name]) {
list.push(property);
return;
}
var index = -1;
for (var i = 0; i < list.length; i++) {
if (list[i].name == property.name) {
index = i;
break;
}
}
property.mergeWith(list[index]);
list[index] = property;
};
return JsonMetadata;
}());
var JsonError = /** @class */ (function () {
function JsonError(type, message) {
this.type = type;
this.message = message;
this.description = "";
this.at = -1;
}
JsonError.prototype.getFullDescription = function () {
return this.message + (this.description ? "\n" + this.description : "");
};
return JsonError;
}());
var JsonUnknownPropertyError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(JsonUnknownPropertyError, _super);
function JsonUnknownPropertyError(propertyName, className) {
var _this = _super.call(this, "unknownproperty", "The property '" +
propertyName +
"' in class '" +
className +
"' is unknown.") || this;
_this.propertyName = propertyName;
_this.className = className;
var properties = JsonObject.metaData.getProperties(className);
if (properties) {
_this.description = "The list of available properties are: ";
for (var i = 0; i < properties.length; i++) {
if (i > 0)
_this.description += ", ";
_this.description += properties[i].name;
}
_this.description += ".";
}
return _this;
}
return JsonUnknownPropertyError;
}(JsonError));
var JsonMissingTypeErrorBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(JsonMissingTypeErrorBase, _super);
function JsonMissingTypeErrorBase(baseClassName, type, message) {
var _this = _super.call(this, type, message) || this;
_this.baseClassName = baseClassName;
_this.type = type;
_this.message = message;
_this.description = "The following types are available: ";
var types = JsonObject.metaData.getChildrenClasses(baseClassName, true);
for (var i = 0; i < types.length; i++) {
if (i > 0)
_this.description += ", ";
_this.description += "'" + types[i].name + "'";
}
_this.description += ".";
return _this;
}
return JsonMissingTypeErrorBase;
}(JsonError));
var JsonMissingTypeError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(JsonMissingTypeError, _super);
function JsonMissingTypeError(propertyName, baseClassName) {
var _this = _super.call(this, baseClassName, "missingtypeproperty", "The property type is missing in the object. Please take a look at property: '" +
propertyName +
"'.") || this;
_this.propertyName = propertyName;
_this.baseClassName = baseClassName;
return _this;
}
return JsonMissingTypeError;
}(JsonMissingTypeErrorBase));
var JsonIncorrectTypeError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(JsonIncorrectTypeError, _super);
function JsonIncorrectTypeError(propertyName, baseClassName) {
var _this = _super.call(this, baseClassName, "incorrecttypeproperty", "The property type is incorrect in the object. Please take a look at property: '" +
propertyName +
"'.") || this;
_this.propertyName = propertyName;
_this.baseClassName = baseClassName;
return _this;
}
return JsonIncorrectTypeError;
}(JsonMissingTypeErrorBase));
var JsonRequiredPropertyError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(JsonRequiredPropertyError, _super);
function JsonRequiredPropertyError(propertyName, className) {
var _this = _super.call(this, "requiredproperty", "The property '" +
propertyName +
"' is required in class '" +
className +
"'.") || this;
_this.propertyName = propertyName;
_this.className = className;
return _this;
}
return JsonRequiredPropertyError;
}(JsonError));
var JsonObject = /** @class */ (function () {
function JsonObject() {
this.errors = new Array();
this.lightSerializing = false;
}
Object.defineProperty(JsonObject, "metaData", {
get: function () {
return JsonObject.metaDataValue;
},
enumerable: true,
configurable: true
});
JsonObject.prototype.toJsonObject = function (obj, storeDefaults) {
if (storeDefaults === void 0) { storeDefaults = false; }
return this.toJsonObjectCore(obj, null, storeDefaults);
};
JsonObject.prototype.toObject = function (jsonObj, obj) {
this.toObjectCore(jsonObj, obj);
if (!!obj.getType) {
var error = this.getRequiredError(jsonObj, obj.getType());
if (!!error) {
this.addNewError(error, jsonObj);
}
}
};
JsonObject.prototype.toObjectCore = function (jsonObj, obj) {
if (!jsonObj)
return;
var properties = null;
var objType = undefined;
var needAddErrors = true;
if (obj.getType) {
objType = obj.getType();
properties = JsonObject.metaData.getProperties(objType);
needAddErrors =
!!objType && !JsonObject.metaData.isDescendantOf(objType, "itemvalue");
}
if (!properties)
return;
if (obj.startLoadingFromJson) {
obj.startLoadingFromJson();
}
properties = this.addDynamicProperties(obj, jsonObj, properties);
for (var key in jsonObj) {
if (key === JsonObject.typePropertyName)
continue;
if (key === JsonObject.positionPropertyName) {
obj[key] = jsonObj[key];
continue;
}
var property = this.findProperty(properties, key);
if (!property) {
if (needAddErrors) {
this.addNewError(new JsonUnknownPropertyError(key.toString(), objType), jsonObj);
}
continue;
}
this.valueToObj(jsonObj[key], obj, property);
}
if (obj.endLoadingFromJson) {
obj.endLoadingFromJson();
}
};
JsonObject.prototype.toJsonObjectCore = function (obj, property, storeDefaults) {
if (storeDefaults === void 0) { storeDefaults = false; }
if (!obj || !obj.getType)
return obj;
if (typeof obj.getData === "function")
return obj.getData();
var result = {};
if (property != null && !property.className) {
result[JsonObject.typePropertyName] = property.getObjType(obj.getType());
}
this.propertiesToJson(obj, JsonObject.metaData.getProperties(obj.getType()), result, storeDefaults);
this.propertiesToJson(obj, this.getDynamicProperties(obj), result, storeDefaults);
return result;
};
JsonObject.prototype.getDynamicProperties = function (obj) {
return Serializer.getDynamicPropertiesByObj(obj);
};
JsonObject.prototype.addDynamicProperties = function (obj, jsonObj, properties) {
if (!obj.getDynamicPropertyName)
return properties;
var dynamicPropName = obj.getDynamicPropertyName();
if (!dynamicPropName)
return properties;
if (jsonObj[dynamicPropName]) {
obj[dynamicPropName] = jsonObj[dynamicPropName];
}
var dynamicProperties = this.getDynamicProperties(obj);
var res = [];
for (var i = 0; i < properties.length; i++) {
res.push(properties[i]);
}
for (var i = 0; i < dynamicProperties.length; i++) {
res.push(dynamicProperties[i]);
}
return res;
};
JsonObject.prototype.propertiesToJson = function (obj, properties, json, storeDefaults) {
if (storeDefaults === void 0) { storeDefaults = false; }
for (var i = 0; i < properties.length; i++) {
this.valueToJson(obj, json, properties[i], storeDefaults);
}
};
JsonObject.prototype.valueToJson = function (obj, result, property, storeDefaults) {
if (storeDefaults === void 0) { storeDefaults = false; }
if (property.isSerializable === false ||
(property.isLightSerializable === false && this.lightSerializing))
return;
var value = property.getValue(obj);
if (!storeDefaults && property.isDefaultValue(value))
return;
if (this.isValueArray(value)) {
var arrValue = [];
for (var i = 0; i < value.length; i++) {
arrValue.push(this.toJsonObjectCore(value[i], property, storeDefaults));
}
value = arrValue.length > 0 ? arrValue : null;
}
else {
value = this.toJsonObjectCore(value, property, storeDefaults);
}
var hasValue = typeof obj["getPropertyValue"] === "function" &&
obj["getPropertyValue"](property.name, null) !== null;
if ((storeDefaults && hasValue) || !property.isDefaultValue(value)) {
result[property.name] = value;
}
};
JsonObject.prototype.valueToObj = function (value, obj, property) {
if (value == null)
return;
this.removePos(property, value);
if (property != null && property.hasToUseSetValue) {
property.setValue(obj, value, this);
return;
}
if (this.isValueArray(value)) {
this.valueToArray(value, obj, property.name, property);
return;
}
var newObj = this.createNewObj(value, property);
if (newObj.newObj) {
this.toObjectCore(value, newObj.newObj);
value = newObj.newObj;
}
if (!newObj.error) {
if (property != null) {
property.setValue(obj, value, this);
}
else {
obj[property.name] = value;
}
}
};
JsonObject.prototype.removePos = function (property, value) {
if (!property || !property.type || property.type.indexOf("value") < 0)
return;
this.removePosFromObj(value);
};
JsonObject.prototype.removePosFromObj = function (obj) {
if (!obj)
return;
if (Array.isArray(obj)) {
for (var i = 0; i < obj.length; i++) {
this.removePosFromObj(obj[i]);
}
}
if (!!obj[JsonObject.positionPropertyName]) {
delete obj[JsonObject.positionPropertyName];
}
};
JsonObject.prototype.isValueArray = function (value) {
return value && Array.isArray(value);
};
JsonObject.prototype.createNewObj = function (value, property) {
var result = { newObj: null, error: null };
var className = value[JsonObject.typePropertyName];
if (!className && property != null && property.className) {
className = property.className;
}
className = property.getClassName(className);
result.newObj = className
? JsonObject.metaData.createClass(className, value)
: null;
result.error = this.checkNewObjectOnErrors(result.newObj, value, property, className);
return result;
};
JsonObject.prototype.checkNewObjectOnErrors = function (newObj, value, property, className) {
var error = null;
if (newObj) {
error = this.getRequiredError(value, className);
}
else {
if (property.baseClassName) {
if (!className) {
error = new JsonMissingTypeError(property.name, property.baseClassName);
}
else {
error = new JsonIncorrectTypeError(property.name, property.baseClassName);
}
}
}
if (error) {
this.addNewError(error, value);
}
return error;
};
JsonObject.prototype.getRequiredError = function (value, className) {
var requiredProperties = JsonObject.metaData.getRequiredProperties(className);
if (!requiredProperties)
return null;
for (var i = 0; i < requiredProperties.length; i++) {
if (!value[requiredProperties[i]]) {
return new JsonRequiredPropertyError(requiredProperties[i], className);
}
}
return null;
};
JsonObject.prototype.addNewError = function (error, jsonObj) {
if (jsonObj && jsonObj[JsonObject.positionPropertyName]) {
error.at = jsonObj[JsonObject.positionPropertyName].start;
}
this.errors.push(error);
};
JsonObject.prototype.valueToArray = function (value, obj, key, property) {
if (obj[key] && value.length > 0)
obj[key].splice(0, obj[key].length);
var valueRes = obj[key] ? obj[key] : [];
this.addValuesIntoArray(value, valueRes, property);
if (!obj[key])
obj[key] = valueRes;
};
JsonObject.prototype.addValuesIntoArray = function (value, result, property) {
for (var i = 0; i < value.length; i++) {
var newValue = this.createNewObj(value[i], property);
if (newValue.newObj) {
if (!!value[i].name) {
newValue.newObj.name = value[i].name;
}
result.push(newValue.newObj);
this.toObjectCore(value[i], newValue.newObj);
}
else {
if (!newValue.error) {
result.push(value[i]);
}
}
}
};
JsonObject.prototype.findProperty = function (properties, key) {
if (!properties)
return null;
for (var i = 0; i < properties.length; i++) {
var prop = properties[i];
if (prop.name == key || prop.alternativeName == key)
return prop;
}
return null;
};
JsonObject.typePropertyName = "type";
JsonObject.positionPropertyName = "pos";
JsonObject.metaDataValue = new JsonMetadata();
return JsonObject;
}());
var Serializer = JsonObject.metaData;
/***/ }),
/* 3 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_3__;
/***/ }),
/* 4 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Helpers; });
var Helpers = /** @class */ (function () {
function Helpers() {
}
/**
* A static methods that returns true if a value underfined, null, empty string or empty array.
* @param value
*/
Helpers.isValueEmpty = function (value) {
if (Array.isArray(value) && value.length === 0)
return true;
if (!!value && typeof value === "object" && value.constructor === Object) {
for (var key in value) {
if (!Helpers.isValueEmpty(value[key]))
return false;
}
return true;
}
if (!!value && (typeof value === "string" || value instanceof String)) {
value = value.trim();
}
return !value && value !== 0 && value !== false;
};
Helpers.isArrayContainsEqual = function (x, y) {
if (!Array.isArray(x) || !Array.isArray(y))
return false;
if (x.length !== y.length)
return false;
for (var i = 0; i < x.length; i++) {
var j = 0;
for (; j < y.length; j++) {
if (Helpers.isTwoValueEquals(x[i], y[j]))
break;
}
if (j === y.length)
return false;
}
return true;
};
Helpers.isArraysEqual = function (x, y, ignoreOrder) {
if (ignoreOrder === void 0) { ignoreOrder = false; }
if (!Array.isArray(x) || !Array.isArray(y))
return false;
if (x.length !== y.length)
return false;
if (ignoreOrder) {
var xSorted = [];
var ySorted = [];
for (var i = 0; i < x.length; i++) {
xSorted.push(x[i]);
ySorted.push(y[i]);
}
xSorted.sort();
ySorted.sort();
x = xSorted;
y = ySorted;
}
for (var i = 0; i < x.length; i++) {
if (!Helpers.isTwoValueEquals(x[i], y[i]))
return false;
}
return true;
};
Helpers.isTwoValueEquals = function (x, y, ignoreOrder) {
if (ignoreOrder === void 0) { ignoreOrder = false; }
if (x === y)
return true;
if (Array.isArray(x) && x.length === 0 && typeof y === "undefined")
return true;
if (Array.isArray(y) && y.length === 0 && typeof x === "undefined")
return true;
if ((x === undefined || x === null) && y === "")
return true;
if ((y === undefined || y === null) && x === "")
return true;
if (typeof x === "string" && typeof y == "string")
return x == y;
if (Helpers.isConvertibleToNumber(x) && Helpers.isConvertibleToNumber(y)) {
if (parseInt(x) === parseInt(y) && parseFloat(x) === parseFloat(y)) {
return true;
}
}
if ((!Helpers.isValueEmpty(x) && Helpers.isValueEmpty(y)) ||
(Helpers.isValueEmpty(x) && !Helpers.isValueEmpty(y)))
return false;
if ((x === true || x === false) && typeof y == "string") {
return x.toString() === y.toLocaleLowerCase();
}
if ((y === true || y === false) && typeof x == "string") {
return y.toString() === x.toLocaleLowerCase();
}
if (!(x instanceof Object) && !(y instanceof Object))
return x == y;
if (!(x instanceof Object) || !(y instanceof Object))
return false;
if (x["equals"])
return x.equals(y);
if (!!x.toJSON && !!y.toJSON) {
return this.isTwoValueEquals(x.toJSON(), y.toJSON());
}
if (Array.isArray(x) && Array.isArray(y))
return Helpers.isArraysEqual(x, y, ignoreOrder);
for (var p in x) {
if (!x.hasOwnProperty(p))
continue;
if (!y.hasOwnProperty(p))
return false;
if (x[p] === y[p])
continue;
if (typeof x[p] !== "object")
return false;
if (!this.isTwoValueEquals(x[p], y[p]))
return false;
}
for (p in y) {
if (y.hasOwnProperty(p) && !x.hasOwnProperty(p))
return false;
}
return true;
};
Helpers.randomizeArray = function (array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
};
Helpers.getUnbindValue = function (value) {
if (!!value && value instanceof Object) {
//do not return the same object instance!!!
return JSON.parse(JSON.stringify(value));
}
return value;
};
Helpers.createCopy = function (obj) {
var res = {};
if (!obj)
return res;
for (var key in obj) {
res[key] = obj[key];
}
return res;
};
Helpers.isConvertibleToNumber = function (value) {
return (value !== undefined &&
value !== null &&
!Array.isArray(value) &&
!isNaN(value));
};
Helpers.isNumber = function (value) {
if (typeof value == "string" &&
!!value &&
value.indexOf("0x") == 0 &&
value.length > 32)
return false;
return !isNaN(parseFloat(value)) && isFinite(value);
};
Helpers.getMaxLength = function (maxLength, surveyLength) {
if (maxLength < 0) {
maxLength = surveyLength;
}
return maxLength > 0 ? maxLength : null;
};
Helpers.getNumberByIndex = function (index, startIndexStr) {
if (index < 0)
return "";
var startIndex = 1;
var prefix = "";
var postfix = ".";
var isNumeric = true;
var strIndex = "A";
var str = "";
if (!!startIndexStr) {
str = startIndexStr;
var ind = str.length - 1;
var hasDigit = false;
for (var i = 0; i < str.length; i++) {
if (Helpers.isCharDigit(str[i])) {
hasDigit = true;
break;
}
}
var checkLetter = function () {
return ((hasDigit && !Helpers.isCharDigit(str[ind])) ||
Helpers.isCharNotLetterAndDigit(str[ind]));
};
while (ind >= 0 && checkLetter())
ind--;
var newPostfix = "";
if (ind < str.length - 1) {
newPostfix = str.substr(ind + 1);
str = str.substr(0, ind + 1);
}
ind = str.length - 1;
while (ind >= 0) {
if (checkLetter())
break;
ind--;
if (!hasDigit)
break;
}
strIndex = str.substr(ind + 1);
prefix = str.substr(0, ind + 1);
if (parseInt(strIndex))
startIndex = parseInt(strIndex);
else if (strIndex.length == 1)
isNumeric = false;
if (!!newPostfix || !!prefix) {
postfix = newPostfix;
}
}
if (isNumeric)
return prefix + (index + startIndex).toString() + postfix;
return (prefix + String.fromCharCode(strIndex.charCodeAt(0) + index) + postfix);
};
Helpers.isCharNotLetterAndDigit = function (ch) {
return ch.toUpperCase() == ch.toLowerCase() && !Helpers.isCharDigit(ch);
};
Helpers.isCharDigit = function (ch) {
return ch >= "0" && ch <= "9";
};
return Helpers;
}());
if (!String.prototype["format"]) {
String.prototype["format"] = function () {
var args = arguments;
return this.replace(/{(\d+)}/g, function (match, number) {
return typeof args[number] != "undefined" ? args[number] : match;
});
};
}
/***/ }),
/* 5 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return SurveyLocString; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyElementBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return ReactSurveyElement; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionElementBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return SurveyQuestionUncontrolledElement; });
var SurveyLocString = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyLocString, _super);
function SurveyLocString(props) {
var _this = _super.call(this, props) || this;
_this.state = { changed: 0 };
return _this;
}
Object.defineProperty(SurveyLocString.prototype, "locStr", {
get: function () {
return this.props.locStr;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyLocString.prototype, "style", {
get: function () {
return this.props.style;
},
enumerable: true,
configurable: true
});
SurveyLocString.prototype.componentDidMount = function () {
if (!this.locStr)
return;
var self = this;
this.locStr.onChanged = function () {
self.setState({ changed: self.state.changed + 1 });
};
};
SurveyLocString.prototype.componentWillUnmount = function () {
if (!this.locStr)
return;
this.locStr.onChanged = function () { };
};
SurveyLocString.prototype.render = function () {
if (!this.locStr)
return null;
if (this.locStr.hasHtml) {
var htmlValue = { __html: this.locStr.renderedHtml };
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { style: this.style, dangerouslySetInnerHTML: htmlValue });
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { style: this.style }, this.locStr.renderedHtml);
};
return SurveyLocString;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
var SurveyElementBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyElementBase, _super);
function SurveyElementBase(props) {
var _this = _super.call(this, props) || this;
_this.titleKeyIndex = 0;
_this.titleKeyPrefix = "-titleKey-";
_this.getTitleKey = function (element) {
_this.titleKeyIndex++;
return element.name + _this.titleKeyPrefix + _this.titleKeyIndex;
};
return _this;
}
SurveyElementBase.renderLocString = function (locStr, style, key) {
if (style === void 0) { style = null; }
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyLocString, { locStr: locStr, style: style, key: key });
};
SurveyElementBase.prototype.componentDidMount = function () {
this.makeBaseElementsReact();
};
SurveyElementBase.prototype.componentWillUnmount = function () {
this.unMakeBaseElementsReact();
};
SurveyElementBase.prototype.componentDidUpdate = function (prevProps, prevState) {
this.makeBaseElementsReact();
};
SurveyElementBase.prototype.render = function () {
if (!this.canRender())
return null;
this.isRenderingValue = true;
var res = this.renderElement();
this.isRenderingValue = false;
return res;
};
Object.defineProperty(SurveyElementBase.prototype, "isRendering", {
get: function () {
return this.isRenderingValue;
},
enumerable: true,
configurable: true
});
SurveyElementBase.prototype.canRender = function () {
return true;
};
SurveyElementBase.prototype.renderElement = function () {
return null;
};
SurveyElementBase.prototype.makeBaseElementsReact = function () {
var els = this.getStateElements();
for (var i = 0; i < els.length; i++) {
this.makeBaseElementReact(els[i]);
}
};
SurveyElementBase.prototype.unMakeBaseElementsReact = function () {
var els = this.getStateElements();
for (var i = 0; i < els.length; i++) {
this.unMakeBaseElementReact(els[i]);
}
};
SurveyElementBase.prototype.getStateElements = function () {
var el = this.getStateElement();
return !!el ? [el] : [];
};
SurveyElementBase.prototype.getStateElement = function () {
return null;
};
Object.defineProperty(SurveyElementBase.prototype, "isDisplayMode", {
get: function () {
return this.props.isDisplayMode || false;
},
enumerable: true,
configurable: true
});
SurveyElementBase.prototype.renderLocString = function (locStr, style) {
if (style === void 0) { style = null; }
return SurveyElementBase.renderLocString(locStr, style);
};
SurveyElementBase.prototype.renderTitleSpans = function (element, cssClasses) {
var _this = this;
var getSpaceSpan = function () {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { "data-key": _this.getTitleKey(element), key: _this.getTitleKey(element) }, "\u00A0"));
};
var spans = [];
if (element.isRequireTextOnStart) {
spans.push(this.renderRequireText(element, cssClasses));
spans.push(getSpaceSpan());
}
var questionNumber = element.no;
if (questionNumber) {
spans.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { "data-key": this.getTitleKey(element), key: this.getTitleKey(element), className: cssClasses.number, style: { position: "static" } }, questionNumber));
spans.push(getSpaceSpan());
}
if (element.isRequireTextBeforeTitle) {
spans.push(this.renderRequireText(element, cssClasses));
spans.push(getSpaceSpan());
}
spans.push(SurveyElementBase.renderLocString(element.locTitle, null, this.getTitleKey(element)));
if (element.isRequireTextAfterTitle) {
spans.push(getSpaceSpan());
spans.push(this.renderRequireText(element, cssClasses));
}
return spans;
};
SurveyElementBase.prototype.renderRequireText = function (element, cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { "data-key": this.getTitleKey(element), key: this.getTitleKey(element), className: cssClasses.requiredText || cssClasses.panel.requiredText }, element.requiredText));
};
SurveyElementBase.prototype.makeBaseElementReact = function (stateElement) {
var _this = this;
if (!stateElement)
return;
stateElement.iteratePropertiesHash(function (hash, key) {
var val = hash[key];
if (Array.isArray(val)) {
var val = val;
val["onArrayChanged"] = function () {
if (_this.isRendering)
return;
_this.setState(function (state) {
var newState = {};
newState[key] = val;
return newState;
});
};
}
});
stateElement.setPropertyValueCoreHandler = function (hash, key, val) {
if (hash[key] !== val) {
hash[key] = val;
if (_this.isRendering)
return;
_this.setState(function (state) {
var newState = {};
newState[key] = val;
return newState;
});
}
};
};
SurveyElementBase.prototype.unMakeBaseElementReact = function (stateElement) {
if (!stateElement)
return;
stateElement.setPropertyValueCoreHandler = undefined;
stateElement.iteratePropertiesHash(function (hash, key) {
var val = hash[key];
if (Array.isArray(val)) {
var val = val;
val["onArrayChanged"] = function () { };
}
});
};
return SurveyElementBase;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
var ReactSurveyElement = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ReactSurveyElement, _super);
function ReactSurveyElement(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(ReactSurveyElement.prototype, "cssClasses", {
get: function () {
return this.props.cssClasses;
},
enumerable: true,
configurable: true
});
return ReactSurveyElement;
}(SurveyElementBase));
var SurveyQuestionElementBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionElementBase, _super);
function SurveyQuestionElementBase(props) {
return _super.call(this, props) || this;
}
SurveyQuestionElementBase.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
this.updateDomElement();
};
SurveyQuestionElementBase.prototype.componentDidMount = function () {
this.updateDomElement();
};
SurveyQuestionElementBase.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (!!this.questionBase) {
this.questionBase.beforeDestroyQuestionElement(this.control);
}
};
SurveyQuestionElementBase.prototype.updateDomElement = function () {
var el = this.control;
if (!!el) {
if (el.getAttribute("data-rendered") !== "r") {
el.setAttribute("data-rendered", "r");
this.questionBase.afterRenderQuestionElement(el);
}
}
};
Object.defineProperty(SurveyQuestionElementBase.prototype, "questionBase", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionElementBase.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
SurveyQuestionElementBase.prototype.canRender = function () {
return !!this.questionBase && !!this.creator;
};
SurveyQuestionElementBase.prototype.shouldComponentUpdate = function () {
return (!this.questionBase.customWidget ||
!!this.questionBase.customWidgetData.isNeedRender ||
!!this.questionBase.customWidget.widgetJson.isDefaultRender ||
!!this.questionBase.customWidget.widgetJson.render);
};
return SurveyQuestionElementBase;
}(SurveyElementBase));
var SurveyQuestionUncontrolledElement = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionUncontrolledElement, _super);
function SurveyQuestionUncontrolledElement(props) {
var _this = _super.call(this, props) || this;
_this.updateValueOnEvent = function (event) {
if (!__WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isTwoValueEquals(_this.questionBase.value, event.target.value)) {
_this.questionBase.value = event.target.value;
}
};
_this.updateValueOnEvent = _this.updateValueOnEvent.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionUncontrolledElement.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionUncontrolledElement.prototype.updateDomElement = function () {
if (!!this.control) {
this.control.value = this.getValue(this.questionBase.value);
}
_super.prototype.updateDomElement.call(this);
};
SurveyQuestionUncontrolledElement.prototype.getValue = function (val) {
if (__WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isValueEmpty(val))
return "";
return val;
};
return SurveyQuestionUncontrolledElement;
}(SurveyQuestionElementBase));
/***/ }),
/* 6 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ReactQuestionFactory; });
var ReactQuestionFactory = /** @class */ (function () {
function ReactQuestionFactory() {
this.creatorHash = {};
}
ReactQuestionFactory.prototype.registerQuestion = function (questionType, questionCreator) {
this.creatorHash[questionType] = questionCreator;
};
ReactQuestionFactory.prototype.getAllTypes = function () {
var result = new Array();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
ReactQuestionFactory.prototype.createQuestion = function (questionType, params) {
var creator = this.creatorHash[questionType];
if (creator == null)
return null;
return creator(params);
};
ReactQuestionFactory.Instance = new ReactQuestionFactory();
return ReactQuestionFactory;
}());
/***/ }),
/* 7 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__settings__ = __webpack_require__(9);
/* unused harmony export Bindings */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return Base; });
/* unused harmony export ArrayChanges */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return SurveyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyElement; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Event; });
var Bindings = /** @class */ (function () {
function Bindings(obj) {
this.obj = obj;
this.properties = null;
this.values = null;
}
Bindings.prototype.getType = function () {
return "bindings";
};
Bindings.prototype.getNames = function () {
var res = [];
this.fillProperties();
for (var i = 0; i < this.properties.length; i++) {
if (this.properties[i].isVisible("", this.obj)) {
res.push(this.properties[i].name);
}
}
return res;
};
Bindings.prototype.getProperties = function () {
var res = [];
this.fillProperties();
for (var i = 0; i < this.properties.length; i++) {
res.push(this.properties[i]);
}
return res;
};
Bindings.prototype.setBinding = function (propertyName, valueName) {
if (!this.values)
this.values = {};
if (!!valueName) {
this.values[propertyName] = valueName;
}
else {
delete this.values[propertyName];
if (Object.keys(this.values).length == 0) {
this.values = null;
}
}
};
Bindings.prototype.clearBinding = function (propertyName) {
this.setBinding(propertyName, "");
};
Bindings.prototype.isEmpty = function () {
return !this.values;
};
Bindings.prototype.getValueNameByPropertyName = function (propertyName) {
if (!this.values)
return undefined;
return this.values[propertyName];
};
Bindings.prototype.getPropertiesByValueName = function (valueName) {
if (!this.values)
return [];
var res = [];
for (var key in this.values) {
if (this.values[key] == valueName) {
res.push(key);
}
}
return res;
};
Bindings.prototype.getJson = function () {
if (this.isEmpty())
return null;
var res = {};
for (var key in this.values) {
res[key] = this.values[key];
}
return res;
};
Bindings.prototype.setJson = function (value) {
this.values = null;
if (!value)
return;
this.values = {};
for (var key in value) {
this.values[key] = value[key];
}
};
Bindings.prototype.fillProperties = function () {
if (this.properties !== null)
return;
this.properties = [];
var objProperties = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].getPropertiesByObj(this.obj);
for (var i = 0; i < objProperties.length; i++) {
if (objProperties[i].isBindable) {
this.properties.push(objProperties[i]);
}
}
};
return Bindings;
}());
/**
* The base class for SurveyJS objects.
*/
var Base = /** @class */ (function () {
function Base() {
this.propertyHash = {};
this.isLoadingFromJsonValue = false;
this.loadingOwner = null;
/**
* Event that raise on property change of the sender object
* sender - the object that owns the property
* options.name - the property name that has been changed
* options.oldValue - old value. Please note, it equals to options.newValue if property is an array
* options.newValue - new value.
*/
this.onPropertyChanged = new Event();
/**
* Event that raised on changing property of the ItemValue object.
* sender - the object that owns the property
* options.propertyName - the property name to which ItemValue array is belong. It can be "choices" for dropdown question
* options.obj - the instance of ItemValue object which property has been changed
* options.name - the property of ItemObject that has been changed
* options.oldValue - old value
* options.newValue - new value
*/
this.onItemValuePropertyChanged = new Event();
this.isCreating = true;
this.bindingsValue = new Bindings(this);
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["b" /* CustomPropertiesCollection */].createProperties(this);
this.onBaseCreating();
this.isCreating = false;
}
Object.defineProperty(Base, "commentPrefix", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_4__settings__["a" /* settings */].commentPrefix;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_4__settings__["a" /* settings */].commentPrefix = val;
},
enumerable: true,
configurable: true
});
/**
* A static methods that returns true if a value underfined, null, empty string or empty array.
* @param value
*/
Base.prototype.isValueEmpty = function (value) {
return __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isValueEmpty(value);
};
Base.prototype.IsPropertyEmpty = function (value) {
return value !== "" && this.isValueEmpty(value);
};
Base.prototype.onBaseCreating = function () { };
/**
* Returns the type of the object as a string as it represents in the json. It should be in lowcase.
*/
Base.prototype.getType = function () {
return "base";
};
Object.defineProperty(Base.prototype, "bindings", {
get: function () {
return this.bindingsValue;
},
enumerable: true,
configurable: true
});
Base.prototype.checkBindings = function (valueName, value) { };
Base.prototype.updateBindings = function (propertyName, value) {
var valueName = this.bindings.getValueNameByPropertyName(propertyName);
if (!!valueName) {
this.updateBindingValue(valueName, value);
}
};
Base.prototype.updateBindingValue = function (valueName, value) { };
/**
* Returns the element template name without prefix. Typically it equals to getType().
* @see getType
*/
Base.prototype.getTemplate = function () {
return this.getType();
};
Object.defineProperty(Base.prototype, "isLoadingFromJson", {
/**
* Returns true if the object is loading from Json at the current moment.
*/
get: function () {
return this.getIsLoadingFromJson();
},
enumerable: true,
configurable: true
});
Base.prototype.getIsLoadingFromJson = function () {
if (!!this.loadingOwner && this.loadingOwner.isLoadingFromJson)
return true;
return this.isLoadingFromJsonValue;
};
Base.prototype.startLoadingFromJson = function () {
this.isLoadingFromJsonValue = true;
};
Base.prototype.endLoadingFromJson = function () {
this.isLoadingFromJsonValue = false;
};
/**
* Deserialized the current object into JSON
* @see fromJSON
*/
Base.prototype.toJSON = function () {
return new __WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* JsonObject */]().toJsonObject(this);
};
/**
* Load object properties and elements. It doesn't reset properties that was changed before and they are not defined in the json parameter.
* @param json the object JSON definition
* @see toJSON
*/
Base.prototype.fromJSON = function (json) {
return new __WEBPACK_IMPORTED_MODULE_3__jsonobject__["c" /* JsonObject */]().toObject(json, this);
};
/**
* Make a clone of the existing object. Create a new object of the same type and load all properties into it.
*/
Base.prototype.clone = function () {
var clonedObj = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].createClass(this.getType());
clonedObj.fromJSON(this.toJSON());
return clonedObj;
};
Base.prototype.getProgressInfo = function () {
return SurveyElement.createProgressInfo();
};
Base.prototype.locStrsChanged = function () {
if (!!this.arraysInfo) {
for (var key in this.arraysInfo) {
var item = this.arraysInfo[key];
if (item && item.isItemValues) {
var arr = this.getPropertyValue(key);
if (arr && !!Base.itemValueLocStrChanged)
Base.itemValueLocStrChanged(arr);
}
}
}
if (!!this.localizableStrings) {
for (var key in this.localizableStrings) {
var item = this.getLocalizableString(key);
if (item)
item.strChanged();
}
}
};
/**
* Returns the property value by name
* @param name property name
*/
Base.prototype.getPropertyValue = function (name, defaultValue) {
if (defaultValue === void 0) { defaultValue = null; }
var res = this.getPropertyValueCore(this.propertyHash, name);
if (this.IsPropertyEmpty(res)) {
if (defaultValue != null)
return defaultValue;
var prop = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].findProperty(this.getType(), name);
if (!!prop && (!prop.isCustom || !this.isCreating)) {
if (!this.IsPropertyEmpty(prop.defaultValue) && !Array.isArray(prop.defaultValue))
return prop.defaultValue;
if (prop.type == "boolean" || prop.type == "switch")
return false;
}
}
return res;
};
Base.prototype.getPropertyValueCore = function (propertiesHash, name) {
if (this.getPropertyValueCoreHandler)
return this.getPropertyValueCoreHandler(propertiesHash, name);
else
return propertiesHash[name];
};
Base.prototype.geValueFromHash = function () {
return this.propertyHash["value"];
};
Base.prototype.setPropertyValueCore = function (propertiesHash, name, val) {
if (this.setPropertyValueCoreHandler)
this.setPropertyValueCoreHandler(propertiesHash, name, val);
else
propertiesHash[name] = val;
};
Base.prototype.iteratePropertiesHash = function (func) {
var _this = this;
var keys = [];
for (var key in this.propertyHash) {
keys.push(key);
}
keys.forEach(function (key) { return func(_this.propertyHash, key); });
};
/**
* set property value
* @param name property name
* @param val new property value
*/
Base.prototype.setPropertyValue = function (name, val) {
var oldValue = this.getPropertyValue(name);
if (oldValue && Array.isArray(oldValue)) {
if (this.isTwoValueEquals(oldValue, val))
return;
var arrayInfo = this.arraysInfo[name];
this.setArray(name, oldValue, val, arrayInfo ? arrayInfo.isItemValues : false, arrayInfo ? arrayInfo.onPush : null);
//this.propertyValueChanged(name, oldValue, oldValue);
}
else {
this.setPropertyValueCore(this.propertyHash, name, val);
if (!this.isTwoValueEquals(oldValue, val)) {
this.propertyValueChanged(name, oldValue, val);
}
}
};
Base.prototype.onPropertyValueChangedCallback = function (name, oldValue, newValue, sender, arrayChanges) { };
Base.prototype.itemValuePropertyChanged = function (item, name, oldValue, newValue) {
this.onItemValuePropertyChanged.fire(this, {
obj: item,
name: name,
oldValue: oldValue,
newValue: newValue,
propertyName: item.ownerPropertyName,
});
};
Base.prototype.onPropertyValueChanged = function (name, oldValue, newValue) { };
Base.prototype.propertyValueChanged = function (name, oldValue, newValue, arrayChanges, target) {
if (this.isLoadingFromJson)
return;
this.updateBindings(name, newValue);
this.onPropertyValueChanged(name, oldValue, newValue);
this.onPropertyChanged.fire(this, {
name: name,
oldValue: oldValue,
newValue: newValue,
});
this.doPropertyValueChangedCallback &&
this.doPropertyValueChangedCallback(name, oldValue, newValue, arrayChanges, this);
if (!this.onPropChangeFunctions)
return;
for (var i = 0; i < this.onPropChangeFunctions.length; i++) {
if (this.onPropChangeFunctions[i].name == name)
this.onPropChangeFunctions[i].func(newValue);
}
};
Base.prototype.doPropertyValueChangedCallback = function (name, oldValue, newValue, arrayChanges, target) {
if (!target)
target = this;
var parentBase = this.getOwnerForPropertyChanged();
if (!!parentBase) {
parentBase.doPropertyValueChangedCallback(name, oldValue, newValue, arrayChanges, target);
}
else {
this.onPropertyValueChangedCallback(name, oldValue, newValue, target, arrayChanges);
}
};
Base.prototype.getOwnerForPropertyChanged = function () {
var testProps = ["colOwner", "locOwner", "survey", "owner", "errorOwner"];
for (var i = 0; i < testProps.length; i++) {
var prop = testProps[i];
var testObj = this[prop];
if (!!testObj && !!testObj.doPropertyValueChangedCallback)
return testObj;
}
return null;
};
/**
* Register a function that will be called on a property value changed.
* @param name the property name
* @param func the function with no parameters that will be called on property changed.
* @param key an optional parameter. If there is already a registered function for this property with the same key, it will be overwritten.
*/
Base.prototype.registerFunctionOnPropertyValueChanged = function (name, func, key) {
if (key === void 0) { key = null; }
if (!this.onPropChangeFunctions) {
this.onPropChangeFunctions = [];
}
if (key) {
for (var i = 0; i < this.onPropChangeFunctions.length; i++) {
var item = this.onPropChangeFunctions[i];
if (item.name == name && item.key == key) {
item.func = func;
return;
}
}
}
this.onPropChangeFunctions.push({ name: name, func: func, key: key });
};
/**
* Register a function that will be called on a property value changed from the names list.
* @param names the list of properties names
* @param func the function with no parameters that will be called on property changed.
* @param key an optional parameter. If there is already a registered function for this property with the same key, it will be overwritten.
*/
Base.prototype.registerFunctionOnPropertiesValueChanged = function (names, func, key) {
if (key === void 0) { key = null; }
for (var i = 0; i < names.length; i++) {
this.registerFunctionOnPropertyValueChanged(names[i], func, key);
}
};
/**
* Unregister notification on property value changed
* @param name the property name
* @param key the key with which you have registered the notification for this property. It can be null.
*/
Base.prototype.unRegisterFunctionOnPropertyValueChanged = function (name, key) {
if (key === void 0) { key = null; }
if (!this.onPropChangeFunctions)
return;
for (var i = 0; i < this.onPropChangeFunctions.length; i++) {
var item = this.onPropChangeFunctions[i];
if (item.name == name && item.key == key) {
this.onPropChangeFunctions.splice(i, 1);
return;
}
}
};
/**
* Unregister notification on property value changed for all properties in the names list.
* @param names the list of properties names
* @param key the key with which you have registered the notification for this property. It can be null.
*/
Base.prototype.unRegisterFunctionOnPropertiesValueChanged = function (names, key) {
if (key === void 0) { key = null; }
for (var i = 0; i < names.length; i++) {
this.unRegisterFunctionOnPropertyValueChanged(names[i], key);
}
};
Base.prototype.createCustomLocalizableObj = function (name) {
var locStr = this.getLocalizableString(name);
if (locStr || !this.getLocale)
return;
this.createLocalizableString(name, this);
};
Base.prototype.createLocalizableString = function (name, owner, useMarkDown) {
if (useMarkDown === void 0) { useMarkDown = false; }
var locStr = new __WEBPACK_IMPORTED_MODULE_1__localizablestring__["a" /* LocalizableString */](owner, useMarkDown);
if (!this.localizableStrings) {
this.localizableStrings = {};
}
this.localizableStrings[name] = locStr;
return locStr;
};
Base.prototype.getLocalizableString = function (name) {
return !!this.localizableStrings ? this.localizableStrings[name] : null;
};
Base.prototype.getLocalizableStringText = function (name, defaultStr) {
if (defaultStr === void 0) { defaultStr = ""; }
var locStr = this.getLocalizableString(name);
if (!locStr)
return "";
var res = locStr.text;
return res ? res : defaultStr;
};
Base.prototype.setLocalizableStringText = function (name, value) {
var locStr = this.getLocalizableString(name);
if (!locStr)
return;
var oldValue = locStr.text;
if (oldValue === value)
return;
locStr.text = value;
this.propertyValueChanged(name, oldValue, value);
};
Base.prototype.addUsedLocales = function (locales) {
if (!!this.localizableStrings) {
for (var key in this.localizableStrings) {
var item = this.getLocalizableString(key);
if (item)
this.AddLocStringToUsedLocales(item, locales);
}
}
if (!!this.arraysInfo) {
for (var key in this.arraysInfo) {
var items = this.getPropertyValue(key);
if (!items || !items.length)
continue;
for (var i = 0; i < items.length; i++) {
var item = items[i];
if (item && item.addUsedLocales) {
item.addUsedLocales(locales);
}
}
}
}
};
Base.prototype.AddLocStringToUsedLocales = function (locStr, locales) {
var locs = locStr.getLocales();
for (var i = 0; i < locs.length; i++) {
if (locales.indexOf(locs[i]) < 0) {
locales.push(locs[i]);
}
}
};
Base.prototype.createItemValues = function (name) {
var self = this;
var result = this.createNewArray(name, function (item) {
item.locOwner = self;
item.ownerPropertyName = name;
});
this.arraysInfo[name].isItemValues = true;
return result;
};
Base.prototype.notifyArrayChanged = function (ar) {
!!ar.onArrayChanged && ar.onArrayChanged();
};
Base.prototype.createNewArrayCore = function (name) {
var res = null;
if (!!this.createArrayCoreHandler) {
res = this.createArrayCoreHandler(this.propertyHash, name);
}
if (!res) {
res = new Array();
this.setPropertyValueCore(this.propertyHash, name, res);
}
return res;
};
Base.prototype.createNewArray = function (name, onPush, onRemove) {
if (onPush === void 0) { onPush = null; }
if (onRemove === void 0) { onRemove = null; }
var newArray = this.createNewArrayCore(name);
if (!this.arraysInfo) {
this.arraysInfo = {};
}
this.arraysInfo[name] = { onPush: onPush, isItemValues: false };
var self = this;
newArray.push = function (value) {
var result = Object.getPrototypeOf(newArray).push.call(newArray, value);
if (onPush)
onPush(value, newArray.length - 1);
var arrayChanges = new ArrayChanges(newArray.length - 1, 0, [value], []);
self.propertyValueChanged(name, newArray, newArray, arrayChanges);
self.notifyArrayChanged(newArray);
return result;
};
newArray.unshift = function (value) {
var result = Object.getPrototypeOf(newArray).unshift.call(newArray, value);
if (onPush)
onPush(value, newArray.length - 1);
var arrayChanges = new ArrayChanges(0, 0, [value], []);
self.propertyValueChanged(name, newArray, newArray, arrayChanges);
self.notifyArrayChanged(newArray);
return result;
};
newArray.pop = function () {
var result = Object.getPrototypeOf(newArray).pop.call(newArray);
if (onRemove)
onRemove(result);
var arrayChanges = new ArrayChanges(newArray.length - 1, 1, [], []);
self.propertyValueChanged(name, newArray, newArray, arrayChanges);
self.notifyArrayChanged(newArray);
return result;
};
newArray.splice = function (start, deleteCount) {
var _a;
var items = [];
for (var _i = 2; _i < arguments.length; _i++) {
items[_i - 2] = arguments[_i];
}
if (!start)
start = 0;
if (!deleteCount)
deleteCount = 0;
var result = (_a = Object.getPrototypeOf(newArray).splice).call.apply(_a, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["d" /* __spreadArrays */])([newArray,
start,
deleteCount], items));
if (!items)
items = [];
if (onRemove && result) {
for (var i = 0; i < result.length; i++) {
onRemove(result[i]);
}
}
if (onPush) {
for (var i = 0; i < items.length; i++) {
onPush(items[i], start + i);
}
}
var arrayChanges = new ArrayChanges(start, deleteCount, items, result);
self.propertyValueChanged(name, newArray, newArray, arrayChanges);
self.notifyArrayChanged(newArray);
return result;
};
return newArray;
};
Base.prototype.getItemValueType = function () {
return undefined;
};
Base.prototype.setArray = function (name, src, dest, isItemValues, onPush) {
var deletedItems = [].concat(src);
Object.getPrototypeOf(src).splice.call(src, 0, src.length);
if (!!dest) {
for (var i = 0; i < dest.length; i++) {
var item = dest[i];
if (isItemValues) {
if (!!Base.createItemValue) {
item = Base.createItemValue(item, this.getItemValueType());
}
}
Object.getPrototypeOf(src).push.call(src, item);
if (onPush)
onPush(src[i]);
}
}
var arrayChanges = new ArrayChanges(0, deletedItems.length, src, deletedItems);
this.propertyValueChanged(name, deletedItems, src, arrayChanges);
this.notifyArrayChanged(src);
};
Base.prototype.isTwoValueEquals = function (x, y, caseInSensitive) {
if (caseInSensitive === void 0) { caseInSensitive = false; }
if (caseInSensitive) {
x = this.getValueInLowCase(x);
y = this.getValueInLowCase(y);
}
return __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isTwoValueEquals(x, y);
};
Base.copyObject = function (dst, src) {
for (var key in src) {
var source = src[key];
if (typeof source === "object") {
source = {};
this.copyObject(source, src[key]);
}
dst[key] = source;
}
};
Base.prototype.copyCssClasses = function (dest, source) {
if (!source)
return;
if (typeof source === "string" || source instanceof String) {
dest["root"] = source;
}
else {
SurveyElement.copyObject(dest, source);
}
};
Base.prototype.getValueInLowCase = function (val) {
if (!!val && typeof val == "string")
return val.toLowerCase();
return val;
};
return Base;
}());
var ArrayChanges = /** @class */ (function () {
function ArrayChanges(index, deleteCount, itemsToAdd, deletedItems) {
this.index = index;
this.deleteCount = deleteCount;
this.itemsToAdd = itemsToAdd;
this.deletedItems = deletedItems;
}
return ArrayChanges;
}());
var SurveyError = /** @class */ (function () {
function SurveyError(text, errorOwner) {
if (text === void 0) { text = null; }
if (errorOwner === void 0) { errorOwner = null; }
this.text = text;
this.errorOwner = errorOwner;
this.visible = true;
}
Object.defineProperty(SurveyError.prototype, "locText", {
get: function () {
if (!this.locTextValue) {
this.locTextValue = new __WEBPACK_IMPORTED_MODULE_1__localizablestring__["a" /* LocalizableString */](this.errorOwner, true);
this.locTextValue.text = this.getText();
}
return this.locTextValue;
},
enumerable: true,
configurable: true
});
SurveyError.prototype.getText = function () {
var res = this.text;
if (!res)
res = this.getDefaultText();
if (!!this.errorOwner) {
res = this.errorOwner.getErrorCustomText(res, this);
}
return res;
};
SurveyError.prototype.getErrorType = function () {
return "base";
};
SurveyError.prototype.getDefaultText = function () {
return "";
};
return SurveyError;
}());
/**
* Base class of SurveyJS Elements.
*/
var SurveyElement = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyElement, _super);
function SurveyElement(name) {
var _this = _super.call(this) || this;
_this.selectedElementInDesignValue = _this;
_this.disableDesignActions = SurveyElement.CreateDisabledDesignElements;
_this.isContentElement = false;
_this.name = name;
_this.createNewArray("errors");
var self = _this;
_this.registerFunctionOnPropertyValueChanged("isReadOnly", function () {
self.onReadOnlyChanged();
});
return _this;
}
SurveyElement.createProgressInfo = function () {
return {
questionCount: 0,
answeredQuestionCount: 0,
requiredQuestionCount: 0,
requiredAnsweredQuestionCount: 0,
};
};
SurveyElement.getProgressInfoByElements = function (children, isRequired) {
var info = SurveyElement.createProgressInfo();
for (var i = 0; i < children.length; i++) {
if (!children[i].isVisible)
continue;
var childInfo = children[i].getProgressInfo();
info.questionCount += childInfo.questionCount;
info.answeredQuestionCount += childInfo.answeredQuestionCount;
info.requiredQuestionCount += childInfo.requiredQuestionCount;
info.requiredAnsweredQuestionCount +=
childInfo.requiredAnsweredQuestionCount;
}
if (isRequired && info.questionCount > 0) {
if (info.requiredQuestionCount == 0)
info.requiredQuestionCount = 1;
if (info.answeredQuestionCount > 0)
info.requiredAnsweredQuestionCount = 1;
}
return info;
};
SurveyElement.ScrollElementToTop = function (elementId) {
if (!elementId || typeof document === "undefined")
return false;
var el = document.getElementById(elementId);
if (!el || !el.scrollIntoView)
return false;
var elemTop = el.getBoundingClientRect().top;
if (elemTop < 0)
el.scrollIntoView();
return elemTop < 0;
};
SurveyElement.GetFirstNonTextElement = function (elements, removeSpaces) {
if (removeSpaces === void 0) { removeSpaces = false; }
if (!elements || !elements.length || elements.length == 0)
return null;
if (removeSpaces) {
var tEl = elements[0];
if (tEl.nodeName === "#text")
tEl.data = "";
tEl = elements[elements.length - 1];
if (tEl.nodeName === "#text")
tEl.data = "";
}
for (var i = 0; i < elements.length; i++) {
if (elements[i].nodeName != "#text" && elements[i].nodeName != "#comment")
return elements[i];
}
return null;
};
SurveyElement.FocusElement = function (elementId) {
if (!elementId || typeof document === "undefined")
return false;
var el = document.getElementById(elementId);
if (el) {
el.focus();
return true;
}
return false;
};
SurveyElement.prototype.setSurveyImpl = function (value) {
this.surveyImplValue = value;
if (!this.surveyImplValue)
return;
this.surveyDataValue = this.surveyImplValue.geSurveyData();
this.surveyValue = this.surveyImplValue.getSurvey();
this.textProcessorValue = this.surveyImplValue.getTextProcessor();
this.onSetData();
};
Object.defineProperty(SurveyElement.prototype, "surveyImpl", {
get: function () {
return this.surveyImplValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "data", {
get: function () {
return this.surveyDataValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "survey", {
/**
* Returns the survey object.
*/
get: function () {
if (!!this.surveyValue)
return this.surveyValue;
if (!!this.surveyImplValue) {
this.surveyValue = this.surveyImplValue.getSurvey();
}
return this.surveyValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "isDesignMode", {
/**
* Returns true if the question in design mode right now.
*/
get: function () {
return !!this.survey && this.survey.isDesignMode;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "areInvisibleElementsShowing", {
get: function () {
return (!!this.survey &&
this.survey.areInvisibleElementsShowing &&
!this.isContentElement);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "isVisible", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "isReadOnly", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "readOnly", {
/**
* Set it to true to make an element question/panel/page readonly.
* Please note, this property is hidden for question without input, for example html question.
* @see enableIf
* @see isReadOnly
*/
get: function () {
return this.getPropertyValue("readOnly", false);
},
set: function (val) {
if (this.readOnly == val)
return;
this.setPropertyValue("readOnly", val);
if (!this.isLoadingFromJson) {
this.setPropertyValue("isReadOnly", this.isReadOnly);
}
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.onReadOnlyChanged = function () {
if (!!this.readOnlyChangedCallback) {
this.readOnlyChangedCallback();
}
};
SurveyElement.prototype.updateElementCss = function () { };
SurveyElement.prototype.getIsLoadingFromJson = function () {
if (_super.prototype.getIsLoadingFromJson.call(this))
return true;
return this.survey ? this.survey.isLoadingFromJson : false;
};
Object.defineProperty(SurveyElement.prototype, "name", {
/**
* This is the identifier of a survey element - question or panel.
* @see valueName
*/
get: function () {
return this.getPropertyValue("name", "");
},
set: function (val) {
var oldValue = this.name;
this.setPropertyValue("name", this.getValidName(val));
if (!this.isLoadingFromJson && !!oldValue) {
this.onNameChanged(oldValue);
}
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.getValidName = function (name) {
return name;
};
SurveyElement.prototype.onNameChanged = function (oldValue) { };
SurveyElement.prototype.updateBindingValue = function (valueName, value) {
if (!!this.data &&
!__WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isTwoValueEquals(value, this.data.getValue(valueName))) {
this.data.setValue(valueName, value, false);
}
};
Object.defineProperty(SurveyElement.prototype, "errors", {
/**
* The list of errors. It is created by callig hasErrors functions
* @see hasErrors
*/
get: function () {
return this.getPropertyValue("errors");
},
set: function (val) {
this.setPropertyValue("errors", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "containsErrors", {
/**
* Returns true if a question or a container (panel/page) or their chidren have an error.
* The value can be out of date. hasErrors function should be called to get the correct value.
*/
get: function () {
return this.getPropertyValue("containsErrors", false);
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.updateContainsErrors = function () {
this.setPropertyValue("containsErrors", this.getContainsErrors());
};
SurveyElement.prototype.getContainsErrors = function () {
return this.errors.length > 0;
};
SurveyElement.prototype.getElementsInDesign = function (includeHidden) {
if (includeHidden === void 0) { includeHidden = false; }
return [];
};
Object.defineProperty(SurveyElement.prototype, "selectedElementInDesign", {
get: function () {
return this.selectedElementInDesignValue;
},
set: function (val) {
this.selectedElementInDesignValue = val;
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.updateCustomWidgets = function () { };
SurveyElement.prototype.onSurveyLoad = function () { };
SurveyElement.prototype.onFirstRendering = function () { };
SurveyElement.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
if (!this.survey) {
this.onSurveyLoad();
}
};
SurveyElement.prototype.setVisibleIndex = function (index) {
return 0;
};
Object.defineProperty(SurveyElement.prototype, "isPage", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "isPanel", {
/**
* Return false if it is not panel.
*/
get: function () {
return false;
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.delete = function () { };
SurveyElement.prototype.removeSelfFromList = function (list) {
if (!list || !Array.isArray(list))
return;
var index = list.indexOf(this);
if (index > -1) {
list.splice(index, 1);
}
};
Object.defineProperty(SurveyElement.prototype, "textProcessor", {
get: function () {
return this.textProcessorValue;
},
enumerable: true,
configurable: true
});
SurveyElement.prototype.getProcessedHtml = function (html) {
if (!html || !this.textProcessor)
return html;
return this.textProcessor.processText(html, true);
};
SurveyElement.prototype.onSetData = function () { };
SurveyElement.prototype.getPage = function (parent) {
while (parent && parent.parent)
parent = parent.parent;
if (parent && parent.getType() == "page")
return parent;
return null;
};
SurveyElement.prototype.moveToBase = function (parent, container, insertBefore) {
if (insertBefore === void 0) { insertBefore = null; }
if (!container)
return false;
parent.removeElement(this);
var index = -1;
if (__WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isNumber(insertBefore)) {
index = parseInt(insertBefore);
}
if (index == -1 && !!insertBefore && !!insertBefore.getType) {
index = container.indexOf(insertBefore);
}
container.addElement(this, index);
return true;
};
SurveyElement.prototype.setPage = function (parent, val) {
var oldPage = this.getPage(parent);
if (oldPage === val)
return;
if (parent)
parent.removeElement(this);
if (val) {
val.addElement(this, -1);
}
};
SurveyElement.CreateDisabledDesignElements = false;
return SurveyElement;
}(Base));
var Event = /** @class */ (function () {
function Event() {
}
Object.defineProperty(Event.prototype, "isEmpty", {
get: function () {
return this.callbacks == null || this.callbacks.length == 0;
},
enumerable: true,
configurable: true
});
Event.prototype.fire = function (sender, options) {
if (this.callbacks == null)
return;
for (var i = 0; i < this.callbacks.length; i++) {
this.callbacks[i](sender, options);
}
};
Event.prototype.clear = function () {
this.callbacks = [];
this.fireCallbackChanged();
};
Event.prototype.add = function (func) {
if (this.hasFunc(func))
return;
if (this.callbacks == null) {
this.callbacks = new Array();
}
this.callbacks.push(func);
this.fireCallbackChanged();
};
Event.prototype.remove = function (func) {
if (this.hasFunc(func)) {
var index = this.callbacks.indexOf(func, 0);
this.callbacks.splice(index, 1);
this.fireCallbackChanged();
}
};
Event.prototype.hasFunc = function (func) {
if (this.callbacks == null)
return false;
return this.callbacks.indexOf(func, 0) > -1;
};
Event.prototype.fireCallbackChanged = function () {
if (!!this.onCallbacksChanged) {
this.onCallbacksChanged();
}
};
return Event;
}());
/***/ }),
/* 8 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionFactory; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ElementFactory; });
//TODO replace completely with ElementFactory
var QuestionFactory = /** @class */ (function () {
function QuestionFactory() {
this.creatorHash = {};
}
Object.defineProperty(QuestionFactory, "DefaultChoices", {
get: function () {
return [
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "1",
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "2",
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item") + "3"
];
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFactory, "DefaultColums", {
get: function () {
var colName = __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("matrix_column") + " ";
return [colName + "1", colName + "2", colName + "3"];
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFactory, "DefaultRows", {
get: function () {
var rowName = __WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].getString("matrix_row") + " ";
return [rowName + "1", rowName + "2"];
},
enumerable: true,
configurable: true
});
QuestionFactory.prototype.registerQuestion = function (questionType, questionCreator) {
this.creatorHash[questionType] = questionCreator;
};
QuestionFactory.prototype.unregisterElement = function (elementType) {
delete this.creatorHash[elementType];
};
QuestionFactory.prototype.clear = function () {
this.creatorHash = {};
};
QuestionFactory.prototype.getAllTypes = function () {
var result = new Array();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
QuestionFactory.prototype.createQuestion = function (questionType, name) {
var creator = this.creatorHash[questionType];
if (creator == null)
return null;
return creator(name);
};
QuestionFactory.Instance = new QuestionFactory();
return QuestionFactory;
}());
var ElementFactory = /** @class */ (function () {
function ElementFactory() {
this.creatorHash = {};
}
ElementFactory.prototype.registerElement = function (elementType, elementCreator) {
this.creatorHash[elementType] = elementCreator;
};
ElementFactory.prototype.clear = function () {
this.creatorHash = {};
};
ElementFactory.prototype.unregisterElement = function (elementType, removeFromSerializer) {
if (removeFromSerializer === void 0) { removeFromSerializer = false; }
delete this.creatorHash[elementType];
QuestionFactory.Instance.unregisterElement(elementType);
if (removeFromSerializer) {
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].removeClass(elementType);
}
};
ElementFactory.prototype.getAllTypes = function () {
var result = QuestionFactory.Instance.getAllTypes();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
ElementFactory.prototype.createElement = function (elementType, name) {
var creator = this.creatorHash[elementType];
if (creator == null)
return QuestionFactory.Instance.createQuestion(elementType, name);
return creator(name);
};
ElementFactory.Instance = new ElementFactory();
return ElementFactory;
}());
/***/ }),
/* 9 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return settings; });
/**
* Global survey settings
*/
var settings = {
/**
* The prefix that uses to store the question comment, as {questionName} + {commentPrefix}.
* The default
*/
commentPrefix: "-Comment",
/**
* Encode parameter on calling restfull web API
*/
webserviceEncodeParameters: true,
/**
* Cache the result for choices getting from web services. Set this property to false, to disable the caching.
*/
useCachingForChoicesRestfull: true,
/**
* SurveyJS web service API url
*/
surveyServiceUrl: "https://api.surveyjs.io/public/v1/Survey",
/**
* separator that can allow to set value and text of ItemValue object in one string as: "value|text"
*/
itemValueSeparator: "|",
/**
* default locale name for localizable strings that uses during serialization, {"default": "My text", "de": "Mein Text"}
*/
defaultLocaleName: "default",
/**
* Default row name for matrix (single choice)
*/
matrixDefaultRowName: "default",
/**
* Default cell type for dropdown and dynamic matrices
*/
matrixDefaultCellType: "dropdown",
/**
* Total value postfix for dropdown and dynamic matrices. The total value stores as: {matrixName} + {postfix}
*/
matrixTotalValuePostFix: "-total",
/**
* Maximum row count in dynamic matrix
*/
matrixMaximumRowCount: 1000,
/**
* Maximum rowCount that returns in addConditionObjectsByContext function
*/
matrixMaxRowCountInCondition: 1,
/**
* Maximum panel count in dynamic panel
*/
panelMaximumPanelCount: 100,
/**
* Maximum rate value count in rating question
*/
ratingMaximumRateValueCount: 20,
/**
* Disable the question while choices are getting from the web service
*/
disableOnGettingChoicesFromWeb: false,
/**
* Set to true to always serialize the localization string as object even if there is only one value for default locale. Instead of string "MyStr" serialize as {default: "MyStr"}
*/
serializeLocalizableStringAsObject: false,
/**
* Set to false to hide empty page title and description in design mode
*/
allowShowEmptyTitleInDesignMode: true,
/**
* Set to false to hide empty page description in design mode
*/
allowShowEmptyDescriptionInDesignMode: true,
/**
* Set this property to true to execute the complete trigger on value change instead of on next page.
*/
executeCompleteTriggerOnValueChanged: false,
/**
* Set this property to false to execute the skip trigger on next page instead of on value change.
*/
executeSkipTriggerOnValueChanged: true,
/**
* Set this property to change readOnlyCommentRenderMode: "textarea" (default) or (div)
*/
readOnlyCommentRenderMode: "textarea",
/**
* Override this function, set your function, if you want to show your own dialog confirm window instead of standard browser window.
* @param message
*/
confirmActionFunc: function (message) {
return confirm(message);
},
/**
* Set this property to change the default value of the minWidth constraint
*/
minWidth: "300px",
/**
* Set this property to change the default value of the minWidth constraint
*/
maxWidth: "initial",
/**
* This property tells how many times survey re-run expressions on value changes during condition running. We need it to avoid recursions in the expressions
*/
maximumConditionRunCountOnValueChanged: 10,
/**
* By default visibleIndex for question with titleLocation = "hidden" is -1, and survey doesn't count these questions when set questions numbers.
* Set it true, and a question next to a question with hidden title will increase it's number.
*/
setQuestionVisibleIndexForHiddenTitle: false,
/**
* By default visibleIndex for question with hideNumber = true is -1, and survey doesn't count these questions when set questions numbers.
* Set it true, and a question next to a question with hidden title number will increase it's number.
*/
setQuestionVisibleIndexForHiddenNumber: false,
/**
* By default all rows are rendered no matters whwther they are visible.
* Set it true, and survey markup rows will be rendered only if they are visible in viewport.
* This feature is experimantal and might do not support all the use cases.
*/
lazyRowsRendering: false,
};
/***/ }),
/* 10 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__validator__ = __webpack_require__(34);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__questionCustomWidgets__ = __webpack_require__(49);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Question; });
/**
* A base class for all questions.
*/
var Question = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(Question, _super);
function Question(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.conditionRunner = null;
_this.isCustomWidgetRequested = false;
_this.customWidgetData = { isNeedRender: true };
_this.isReadyValue = true;
/**
* The event is fired when isReady property of question is changed.
* options.question - the question
* options.isReady - current value of isReady
* options.oldIsReady - old value of isReady
*/
_this.onReadyChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
_this.isRunningValidatorsValue = false;
_this.isValueChangedInSurvey = false;
_this.allowNotifyValueChanged = true;
_this.locNotificationInData = false;
//ILocalizableOwner
_this.locOwner = null;
_this.id = Question.getQuestionId();
_this.onCreating();
var self = _this;
_this.createNewArray("validators", function (validator) {
validator.errorOwner = self;
});
var locTitleValue = _this.createLocalizableString("title", _this, true);
locTitleValue.onGetTextCallback = function (text) {
if (!text) {
text = self.name;
}
if (!self.survey)
return text;
return self.survey.getUpdatedQuestionTitle(self, text);
};
_this.locProcessedTitle = new __WEBPACK_IMPORTED_MODULE_7__localizablestring__["a" /* LocalizableString */](_this, true);
_this.locProcessedTitle.sharedData = locTitleValue;
var locCommentText = _this.createLocalizableString("commentText", _this, true);
locCommentText.onGetTextCallback = function (text) {
return !!text ? text : __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText");
};
_this.createLocalizableString("requiredErrorText", _this);
_this.registerFunctionOnPropertyValueChanged("width", function () {
self.updateElementCss();
if (!!self.parent) {
self.parent.elementWidthChanged(self);
}
});
_this.registerFunctionOnPropertiesValueChanged(["indent", "rightIndent"], function () {
self.onIndentChanged();
});
_this.registerFunctionOnPropertiesValueChanged(["hasComment", "hasOther"], function () {
self.initCommentFromSurvey();
});
return _this;
}
Question.getQuestionId = function () {
return "sq_" + Question.questionCounter++;
};
Question.prototype.isReadOnlyRenderDiv = function () {
return this.isReadOnly && __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].readOnlyCommentRenderMode === "div";
};
Question.prototype.getValueName = function () {
if (!!this.valueName)
return this.valueName.toString();
return this.name;
};
Object.defineProperty(Question.prototype, "valueName", {
/**
* Use this property if you want to store the question result in the name different from the question name.
* Question name should be unique in the survey and valueName could be not unique. It allows to share data between several questions with the same valueName.
* The library set the value automatically if the question.name property is not valid. For example, if it contains the period '.' symbol.
* In this case if you set the question.name property to 'x.y' then the valueName becomes 'x y'.
* Please note, this property is hidden for questions without input, for example html question.
* @see name
*/
get: function () {
return this.getPropertyValue("valueName", "");
},
set: function (val) {
var oldValueName = this.getValueName();
this.setPropertyValue("valueName", val);
this.onValueNameChanged(oldValueName);
},
enumerable: true,
configurable: true
});
Question.prototype.onValueNameChanged = function (oldValue) {
if (!this.survey)
return;
this.survey.questionRenamed(this, this.name, !!oldValue ? oldValue : this.name);
this.initDataFromSurvey();
};
Question.prototype.onNameChanged = function (oldValue) {
if (!this.survey)
return;
this.survey.questionRenamed(this, oldValue, this.valueName ? this.valueName : oldValue);
};
Object.defineProperty(Question.prototype, "isReady", {
get: function () {
return this.isReadyValue;
},
enumerable: true,
configurable: true
});
/**
* Get is question ready to use
*/
Question.prototype.choicesLoaded = function () { };
Object.defineProperty(Question.prototype, "page", {
/**
* Get/set the page where the question is located.
*/
get: function () {
return this.getPage(this.parent);
},
set: function (val) {
this.setPage(this.parent, val);
},
enumerable: true,
configurable: true
});
Question.prototype.getPanel = function () {
return null;
};
Question.prototype.delete = function () {
if (!!this.parent) {
this.removeSelfFromList(this.parent.elements);
}
};
Object.defineProperty(Question.prototype, "isFlowLayout", {
get: function () {
return this.getLayoutType() === "flow";
},
enumerable: true,
configurable: true
});
Question.prototype.getLayoutType = function () {
if (!!this.parent)
return this.parent.getChildrenLayoutType();
return "row";
};
Question.prototype.isLayoutTypeSupported = function (layoutType) {
return layoutType !== "flow";
};
Object.defineProperty(Question.prototype, "visible", {
/**
* Use it to get/set the question visibility.
* @see visibleIf
*/
get: function () {
return this.getPropertyValue("visible", true);
},
set: function (val) {
if (val == this.visible)
return;
this.setPropertyValue("visible", val);
this.onVisibleChanged();
this.notifySurveyVisibilityChanged();
},
enumerable: true,
configurable: true
});
Question.prototype.onVisibleChanged = function () {
this.setPropertyValue("isVisible", this.isVisible);
if (this.isVisible && this.survey && this.survey.isClearValueOnHidden) {
this.updateValueWithDefaults();
}
if (!this.isVisible && this.errors && this.errors.length > 0) {
this.errors = [];
}
};
Object.defineProperty(Question.prototype, "useDisplayValuesInTitle", {
/**
* Use it to choose how other question values will be rendered in title if referenced in {}.
* Please note, this property is hidden for question without input, for example html question.
*/
get: function () {
return this.getPropertyValue("useDisplayValuesInTitle", true);
},
set: function (val) {
this.setPropertyValue("useDisplayValuesInTitle", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "visibleIf", {
/**
* An expression that returns true or false. If it returns true the Question becomes visible and if it returns false the Question becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used.
* @see visible
*/
get: function () {
return this.getPropertyValue("visibleIf", "");
},
set: function (val) {
this.setPropertyValue("visibleIf", val);
this.runConditions();
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "isVisible", {
/**
* Returns true if the question is visible or survey is in design mode right now.
*/
get: function () {
if (this.survey && this.survey.areEmptyElementsHidden && this.isEmpty())
return false;
return this.visible || this.areInvisibleElementsShowing;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "visibleIndex", {
/**
* Returns the visible index of the question in the survey. It can be from 0 to all visible questions count - 1
* The visibleIndex is -1 if the title is 'hidden' or hideNumber is true
* @see titleLocation
* @see hideNumber
*/
get: function () {
return this.getPropertyValue("visibleIndex", -1);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hideNumber", {
/**
* Set hideNumber to true to stop showing the number for this question. The question will not be counter
* @see visibleIndex
* @see titleLocation
*/
get: function () {
return this.getPropertyValue("hideNumber", false);
},
set: function (val) {
this.setPropertyValue("hideNumber", val);
this.notifySurveyVisibilityChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "isAllowTitleLeft", {
/**
* Returns true if the question may have a title located on the left
*/
get: function () {
return true;
},
enumerable: true,
configurable: true
});
/**
* Returns the type of the object as a string as it represents in the json.
*/
Question.prototype.getType = function () {
return "question";
};
/**
* Move question to a new container Page/Panel. Add as a last element if insertBefore parameter is not used or inserted into the given index,
* if insert parameter is number, or before the given element, if the insertBefore parameter is a question or panel
* @param container Page or Panel to where a question is relocated.
* @param insertBefore Use it if you want to set the question to a specific position. You may use a number (use 0 to insert int the beginning) or element, if you want to insert before this element.
*/
Question.prototype.moveTo = function (container, insertBefore) {
if (insertBefore === void 0) { insertBefore = null; }
return this.moveToBase(this.parent, container, insertBefore);
};
Question.prototype.getProgressInfo = function () {
if (!this.hasInput)
return _super.prototype.getProgressInfo.call(this);
return {
questionCount: 1,
answeredQuestionCount: !this.isEmpty() ? 1 : 0,
requiredQuestionCount: this.isRequired ? 1 : 0,
requiredAnsweredQuestionCount: !this.isEmpty() && this.isRequired ? 1 : 0,
};
};
Question.prototype.runConditions = function () {
if (this.data && !this.isLoadingFromJson && !this.isDesignMode) {
this.runCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());
this.locStrsChanged();
}
};
Question.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
if (this.survey) {
this.survey.questionCreated(this);
}
if (this.survey && this.survey.isDesignMode && !this.isDesignMode) {
this.onVisibleChanged();
}
this.runConditions();
};
Question.prototype.getDataFilteredValues = function () {
return !!this.data ? this.data.getFilteredValues() : null;
};
Question.prototype.getDataFilteredProperties = function () {
var props = !!this.data ? this.data.getFilteredProperties() : {};
props.question = this;
return props;
};
Object.defineProperty(Question.prototype, "parent", {
/**
* A parent element. It can be panel or page.
*/
get: function () {
return this.getPropertyValue("parent", null);
},
set: function (val) {
this.setPropertyValue("parent", val);
this.updateElementCss();
this.onParentChanged();
},
enumerable: true,
configurable: true
});
Question.prototype.onParentChanged = function () { };
Object.defineProperty(Question.prototype, "hasTitle", {
/**
* Returns false if the question doesn't have a title property, for example: QuestionHtmlModel, or titleLocation property equals to "hidden"
* @see titleLocation
*/
get: function () {
return this.getTitleLocation() !== "hidden";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "titleLocation", {
/**
* Set this property different from "default" to set the specific question title location for this panel/page.
* Please note, this property is hidden for questions without input, for example html question.
* @see SurveyModel.questionTitleLocation
*/
get: function () {
return this.getPropertyValue("titleLocation");
},
set: function (value) {
var isVisibilityChanged = this.titleLocation == "hidden" || value == "hidden";
this.setPropertyValue("titleLocation", value.toLowerCase());
if (!this.isLoadingFromJson) {
this.updateElementCss();
}
if (isVisibilityChanged) {
this.notifySurveyVisibilityChanged();
}
},
enumerable: true,
configurable: true
});
Question.prototype.notifySurveyVisibilityChanged = function () {
if (!this.survey || this.isLoadingFromJson)
return;
this.survey.questionVisibilityChanged(this, this.isVisible);
if (this.survey.isClearValueOnHidden && !this.visible) {
this.clearValue();
}
};
/**
* Return the title location based on question titleLocation property and QuestionTitleLocation of it's parents
* @see titleLocation
* @see PanelModelBase.QuestionTitleLocation
* @see SurveyModel.QuestionTitleLocation
*/
Question.prototype.getTitleLocation = function () {
if (this.isFlowLayout)
return "hidden";
var location = this.getTitleLocationCore();
if (location === "left" && !this.isAllowTitleLeft)
location = "top";
return location;
};
Question.prototype.getTitleLocationCore = function () {
if (this.titleLocation !== "default")
return this.titleLocation;
if (!!this.parent)
return this.parent.getQuestionTitleLocation();
if (!!this.survey)
return this.survey.questionTitleLocation;
return "top";
};
Object.defineProperty(Question.prototype, "hasTitleOnLeft", {
get: function () {
return this.hasTitle && this.getTitleLocation() === "left";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasTitleOnTop", {
get: function () {
return this.hasTitle && this.getTitleLocation() === "top";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasTitleOnBottom", {
get: function () {
return this.hasTitle && this.getTitleLocation() === "bottom";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasTitleOnLeftTop", {
get: function () {
if (!this.hasTitle)
return false;
var location = this.getTitleLocation();
return location === "left" || location === "top";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "errorLocation", {
get: function () {
return this.survey ? this.survey.questionErrorLocation : "top";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasInput", {
/**
* Returns false if the question doesn't have an input element, for example: QuestionHtmlModel
* @see hasSingleInput
*/
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasSingleInput", {
/**
* Returns false if the question doesn't have an input element or have multiple inputs: matrices or panel dynamic
* @see hasInput
*/
get: function () {
return this.hasInput;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "inputId", {
get: function () {
return this.id + "i";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "title", {
/**
* Question title. Use survey questionTitleTemplate property to change the title question is rendered. If it is empty, then question name property is used.
* @see SurveyModel.questionTitleTemplate
*/
get: function () {
return this.getLocalizableStringText("title", this.name);
},
set: function (val) {
this.setLocalizableStringText("title", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locTitle", {
get: function () {
return this.getLocalizableString("title");
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "descriptionLocation", {
/**
* Question description location. By default, value is "default" and it depends on survey questionDescriptionLocation property
* You may change it to "underInput" to render it under question input or "underTitle" to rendered it under title.
* @see description
* @see Survey.questionDescriptionLocation
*/
get: function () {
return this.getPropertyValue("descriptionLocation");
},
set: function (val) {
this.setPropertyValue("descriptionLocation", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasDescriptionUnderTitle", {
get: function () {
return this.getDescriptionLocation() == "underTitle";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasDescriptionUnderInput", {
get: function () {
return this.getDescriptionLocation() == "underInput";
},
enumerable: true,
configurable: true
});
Question.prototype.getDescriptionLocation = function () {
if (this.descriptionLocation !== "default")
return this.descriptionLocation;
return !!this.survey
? this.survey.questionDescriptionLocation
: "underTitle";
};
Object.defineProperty(Question.prototype, "clickTitleFunction", {
get: function () {
if (this.hasInput) {
var self = this;
return function () {
self.focus();
return true;
};
}
return undefined;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "requiredErrorText", {
/**
* The custom text that will be shown on required error. Use this property, if you do not want to show the default text.
* Please note, this property is hidden for question without input, for example html question.
*/
get: function () {
return this.getLocalizableStringText("requiredErrorText");
},
set: function (val) {
this.setLocalizableStringText("requiredErrorText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locRequiredErrorText", {
get: function () {
return this.getLocalizableString("requiredErrorText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "commentText", {
/**
* Use it to get or set the comment value.
*/
get: function () {
return this.getLocalizableStringText("commentText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText"));
},
set: function (val) {
this.setLocalizableStringText("commentText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "locCommentText", {
get: function () {
return this.getLocalizableString("commentText");
},
enumerable: true,
configurable: true
});
/**
* Returns a copy of question errors survey. For some questions like matrix and panel dynamic it includes the errors of nested questions.
*/
Question.prototype.getAllErrors = function () {
return this.errors.slice();
};
Question.prototype.getErrorByType = function (errorType) {
for (var i = 0; i < this.errors.length; i++) {
if (this.errors[i].getErrorType() === errorType)
return this.errors[i];
}
return null;
};
Object.defineProperty(Question.prototype, "customWidget", {
/**
* The link to the custom widget.
*/
get: function () {
if (!this.isCustomWidgetRequested && !this.customWidgetValue) {
this.isCustomWidgetRequested = true;
this.updateCustomWidget();
}
return this.customWidgetValue;
},
enumerable: true,
configurable: true
});
Question.prototype.updateCustomWidget = function () {
this.customWidgetValue = __WEBPACK_IMPORTED_MODULE_9__questionCustomWidgets__["a" /* CustomWidgetCollection */].Instance.getCustomWidget(this);
};
Object.defineProperty(Question.prototype, "isCompositeQuestion", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Question.prototype.afterRenderQuestionElement = function (el) {
if (!this.survey || !this.hasSingleInput)
return;
this.survey.afterRenderQuestionInput(this, el);
};
Question.prototype.afterRender = function (el) {
if (!this.survey)
return;
this.survey.afterRenderQuestion(this, el);
if (!!this.afterRenderQuestionCallback) {
this.afterRenderQuestionCallback(this, el);
}
};
Question.prototype.beforeDestroyQuestionElement = function (el) { };
Object.defineProperty(Question.prototype, "processedTitle", {
/**
* Returns the rendred question title.
*/
get: function () {
var res = this.locProcessedTitle.textOrHtml;
return res ? res : this.name;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "fullTitle", {
/**
* Returns the title after processing the question template.
* @see SurveyModel.questionTitleTemplate
*/
get: function () {
return this.locTitle.renderedHtml;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "titlePattern", {
get: function () {
return !!this.survey ? this.survey.questionTitlePattern : "numTitleRequire";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "isRequireTextOnStart", {
get: function () {
return this.isRequired && this.titlePattern == "requireNumTitle";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "isRequireTextBeforeTitle", {
get: function () {
return this.isRequired && this.titlePattern == "numRequireTitle";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "isRequireTextAfterTitle", {
get: function () {
return this.isRequired && this.titlePattern == "numTitleRequire";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "startWithNewLine", {
/**
* The Question renders on the new line if the property is true. If the property is false, the question tries to render on the same line/row with a previous question/panel.
*/
get: function () {
return this.getPropertyValue("startWithNewLine", true);
},
set: function (val) {
if (this.startWithNewLine == val)
return;
this.setPropertyValue("startWithNewLine", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "cssClasses", {
/**
* Returns all css classes that used for rendering the question. You may use survey.updateQuestionCssClasses event to override css classes for a question.
* @see SurveyModel.updateQuestionCssClasses
*/
get: function () {
var css = this.css;
var classes = { error: {} };
this.copyCssClasses(classes, css.question);
this.copyCssClasses(classes.error, css.error);
this.updateCssClasses(classes, css);
if (this.survey) {
this.survey.updateQuestionCssClasses(this, classes);
}
this.updateElementCssCore(classes);
return classes;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "cssRoot", {
get: function () {
return this.getPropertyValue("cssRoot", "");
},
enumerable: true,
configurable: true
});
Question.prototype.setCssRoot = function (val) {
this.setPropertyValue("cssRoot", val);
};
Question.prototype.getCssRoot = function (cssClasses) {
var res = this.isFlowLayout && !this.isDesignMode
? cssClasses.flowRoot
: cssClasses.mainRoot;
if (!res)
res = "";
if (!this.isFlowLayout &&
this.hasTitleOnLeft &&
!!cssClasses.titleLeftRoot) {
res += " " + cssClasses.titleLeftRoot;
}
if (this.errors.length > 0 && !!cssClasses.hasError) {
res += " " + cssClasses.hasError;
}
if (cssClasses.small && !this.width) {
res += " " + cssClasses.small;
}
return res;
};
Object.defineProperty(Question.prototype, "cssHeader", {
get: function () {
return this.getPropertyValue("cssHeader", "");
},
enumerable: true,
configurable: true
});
Question.prototype.setCssHeader = function (val) {
this.setPropertyValue("cssHeader", val);
};
Question.prototype.getCssHeader = function (cssClasses) {
var res = cssClasses.header || "";
if (this.hasTitleOnTop && !!cssClasses.headerTop) {
res += " " + cssClasses.headerTop;
}
if (this.hasTitleOnLeft && !!cssClasses.headerLeft) {
res += " " + cssClasses.headerLeft;
}
if (this.hasTitleOnBottom && !!cssClasses.headerBottom) {
res += " " + cssClasses.headerBottom;
}
return res;
};
Object.defineProperty(Question.prototype, "cssContent", {
get: function () {
return this.getPropertyValue("cssContent", "");
},
enumerable: true,
configurable: true
});
Question.prototype.setCssContent = function (val) {
this.setPropertyValue("cssContent", val);
};
Question.prototype.getCssContent = function (cssClasses) {
var res = cssClasses.content || "";
if (this.hasTitleOnLeft && !!cssClasses.contentLeft) {
res += " " + cssClasses.contentLeft;
}
return res;
};
Object.defineProperty(Question.prototype, "cssTitle", {
get: function () {
return this.getPropertyValue("cssTitle", "");
},
enumerable: true,
configurable: true
});
Question.prototype.setCssTitle = function (val) {
this.setPropertyValue("cssTitle", val);
};
Question.prototype.getCssTitle = function (cssClasses) {
var result = cssClasses.title;
if (this.containsErrors) {
if (!!cssClasses.titleOnError) {
result += " " + cssClasses.titleOnError;
}
}
else if (this.isAnswered && !!cssClasses.titleOnAnswer) {
result += " " + cssClasses.titleOnAnswer;
}
return result;
};
Object.defineProperty(Question.prototype, "cssError", {
get: function () {
return this.getPropertyValue("cssError", "");
},
enumerable: true,
configurable: true
});
Question.prototype.setCssError = function (val) {
this.setPropertyValue("cssError", val);
};
//TODO was not removed from other places
Question.prototype.getCssError = function (cssClasses) {
var res = cssClasses.error.root || "";
if (this.errorLocation == "top") {
if (!!cssClasses.error.locationTop) {
res += " " + cssClasses.error.locationTop;
}
}
else if (this.errorLocation === "bottom" &&
!!cssClasses.error.locationBottom) {
res += " " + cssClasses.error.locationBottom;
}
return res;
};
Question.prototype.updateElementCss = function () {
if (this.isLoadingFromJson)
return;
this.updateElementCssCore(this.cssClasses);
};
Question.prototype.updateElementCssCore = function (cssClasses) {
this.setCssRoot(this.getCssRoot(cssClasses));
this.setCssHeader(this.getCssHeader(cssClasses));
this.setCssContent(this.getCssContent(cssClasses));
this.setCssTitle(this.getCssTitle(cssClasses));
this.setCssError(this.getCssError(cssClasses));
};
Question.prototype.updateCssClasses = function (res, css) {
if (!css.question)
return;
if (this.isRequired) {
if (!!css.question.required) {
res.root = (res.root ? res.root + " " : "") + objCss;
}
if (css.question.titleRequired) {
res.title += " " + css.question.titleRequired;
}
}
var objCss = css[this.getCssType()];
if (objCss === undefined || objCss === null)
return;
if (typeof objCss === "string" || objCss instanceof String) {
res.root = (res.root ? res.root + " " : "") + objCss;
}
else {
for (var key in objCss) {
res[key] = objCss[key];
}
}
};
Question.prototype.getCssType = function () {
return this.getType();
};
Object.defineProperty(Question.prototype, "css", {
get: function () {
return !!this.survey ? this.survey.getCss() : {};
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "width", {
/**
* Use it to set the specific width to the question like css style (%, px, em etc).
*/
get: function () {
return this.getPropertyValue("width", "");
},
set: function (val) {
this.setPropertyValue("width", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "minWidth", {
/**
* Use it to set the specific minWidth constraint to the question like css style (%, px, em etc).
*/
get: function () {
return this.getPropertyValue("minWidth", __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].minWidth);
},
set: function (val) {
this.setPropertyValue("minWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "maxWidth", {
/**
* Use it to set the specific maxWidth constraint to the question like css style (%, px, em etc).
*/
get: function () {
return this.getPropertyValue("maxWidth", __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].maxWidth);
},
set: function (val) {
this.setPropertyValue("maxWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "renderWidth", {
/**
* The rendered width of the question.
*/
get: function () {
return this.getPropertyValue("renderWidth", "");
},
set: function (val) {
this.setPropertyValue("renderWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "indent", {
/**
* Set it different from 0 to increase the left padding.
*/
get: function () {
return this.getPropertyValue("indent", 0);
},
set: function (val) {
this.setPropertyValue("indent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "rightIndent", {
/**
* Set it different from 0 to increase the right padding.
*/
get: function () {
return this.getPropertyValue("rightIndent", 0);
},
set: function (val) {
this.setPropertyValue("rightIndent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "paddingLeft", {
get: function () {
return this.getPropertyValue("paddintLeft", "");
},
set: function (val) {
this.setPropertyValue("paddintLeft", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "paddingRight", {
get: function () {
return this.getPropertyValue("paddingRight", "");
},
set: function (val) {
this.setPropertyValue("paddingRight", val);
},
enumerable: true,
configurable: true
});
Question.prototype.onIndentChanged = function () {
this.paddingLeft = this.getIndentSize(this.indent);
this.paddingRight = this.getIndentSize(this.rightIndent);
};
Question.prototype.getIndentSize = function (indent) {
if (indent < 1)
return "";
return indent * this.cssClasses.indent + "px";
};
/**
* Move the focus to the input of this question.
* @param onError set this parameter to true, to focus the input with the first error, other wise the first input will be focused.
*/
Question.prototype.focus = function (onError) {
if (onError === void 0) { onError = false; }
if (this.isDesignMode)
return;
if (!!this.survey) {
this.survey.scrollElementToTop(this, this, null, this.id);
}
var id = !onError
? this.getFirstInputElementId()
: this.getFirstErrorInputElementId();
if (__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */].FocusElement(id)) {
this.fireCallback(this.focusCallback);
}
};
Question.prototype.fireCallback = function (callback) {
if (callback)
callback();
};
Question.prototype.getOthersMaxLength = function () {
if (!this.survey)
return null;
return this.survey.maxOthersLength > 0 ? this.survey.maxOthersLength : null;
};
Question.prototype.onCreating = function () { };
Question.prototype.getFirstInputElementId = function () {
return this.inputId;
};
Question.prototype.getFirstErrorInputElementId = function () {
return this.getFirstInputElementId();
};
Question.prototype.getProcessedTextValue = function (textValue) {
var name = textValue.name.toLocaleLowerCase();
textValue.isExists =
Object.keys(Question.TextPreprocessorValuesMap).indexOf(name) !== -1 ||
this[textValue.name] !== undefined;
textValue.value = this[Question.TextPreprocessorValuesMap[name] || textValue.name];
};
Question.prototype.supportComment = function () {
return false;
};
Question.prototype.supportOther = function () {
return false;
};
Object.defineProperty(Question.prototype, "isRequired", {
/**
* Set this property to true, to make the question a required. If a user doesn't answer the question then a validation error will be generated.
* Please note, this property is hidden for question without input, for example html question.
*/
get: function () {
return this.getPropertyValue("isRequired", false);
},
set: function (val) {
if (this.isRequired == val)
return;
this.setPropertyValue("isRequired", val);
if (!this.isLoadingFromJson) {
this.locTitle.onChanged();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "requiredIf", {
/**
* An expression that returns true or false. If it returns true the Question becomes required and an end-user has to answer it.
* If it returns false the Question then an end-user may not answer it the Question maybe empty.
* The library runs the expression on survey start and on changing a question value. If the property is empty then isRequired property is used.
* Please note, this property is hidden for question without input, for example html question.
* @see isRequired
*/
get: function () {
return this.getPropertyValue("requiredIf", "");
},
set: function (val) {
this.setPropertyValue("requiredIf", val);
this.runConditions();
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasComment", {
/**
* Set it to true, to add a comment for the question.
*/
get: function () {
return this.getPropertyValue("hasComment", false);
},
set: function (val) {
if (!this.supportComment())
return;
this.setPropertyValue("hasComment", val);
if (this.hasComment)
this.hasOther = false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "id", {
/**
* The unique identificator. It is generated automatically.
*/
get: function () {
return this.getPropertyValue("id");
},
set: function (val) {
this.setPropertyValue("id", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "ariaTitleId", {
get: function () {
return this.id + "_ariaTitle";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "ariaRole", {
get: function () {
return null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "hasOther", {
get: function () {
return this.getPropertyValue("hasOther", false);
},
set: function (val) {
if (!this.supportOther() || this.hasOther == val)
return;
this.setPropertyValue("hasOther", val);
if (this.hasOther)
this.hasComment = false;
this.hasOtherChanged();
},
enumerable: true,
configurable: true
});
Question.prototype.hasOtherChanged = function () { };
Object.defineProperty(Question.prototype, "requireUpdateCommentValue", {
get: function () {
return this.hasComment || this.hasOther;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "isReadOnly", {
/**
* Returns true if readOnly property is true or survey is in display mode or parent panel/page is readOnly.
* @see SurveyModel.model
* @see readOnly
*/
get: function () {
var isParentReadOnly = !!this.parent && this.parent.isReadOnly;
var isSurveyReadOnly = !!this.survey && this.survey.isDisplayMode;
return this.readOnly || isParentReadOnly || isSurveyReadOnly;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "enableIf", {
/**
* An expression that returns true or false. If it returns false the Question becomes read only and an end-user will not able to answer on the qustion. The library runs the expression on survey start and on changing a question value. If the property is empty then readOnly property is used.
* Please note, this property is hidden for question without input, for example html question.
* @see readOnly
* @see isReadOnly
*/
get: function () {
return this.getPropertyValue("enableIf", "");
},
set: function (val) {
this.setPropertyValue("enableIf", val);
this.runConditions();
},
enumerable: true,
configurable: true
});
/**
* Run visibleIf and enableIf expressions. If visibleIf or/and enabledIf are not empty, then the results of performing the expression (true or false) set to the visible/readOnly properties.
* @param values Typically survey results
* @see visible
* @see visibleIf
* @see readOnly
* @see enableIf
*/
Question.prototype.runCondition = function (values, properties) {
if (this.isDesignMode)
return;
if (!properties)
properties = {};
properties["question"] = this;
if (!this.areInvisibleElementsShowing) {
this.runVisibleIfCondition(values, properties);
}
this.runEnableIfCondition(values, properties);
this.runRequiredIfCondition(values, properties);
};
Question.prototype.runVisibleIfCondition = function (values, properties) {
var _this = this;
if (!this.visibleIf)
return;
if (!this.conditionRunner)
this.conditionRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["b" /* ConditionRunner */](this.visibleIf);
this.conditionRunner.expression = this.visibleIf;
this.conditionRunner.onRunComplete = function (res) {
_this.visible = res;
};
this.conditionRunner.run(values, properties);
};
Question.prototype.runEnableIfCondition = function (values, properties) {
var _this = this;
if (!this.enableIf)
return;
if (!this.conditionEnabelRunner)
this.conditionEnabelRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["b" /* ConditionRunner */](this.enableIf);
this.conditionEnabelRunner.expression = this.enableIf;
this.conditionEnabelRunner.onRunComplete = function (res) {
_this.readOnly = !res;
};
this.conditionEnabelRunner.run(values, properties);
};
Question.prototype.runRequiredIfCondition = function (values, properties) {
var _this = this;
if (!this.requiredIf)
return;
if (!this.conditionRequiredRunner)
this.conditionRequiredRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["b" /* ConditionRunner */](this.requiredIf);
this.conditionRequiredRunner.expression = this.requiredIf;
this.conditionRequiredRunner.onRunComplete = function (res) {
_this.isRequired = res;
};
this.conditionRequiredRunner.run(values, properties);
};
Object.defineProperty(Question.prototype, "no", {
/**
* The property returns the question number. If question is invisible then it returns empty string.
* If visibleIndex is 1, then no is 2, or 'B' if survey.questionStartIndex is 'A'.
* @see SurveyModel.questionStartIndex
*/
get: function () {
if (!this.hasTitle || this.hideNumber)
return "";
var no = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getNumberByIndex(this.visibleIndex, this.getStartIndex());
if (!!this.survey) {
no = this.survey.getUpdatedQuestionNo(this, no);
}
return no;
},
enumerable: true,
configurable: true
});
Question.prototype.getStartIndex = function () {
if (!!this.parent)
return this.parent.getQuestionStartIndex();
if (!!this.survey)
return this.survey.questionStartIndex;
return "";
};
Question.prototype.onSurveyLoad = function () {
this.fireCallback(this.surveyLoadCallback);
this.updateValueWithDefaults();
this.updateDisplayValue();
this.updateElementCss();
};
Question.prototype.onSetData = function () {
_super.prototype.onSetData.call(this);
this.initDataFromSurvey();
this.onSurveyValueChanged(this.value);
this.updateValueWithDefaults();
this.updateElementCss();
};
Question.prototype.initDataFromSurvey = function () {
if (!!this.data) {
this.updateValueFromSurvey(this.data.getValue(this.getValueName()));
this.initCommentFromSurvey();
}
};
Question.prototype.initCommentFromSurvey = function () {
if (!!this.data && this.requireUpdateCommentValue) {
this.updateCommentFromSurvey(this.data.getComment(this.getValueName()));
}
else {
this.updateCommentFromSurvey("");
}
};
Question.prototype.runExpression = function (expression) {
if (!this.survey || !expression)
return undefined;
return this.survey.runExpression(expression);
};
Object.defineProperty(Question.prototype, "questionValue", {
get: function () {
return this.getPropertyValue("value");
},
set: function (val) {
this.setPropertyValue("value", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "questionComment", {
get: function () {
return this.getPropertyValue("comment");
},
set: function (val) {
this.setPropertyValue("comment", val);
this.fireCallback(this.commentChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "value", {
/**
* Get/Set the question value.
* @see SurveyMode.setValue
* @see SurveyMode.getValue
*/
get: function () {
return this.getValueCore();
},
set: function (newValue) {
this.setNewValue(newValue);
},
enumerable: true,
configurable: true
});
Question.prototype.clearValue = function () {
this.value = null;
this.comment = null;
};
Question.prototype.createValueCopy = function () {
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(this.value);
};
Question.prototype.canClearValueAsInvisible = function () {
if (this.isVisible && this.isParentVisible)
return false;
if (!!this.page && this.page.isStarted)
return false;
if (!this.survey || !this.valueName)
return true;
return !this.survey.hasVisibleQuestionByValueName(this.valueName);
};
Object.defineProperty(Question.prototype, "isParentVisible", {
get: function () {
var parent = this.parent;
while (parent) {
if (!parent.isVisible)
return false;
parent = parent.parent;
}
return true;
},
enumerable: true,
configurable: true
});
Question.prototype.clearValueIfInvisible = function () {
if (this.canClearValueAsInvisible()) {
this.clearValue();
}
};
Object.defineProperty(Question.prototype, "displayValue", {
get: function () {
this.updateDisplayValue();
return this.getPropertyValue("displayValue", "");
},
enumerable: true,
configurable: true
});
Question.prototype.updateDisplayValue = function () {
if (this.isLoadingFromJson)
return;
this.setPropertyValue("displayValue", this.getDisplayValue(true));
};
/**
* Return the question value as a display text. For example, for dropdown, it would return the item text instead of item value.
* @param keysAsText Set this value to true, to return key (in matrices questions) as display text as well.
* @param value use this parameter, if you want to get display value for this value and not question.value. It is undefined by default.
*/
Question.prototype.getDisplayValue = function (keysAsText, value) {
if (value === void 0) { value = undefined; }
if (this.customWidget) {
var res = this.customWidget.getDisplayValue(this, value);
if (res)
return res;
}
value = value == undefined ? this.createValueCopy() : value;
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(value))
return "";
return this.getDisplayValueCore(keysAsText, value);
};
Question.prototype.getDisplayValueCore = function (keyAsText, value) {
return value;
};
Object.defineProperty(Question.prototype, "defaultValue", {
/**
* Set the default value to the question. It will be assign to the question on loading the survey from JSON or adding a question to the survey or on setting this property of the value is empty.
* Please note, this property is hidden for question without input, for example html question.
*/
get: function () {
return this.getPropertyValue("defaultValue");
},
set: function (val) {
if (this.isValueExpression(val)) {
this.defaultValueExpression = val.substr(1);
return;
}
this.setPropertyValue("defaultValue", this.convertDefaultValue(val));
this.updateValueWithDefaults();
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "defaultValueExpression", {
get: function () {
return this.getPropertyValue("defaultValueExpression");
},
set: function (val) {
this.setPropertyValue("defaultValueExpression", val);
this.updateValueWithDefaults();
},
enumerable: true,
configurable: true
});
/**
* Returns question answer data as a plain object: with question title, name, value and displayValue.
* For complex questions (like matrix, etc.) isNode flag is set to true and data contains array of nested objects (rows)
* set options.includeEmpty to false if you want to skip empty answers
*/
Question.prototype.getPlainData = function (options) {
var _this = this;
if (options === void 0) { options = {
includeEmpty: true,
includeQuestionTypes: false,
}; }
if (options.includeEmpty || !this.isEmpty()) {
var questionPlainData = {
name: this.name,
title: this.locTitle.renderedHtml,
value: this.value,
displayValue: this.displayValue,
isNode: false,
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
};
if (options.includeQuestionTypes === true) {
questionPlainData.questionType = this.getType();
}
(options.calculations || []).forEach(function (calculation) {
questionPlainData[calculation.propertyName] = _this[calculation.propertyName];
});
if (this.hasComment) {
questionPlainData.isNode = true;
questionPlainData.data = [
{
name: 0,
isComment: true,
title: "Comment",
value: __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].commentPrefix,
displayValue: this.comment,
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: false,
},
];
}
return questionPlainData;
}
return undefined;
};
Object.defineProperty(Question.prototype, "correctAnswer", {
/**
* The correct answer on the question. Set this value if you are doing a quiz.
* Please note, this property is hidden for question without input, for example html question.
* @see SurveyModel.correctAnswers
* @see SurveyModel.inCorrectAnswers
*/
get: function () {
return this.getPropertyValue("correctAnswer");
},
set: function (val) {
this.setPropertyValue("correctAnswer", this.convertDefaultValue(val));
},
enumerable: true,
configurable: true
});
Question.prototype.convertDefaultValue = function (val) {
return val;
};
Object.defineProperty(Question.prototype, "quizQuestionCount", {
/**
* Returns questions count: 1 for the non-matrix questions and all inner visible questions that has input(s) widgets for question of matrix types.
* @see getQuizQuestions
*/
get: function () {
if (this.isVisible &&
this.hasInput &&
!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(this.correctAnswer))
return this.getQuizQuestionCount();
return 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "correctAnswerCount", {
get: function () {
if (!this.isEmpty() && !this.isValueEmpty(this.correctAnswer))
return this.getCorrectAnswerCount();
return 0;
},
enumerable: true,
configurable: true
});
Question.prototype.getQuizQuestionCount = function () {
return 1;
};
Question.prototype.getCorrectAnswerCount = function () {
return this.isTwoValueEquals(this.value, this.correctAnswer, true) ? 1 : 0;
};
Question.prototype.isAnswerCorrect = function () {
return this.correctAnswerCount == this.quizQuestionCount;
};
Question.prototype.updateValueWithDefaults = function () {
if (this.isLoadingFromJson ||
(!this.isDesignMode && this.isDefaultValueEmpty()))
return;
if (!this.isDesignMode && !this.isEmpty())
return;
if (this.isEmpty() && this.isDefaultValueEmpty())
return;
if (!!this.survey && this.survey.isClearValueOnHidden && !this.isVisible)
return;
this.setDefaultValue();
};
Question.prototype.getQuestionFromArray = function (name, index) {
return null;
};
Question.prototype.getDefaultValue = function () {
return this.defaultValue;
};
Question.prototype.isDefaultValueEmpty = function () {
return !this.defaultValueExpression && this.isValueEmpty(this.defaultValue);
};
Question.prototype.setDefaultValue = function () {
this.value = this.getValueAndRunExpression(__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(this.defaultValue), this.defaultValueExpression);
};
Question.prototype.isValueExpression = function (val) {
return !!val && typeof val == "string" && val.length > 0 && val[0] == "=";
};
Question.prototype.getValueAndRunExpression = function (val, expression) {
if (!!expression) {
val = this.runExpression(expression);
}
if (!val)
return val;
if (val instanceof Date) {
val = val.toISOString().slice(0, 10);
}
return val;
};
Object.defineProperty(Question.prototype, "comment", {
/**
* The question comment value.
*/
get: function () {
return this.getQuestionComment();
},
set: function (newValue) {
if (!!newValue) {
newValue = newValue.toString().trim();
}
if (this.comment == newValue)
return;
this.setQuestionComment(newValue);
},
enumerable: true,
configurable: true
});
Question.prototype.getQuestionComment = function () {
return this.questionComment;
};
Question.prototype.setQuestionComment = function (newValue) {
this.setNewComment(newValue);
};
/**
* Returns true if the question value is empty
*/
Question.prototype.isEmpty = function () {
return this.isValueEmpty(this.value);
};
Object.defineProperty(Question.prototype, "isAnswered", {
get: function () {
return this.getPropertyValue("isAnswered");
},
set: function (val) {
this.setPropertyValue("isAnswered", val);
},
enumerable: true,
configurable: true
});
Question.prototype.updateIsAnswered = function () {
this.setPropertyValue("isAnswered", this.getIsAnswered());
};
Question.prototype.getIsAnswered = function () {
return !this.isEmpty();
};
Object.defineProperty(Question.prototype, "validators", {
/**
* The list of question validators.
* Please note, this property is hidden for question without input, for example html question.
*/
get: function () {
return this.getPropertyValue("validators");
},
set: function (val) {
this.setPropertyValue("validators", val);
},
enumerable: true,
configurable: true
});
Question.prototype.getValidators = function () {
return this.validators;
};
Question.prototype.getSupportedValidators = function () {
var res = [];
this.addSupportedValidators(res);
return res;
};
Question.prototype.addSupportedValidators = function (supportedValidators) {
supportedValidators.push("expression");
};
Question.prototype.addConditionObjectsByContext = function (objects, context) {
objects.push({
name: this.getValueName(),
text: this.processedTitle,
question: this,
});
};
Question.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
var json = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* JsonObject */]().toJsonObject(this);
json["type"] = this.getType();
return json;
};
/**
* Returns true if there is a validation error(s) in the question.
* @param fireCallback set it to true to show an error in UI.
*/
Question.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
var oldHasErrors = this.errors.length > 0;
var errors = this.checkForErrors(!!rec && rec.isOnValueChanged === true);
if (fireCallback) {
if (!!this.survey) {
this.survey.beforeSettingQuestionErrors(this, errors);
}
this.errors = errors;
}
this.updateContainsErrors();
if (oldHasErrors != errors.length > 0) {
this.updateElementCss();
}
return errors.length > 0;
};
Object.defineProperty(Question.prototype, "currentErrorCount", {
/**
* Returns the validation errors count.
*/
get: function () {
return this.errors.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Question.prototype, "requiredText", {
/**
* Returns the char/string for a required question.
* @see SurveyModel.requiredText
*/
get: function () {
return this.survey != null && this.isRequired
? this.survey.requiredText
: "";
},
enumerable: true,
configurable: true
});
/**
* Add error into the question error list.
* @param error
*/
Question.prototype.addError = function (error) {
if (!error)
return;
var newError = null;
if (typeof error === "string" || error instanceof String) {
newError = new __WEBPACK_IMPORTED_MODULE_5__error__["a" /* CustomError */](error, this.survey);
}
else {
newError = error;
}
this.errors.push(newError);
};
/**
* Remove a particular error from the question error list.
* @param error
*/
Question.prototype.removeError = function (error) {
var errors = this.errors;
var index = errors.indexOf(error);
if (index !== -1)
errors.splice(index, 1);
};
Question.prototype.checkForErrors = function (isOnValueChanged) {
var qErrors = new Array();
if (this.isVisible && !this.isReadOnly) {
this.collectErrors(qErrors, isOnValueChanged);
}
return qErrors;
};
Question.prototype.collectErrors = function (qErrors, isOnValueChanged) {
this.onCheckForErrors(qErrors, isOnValueChanged);
if (qErrors.length > 0 || !this.canRunValidators(isOnValueChanged))
return;
var errors = this.runValidators();
if (errors.length > 0) {
//validators may change the question value.
qErrors.length = 0;
for (var i = 0; i < errors.length; i++) {
qErrors.push(errors[i]);
}
}
if (this.survey && qErrors.length == 0) {
var error = this.fireSurveyValidation();
if (error) {
qErrors.push(error);
}
}
};
Question.prototype.canRunValidators = function (isOnValueChanged) {
return true;
};
Question.prototype.fireSurveyValidation = function () {
if (this.validateValueCallback)
return this.validateValueCallback();
return this.survey ? this.survey.validateQuestion(this) : null;
};
Question.prototype.onCheckForErrors = function (errors, isOnValueChanged) {
if (!isOnValueChanged && this.hasRequiredError()) {
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["c" /* AnswerRequiredError */](this.requiredErrorText, this));
}
};
Question.prototype.hasRequiredError = function () {
return this.isRequired && this.isEmpty();
};
Object.defineProperty(Question.prototype, "isRunningValidators", {
get: function () {
return this.getIsRunningValidators();
},
enumerable: true,
configurable: true
});
Question.prototype.getIsRunningValidators = function () {
return this.isRunningValidatorsValue;
};
Question.prototype.runValidators = function () {
var _this = this;
if (!!this.validatorRunner) {
this.validatorRunner.onAsyncCompleted = null;
}
this.validatorRunner = new __WEBPACK_IMPORTED_MODULE_6__validator__["a" /* ValidatorRunner */]();
this.isRunningValidatorsValue = true;
this.validatorRunner.onAsyncCompleted = function (errors) {
_this.doOnAsyncCompleted(errors);
};
return this.validatorRunner.run(this);
};
Question.prototype.doOnAsyncCompleted = function (errors) {
for (var i = 0; i < errors.length; i++) {
this.errors.push(errors[i]);
}
this.isRunningValidatorsValue = false;
this.raiseOnCompletedAsyncValidators();
};
Question.prototype.raiseOnCompletedAsyncValidators = function () {
if (!!this.onCompletedAsyncValidators && !this.isRunningValidators) {
this.onCompletedAsyncValidators(this.getAllErrors().length > 0);
this.onCompletedAsyncValidators = null;
}
};
Question.prototype.setNewValue = function (newValue) {
var oldAnswered = this.isAnswered;
this.setNewValueInData(newValue);
this.allowNotifyValueChanged && this.onValueChanged();
if (this.isAnswered != oldAnswered) {
this.updateElementCss();
}
};
Question.prototype.isTextValue = function () {
return false;
};
Object.defineProperty(Question.prototype, "isSurveyInputTextUpdate", {
get: function () {
return !!this.survey ? this.survey.isUpdateValueTextOnTyping : false;
},
enumerable: true,
configurable: true
});
Question.prototype.getDataLocNotification = function () {
if (this.locNotificationInData)
return this.locNotificationInData;
return this.isInputTextUpdate ? "text" : false;
};
Object.defineProperty(Question.prototype, "isInputTextUpdate", {
get: function () {
return this.isSurveyInputTextUpdate && this.isTextValue();
},
enumerable: true,
configurable: true
});
Question.prototype.setNewValueInData = function (newValue) {
newValue = this.valueToData(newValue);
if (!this.isValueChangedInSurvey) {
this.setValueCore(newValue);
}
};
Question.prototype.getValueCore = function () {
return this.questionValue;
};
Question.prototype.setValueCore = function (newValue) {
this.setQuestionValue(newValue);
if (this.data != null) {
this.data.setValue(this.getValueName(), newValue, this.getDataLocNotification(), this.allowNotifyValueChanged);
}
};
Question.prototype.valueFromData = function (val) {
return val;
};
Question.prototype.valueToData = function (val) {
return val;
};
Question.prototype.onValueChanged = function () { };
Question.prototype.setNewComment = function (newValue) {
this.questionComment = newValue;
if (this.data != null) {
this.data.setComment(this.getValueName(), newValue, this.isSurveyInputTextUpdate ? "text" : false);
}
};
Question.prototype.getValidName = function (name) {
if (!name)
return name;
return name.trim().replace(/[\{\}]+/g, "");
};
//IQuestion
Question.prototype.updateValueFromSurvey = function (newValue) {
newValue = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(newValue);
this.setQuestionValue(this.valueFromData(newValue));
};
Question.prototype.updateCommentFromSurvey = function (newValue) {
this.questionComment = newValue;
};
Question.prototype.setQuestionValue = function (newValue, updateIsAnswered) {
if (updateIsAnswered === void 0) { updateIsAnswered = true; }
this.questionValue = newValue;
this.allowNotifyValueChanged &&
this.fireCallback(this.valueChangedCallback);
if (updateIsAnswered)
this.updateIsAnswered();
};
Question.prototype.onSurveyValueChanged = function (newValue) {
if (this.isLoadingFromJson)
return;
this.updateDisplayValue();
};
Question.prototype.setVisibleIndex = function (val) {
if (!this.isVisible ||
(!this.hasTitle && !__WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].setQuestionVisibleIndexForHiddenTitle) ||
(this.hideNumber && !__WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].setQuestionVisibleIndexForHiddenNumber)) {
val = -1;
}
this.setPropertyValue("visibleIndex", val);
return val < 0 ? 0 : 1;
};
Question.prototype.removeElement = function (element) {
return false;
};
Question.prototype.supportGoNextPageAutomatic = function () {
return false;
};
Question.prototype.supportGoNextPageError = function () {
return true;
};
/**
* Call this function to remove values from the current question, that end-user will not be able to enter.
* For example the value that doesn't exists in a radigroup/dropdown/checkbox choices or matrix rows/columns.
*/
Question.prototype.clearIncorrectValues = function () { };
Question.prototype.clearOnDeletingContainer = function () { };
/**
* Call this function to clear all errors in the question
*/
Question.prototype.clearErrors = function () {
this.errors = [];
};
Question.prototype.clearUnusedValues = function () { };
Question.prototype.onAnyValueChanged = function (name) { };
Question.prototype.checkBindings = function (valueName, value) {
if (this.bindings.isEmpty() || !this.data)
return;
var props = this.bindings.getPropertiesByValueName(valueName);
for (var i = 0; i < props.length; i++) {
this[props[i]] = value;
}
};
/**
* Returns the current survey locale
* @see SurveyModel.locale
*/
Question.prototype.getLocale = function () {
return this.survey
? this.survey.getLocale()
: this.locOwner
? this.locOwner.getLocale()
: "";
};
Question.prototype.getMarkdownHtml = function (text) {
return this.survey
? this.survey.getSurveyMarkdownHtml(this, text)
: this.locOwner
? this.locOwner.getMarkdownHtml(text)
: null;
};
Question.prototype.getProcessedText = function (text) {
if (this.textProcessor)
return this.textProcessor.processText(text, this.useDisplayValuesInTitle);
if (this.locOwner)
return this.locOwner.getProcessedText(text);
return text;
};
//ISurveyErrorOwner
Question.prototype.getErrorCustomText = function (text, error) {
if (!!this.survey)
return this.survey.getErrorCustomText(text, error);
return text;
};
//IValidatorOwner
Question.prototype.getValidatorTitle = function () {
return null;
};
Object.defineProperty(Question.prototype, "validatedValue", {
get: function () {
return this.value;
},
set: function (val) {
this.value = val;
},
enumerable: true,
configurable: true
});
Question.prototype.getAllValues = function () {
return !!this.data ? this.data.getAllValues() : null;
};
Question.prototype.dispose = function () { };
Question.TextPreprocessorValuesMap = {
title: "processedTitle",
require: "requiredText",
};
Question.questionCounter = 100;
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["c" /* __decorate */])([
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__jsonobject__["d" /* property */])({ localizable: true })
], Question.prototype, "description", void 0);
return Question;
}(__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("question", [
"!name",
{ name: "visible:switch", default: true },
{ name: "useDisplayValuesInTitle:boolean", default: true, layout: "row" },
"visibleIf:condition",
{ name: "width" },
{ name: "minWidth", default: __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].minWidth },
{ name: "maxWidth", default: __WEBPACK_IMPORTED_MODULE_10__settings__["a" /* settings */].maxWidth },
{ name: "startWithNewLine:boolean", default: true, layout: "row" },
{ name: "indent:number", default: 0, choices: [0, 1, 2, 3], layout: "row" },
{
name: "page",
isSerializable: false,
visibleIf: function (obj) {
var survey = obj ? obj.survey : null;
return !survey || survey.pages.length > 1;
},
choices: function (obj) {
var survey = obj ? obj.survey : null;
return survey
? survey.pages.map(function (p) {
return { value: p.name, text: p.title };
})
: [];
},
},
{ name: "title:text", serializationProperty: "locTitle", layout: "row" },
{
name: "titleLocation",
default: "default",
choices: ["default", "top", "bottom", "left", "hidden"],
layout: "row",
},
{
name: "description:text",
serializationProperty: "locDescription",
layout: "row",
},
{
name: "descriptionLocation",
default: "default",
choices: ["default", "underInput", "underTitle"],
},
{
name: "hideNumber:boolean",
dependsOn: "titleLocation",
visibleIf: function (obj) {
if (!obj) {
return true;
}
if (obj.titleLocation === "hidden") {
return false;
}
var parent = obj ? obj.parent : null;
var numberingAllowedByParent = !parent || parent.showQuestionNumbers !== "off";
if (!numberingAllowedByParent) {
return false;
}
var survey = obj ? obj.survey : null;
return (!survey ||
survey.showQuestionNumbers !== "off" ||
(!!parent && parent.showQuestionNumbers === "onpanel"));
},
},
"valueName",
"enableIf:condition",
"defaultValue:value",
{
name: "defaultValueExpression:expression",
category: "logic",
},
"correctAnswer:value",
"isRequired:switch",
"requiredIf:condition",
{
name: "requiredErrorText:text",
serializationProperty: "locRequiredErrorText",
},
"readOnly:switch",
{
name: "validators:validators",
baseClassName: "surveyvalidator",
classNamePart: "validator",
},
{
name: "bindings:bindings",
serializationProperty: "bindings",
visibleIf: function (obj) {
return obj.bindings.getNames().length > 0;
},
},
]);
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addAlterNativeClassName("question", "questionbase");
/***/ }),
/* 11 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__conditionsParser__ = __webpack_require__(44);
/* unused harmony export ExpressionRunnerBase */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ConditionRunner; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ExpressionRunner; });
var ExpressionRunnerBase = /** @class */ (function () {
function ExpressionRunnerBase(expression) {
this.processValue = new __WEBPACK_IMPORTED_MODULE_1__conditionProcessValue__["a" /* ProcessValue */]();
this.parser = new __WEBPACK_IMPORTED_MODULE_2__conditionsParser__["a" /* ConditionsParser */]();
this.isAsyncValue = false;
this.hasFunctionValue = false;
this.expression = expression;
}
Object.defineProperty(ExpressionRunnerBase.prototype, "expression", {
get: function () {
return this.expressionValue;
},
set: function (value) {
if (this.expression === value)
return;
this.expressionValue = value;
this.operand = this.parser.parseExpression(value);
this.hasFunctionValue = this.canRun() ? this.operand.hasFunction() : false;
this.isAsyncValue = this.hasFunction()
? this.operand.hasAsyncFunction()
: false;
},
enumerable: true,
configurable: true
});
ExpressionRunnerBase.prototype.getVariables = function () {
if (!this.operand)
return [];
var variables = [];
this.operand.setVariables(variables);
return variables;
};
ExpressionRunnerBase.prototype.hasFunction = function () {
return this.hasFunctionValue;
};
Object.defineProperty(ExpressionRunnerBase.prototype, "isAsync", {
get: function () {
return this.isAsyncValue;
},
enumerable: true,
configurable: true
});
ExpressionRunnerBase.prototype.canRun = function () {
return !!this.operand;
};
ExpressionRunnerBase.prototype.runCore = function (values, properties) {
var _this = this;
if (properties === void 0) { properties = null; }
if (!this.operand)
return null;
this.processValue.values = values;
this.processValue.properties = properties;
if (!this.isAsync)
return this.runValues();
this.asyncFuncList = [];
this.operand.addToAsyncList(this.asyncFuncList);
for (var i = 0; i < this.asyncFuncList.length; i++) {
this.asyncFuncList[i].onAsyncReady = function () {
_this.doAsyncFunctionReady();
};
}
for (var i = 0; i < this.asyncFuncList.length; i++) {
this.asyncFuncList[i].evaluateAsync(this.processValue);
}
return false;
};
ExpressionRunnerBase.prototype.doAsyncFunctionReady = function () {
for (var i = 0; i < this.asyncFuncList.length; i++) {
if (!this.asyncFuncList[i].isReady)
return;
}
this.runValues();
};
ExpressionRunnerBase.prototype.runValues = function () {
var res = this.operand.evaluate(this.processValue);
this.doOnComplete(res);
return res;
};
ExpressionRunnerBase.prototype.doOnComplete = function (res) { };
return ExpressionRunnerBase;
}());
var ConditionRunner = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ConditionRunner, _super);
function ConditionRunner() {
return _super !== null && _super.apply(this, arguments) || this;
}
ConditionRunner.prototype.run = function (values, properties) {
if (properties === void 0) { properties = null; }
return this.runCore(values, properties) == true;
};
ConditionRunner.prototype.doOnComplete = function (res) {
if (!!this.onRunComplete)
this.onRunComplete(res == true);
};
return ConditionRunner;
}(ExpressionRunnerBase));
var ExpressionRunner = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ExpressionRunner, _super);
function ExpressionRunner() {
return _super !== null && _super.apply(this, arguments) || this;
}
ExpressionRunner.prototype.run = function (values, properties) {
if (properties === void 0) { properties = null; }
return this.runCore(values, properties);
};
ExpressionRunner.prototype.doOnComplete = function (res) {
if (!!this.onRunComplete)
this.onRunComplete(res);
};
return ExpressionRunner;
}(ExpressionRunnerBase));
/***/ }),
/* 12 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return AnswerRequiredError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return OneAnswerRequiredError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return RequreNumericError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return ExceedSizeError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return WebRequestError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return WebRequestEmptyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return OtherEmptyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return UploadingFileError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return RequiredInAllRowsError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return MinRowCountError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return KeyDuplicationError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CustomError; });
var AnswerRequiredError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(AnswerRequiredError, _super);
function AnswerRequiredError(text, errorOwner) {
if (text === void 0) { text = null; }
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
AnswerRequiredError.prototype.getErrorType = function () {
return "required";
};
AnswerRequiredError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("requiredError");
};
return AnswerRequiredError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var OneAnswerRequiredError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(OneAnswerRequiredError, _super);
function OneAnswerRequiredError(text, errorOwner) {
if (text === void 0) { text = null; }
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
OneAnswerRequiredError.prototype.getErrorType = function () {
return "requireoneanswer";
};
OneAnswerRequiredError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("requiredErrorInPanel");
};
return OneAnswerRequiredError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var RequreNumericError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(RequreNumericError, _super);
function RequreNumericError(text, errorOwner) {
if (text === void 0) { text = null; }
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
RequreNumericError.prototype.getErrorType = function () {
return "requirenumeric";
};
RequreNumericError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("numericError");
};
return RequreNumericError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var ExceedSizeError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ExceedSizeError, _super);
function ExceedSizeError(maxSize, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, null, errorOwner) || this;
_this.maxSize = maxSize;
_this.locText.text = _this.getText();
return _this;
}
ExceedSizeError.prototype.getErrorType = function () {
return "exceedsize";
};
ExceedSizeError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */]
.getString("exceedMaxSize")["format"](this.getTextSize());
};
ExceedSizeError.prototype.getTextSize = function () {
var sizes = ["Bytes", "KB", "MB", "GB", "TB"];
var fixed = [0, 0, 2, 3, 3];
if (this.maxSize === 0) {
return "0 Byte";
}
var i = Math.floor(Math.log(this.maxSize) / Math.log(1024));
var value = this.maxSize / Math.pow(1024, i);
return value.toFixed(fixed[i]) + " " + sizes[i];
};
return ExceedSizeError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var WebRequestError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(WebRequestError, _super);
function WebRequestError(status, response, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, null, errorOwner) || this;
_this.status = status;
_this.response = response;
return _this;
}
WebRequestError.prototype.getErrorType = function () {
return "webrequest";
};
WebRequestError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */]
.getString("urlRequestError")["format"](this.status, this.response);
};
return WebRequestError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var WebRequestEmptyError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(WebRequestEmptyError, _super);
function WebRequestEmptyError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
WebRequestEmptyError.prototype.getErrorType = function () {
return "webrequestempty";
};
WebRequestEmptyError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("urlGetChoicesError");
};
return WebRequestEmptyError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var OtherEmptyError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(OtherEmptyError, _super);
function OtherEmptyError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
OtherEmptyError.prototype.getErrorType = function () {
return "otherempty";
};
OtherEmptyError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("otherRequiredError");
};
return OtherEmptyError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var UploadingFileError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(UploadingFileError, _super);
function UploadingFileError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
UploadingFileError.prototype.getErrorType = function () {
return "uploadingfile";
};
UploadingFileError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("uploadingFile");
};
return UploadingFileError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var RequiredInAllRowsError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(RequiredInAllRowsError, _super);
function RequiredInAllRowsError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
RequiredInAllRowsError.prototype.getErrorType = function () {
return "requiredinallrowserror";
};
RequiredInAllRowsError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("requiredInAllRowsError");
};
return RequiredInAllRowsError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var MinRowCountError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MinRowCountError, _super);
function MinRowCountError(minRowCount, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, null, errorOwner) || this;
_this.minRowCount = minRowCount;
return _this;
}
MinRowCountError.prototype.getErrorType = function () {
return "minrowcounterror";
};
MinRowCountError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */]
.getString("minRowCountError")["format"](this.minRowCount);
};
return MinRowCountError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var KeyDuplicationError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(KeyDuplicationError, _super);
function KeyDuplicationError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
KeyDuplicationError.prototype.getErrorType = function () {
return "keyduplicationerror";
};
KeyDuplicationError.prototype.getDefaultText = function () {
return __WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].getString("keyDuplicationError");
};
return KeyDuplicationError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
var CustomError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(CustomError, _super);
function CustomError(text, errorOwner) {
if (errorOwner === void 0) { errorOwner = null; }
var _this = _super.call(this, text, errorOwner) || this;
_this.text = text;
return _this;
}
CustomError.prototype.getErrorType = function () {
return "custom";
};
return CustomError;
}(__WEBPACK_IMPORTED_MODULE_2__base__["d" /* SurveyError */]));
/***/ }),
/* 13 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ItemValue; });
/**
* Array of ItemValue is used in checkox, dropdown and radiogroup choices, matrix columns and rows.
* It has two main properties: value and text. If text is empty, value is used for displaying.
* The text property is localizable and support markdown.
*/
var ItemValue = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ItemValue, _super);
function ItemValue(value, text, typeName) {
if (text === void 0) { text = null; }
if (typeName === void 0) { typeName = "itemvalue"; }
var _this = _super.call(this) || this;
_this.typeName = typeName;
_this.ownerPropertyName = "";
_this.isVisibleValue = true;
_this.locTextValue = new __WEBPACK_IMPORTED_MODULE_1__localizablestring__["a" /* LocalizableString */](null, true);
_this.locTextValue.onGetTextCallback = function (txt) {
return txt ? txt : !_this.isValueItemEmpty ? _this.value.toString() : null;
};
if (text)
_this.locText.text = text;
if (!!value && typeof value === "object") {
_this.setData(value);
}
else {
_this.value = value;
}
if (_this.getType() != "itemvalue") {
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* CustomPropertiesCollection */].createProperties(_this);
}
_this.onCreating();
return _this;
}
Object.defineProperty(ItemValue, "Separator", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__settings__["a" /* settings */].itemValueSeparator;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_6__settings__["a" /* settings */].itemValueSeparator = val;
},
enumerable: true,
configurable: true
});
ItemValue.createArray = function (locOwner) {
var items = [];
ItemValue.setupArray(items, locOwner);
return items;
};
ItemValue.setupArray = function (items, locOwner) {
items.push = function (value) {
var result = Array.prototype.push.call(this, value);
value.locOwner = locOwner;
return result;
};
items.unshift = function (value) {
var result = Array.prototype.unshift.call(this, value);
value.locOwner = locOwner;
return result;
};
items.splice = function (start, deleteCount) {
var _a;
var items = [];
for (var _i = 2; _i < arguments.length; _i++) {
items[_i - 2] = arguments[_i];
}
var result = (_a = Array.prototype.splice).call.apply(_a, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["d" /* __spreadArrays */])([this,
start,
deleteCount], items));
if (!items)
items = [];
for (var i = 0; i < items.length; i++) {
items[i].locOwner = locOwner;
}
return result;
};
};
ItemValue.setData = function (items, values) {
items.length = 0;
for (var i = 0; i < values.length; i++) {
var value = values[i];
var item;
if (typeof value.getType === "function") {
item = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].createClass(value.getType());
}
else {
item = new ItemValue(null);
}
item.setData(value);
if (!!value.originalItem) {
item.originalItem = value.originalItem;
}
items.push(item);
}
};
ItemValue.getData = function (items) {
var result = new Array();
for (var i = 0; i < items.length; i++) {
result.push(items[i].getData());
}
return result;
};
ItemValue.getItemByValue = function (items, val) {
for (var i = 0; i < items.length; i++) {
if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(items[i].value, val))
return items[i];
}
return null;
};
ItemValue.getTextOrHtmlByValue = function (items, val) {
var item = ItemValue.getItemByValue(items, val);
return item !== null ? item.locText.textOrHtml : "";
};
ItemValue.locStrsChanged = function (items) {
for (var i = 0; i < items.length; i++) {
items[i].locText.strChanged();
}
};
ItemValue.runConditionsForItems = function (items, filteredItems, runner, values, properties, useItemExpression) {
if (useItemExpression === void 0) { useItemExpression = true; }
return ItemValue.runConditionsForItemsCore(items, filteredItems, runner, values, properties, true, useItemExpression);
};
ItemValue.runEnabledConditionsForItems = function (items, runner, values, properties) {
return ItemValue.runConditionsForItemsCore(items, null, runner, values, properties, false);
};
ItemValue.runConditionsForItemsCore = function (items, filteredItems, runner, values, properties, isVisible, useItemExpression) {
if (useItemExpression === void 0) { useItemExpression = true; }
if (!values) {
values = {};
}
var itemValue = values["item"];
var choiceValue = values["choice"];
var hasChanded = false;
for (var i = 0; i < items.length; i++) {
var item = items[i];
values["item"] = item.value;
values["choice"] = item.value;
var itemRunner = useItemExpression && !!item.getConditionRunner
? item.getConditionRunner(isVisible)
: false;
if (!itemRunner) {
itemRunner = runner;
}
var newValue = true;
if (itemRunner) {
newValue = itemRunner.run(values, properties);
}
if (!!filteredItems && newValue) {
filteredItems.push(item);
}
var oldValue = isVisible ? item.isVisible : item.isEnabled;
if (newValue != oldValue) {
hasChanded = true;
if (isVisible) {
if (!!item.setIsVisible)
item.setIsVisible(newValue);
}
else {
if (!!item.setIsEnabled)
item.setIsEnabled(newValue);
}
}
}
if (itemValue) {
values["item"] = itemValue;
}
else {
delete values["item"];
}
if (choiceValue) {
values["choice"] = choiceValue;
}
else {
delete values["choice"];
}
return hasChanded;
};
ItemValue.prototype.onCreating = function () { };
ItemValue.prototype.getType = function () {
return !!this.typeName ? this.typeName : "itemvalue";
};
ItemValue.prototype.getLocale = function () {
return this.locText.locale;
};
Object.defineProperty(ItemValue.prototype, "locText", {
get: function () {
return this.locTextValue;
},
enumerable: true,
configurable: true
});
ItemValue.prototype.setLocText = function (locText) {
this.locTextValue = locText;
};
Object.defineProperty(ItemValue.prototype, "locOwner", {
get: function () {
return this.locText.owner;
},
set: function (value) {
this.locText.owner = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "value", {
get: function () {
return this.itemValue;
},
set: function (newValue) {
var oldValue = this.itemValue;
this.itemValue = newValue;
this.propertyValueChanged("value", oldValue, this.itemValue);
if (!this.itemValue)
return;
var str = this.itemValue.toString();
var index = str.indexOf(__WEBPACK_IMPORTED_MODULE_6__settings__["a" /* settings */].itemValueSeparator);
if (index > -1) {
this.itemValue = str.slice(0, index);
this.text = str.slice(index + 1);
}
else if (!this.hasText) {
this.locText.onChanged();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "hasText", {
get: function () {
return this.locText.pureText ? true : false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "text", {
get: function () {
return this.locText.calculatedText; //TODO: it will be correct to use this.locText.text, however it would require a lot of rewriting in Creator
},
set: function (newText) {
var oldText = this.locText.text;
this.locText.text = newText;
this.propertyValueChanged("text", oldText, newText);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "calculatedText", {
get: function () {
return this.locText.calculatedText;
},
enumerable: true,
configurable: true
});
ItemValue.prototype.getData = function () {
var json = this.toJSON();
if (!!json["value"] && !!json["value"]["pos"]) {
delete json["value"]["pos"];
}
if (Object.keys(json).length == 1 && !__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(json["value"]))
return this.value;
return json;
};
ItemValue.prototype.toJSON = function () {
var res = {};
var properties = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].getProperties(this.getType());
if (!properties || properties.length == 0) {
properties = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].getProperties("itemvalue");
}
var jsoObj = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* JsonObject */]();
for (var i = 0; i < properties.length; i++) {
jsoObj.valueToJson(this, res, properties[i]);
}
return res;
};
ItemValue.prototype.setData = function (value) {
if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(value))
return;
if (typeof value.value !== "undefined") {
var json = value;
if (typeof value.toJSON === "function") {
json = value.toJSON();
}
new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* JsonObject */]().toObject(json, this);
}
else {
this.value = value;
}
};
Object.defineProperty(ItemValue.prototype, "visibleIf", {
get: function () {
return this.getPropertyValue("visibleIf", "");
},
set: function (val) {
this.setPropertyValue("visibleIf", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ItemValue.prototype, "isVisible", {
get: function () {
return this.isVisibleValue;
},
enumerable: true,
configurable: true
});
ItemValue.prototype.setIsVisible = function (val) {
this.isVisibleValue = val;
};
Object.defineProperty(ItemValue.prototype, "isEnabled", {
get: function () {
return this.getPropertyValue("isEnabled", true);
},
enumerable: true,
configurable: true
});
ItemValue.prototype.setIsEnabled = function (val) {
this.setPropertyValue("isEnabled", val);
};
ItemValue.prototype.addUsedLocales = function (locales) {
this.AddLocStringToUsedLocales(this.locTextValue, locales);
};
ItemValue.prototype.onPropertyValueChanged = function (name, oldValue, newValue) {
var funcName = "itemValuePropertyChanged";
if (!this.locOwner || !this.locOwner[funcName])
return;
this.locOwner[funcName](this, name, oldValue, newValue);
};
ItemValue.prototype.getConditionRunner = function (isVisible) {
if (isVisible)
return this.getVisibleConditionRunner();
return this.getEnableConditionRunner();
};
ItemValue.prototype.getVisibleConditionRunner = function () {
if (!this.visibleIf)
return null;
if (!this.visibleConditionRunner)
this.visibleConditionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](this.visibleIf);
this.visibleConditionRunner.expression = this.visibleIf;
return this.visibleConditionRunner;
};
ItemValue.prototype.getEnableConditionRunner = function () {
if (!this.enableIf)
return null;
if (!this.enableConditionRunner)
this.enableConditionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](this.enableIf);
this.enableConditionRunner.expression = this.enableIf;
return this.enableConditionRunner;
};
Object.defineProperty(ItemValue.prototype, "isValueItemEmpty", {
get: function () {
return !this.itemValue && this.itemValue !== 0 && this.itemValue !== false;
},
enumerable: true,
configurable: true
});
return ItemValue;
}(__WEBPACK_IMPORTED_MODULE_5__base__["b" /* Base */]));
__WEBPACK_IMPORTED_MODULE_5__base__["b" /* Base */].createItemValue = function (source, type) {
var item = null;
if (!!type) {
item = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* JsonObject */].metaData.createClass(type, {});
}
else if (typeof source.getType === "function") {
item = new ItemValue(null, undefined, source.getType());
}
else {
item = new ItemValue(null);
}
item.setData(source);
return item;
};
__WEBPACK_IMPORTED_MODULE_5__base__["b" /* Base */].itemValueLocStrChanged = function (arr) {
ItemValue.locStrsChanged(arr);
};
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["k" /* JsonObjectProperty */].getItemValuesDefaultValue = function (val) {
var res = new Array();
ItemValue.setData(res, val || []);
return res;
};
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("itemvalue", [
"value",
{
name: "text",
serializationProperty: "locText",
},
{ name: "visibleIf:condition", showMode: "form" },
{ name: "enableIf:condition", showMode: "form" },
], function (value) { return new ItemValue(value); });
/***/ }),
/* 14 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return surveyCss; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultStandardCss; });
var surveyCss = {
currentType: "",
getCss: function () {
var loc = this.currentType ? this[this.currentType] : defaultStandardCss;
if (!loc)
loc = defaultStandardCss;
return loc;
},
};
var defaultStandardCss = {
root: "sv_main sv_default_css",
container: "sv_container",
header: "sv_header",
body: "sv_body",
bodyEmpty: "sv_body sv_body_empty",
footer: "sv_nav",
title: "",
description: "",
logo: "sv_logo",
logoImage: "sv_logo__image",
headerText: "sv_header__text",
navigationButton: "",
completedPage: "sv_completed_page",
navigation: {
complete: "sv_complete_btn",
prev: "sv_prev_btn",
next: "sv_next_btn",
start: "sv_start_btn",
preview: "sv_preview_btn",
edit: "sv_edit_btn",
},
progress: "sv_progress",
progressBar: "sv_progress_bar",
progressTextInBar: "sv-hidden",
page: {
root: "sv_p_root",
title: "sv_page_title",
description: "",
},
// TODO: move to the page object
pageTitle: "sv_page_title",
pageDescription: "",
row: "sv_row",
question: {
mainRoot: "sv_q sv_qstn",
flowRoot: "sv_q_flow sv_qstn",
header: "",
headerLeft: "title-left",
content: "",
contentLeft: "content-left",
titleLeftRoot: "sv_qstn_left",
requiredText: "sv_q_required_text",
title: "sv_q_title",
number: "sv_q_num",
description: "sv_q_description",
comment: "",
required: "",
titleRequired: "",
hasError: "",
indent: 20,
footer: "sv_q_footer",
formGroup: "form-group",
asCell: "sv_matrix_cell",
},
panel: {
title: "sv_p_title",
titleExpandable: "sv_p_title_expandable",
titleOnError: "",
icon: "sv_panel_icon",
iconExpanded: "sv_expanded",
description: "sv_p_description",
container: "sv_p_container",
footer: "sv_p_footer",
number: "sv_q_num",
requiredText: "sv_q_required_text",
},
error: {
root: "sv_q_erbox",
icon: "",
item: "",
locationTop: "sv_qstn_error_top",
locationBottom: "sv_qstn_error_bottom",
},
boolean: {
root: "sv_qcbc sv_qbln",
item: "sv-boolean",
control: "sv-visuallyhidden",
itemChecked: "sv-boolean--checked checked",
itemIndeterminate: "sv-boolean--indeterminate",
itemDisabled: "sv-boolean--disabled",
switch: "sv-boolean__switch",
slider: "sv-boolean__slider",
label: "sv-boolean__label ",
disabledLabel: "sv-boolean__label--disabled",
},
checkbox: {
root: "sv_qcbc sv_qcbx",
item: "sv_q_checkbox",
itemSelectAll: "sv_q_checkbox_selectall",
itemNone: "sv_q_checkbox_none",
itemChecked: "checked",
itemInline: "sv_q_checkbox_inline",
label: "sv_q_checkbox_label",
labelChecked: "",
itemControl: "sv_q_checkbox_control_item",
itemDecorator: "sv-hidden",
controlLabel: "sv_q_checkbox_control_label",
materialDecorator: "checkbox-material",
other: "sv_q_other sv_q_checkbox_other",
column: "sv_q_select_column",
},
comment: "",
dropdown: {
root: "",
control: "sv_q_dropdown_control",
selectWrapper: "sv_select_wrapper",
other: "sv_q_dd_other",
},
html: { root: "" },
image: { root: "sv_q_image", image: "sv_image_image" },
matrix: {
root: "sv_q_matrix",
label: "sv_q_m_label",
itemChecked: "checked",
itemDecorator: "sv-hidden",
cellText: "sv_q_m_cell_text",
cellTextSelected: "sv_q_m_cell_selected",
cellLabel: "sv_q_m_cell_label",
},
matrixdropdown: { root: "sv_q_matrix_dropdown", cell: "sv_matrix_cell" },
matrixdynamic: {
root: "sv_q_matrix_dynamic",
button: "sv_matrix_dynamic_button",
buttonAdd: "",
buttonRemove: "",
iconAdd: "",
iconRemove: "",
cell: "sv_matrix_cell",
},
paneldynamic: {
root: "sv_panel_dynamic",
title: "sv_p_title",
button: "",
buttonAdd: "sv-paneldynamic__add-btn",
buttonRemove: "",
buttonPrev: "sv-paneldynamic__prev-btn",
buttonNext: "sv-paneldynamic__next-btn",
progressContainer: "sv-paneldynamic__progress-container",
progress: "sv-progress",
progressBar: "sv-progress__bar",
progressText: "sv-paneldynamic__progress-text",
},
multipletext: {
root: "sv_q_mt",
itemTitle: "sv_q_mt_title",
row: "sv_q_mt_row",
itemValue: "sv_q_mt_item_value sv_q_text_root",
},
radiogroup: {
root: "sv_qcbc",
item: "sv_q_radiogroup",
itemChecked: "checked",
itemInline: "sv_q_radiogroup_inline",
itemDecorator: "sv-hidden",
label: "sv_q_radiogroup_label",
labelChecked: "",
itemControl: "sv_q_radiogroup_control_item",
controlLabel: "",
materialDecorator: "circle",
other: "sv_q_other sv_q_radiogroup_other",
clearButton: "sv_q_radiogroup_clear",
column: "sv_q_select_column",
},
imagepicker: {
root: "sv_imgsel",
item: "sv_q_imgsel",
itemChecked: "checked",
label: "sv_q_imgsel_label",
itemControl: "sv_q_imgsel_control_item",
image: "sv_q_imgsel_image",
itemInline: "sv_q_imagepicker_inline",
itemText: "sv_q_imgsel_text",
clearButton: "sv_q_radiogroup_clear",
},
rating: {
root: "sv_q_rating",
item: "sv_q_rating_item",
selected: "active",
minText: "sv_q_rating_min_text",
itemText: "sv_q_rating_item_text",
maxText: "sv_q_rating_max_text",
disabled: "",
},
text: "sv_q_text_root",
expression: "",
file: {
root: "sv_q_file",
placeholderInput: "sv-visuallyhidden",
preview: "sv_q_file_preview",
removeButton: "sv_q_file_remove_button",
fileInput: "sv-visuallyhidden",
removeFile: "sv_q_file_remove",
removeFileSvg: "sv-hidden",
fileDecorator: "sv-file__decorator",
fileSignBottom: "sv-hidden",
removeButtonBottom: "sv-hidden",
chooseFile: "sv_q_file_choose_button",
noFileChosen: "sv_q_file_placeholder",
},
signaturepad: {
root: "sv_q_signaturepad sjs_sp_container",
controls: "sjs_sp_controls",
clearButton: "sjs_sp_clear",
},
saveData: {
root: "",
saving: "",
error: "",
success: "",
saveAgainButton: "",
},
window: {
root: "sv_window",
body: "sv_window_content",
header: {
root: "sv_window_title",
title: "",
button: "",
buttonExpanded: "",
buttonCollapsed: "",
},
},
};
surveyCss["standard"] = defaultStandardCss;
/***/ }),
/* 15 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ProcessValue; });
var ProcessValue = /** @class */ (function () {
function ProcessValue() {
this.values = null;
this.properties = null;
}
ProcessValue.prototype.getFirstName = function (text, obj) {
if (obj === void 0) { obj = null; }
if (!text)
return text;
var res = "";
if (!!obj) {
res = this.getFirstPropertyName(text, obj);
if (!!res)
return res;
}
for (var i = 0; i < text.length; i++) {
var ch = text[i];
if (ch == "." || ch == "[")
break;
res += ch;
}
return res;
};
ProcessValue.prototype.hasValue = function (text, values) {
if (values === void 0) { values = null; }
if (!values)
values = this.values;
var res = this.getValueCore(text, values);
return res.hasValue;
};
ProcessValue.prototype.getValue = function (text, values) {
if (values === void 0) { values = null; }
if (!values)
values = this.values;
var res = this.getValueCore(text, values);
return res.value;
};
ProcessValue.prototype.setValue = function (obj, text, value) {
if (!text)
return;
var nonNestedObj = this.getNonNestedObject(obj, text, true);
if (!nonNestedObj)
return;
obj = nonNestedObj.value;
text = nonNestedObj.text;
if (!!obj && !!text) {
obj[text] = value;
}
};
ProcessValue.prototype.getValueInfo = function (valueInfo) {
if (!!valueInfo.path) {
valueInfo.value = this.getValueFromPath(valueInfo.path, this.values);
valueInfo.hasValue =
valueInfo.value !== null && !__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isValueEmpty(valueInfo.value);
if (!valueInfo.hasValue &&
valueInfo.path.length > 1 &&
valueInfo.path[valueInfo.path.length - 1] == "length") {
valueInfo.hasValue = true;
valueInfo.value = 0;
}
return;
}
var res = this.getValueCore(valueInfo.name, this.values);
valueInfo.value = res.value;
valueInfo.hasValue = res.hasValue;
valueInfo.path = res.hasValue ? res.path : null;
};
ProcessValue.prototype.getValueFromPath = function (path, values) {
var index = 0;
while (!!values && index < path.length) {
var ind_name = path[index];
if (__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isNumber(ind_name) &&
Array.isArray(values) &&
ind_name >= values.length)
return null;
values = values[ind_name];
index++;
}
return values;
};
ProcessValue.prototype.getValueCore = function (text, values) {
var res = { hasValue: false, value: null, path: null };
var curValue = values;
if (!curValue && curValue !== 0 && curValue !== false)
return res;
if (text &&
text.lastIndexOf(".length") > -1 &&
text.lastIndexOf(".length") === text.length - ".length".length) {
res.value = 0;
res.hasValue = true;
}
var nonNestedObj = this.getNonNestedObject(curValue, text, false);
if (!nonNestedObj)
return res;
res.path = nonNestedObj.path;
res.value = !!nonNestedObj.text
? this.getObjectValue(nonNestedObj.value, nonNestedObj.text)
: nonNestedObj.value;
res.hasValue = !__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isValueEmpty(res.value);
return res;
};
ProcessValue.prototype.getNonNestedObject = function (obj, text, createPath) {
var curName = this.getFirstPropertyName(text, obj, createPath);
var path = !!curName ? [curName] : null;
while (text != curName && !!obj) {
var isArray = text[0] == "[";
if (!isArray) {
if (!curName && text == this.getFirstName(text))
return { value: obj, text: text, path: path };
obj = this.getObjectValue(obj, curName);
if (__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isValueEmpty(obj) && !createPath)
return null;
text = text.substr(curName.length);
}
else {
var objInArray = this.getObjInArray(obj, text);
if (!objInArray)
return null;
obj = objInArray.value;
text = objInArray.text;
path.push(objInArray.index);
}
if (!!text && text[0] == ".") {
text = text.substr(1);
}
curName = this.getFirstPropertyName(text, obj, createPath);
if (!!curName) {
path.push(curName);
}
}
return { value: obj, text: text, path: path };
};
ProcessValue.prototype.getObjInArray = function (curValue, text) {
if (!Array.isArray(curValue))
return null;
var index = 1;
var str = "";
while (index < text.length && text[index] != "]") {
str += text[index];
index++;
}
text = index < text.length ? text.substr(index + 1) : "";
index = this.getIntValue(str);
if (index < 0 || index >= curValue.length)
return null;
return { value: curValue[index], text: text, index: index };
};
ProcessValue.prototype.getFirstPropertyName = function (name, obj, createProp) {
if (createProp === void 0) { createProp = false; }
if (!name)
return name;
if (!obj)
obj = {};
if (obj.hasOwnProperty(name))
return name;
name = name.toLowerCase();
var A = name[0];
var a = A.toUpperCase();
for (var key in obj) {
var first = key[0];
if (first === a || first === A) {
var keyName = key.toLowerCase();
if (keyName == name)
return key;
if (name.length <= keyName.length)
continue;
var ch = name[keyName.length];
if (ch != "." && ch != "[")
continue;
if (keyName == name.substr(0, keyName.length))
return key;
}
}
if (createProp && name[0] !== "[") {
var ind = name.indexOf(".");
if (ind > -1) {
name = name.substr(0, ind);
obj[name] = {};
}
return name;
}
return "";
};
ProcessValue.prototype.getObjectValue = function (obj, name) {
if (!name)
return null;
return obj[name];
};
ProcessValue.prototype.getIntValue = function (str) {
if (str == "0" || ((str | 0) > 0 && str % 1 == 0))
return Number(str);
return -1;
};
return ProcessValue;
}());
/***/ }),
/* 16 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return LocalizableString; });
/**
* The class represents the string that supports multi-languages and markdown.
* It uses in all objects where support for multi-languages and markdown is required.
*/
var LocalizableString = /** @class */ (function () {
function LocalizableString(owner, useMarkdown) {
if (useMarkdown === void 0) { useMarkdown = false; }
this.owner = owner;
this.useMarkdown = useMarkdown;
this.values = {};
this.htmlValues = {};
this.renderedText = null;
this.calculatedTextValue = null;
this.onGetTextCallback = null;
this.onCreating();
}
Object.defineProperty(LocalizableString, "defaultLocale", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "locale", {
get: function () {
return this.owner && this.owner.getLocale ? this.owner.getLocale() : "";
},
enumerable: true,
configurable: true
});
LocalizableString.prototype.strChanged = function () {
if (this.renderedText === null)
return;
this.calculatedTextValue = this.calText();
if (this.renderedText !== this.calculatedTextValue) {
this.renderedText = null;
this.calculatedTextValue = null;
this.onChanged();
}
};
Object.defineProperty(LocalizableString.prototype, "text", {
get: function () {
return this.pureText;
},
set: function (value) {
this.setLocaleText(this.locale, value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "calculatedText", {
get: function () {
this.renderedText =
this.calculatedTextValue !== null
? this.calculatedTextValue
: this.calText();
this.calculatedTextValue = null;
return this.renderedText;
},
enumerable: true,
configurable: true
});
LocalizableString.prototype.calText = function () {
var res = this.pureText;
if (res &&
this.owner &&
this.owner.getProcessedText &&
res.indexOf("{") > -1) {
res = this.owner.getProcessedText(res);
}
if (this.onGetTextCallback)
res = this.onGetTextCallback(res);
return res;
};
Object.defineProperty(LocalizableString.prototype, "pureText", {
get: function () {
var loc = this.locale;
if (!loc)
loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
var res = this.getValue(loc);
if (!res && loc == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName) {
res = this.getValue(__WEBPACK_IMPORTED_MODULE_1__surveyStrings__["a" /* surveyLocalization */].defaultLocale);
}
if (!res && loc !== __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName) {
res = this.getValue(__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName);
}
if (!res)
res = "";
return res;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "hasHtml", {
get: function () {
return this.hasHtmlValue();
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "html", {
get: function () {
if (!this.hasHtml)
return "";
return this.getHtmlValue();
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "isEmpty", {
get: function () {
return this.getValuesKeys().length == 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "textOrHtml", {
get: function () {
return this.hasHtml ? this.getHtmlValue() : this.calculatedText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(LocalizableString.prototype, "renderedHtml", {
get: function () {
return this.textOrHtml;
},
enumerable: true,
configurable: true
});
LocalizableString.prototype.getLocaleText = function (loc) {
if (!loc)
loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
var res = this.getValue(loc);
return res ? res : "";
};
LocalizableString.prototype.setLocaleText = function (loc, value) {
if (value == this.getLocaleText(loc))
return;
if (value &&
loc &&
loc != __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName &&
!this.getValue(loc) &&
value == this.getLocaleText(__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName))
return;
if (!loc)
loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
delete this.htmlValues[loc];
if (!value) {
if (this.getValue(loc))
this.deleteValue(loc);
}
else {
if (typeof value === "string") {
if (loc != __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName &&
value == this.getLocaleText(__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName)) {
this.setLocaleText(loc, null);
}
else {
this.setValue(loc, value);
if (loc == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName) {
this.deleteValuesEqualsToDefault(value);
}
}
}
}
this.strChanged();
};
LocalizableString.prototype.hasNonDefaultText = function () {
var keys = this.getValuesKeys();
if (keys.length == 0)
return false;
return keys.length > 1 || keys[0] != __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
};
LocalizableString.prototype.getLocales = function () {
var keys = this.getValuesKeys();
if (keys.length == 0)
return [];
return keys;
};
LocalizableString.prototype.getJson = function () {
if (!!this.sharedData)
return this.sharedData.getJson();
var keys = this.getValuesKeys();
if (keys.length == 0)
return null;
if (keys.length == 1 &&
keys[0] == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName &&
!__WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].serializeLocalizableStringAsObject)
return this.values[keys[0]];
return this.values;
};
LocalizableString.prototype.setJson = function (value) {
if (!!this.sharedData) {
this.sharedData.setJson(value);
return;
}
this.values = {};
this.htmlValues = {};
if (!value)
return;
if (typeof value === "string") {
this.setLocaleText(null, value);
}
else {
for (var key in value) {
this.setLocaleText(key, value[key]);
}
}
this.strChanged();
};
LocalizableString.prototype.equals = function (obj) {
if (!!this.sharedData)
return this.sharedData.equals(obj);
if (!obj || !obj.values)
return false;
return __WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isTwoValueEquals(this.values, obj.values);
};
LocalizableString.prototype.onChanged = function () {
if (this.onStrChanged)
this.onStrChanged();
};
LocalizableString.prototype.onCreating = function () { };
LocalizableString.prototype.hasHtmlValue = function () {
if (!this.owner || !this.useMarkdown)
return false;
var renderedText = this.calculatedText;
if (!renderedText)
return false;
var loc = this.locale;
if (!loc)
loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
this.htmlValues[loc] = this.owner.getMarkdownHtml(renderedText);
return this.htmlValues[loc] ? true : false;
};
LocalizableString.prototype.getHtmlValue = function () {
var loc = this.locale;
if (!loc)
loc = __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName;
return this.htmlValues[loc];
};
LocalizableString.prototype.deleteValuesEqualsToDefault = function (defaultValue) {
var keys = this.getValuesKeys();
for (var i = 0; i < keys.length; i++) {
if (keys[i] == __WEBPACK_IMPORTED_MODULE_2__settings__["a" /* settings */].defaultLocaleName)
continue;
if (this.getValue(keys[i]) == defaultValue) {
this.deleteValue(keys[i]);
}
}
};
LocalizableString.prototype.getValue = function (loc) {
if (!!this.sharedData)
return this.sharedData.getValue(loc);
return this.values[loc];
};
LocalizableString.prototype.setValue = function (loc, value) {
if (!!this.sharedData)
this.sharedData.setValue(loc, value);
else
this.values[loc] = value;
};
LocalizableString.prototype.deleteValue = function (loc) {
if (!!this.sharedData)
this.sharedData.deleteValue(loc);
else
delete this.values[loc];
};
LocalizableString.prototype.getValuesKeys = function () {
if (!!this.sharedData)
return this.sharedData.getValuesKeys();
return Object.keys(this.values);
};
LocalizableString.SerializeAsObject = false;
return LocalizableString;
}());
/***/ }),
/* 17 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__custom_widget__ = __webpack_require__(140);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__element_factory__ = __webpack_require__(19);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestion; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyElementErrors; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return SurveyQuestionAndErrorsCell; });
var SurveyQuestion = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestion, _super);
function SurveyQuestion(props) {
var _this = _super.call(this, props) || this;
_this.rootRef = __WEBPACK_IMPORTED_MODULE_1_react__["createRef"]();
return _this;
}
SurveyQuestion.renderQuestionBody = function (creator, question) {
if (!question.visible)
return null;
var customWidget = question.customWidget;
if (!customWidget) {
return creator.createQuestionElement(question);
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_5__custom_widget__["a" /* SurveyCustomWidget */], { creator: creator, question: question });
};
SurveyQuestion.prototype.getStateElement = function () {
return this.question;
};
Object.defineProperty(SurveyQuestion.prototype, "question", {
get: function () {
return this.props.element;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestion.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
SurveyQuestion.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
if (!!this.question) {
this.question["react"] = this;
}
this.doAfterRender();
};
SurveyQuestion.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (!!this.question) {
this.question["react"] = null;
}
var el = this.rootRef.current;
if (!!el) {
el.removeAttribute("data-rendered");
}
};
SurveyQuestion.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
this.doAfterRender();
};
SurveyQuestion.prototype.doAfterRender = function () {
if (this.question) {
var el = this.rootRef.current;
if (el && el.getAttribute("data-rendered") !== "r") {
el.setAttribute("data-rendered", "r");
el.setAttribute("name", this.question.name);
this.question.afterRender(el);
}
}
};
SurveyQuestion.prototype.canRender = function () {
return (_super.prototype.canRender.call(this) &&
!!this.question &&
!!this.creator &&
this.question.isVisible);
};
SurveyQuestion.prototype.renderElement = function () {
var question = this.question;
var cssClasses = question.cssClasses;
var questionRender = this.renderQuestion();
var header = this.renderHeader(question);
var headerTop = question.hasTitleOnLeftTop ? header : null;
var headerBottom = question.hasTitleOnBottom ? header : null;
var descriptionUnderInput = question.hasDescriptionUnderInput
? this.renderDescription(cssClasses, true)
: null;
var questionRootClass = question.cssRoot;
var comment = question && question.hasComment ? this.renderComment(cssClasses) : null;
var errorsTop = this.creator.questionErrorLocation() === "top"
? this.renderErrors(cssClasses, "top")
: null;
var errorsBottom = this.creator.questionErrorLocation() === "bottom"
? this.renderErrors(cssClasses, "bottom")
: null;
var rootStyle = {};
if (question.renderWidth) {
rootStyle["width"] = question.renderWidth;
rootStyle["flexGrow"] = 1;
rootStyle["flexShrink"] = 1;
rootStyle["flexBasis"] = question.renderWidth;
rootStyle["minWidth"] = question.minWidth;
rootStyle["maxWidth"] = question.maxWidth;
}
if (!!question.paddingLeft)
rootStyle["paddingLeft"] = question.paddingLeft;
if (!!question.paddingRight)
rootStyle["paddingRight"] = question.paddingRight;
if (question.isReadOnly) {
questionRootClass += " " + cssClasses.disabled;
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: this.rootRef, id: question.id, className: questionRootClass, style: rootStyle, role: question.ariaRole, "aria-labelledby": question.hasTitle ? question.ariaTitleId : null },
headerTop,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: question.cssContent },
errorsTop,
questionRender,
comment,
errorsBottom,
descriptionUnderInput),
headerBottom));
};
SurveyQuestion.prototype.renderQuestion = function () {
return SurveyQuestion.renderQuestionBody(this.creator, this.question);
};
SurveyQuestion.prototype.renderTitle = function (cssClasses) {
var spans = this.renderTitleSpans(this.question, cssClasses);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h5", { className: this.question.cssTitle, "aria-label": this.question.locTitle.renderedHtml, id: this.question.ariaTitleId }, spans));
};
SurveyQuestion.prototype.renderDescription = function (cssClasses, isUnderInput) {
if (isUnderInput === void 0) { isUnderInput = false; }
var descriptionText = __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.question.locDescription);
var className = isUnderInput
? cssClasses.descriptionUnderInput
: cssClasses.description;
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: className }, descriptionText);
};
SurveyQuestion.prototype.renderComment = function (cssClasses) {
// var commentText = SurveyElementBase.renderLocString(
// this.question.locCommentText
// );
var commentText = this.question.commentText;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.formGroup },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null, commentText),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, cssClasses: cssClasses, otherCss: cssClasses.other, isDisplayMode: this.question.isReadOnly })));
};
SurveyQuestion.prototype.renderHeader = function (question) {
var cssClasses = question.cssClasses;
var title = question.hasTitle ? this.renderTitle(cssClasses) : null;
var description = question.hasDescriptionUnderTitle
? this.renderDescription(cssClasses)
: null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: question.cssHeader, onClick: question.clickTitleFunction },
title,
description));
};
SurveyQuestion.prototype.renderErrors = function (cssClasses, location) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyElementErrors, { element: this.question, cssClasses: cssClasses, creator: this.creator, location: location, id: this.question.id + "_errors" }));
};
return SurveyQuestion;
}(__WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["a" /* SurveyElementBase */]));
__WEBPACK_IMPORTED_MODULE_6__element_factory__["a" /* ReactElementFactory */].Instance.registerElement("question", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestion, props);
});
var SurveyElementErrors = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyElementErrors, _super);
function SurveyElementErrors(props) {
var _this = _super.call(this, props) || this;
_this.state = _this.getState();
return _this;
}
Object.defineProperty(SurveyElementErrors.prototype, "id", {
get: function () {
return this.props.id;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElementErrors.prototype, "element", {
get: function () {
var element = this.props.element;
return element instanceof __WEBPACK_IMPORTED_MODULE_2__base__["a" /* SurveyElement */] ? element : null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElementErrors.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElementErrors.prototype, "location", {
get: function () {
return this.props.location;
},
enumerable: true,
configurable: true
});
SurveyElementErrors.prototype.getState = function (prevState) {
if (prevState === void 0) { prevState = null; }
return !prevState ? { error: 0 } : { error: prevState.error + 1 };
};
SurveyElementErrors.prototype.canRender = function () {
return !!this.element && this.element.errors.length > 0;
};
SurveyElementErrors.prototype.renderElement = function () {
var errors = [];
for (var i = 0; i < this.element.errors.length; i++) {
var key = "error" + i;
errors.push(this.creator.renderError(key, this.element.errors[i], this.cssClasses));
}
var classes = this.cssClasses.error.root;
if (this.location === "top") {
classes += " " + this.cssClasses.error.locationTop;
}
else if (this.location === "bottom") {
classes += " " + this.cssClasses.error.locationBottom;
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { role: "alert", className: classes, id: this.id }, errors));
};
return SurveyElementErrors;
}(__WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["d" /* ReactSurveyElement */]));
var SurveyQuestionAndErrorsCell = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionAndErrorsCell, _super);
function SurveyQuestionAndErrorsCell(props) {
var _this = _super.call(this, props) || this;
_this.cellRef = __WEBPACK_IMPORTED_MODULE_1_react__["createRef"]();
return _this;
}
SurveyQuestionAndErrorsCell.prototype.getStateElement = function () {
return this.question;
};
Object.defineProperty(SurveyQuestionAndErrorsCell.prototype, "question", {
get: function () {
return this.getQuestion();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionAndErrorsCell.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
SurveyQuestionAndErrorsCell.prototype.getQuestion = function () {
return this.props.question;
};
SurveyQuestionAndErrorsCell.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
this.doAfterRender();
};
SurveyQuestionAndErrorsCell.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (this.question) {
var el = this.cellRef.current;
if (!!el) {
el.removeAttribute("data-rendered");
}
}
};
SurveyQuestionAndErrorsCell.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
this.doAfterRender();
};
SurveyQuestionAndErrorsCell.prototype.doAfterRender = function () { };
SurveyQuestionAndErrorsCell.prototype.getCellClass = function () {
return null;
};
SurveyQuestionAndErrorsCell.prototype.canRender = function () {
return !!this.question;
};
SurveyQuestionAndErrorsCell.prototype.renderElement = function () {
var errorsLocation = this.creator.questionErrorLocation();
var errors = this.getShowErrors() ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyElementErrors, { element: this.question, cssClasses: this.cssClasses, creator: this.creator, location: errorsLocation })) : null;
var errorsTop = errorsLocation === "top" ? errors : null;
var errorsBottom = errorsLocation === "bottom" ? errors : null;
var renderedCell = this.renderQuestion();
var style = this.getCellStyle();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { ref: this.cellRef, className: this.getCellClass() + " " + this.cssClasses.cell, headers: this.question.isVisible ? this.getHeaderText() : "", style: style },
errorsTop,
renderedCell,
errorsBottom));
};
SurveyQuestionAndErrorsCell.prototype.getShowErrors = function () {
return this.question.isVisible;
};
SurveyQuestionAndErrorsCell.prototype.getCellStyle = function () {
return null;
};
SurveyQuestionAndErrorsCell.prototype.renderQuestion = function () {
return SurveyQuestion.renderQuestionBody(this.creator, this.question);
};
SurveyQuestionAndErrorsCell.prototype.getHeaderText = function () {
return !!this["cell"] ? this["cell"].column.locTitle.renderedHtml : "";
};
return SurveyQuestionAndErrorsCell;
}(__WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["d" /* ReactSurveyElement */]));
/***/ }),
/* 18 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionComment; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionCommentItem; });
var SurveyQuestionComment = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionComment, _super);
function SurveyQuestionComment(props) {
return _super.call(this, props) || this;
}
SurveyQuestionComment.prototype.renderElement = function () {
var _this = this;
var cssClasses = this.question.cssClasses;
var onBlur = !this.question.isInputTextUpdate
? this.updateValueOnEvent
: null;
var onInput = this.question.isInputTextUpdate
? this.updateValueOnEvent
: null;
var placeHolder = this.question.isReadOnly ? "" : this.question.placeHolder;
if (this.question.isReadOnlyRenderDiv()) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null, this.question.value);
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("textarea", { id: this.question.inputId, className: cssClasses.root, disabled: this.isDisplayMode, ref: function (tetxarea) { return (_this.control = tetxarea); }, maxLength: this.question.getMaxLength(), placeholder: placeHolder, onBlur: onBlur, onInput: onInput, cols: this.question.cols, rows: this.question.rows, "aria-required": this.question.isRequired, "aria-label": this.question.locTitle.renderedHtml, "aria-invalid": this.question.errors.length > 0, "aria-describedby": this.question.errors.length > 0 ? this.question.id + "_errors" : null }));
};
return SurveyQuestionComment;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* SurveyQuestionUncontrolledElement */]));
var SurveyQuestionCommentItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionCommentItem, _super);
function SurveyQuestionCommentItem() {
return _super !== null && _super.apply(this, arguments) || this;
}
SurveyQuestionCommentItem.prototype.canRender = function () {
return !!this.props.question;
};
SurveyQuestionCommentItem.prototype.renderElement = function () {
var _this = this;
var question = this.props.question;
var className = this.props.otherCss || this.cssClasses.comment;
var handleOnChange = function (event) {
_this.setState({ comment: event.target.value });
};
var updateValueOnEvent = function (event) {
question.comment = event.target.value;
};
var onBlur = !question.isInputTextUpdate ? updateValueOnEvent : null;
var onInput = question.isInputTextUpdate ? updateValueOnEvent : null;
var comment = !!this.state && this.state.comment !== undefined
? this.state.comment
: question.comment || "";
if (question.isReadOnlyRenderDiv()) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null, comment);
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("textarea", { className: className, value: comment, disabled: this.isDisplayMode, maxLength: question.getOthersMaxLength(), placeholder: question.otherPlaceHolder, onChange: handleOnChange, onBlur: onBlur, onInput: onInput, "aria-required": question.isRequired, "aria-label": question.locTitle.renderedHtml }));
};
return SurveyQuestionCommentItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["d" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("comment", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionComment, props);
});
/***/ }),
/* 19 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ReactElementFactory; });
var ReactElementFactory = /** @class */ (function () {
function ReactElementFactory() {
this.creatorHash = {};
}
ReactElementFactory.prototype.registerElement = function (elementType, elementCreator) {
this.creatorHash[elementType] = elementCreator;
};
ReactElementFactory.prototype.getAllTypes = function () {
var result = new Array();
for (var key in this.creatorHash) {
result.push(key);
}
return result.sort();
};
ReactElementFactory.prototype.isElementRegisgered = function (elementType) {
return !!this.creatorHash[elementType];
};
ReactElementFactory.prototype.createElement = function (elementType, params) {
var creator = this.creatorHash[elementType];
if (creator == null)
return null;
return creator(params);
};
ReactElementFactory.Instance = new ReactElementFactory();
return ReactElementFactory;
}());
/***/ }),
/* 20 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__choicesRestfull__ = __webpack_require__(43);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionSelectBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCheckboxBase; });
/**
* It is a base class for checkbox, dropdown and radiogroup questions.
*/
var QuestionSelectBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionSelectBase, _super);
function QuestionSelectBase(name) {
var _this = _super.call(this, name) || this;
_this.filteredChoicesValue = null;
_this.otherItemValue = new __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */]("other");
_this.choicesFromUrl = null;
_this.cachedValueForUrlRequests = null;
_this.isChoicesLoaded = false;
_this.enableOnLoadingChoices = false;
_this.isSettingDefaultValue = false;
_this.isSettingComment = false;
_this.isRunningChoices = false;
_this.isFirstLoadChoicesFromUrl = true;
var self = _this;
_this.createItemValues("choices");
_this.registerFunctionOnPropertyValueChanged("choices", function () {
if (!self.filterItems()) {
self.onVisibleChoicesChanged();
}
});
_this.registerFunctionOnPropertyValueChanged("hideIfChoicesEmpty", function () {
self.updateVisibilityBasedOnChoices();
});
_this.createNewArray("visibleChoices");
_this.choicesByUrl = _this.createRestfull();
_this.choicesByUrl.owner = _this;
var locOtherText = _this.createLocalizableString("otherText", _this, true);
_this.createLocalizableString("otherErrorText", _this, true);
_this.otherItemValue.locOwner = _this;
_this.otherItemValue.setLocText(locOtherText);
locOtherText.onGetTextCallback = function (text) {
return !!text ? text : __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText");
};
_this.choicesByUrl.beforeSendRequestCallback = function () {
self.onBeforeSendRequest();
};
_this.choicesByUrl.getResultCallback = function (items) {
self.onLoadChoicesFromUrl(items);
};
_this.choicesByUrl.updateResultCallback = function (items, serverResult) {
if (self.survey) {
return self.survey.updateChoicesFromServer(self, items, serverResult);
}
return items;
};
_this.createLocalizableString("otherPlaceHolder", _this);
return _this;
}
QuestionSelectBase.prototype.getType = function () {
return "selectbase";
};
QuestionSelectBase.prototype.supportGoNextPageError = function () {
return !this.isOtherSelected || !!this.comment;
};
QuestionSelectBase.prototype.isLayoutTypeSupported = function (layoutType) {
return true;
};
Object.defineProperty(QuestionSelectBase.prototype, "otherItem", {
/**
* Returns the other item. By using this property, you may change programmatically it's value and text.
* @see hasOther
*/
get: function () {
return this.otherItemValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "isOtherSelected", {
/**
* Returns true if a user select the 'other' item.
*/
get: function () {
return this.hasOther && this.getHasOther(this.renderedValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "choicesVisibleIf", {
/**
* An expression that returns true or false. It runs against each choices item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression.
* @see visibleIf
* @see choicesEnableIf
*/
get: function () {
return this.getPropertyValue("choicesVisibleIf", "");
},
set: function (val) {
this.setPropertyValue("choicesVisibleIf", val);
this.filterItems();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "choicesEnableIf", {
/**
* An expression that returns true or false. It runs against each choices item and if for this item it returns true, then the item is enabled otherwise the item becomes disabled. Please use {item} to get the current item value in the expression.
* @see choicesVisibleIf
*/
get: function () {
return this.getPropertyValue("choicesEnableIf", "");
},
set: function (val) {
this.setPropertyValue("choicesEnableIf", val);
this.filterItems();
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
this.runItemsEnableCondition(values, properties);
this.runItemsCondition(values, properties);
};
QuestionSelectBase.prototype.isTextValue = function () {
return true; //for comments and others
};
QuestionSelectBase.prototype.setDefaultValue = function () {
this.isSettingDefaultValue =
!this.isValueEmpty(this.defaultValue) &&
this.hasUnknownValue(this.defaultValue);
_super.prototype.setDefaultValue.call(this);
this.isSettingDefaultValue = false;
};
QuestionSelectBase.prototype.getIsMultipleValue = function () {
return false;
};
QuestionSelectBase.prototype.convertDefaultValue = function (val) {
if (val == null || val == undefined)
return val;
if (this.getIsMultipleValue()) {
if (!Array.isArray(val))
return [val];
}
else {
if (Array.isArray(val) && val.length > 0)
return val[0];
}
return val;
};
QuestionSelectBase.prototype.filterItems = function () {
if (this.isLoadingFromJson ||
!this.data ||
this.areInvisibleElementsShowing)
return false;
var values = this.getDataFilteredValues();
var properties = this.getDataFilteredProperties();
this.runItemsEnableCondition(values, properties);
return this.runItemsCondition(values, properties);
};
QuestionSelectBase.prototype.runItemsCondition = function (values, properties) {
this.setConditionalChoicesRunner();
var hasChanges = this.runConditionsForItems(values, properties);
if (!!this.filteredChoicesValue &&
this.filteredChoicesValue.length === this.activeChoices.length) {
this.filteredChoicesValue = null;
}
if (hasChanges) {
this.onVisibleChoicesChanged();
this.clearIncorrectValues();
}
return hasChanges;
};
QuestionSelectBase.prototype.runItemsEnableCondition = function (values, properties) {
this.setConditionalEnableChoicesRunner();
var hasChanged = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].runEnabledConditionsForItems(this.activeChoices, this.conditionChoicesEnableIfRunner, values, properties);
if (hasChanged) {
this.clearDisabledValues();
}
};
QuestionSelectBase.prototype.setConditionalChoicesRunner = function () {
if (this.choicesVisibleIf) {
if (!this.conditionChoicesVisibleIfRunner) {
this.conditionChoicesVisibleIfRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["b" /* ConditionRunner */](this.choicesVisibleIf);
}
this.conditionChoicesVisibleIfRunner.expression = this.choicesVisibleIf;
}
else {
this.conditionChoicesVisibleIfRunner = null;
}
};
QuestionSelectBase.prototype.setConditionalEnableChoicesRunner = function () {
if (this.choicesEnableIf) {
if (!this.conditionChoicesEnableIfRunner) {
this.conditionChoicesEnableIfRunner = new __WEBPACK_IMPORTED_MODULE_8__conditions__["b" /* ConditionRunner */](this.choicesEnableIf);
}
this.conditionChoicesEnableIfRunner.expression = this.choicesEnableIf;
}
else {
this.conditionChoicesEnableIfRunner = null;
}
};
QuestionSelectBase.prototype.runConditionsForItems = function (values, properties) {
this.filteredChoicesValue = [];
return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].runConditionsForItems(this.activeChoices, this.filteredChoices, this.areInvisibleElementsShowing
? null
: this.conditionChoicesVisibleIfRunner, values, properties, !this.survey || !this.survey.areInvisibleElementsShowing);
};
QuestionSelectBase.prototype.getHasOther = function (val) {
return val === this.otherItem.value;
};
Object.defineProperty(QuestionSelectBase.prototype, "validatedValue", {
get: function () {
return this.rendredValueToDataCore(this.value);
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.createRestfull = function () {
return new __WEBPACK_IMPORTED_MODULE_7__choicesRestfull__["a" /* ChoicesRestfull */]();
};
QuestionSelectBase.prototype.getQuestionComment = function () {
if (!!this.commentValue)
return this.commentValue;
if (this.hasComment || this.getStoreOthersAsComment())
return _super.prototype.getQuestionComment.call(this);
return this.commentValue;
};
QuestionSelectBase.prototype.setQuestionComment = function (newValue) {
if (this.hasComment || this.getStoreOthersAsComment())
_super.prototype.setQuestionComment.call(this, newValue);
else {
if (!this.isSettingComment && newValue != this.commentValue) {
this.isSettingComment = true;
this.commentValue = newValue;
if (this.isOtherSelected && !this.isRenderedValueSetting) {
this.value = this.rendredValueToData(this.renderedValue);
}
this.isSettingComment = false;
}
}
};
Object.defineProperty(QuestionSelectBase.prototype, "renderedValue", {
get: function () {
return this.getPropertyValue("renderedValue", null);
},
set: function (val) {
this.setPropertyValue("renderedValue", val);
this.value = this.rendredValueToData(val);
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.setQuestionValue = function (newValue, updateIsAnswered) {
if (updateIsAnswered === void 0) { updateIsAnswered = true; }
if (this.isLoadingFromJson ||
__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(this.value, newValue))
return;
_super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);
this.setPropertyValue("renderedValue", this.rendredValueFromData(newValue));
if (this.hasComment)
return;
var isOtherSel = this.isOtherSelected;
if (isOtherSel && !!this.prevCommentValue) {
var oldComment = this.prevCommentValue;
this.prevCommentValue = "";
this.comment = oldComment;
}
if (!isOtherSel && !!this.comment) {
if (this.getStoreOthersAsComment()) {
this.prevCommentValue = this.comment;
}
this.comment = "";
}
};
QuestionSelectBase.prototype.setNewValue = function (newValue) {
newValue = this.valueFromData(newValue);
if ((!this.choicesByUrl.isRunning &&
!this.choicesByUrl.isWaitingForParameters) ||
!this.isValueEmpty(newValue)) {
this.cachedValueForUrlRequests = newValue;
}
_super.prototype.setNewValue.call(this, newValue);
};
QuestionSelectBase.prototype.valueFromData = function (val) {
var choiceitem = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(this.activeChoices, val);
if (!!choiceitem) {
return choiceitem.value;
}
return _super.prototype.valueFromData.call(this, val);
};
QuestionSelectBase.prototype.rendredValueFromData = function (val) {
if (this.getStoreOthersAsComment())
return val;
return this.renderedValueFromDataCore(val);
};
QuestionSelectBase.prototype.rendredValueToData = function (val) {
if (this.getStoreOthersAsComment())
return val;
return this.rendredValueToDataCore(val);
};
QuestionSelectBase.prototype.renderedValueFromDataCore = function (val) {
if (!this.hasUnknownValue(val, true))
return this.valueFromData(val);
this.comment = val;
return this.otherItem.value;
};
QuestionSelectBase.prototype.rendredValueToDataCore = function (val) {
if (val == this.otherItem.value && this.getQuestionComment()) {
val = this.getQuestionComment();
}
return val;
};
QuestionSelectBase.prototype.hasUnknownValue = function (val, includeOther) {
if (includeOther === void 0) { includeOther = false; }
if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isValueEmpty(val))
return false;
if (includeOther && val == this.otherItem.value)
return false;
return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(this.filteredChoices, val) == null;
};
QuestionSelectBase.prototype.isValueDisabled = function (val) {
var itemValue = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(this.filteredChoices, val);
return !!itemValue && !itemValue.isEnabled;
};
Object.defineProperty(QuestionSelectBase.prototype, "choices", {
/**
* The list of items. Every item has value and text. If text is empty, the value is rendered. The item text supports markdown.
* @see choicesByUrl
*/
get: function () {
return this.getPropertyValue("choices");
},
set: function (newValue) {
this.setPropertyValue("choices", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "hideIfChoicesEmpty", {
/**
* Set this property to true to hide the question if there is no visible choices.
*/
get: function () {
return this.getPropertyValue("hideIfChoicesEmpty", false);
},
set: function (val) {
this.setPropertyValue("hideIfChoicesEmpty", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "keepIncorrectValues", {
get: function () {
return this.getPropertyValue("keepIncorrectValues", false);
},
set: function (val) {
this.setPropertyValue("keepIncorrectValues", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "storeOthersAsComment", {
/**
* Please use survey.storeOthersAsComment to change the behavior on the survey level. This property is depricated and invisible in Survey Creator.
* By default the entered text in the others input in the checkbox/radiogroup/dropdown are stored as "question name " + "-Comment". The value itself is "question name": "others". Set this property to false, to store the entered text directly in the "question name" key.
* Possible values are: "default", true, false
* @see SurveyModel.storeOthersAsComment
*/
get: function () {
return this.getPropertyValue("storeOthersAsComment", "default");
},
set: function (val) {
this.setPropertyValue("storeOthersAsComment", val);
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.hasOtherChanged = function () {
this.onVisibleChoicesChanged();
};
Object.defineProperty(QuestionSelectBase.prototype, "choicesOrder", {
/**
* Use this property to render items in a specific order: "asc", "desc", "random". Default value is "none".
*/
get: function () {
return this.getPropertyValue("choicesOrder");
},
set: function (val) {
val = val.toLowerCase();
if (val == this.choicesOrder)
return;
this.setPropertyValue("choicesOrder", val);
this.onVisibleChoicesChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "otherText", {
/**
* Use this property to set the different text for other item.
*/
get: function () {
return this.getLocalizableStringText("otherText", __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("otherItemText"));
},
set: function (val) {
this.setLocalizableStringText("otherText", val);
this.onVisibleChoicesChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "locOtherText", {
get: function () {
return this.getLocalizableString("otherText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "otherPlaceHolder", {
/**
* Use this property to set the place holder text for other or comment field .
*/
get: function () {
return this.getLocalizableStringText("otherPlaceHolder");
},
set: function (val) {
this.setLocalizableStringText("otherPlaceHolder", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "locOtherPlaceHolder", {
get: function () {
return this.getLocalizableString("otherPlaceHolder");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "otherErrorText", {
/**
* The text that shows when the other item is choosed by the other input is empty.
*/
get: function () {
return this.getLocalizableStringText("otherErrorText", __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("otherRequiredError"));
},
set: function (val) {
this.setLocalizableStringText("otherErrorText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "locOtherErrorText", {
get: function () {
return this.getLocalizableString("otherErrorText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "visibleChoices", {
/**
* The list of items as they will be rendered. If needed items are sorted and the other item is added.
* @see hasOther
* @see choicesOrder
* @see enabledChoices
*/
get: function () {
return this.getPropertyValue("visibleChoices", []);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "enabledChoices", {
/**
* The list of enabled items as they will be rendered. The disabled items are not included
* @see hasOther
* @see choicesOrder
* @see visibleChoices
*/
get: function () {
var res = [];
var items = this.visibleChoices;
for (var i = 0; i < items.length; i++) {
if (items[i].isEnabled)
res.push(items[i]);
}
return res;
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.updateVisibleChoices = function () {
if (this.isLoadingFromJson)
return;
var newValue = new Array();
var calcValue = this.calcVisibleChoices();
if (!calcValue)
calcValue = [];
for (var i = 0; i < calcValue.length; i++) {
newValue.push(calcValue[i]);
}
this.setPropertyValue("visibleChoices", newValue);
};
QuestionSelectBase.prototype.calcVisibleChoices = function () {
if (this.canUseFilteredChoices())
return this.filteredChoices;
var res = this.sortVisibleChoices(this.filteredChoices.slice());
this.addToVisibleChoices(res);
return res;
};
QuestionSelectBase.prototype.canUseFilteredChoices = function () {
return !this.hasOther && this.choicesOrder == "none";
};
QuestionSelectBase.prototype.addToVisibleChoices = function (items) {
if (this.hasOther) {
items.push(this.otherItem);
}
};
QuestionSelectBase.prototype.getPlainData = function (options) {
var _this = this;
if (options === void 0) { options = {
includeEmpty: true,
includeQuestionTypes: false,
}; }
var questionPlainData = _super.prototype.getPlainData.call(this, options);
if (!!questionPlainData) {
var values = Array.isArray(this.value) ? this.value : [this.value];
questionPlainData.isNode = true;
questionPlainData.data = (questionPlainData.data || []).concat(values.map(function (dataValue, index) {
var choice = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(_this.visibleChoices, dataValue);
var choiceDataItem = {
name: index,
title: "Choice",
value: dataValue,
displayValue: _this.getChoicesDisplayValue(_this.visibleChoices, dataValue),
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: false,
};
if (!!choice) {
(options.calculations || []).forEach(function (calculation) {
choiceDataItem[calculation.propertyName] =
choice[calculation.propertyName];
});
}
if (_this.isOtherSelected && _this.otherItemValue === choice) {
choiceDataItem.isOther = true;
choiceDataItem.displayValue = _this.comment;
}
return choiceDataItem;
}));
}
return questionPlainData;
};
/**
* Returns the text for the current value. If the value is null then returns empty string. If 'other' is selected then returns the text for other value.
*/
QuestionSelectBase.prototype.getDisplayValueCore = function (keysAsText, value) {
return this.getChoicesDisplayValue(this.visibleChoices, value);
};
QuestionSelectBase.prototype.getChoicesDisplayValue = function (items, val) {
if (val == this.otherItemValue.value)
return this.comment ? this.comment : this.locOtherText.textOrHtml;
var str = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(items, val);
return str == "" && val ? val : str;
};
Object.defineProperty(QuestionSelectBase.prototype, "filteredChoices", {
get: function () {
return this.filteredChoicesValue
? this.filteredChoicesValue
: this.activeChoices;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "activeChoices", {
get: function () {
return this.choicesFromUrl ? this.choicesFromUrl : this.getChoices();
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.getChoices = function () {
return this.choices;
};
QuestionSelectBase.prototype.supportComment = function () {
return true;
};
QuestionSelectBase.prototype.supportOther = function () {
return true;
};
QuestionSelectBase.prototype.onCheckForErrors = function (errors, isOnValueChanged) {
_super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged);
if (!this.hasOther || !this.isOtherSelected || this.comment)
return;
errors.push(new __WEBPACK_IMPORTED_MODULE_6__error__["h" /* OtherEmptyError */](this.otherErrorText, this));
};
QuestionSelectBase.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
this.runChoicesByUrl();
};
QuestionSelectBase.prototype.getStoreOthersAsComment = function () {
if (this.isSettingDefaultValue)
return false;
return (this.storeOthersAsComment === true ||
(this.storeOthersAsComment == "default" &&
(this.survey != null ? this.survey.storeOthersAsComment : true)) ||
(!this.choicesByUrl.isEmpty && !this.choicesFromUrl));
};
QuestionSelectBase.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.runChoicesByUrl();
this.onVisibleChoicesChanged();
};
QuestionSelectBase.prototype.onAnyValueChanged = function (name) {
_super.prototype.onAnyValueChanged.call(this, name);
if (name != this.getValueName()) {
this.runChoicesByUrl();
}
};
QuestionSelectBase.prototype.updateValueFromSurvey = function (newValue) {
var newComment = "";
if (this.hasOther &&
this.getStoreOthersAsComment() &&
this.hasUnknownValue(newValue) &&
!this.getHasOther(newValue)) {
newComment = this.getCommentFromValue(newValue);
newValue = this.setOtherValueIntoValue(newValue);
}
_super.prototype.updateValueFromSurvey.call(this, newValue);
if (!!newComment) {
this.setNewComment(newComment);
}
};
QuestionSelectBase.prototype.getCommentFromValue = function (newValue) {
return newValue;
};
QuestionSelectBase.prototype.setOtherValueIntoValue = function (newValue) {
return this.otherItem.value;
};
QuestionSelectBase.prototype.runChoicesByUrl = function () {
if (!this.choicesByUrl || this.isLoadingFromJson || this.isRunningChoices)
return;
var processor = this.surveyImpl
? this.surveyImpl.getTextProcessor()
: this.textProcessor;
if (!processor)
processor = this.survey;
if (!processor)
return;
this.isReadyValue = this.isChoicesLoaded || this.choicesByUrl.isEmpty;
this.isRunningChoices = true;
this.choicesByUrl.run(processor);
this.isRunningChoices = false;
};
QuestionSelectBase.prototype.onBeforeSendRequest = function () {
if (__WEBPACK_IMPORTED_MODULE_9__settings__["a" /* settings */].disableOnGettingChoicesFromWeb === true && !this.isReadOnly) {
this.enableOnLoadingChoices = true;
this.readOnly = true;
}
};
QuestionSelectBase.prototype.onLoadChoicesFromUrl = function (array) {
if (this.enableOnLoadingChoices) {
this.readOnly = false;
}
if (!this.isReadOnly) {
var errors = [];
if (this.choicesByUrl && this.choicesByUrl.error) {
errors.push(this.choicesByUrl.error);
}
this.errors = errors;
}
var newChoices = null;
var checkCachedValuesOnExisting = true;
if (this.isFirstLoadChoicesFromUrl &&
!this.cachedValueForUrlRequests &&
this.defaultValue) {
this.cachedValueForUrlRequests = this.defaultValue;
checkCachedValuesOnExisting = false;
}
if (this.isValueEmpty(this.cachedValueForUrlRequests)) {
this.cachedValueForUrlRequests = this.value;
}
this.isFirstLoadChoicesFromUrl = false;
var cachedValues = this.createCachedValueForUrlRequests(this.cachedValueForUrlRequests, checkCachedValuesOnExisting);
if (array && array.length > 0) {
newChoices = new Array();
__WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].setData(newChoices, array);
}
this.choicesFromUrl = newChoices;
this.filterItems();
this.onVisibleChoicesChanged();
if (newChoices) {
var newValue = this.updateCachedValueForUrlRequests(cachedValues, newChoices);
if (!!newValue && !this.isReadOnly) {
var hasChanged = !__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(this.value, newValue.value);
try {
if (!__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isValueEmpty(newValue.value)) {
this.allowNotifyValueChanged = false;
this.locNotificationInData = true;
this.value = undefined;
this.locNotificationInData = false;
}
this.allowNotifyValueChanged = hasChanged;
this.value = newValue.value;
}
finally {
this.allowNotifyValueChanged = true;
}
}
}
this.choicesLoaded();
};
QuestionSelectBase.prototype.createCachedValueForUrlRequests = function (val, checkOnExisting) {
if (this.isValueEmpty(val))
return null;
if (Array.isArray(val)) {
var res = [];
for (var i = 0; i < val.length; i++) {
res.push(this.createCachedValueForUrlRequests(val[i], true));
}
return res;
}
var isExists = checkOnExisting ? !this.hasUnknownValue(val) : true;
return { value: val, isExists: isExists };
};
QuestionSelectBase.prototype.updateCachedValueForUrlRequests = function (val, newChoices) {
if (this.isValueEmpty(val))
return null;
if (Array.isArray(val)) {
var res = [];
for (var i = 0; i < val.length; i++) {
var updatedValue = this.updateCachedValueForUrlRequests(val[i], newChoices);
if (updatedValue && !this.isValueEmpty(updatedValue.value)) {
var newValue = updatedValue.value;
var item = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(newChoices, updatedValue.value);
if (!!item) {
newValue = item.value;
}
res.push(newValue);
}
}
return { value: res };
}
var value = val.isExists && this.hasUnknownValue(val.value) ? null : val.value;
var item = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(newChoices, value);
if (!!item) {
value = item.value;
}
return { value: value };
};
QuestionSelectBase.prototype.onVisibleChoicesChanged = function () {
if (this.isLoadingFromJson)
return;
this.updateVisibleChoices();
this.updateVisibilityBasedOnChoices();
if (!!this.visibleChoicesChangedCallback)
this.visibleChoicesChangedCallback();
};
QuestionSelectBase.prototype.updateVisibilityBasedOnChoices = function () {
if (this.hideIfChoicesEmpty) {
this.visible = !this.filteredChoices || this.filteredChoices.length > 0;
}
};
QuestionSelectBase.prototype.sortVisibleChoices = function (array) {
var order = this.choicesOrder.toLowerCase();
if (order == "asc")
return this.sortArray(array, 1);
if (order == "desc")
return this.sortArray(array, -1);
if (order == "random")
return this.randomizeArray(array);
return array;
};
QuestionSelectBase.prototype.sortArray = function (array, mult) {
return array.sort(function (a, b) {
if (a.calculatedText < b.calculatedText)
return -1 * mult;
if (a.calculatedText > b.calculatedText)
return 1 * mult;
return 0;
});
};
QuestionSelectBase.prototype.randomizeArray = function (array) {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].randomizeArray(array);
};
QuestionSelectBase.prototype.clearIncorrectValues = function () {
if (this.keepIncorrectValues)
return;
if (!!this.survey &&
this.survey.questionCountByValueName(this.getValueName()) > 1)
return;
if (!!this.choicesByUrl && !this.choicesByUrl.isEmpty)
return;
if (this.clearIncorrectValuesCallback) {
this.clearIncorrectValuesCallback();
}
else {
this.clearIncorrectValuesCore();
}
};
QuestionSelectBase.prototype.clearValueIfInvisible = function () {
_super.prototype.clearValueIfInvisible.call(this);
this.clearIncorrectValues();
};
/**
* Returns true if item is selected
* @param item checkbox or radio item value
*/
QuestionSelectBase.prototype.isItemSelected = function (item) {
return item.value === this.value;
};
QuestionSelectBase.prototype.clearDisabledValues = function () {
if (!this.survey || !this.survey.clearValueOnDisableItems)
return;
this.clearDisabledValuesCore();
};
QuestionSelectBase.prototype.clearIncorrectValuesCore = function () {
var val = this.value;
if (this.canClearValueAnUnknow(val)) {
this.clearValue();
}
};
QuestionSelectBase.prototype.canClearValueAnUnknow = function (val) {
if (!this.getStoreOthersAsComment() && this.isOtherSelected)
return false;
return this.hasUnknownValue(val, true);
};
QuestionSelectBase.prototype.clearDisabledValuesCore = function () {
if (this.isValueDisabled(this.value)) {
this.clearValue();
}
};
QuestionSelectBase.prototype.clearUnusedValues = function () {
_super.prototype.clearUnusedValues.call(this);
if (!this.isOtherSelected && !this.hasComment) {
this.comment = "";
}
};
QuestionSelectBase.prototype.getColumnClass = function () {
var columnClass = this.cssClasses.column;
if (this.hasColumns) {
columnClass += " sv-q-column-" + this.colCount;
}
return columnClass;
};
QuestionSelectBase.prototype.getLabelClass = function (item) {
var labelClass = this.cssClasses.label;
if (this.isItemSelected(item)) {
labelClass += " " + this.cssClasses.labelChecked;
}
return labelClass;
};
QuestionSelectBase.prototype.getControlLabelClass = function (item) {
var controlLabelClass = this.cssClasses.controlLabel;
if (this.isItemSelected(item)) {
controlLabelClass += " " + this.cssClasses.controlLabelChecked;
}
return controlLabelClass;
};
Object.defineProperty(QuestionSelectBase.prototype, "columns", {
get: function () {
var columns = [];
var colCount = this.colCount;
if (this.hasColumns && this.visibleChoices.length > 0) {
for (var i = 0; i < colCount; i++) {
var column = [];
for (var j = i; j < this.visibleChoices.length; j += colCount) {
column.push(this.visibleChoices[j]);
}
columns.push(column);
}
}
return columns;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSelectBase.prototype, "hasColumns", {
get: function () {
return this.colCount > 1;
},
enumerable: true,
configurable: true
});
QuestionSelectBase.prototype.choicesLoaded = function () {
this.isChoicesLoaded = true;
var oldIsReady = this.isReadyValue;
this.isReadyValue = true;
this.onReadyChanged &&
this.onReadyChanged.fire(this, {
question: this,
isReady: true,
oldIsReady: oldIsReady,
});
};
return QuestionSelectBase;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
/**
* A base class for checkbox and radiogroup questions. It introduced a colCount property.
*/
var QuestionCheckboxBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionCheckboxBase, _super);
function QuestionCheckboxBase(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
Object.defineProperty(QuestionCheckboxBase.prototype, "colCount", {
/**
* The number of columns for radiogroup and checkbox questions. Items are rendred in one line if the value is 0.
*/
get: function () {
return this.getPropertyValue("colCount", this.isFlowLayout ? 0 : 1);
},
set: function (value) {
if (value < 0 || value > 5 || this.isFlowLayout)
return;
this.setPropertyValue("colCount", value);
this.fireCallback(this.colCountChangedCallback);
},
enumerable: true,
configurable: true
});
QuestionCheckboxBase.prototype.getItemIndex = function (item) {
return this.visibleChoices.indexOf(item);
};
QuestionCheckboxBase.prototype.onParentChanged = function () {
_super.prototype.onParentChanged.call(this);
if (this.isFlowLayout) {
this.setPropertyValue("colCount", null);
}
};
return QuestionCheckboxBase;
}(QuestionSelectBase));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("selectbase", [
{ name: "hasComment:switch", layout: "row" },
{
name: "commentText",
dependsOn: "hasComment",
visibleIf: function (obj) {
return obj.hasComment;
},
serializationProperty: "locCommentText",
layout: "row",
},
{
name: "choices:itemvalue[]",
baseValue: function () {
return __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("choices_Item");
},
},
{
name: "choicesOrder",
default: "none",
choices: ["none", "asc", "desc", "random"],
},
{
name: "choicesByUrl:restfull",
className: "ChoicesRestfull",
onGetValue: function (obj) {
return obj.choicesByUrl.getData();
},
onSetValue: function (obj, value) {
obj.choicesByUrl.setData(value);
},
},
"hideIfChoicesEmpty:boolean",
"choicesVisibleIf:condition",
"choicesEnableIf:condition",
"hasOther:boolean",
{
name: "otherPlaceHolder",
serializationProperty: "locOtherPlaceHolder",
dependsOn: "hasOther",
visibleIf: function (obj) {
return obj.hasOther;
},
},
{
name: "otherText",
serializationProperty: "locOtherText",
dependsOn: "hasOther",
visibleIf: function (obj) {
return obj.hasOther;
},
},
{
name: "otherErrorText",
serializationProperty: "locOtherErrorText",
dependsOn: "hasOther",
visibleIf: function (obj) {
return obj.hasOther;
},
},
{
name: "storeOthersAsComment",
default: "default",
choices: ["default", true, false],
visible: false,
},
], null, "question");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("checkboxbase", [
{
name: "colCount:number",
default: 1,
choices: [0, 1, 2, 3, 4, 5],
layout: "row",
},
], null, "selectbase");
/***/ }),
/* 21 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestion__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__element_factory__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__panel_base__ = __webpack_require__(53);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyPanel; });
var SurveyPanel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyPanel, _super);
function SurveyPanel(props) {
var _this = _super.call(this, props) || this;
_this.hasBeenExpanded = false;
_this.handleEditClick = _this.handleEditClick.bind(_this);
return _this;
}
Object.defineProperty(SurveyPanel.prototype, "panel", {
get: function () {
return this.panelBase;
},
enumerable: true,
configurable: true
});
SurveyPanel.prototype.handleEditClick = function (event) {
this.panel.cancelPreview();
};
SurveyPanel.prototype.canRender = function () {
return (_super.prototype.canRender.call(this) &&
!!this.survey &&
!!this.panelBase &&
this.panelBase.isVisible);
};
SurveyPanel.prototype.renderElement = function () {
var title = this.renderTitle();
var description = this.renderDescription();
var errors = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_2__reactquestion__["b" /* SurveyElementErrors */], { element: this.panelBase, cssClasses: this.panelBase.cssClasses, creator: this.creator }));
var style = {
paddingLeft: this.panel.innerPaddingLeft,
display: !this.panel.isCollapsed ? "block" : "none",
};
var content = null;
if (!this.panel.isCollapsed || this.hasBeenExpanded) {
this.hasBeenExpanded = true;
var rows = this.renderRows(this.panelBase.cssClasses);
var className = this.panelBase.cssClasses.panel.content;
content = this.renderContent(style, rows, className);
}
var rootStyle = {};
if (this.panel.renderWidth) {
rootStyle["width"] = this.panel.renderWidth;
rootStyle["flexGrow"] = 1;
rootStyle["flexShrink"] = 1;
rootStyle["flexBasis"] = this.panel.renderWidth;
rootStyle["minWidth"] = this.panel["minWidth"];
rootStyle["maxWidth"] = this.panel["maxWidth"];
}
var bottom = this.renderBottom();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: this.rootRef, className: this.panelBase.cssClasses.panel.container, style: rootStyle },
title,
description,
errors,
content,
bottom));
};
SurveyPanel.prototype.renderContent = function (style, rows, className) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: style, className: className }, rows));
};
SurveyPanel.prototype.renderTitle = function () {
var _this = this;
if (!this.panelBase.title)
return null;
var spans = this.renderTitleSpans(this.panel, this.panel.cssClasses);
var expandCollapse = null;
var titleStyle = this.panel.cssClasses.panel.title;
if (this.panel.isCollapsed || this.panel.isExpanded) {
titleStyle += " " + this.panel.cssClasses.panel.titleExpandable;
var iconCss = this.panel.cssClasses.panel.icon;
if (!this.panel.isCollapsed)
iconCss += " " + this.panel.cssClasses.panel.iconExpanded;
var changeExpanded = function () {
if (_this.panel.isCollapsed) {
_this.panel.expand();
}
else {
_this.panel.collapse();
}
};
var pressExpand = function (event) {
if (event.keyCode == 13)
changeExpanded();
};
expandCollapse = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: iconCss, tabIndex: 0, onKeyUp: pressExpand }));
}
if (this.panel.containsErrors) {
titleStyle += " " + this.panel.cssClasses.panel.titleOnError;
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h4", { className: titleStyle, onClick: changeExpanded },
spans,
expandCollapse));
};
SurveyPanel.prototype.renderDescription = function () {
if (!this.panelBase.description)
return null;
var text = __WEBPACK_IMPORTED_MODULE_3__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.panelBase.locDescription);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.panel.cssClasses.panel.description }, text));
};
SurveyPanel.prototype.renderBottom = function () {
if (!this.panel.hasEditButton || !this.survey)
return;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.panel.cssClasses.panel.footer },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: this.survey.cssNavigationEdit, type: "button", onClick: this.handleEditClick, value: this.survey.editText })));
};
return SurveyPanel;
}(__WEBPACK_IMPORTED_MODULE_5__panel_base__["a" /* SurveyPanelBase */]));
__WEBPACK_IMPORTED_MODULE_4__element_factory__["a" /* ReactElementFactory */].Instance.registerElement("panel", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyPanel, props);
});
/***/ }),
/* 22 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__settings__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__utils_utils__ = __webpack_require__(24);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return DragDropInfo; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return QuestionRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return PanelModelBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return PanelModel; });
var DragDropInfo = /** @class */ (function () {
function DragDropInfo(source, target, nestedPanelDepth) {
if (nestedPanelDepth === void 0) { nestedPanelDepth = -1; }
this.source = source;
this.target = target;
this.nestedPanelDepth = nestedPanelDepth;
}
return DragDropInfo;
}());
var QuestionRowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionRowModel, _super);
function QuestionRowModel(panel) {
var _this = _super.call(this) || this;
_this.panel = panel;
_this._scrollableParent = undefined;
_this._updateVisibility = undefined;
_this.isNeedRender = !__WEBPACK_IMPORTED_MODULE_8__settings__["a" /* settings */].lazyRowsRendering;
_this.visible = panel.areInvisibleElementsShowing;
_this.createNewArray("elements");
return _this;
}
QuestionRowModel.prototype.startLazyRendering = function (rowContainerDiv) {
var _this = this;
this._scrollableParent = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__utils_utils__["d" /* findScrollableParent */])(rowContainerDiv);
this._updateVisibility = function () {
var isRowContainerDivVisible = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__utils_utils__["e" /* isElementVisible */])(rowContainerDiv, 50);
if (!_this.isNeedRender && isRowContainerDivVisible) {
_this.isNeedRender = true;
_this.stopLazyRendering();
}
};
setTimeout(function () {
_this._scrollableParent.addEventListener("scroll", _this._updateVisibility);
_this._updateVisibility();
}, 10);
};
QuestionRowModel.prototype.stopLazyRendering = function () {
if (!!this._scrollableParent && !!this._updateVisibility) {
this._scrollableParent.removeEventListener("scroll", this._updateVisibility);
}
this._scrollableParent = undefined;
this._updateVisibility = undefined;
};
Object.defineProperty(QuestionRowModel.prototype, "elements", {
get: function () {
return this.getPropertyValue("elements");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRowModel.prototype, "visible", {
get: function () {
return this.getPropertyValue("visible", true);
},
set: function (val) {
this.setPropertyValue("visible", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRowModel.prototype, "isNeedRender", {
get: function () {
return this.getPropertyValue("isneedrender", true);
},
set: function (val) {
this.setPropertyValue("isneedrender", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRowModel.prototype, "visibleElements", {
get: function () {
return this.elements.filter(function (e) { return e.isVisible; });
},
enumerable: true,
configurable: true
});
QuestionRowModel.prototype.updateVisible = function () {
this.visible = this.calcVisible();
this.setWidth();
};
QuestionRowModel.prototype.addElement = function (q) {
this.elements.push(q);
this.updateVisible();
};
Object.defineProperty(QuestionRowModel.prototype, "index", {
get: function () {
return this.panel.rows.indexOf(this);
},
enumerable: true,
configurable: true
});
QuestionRowModel.prototype.setWidth = function () {
var visCount = this.visibleElements.length;
if (visCount == 0)
return;
var counter = 0;
var preSetWidthElements = [];
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
this.setElementMaxMinWidth(el);
if (el.isVisible) {
var width = this.getElementWidth(el);
if (!!width) {
el.renderWidth = this.getRenderedWidthFromWidth(width);
preSetWidthElements.push(el);
}
el.rightIndent = counter < visCount - 1 ? 1 : 0;
counter++;
}
else {
el.renderWidth = "";
}
}
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
if (!el.isVisible || preSetWidthElements.indexOf(el) > -1)
continue;
if (preSetWidthElements.length == 0) {
el.renderWidth = (100 / visCount).toFixed(6) + "%";
}
else {
el.renderWidth = this.getRenderedCalcWidth(el, preSetWidthElements, visCount);
}
}
};
QuestionRowModel.prototype.setElementMaxMinWidth = function (el) {
if (el.width &&
typeof el.width === "string" &&
el.width.indexOf("%") === -1) {
el.minWidth = el.width;
el.maxWidth = el.width;
}
};
QuestionRowModel.prototype.getRenderedCalcWidth = function (el, preSetWidthElements, visCount) {
var expression = "100%";
for (var i = 0; i < preSetWidthElements.length; i++) {
expression += " - " + preSetWidthElements[i].renderWidth;
}
var calcWidthEl = visCount - preSetWidthElements.length;
if (calcWidthEl > 1) {
expression = "(" + expression + ")/" + calcWidthEl.toString();
}
return "calc(" + expression + ")";
};
QuestionRowModel.prototype.getElementWidth = function (el) {
var width = el.width;
if (!width || typeof width !== "string")
return "";
return width.trim();
};
QuestionRowModel.prototype.getRenderedWidthFromWidth = function (width) {
return __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isNumber(width) ? width + "px" : width;
};
QuestionRowModel.prototype.calcVisible = function () {
return this.visibleElements.length > 0;
};
return QuestionRowModel;
}(__WEBPACK_IMPORTED_MODULE_3__base__["b" /* Base */]));
/**
* A base class for a Panel and Page objects.
*/
var PanelModelBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(PanelModelBase, _super);
function PanelModelBase(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isQuestionsReady = false;
_this.questionsValue = new Array();
_this.createNewArray("rows");
_this.elementsValue = _this.createNewArray("elements", _this.onAddElement.bind(_this), _this.onRemoveElement.bind(_this));
_this.registerFunctionOnPropertyValueChanged("questionTitleLocation", _this.onVisibleChanged.bind(_this));
_this.id = PanelModelBase.getPanelId();
_this.createLocalizableString("title", _this, true);
_this.createLocalizableString("description", _this, true);
_this.createLocalizableString("requiredErrorText", _this);
return _this;
}
PanelModelBase.getPanelId = function () {
return "sp_" + PanelModelBase.panelCounter++;
};
PanelModelBase.prototype.getType = function () {
return "panelbase";
};
PanelModelBase.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
if (this.isDesignMode)
this.onVisibleChanged();
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].setSurveyImpl(value);
}
};
PanelModelBase.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
this.markQuestionListDirty();
this.onRowsChanged();
};
Object.defineProperty(PanelModelBase.prototype, "title", {
/**
* PanelModel or PageModel title property.
* @description
*/
get: function () {
return this.getLocalizableStringText("title");
},
set: function (val) {
this.setLocalizableStringText("title", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "locTitle", {
get: function () {
return this.getLocalizableString("title");
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "_showTitle", {
get: function () {
return ((this.survey.showPageTitles && this.title.length > 0) ||
(this.isDesignMode && __WEBPACK_IMPORTED_MODULE_8__settings__["a" /* settings */].allowShowEmptyTitleInDesignMode));
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "_showDescription", {
get: function () {
return ((this.survey.showPageTitles && this.description.length > 0) ||
(this.isDesignMode &&
__WEBPACK_IMPORTED_MODULE_8__settings__["a" /* settings */].allowShowEmptyTitleInDesignMode &&
__WEBPACK_IMPORTED_MODULE_8__settings__["a" /* settings */].allowShowEmptyDescriptionInDesignMode));
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "description", {
/**
* PanelModel or PageModel description property. It renders under title by using smaller font. Unlike the title, description can be empty.
* @see title
*/
get: function () {
return this.getLocalizableStringText("description");
},
set: function (val) {
this.setLocalizableStringText("description", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "locDescription", {
get: function () {
return this.getLocalizableString("description");
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].locStrsChanged();
}
};
Object.defineProperty(PanelModelBase.prototype, "requiredText", {
/**
* Returns the char/string for a required panel.
* @see SurveyModel.requiredText
*/
get: function () {
return this.survey != null && this.isRequired
? this.survey.requiredText
: "";
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "titlePattern", {
get: function () {
return !!this.survey ? this.survey.questionTitlePattern : "numTitleRequire";
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "isRequireTextOnStart", {
get: function () {
return this.isRequired && this.titlePattern == "requireNumTitle";
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "isRequireTextBeforeTitle", {
get: function () {
return this.isRequired && this.titlePattern == "numRequireTitle";
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "isRequireTextAfterTitle", {
get: function () {
return this.isRequired && this.titlePattern == "numTitleRequire";
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "requiredErrorText", {
/**
* The custom text that will be shown on required error. Use this property, if you do not want to show the default text.
*/
get: function () {
return this.getLocalizableStringText("requiredErrorText");
},
set: function (val) {
this.setLocalizableStringText("requiredErrorText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "locRequiredErrorText", {
get: function () {
return this.getLocalizableString("requiredErrorText");
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getLocale = function () {
return this.survey
? this.survey.getLocale()
: "";
};
PanelModelBase.prototype.getMarkdownHtml = function (text) {
return this.survey ? this.survey.getSurveyMarkdownHtml(this, text) : null;
};
PanelModelBase.prototype.getProcessedText = function (text) {
return this.textProcessor
? this.textProcessor.processText(text, true)
: text;
};
Object.defineProperty(PanelModelBase.prototype, "parent", {
/**
* A parent element. It is always null for the Page object and always not null for the Panel object. Panel object may contain Questions and other Panels.
*/
get: function () {
return this.getPropertyValue("parent", null);
},
set: function (val) {
this.setPropertyValue("parent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "depth", {
get: function () {
if (this.parent == null)
return 0;
return this.parent.depth + 1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "visibleIf", {
/**
* An expression that returns true or false. If it returns true the Panel becomes visible and if it returns false the Panel becomes invisible. The library runs the expression on survey start and on changing a question value. If the property is empty then visible property is used.
* @see visible
*/
get: function () {
return this.getPropertyValue("visibleIf", "");
},
set: function (val) {
this.setPropertyValue("visibleIf", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "cssClasses", {
get: function () {
var classes = { panel: {}, error: {}, row: "" };
this.copyCssClasses(classes.panel, this.css.panel);
this.copyCssClasses(classes.error, this.css.error);
if (!!this.css.row) {
classes.row = this.css.row;
}
if (this.survey) {
this.survey.updatePanelCssClasses(this, classes);
}
return classes;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "css", {
get: function () {
return !!this.survey ? this.survey.getCss() : {};
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "id", {
/**
* A unique element identificator. It is generated automatically.
*/
get: function () {
return this.getPropertyValue("id");
},
set: function (val) {
this.setPropertyValue("id", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "isPanel", {
/**
* Returns true if the current object is Panel. Returns false if the current object is Page (a root Panel).
*/
get: function () {
return false;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getPanel = function () {
return this;
};
PanelModelBase.prototype.getLayoutType = function () {
return "row";
};
PanelModelBase.prototype.isLayoutTypeSupported = function (layoutType) {
return layoutType !== "flow";
};
Object.defineProperty(PanelModelBase.prototype, "questions", {
/**
* Returns the list of all questions located in the Panel/Page, including in the nested Panels.
* @see Question
* @see elements
*/
get: function () {
if (!this.isQuestionsReady) {
this.questionsValue = [];
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
if (el.isPanel) {
var qs = el.questions;
for (var j = 0; j < qs.length; j++) {
this.questionsValue.push(qs[j]);
}
}
else {
this.questionsValue.push(el);
}
}
this.isQuestionsReady = true;
}
return this.questionsValue;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getValidName = function (name) {
if (!!name)
return name.trim();
return name;
};
/**
* Returns the question by its name
* @param name the question name
*/
PanelModelBase.prototype.getQuestionByName = function (name) {
var questions = this.questions;
for (var i = 0; i < questions.length; i++) {
if (questions[i].name == name)
return questions[i];
}
return null;
};
/**
* Returns the element by its name. It works recursively.
* @param name the element name
*/
PanelModelBase.prototype.getElementByName = function (name) {
var elements = this.elements;
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (el.name == name)
return el;
var pnl = el.getPanel();
if (!!pnl) {
var res = pnl.getElementByName(name);
if (!!res)
return res;
}
}
return null;
};
PanelModelBase.prototype.getQuestionByValueName = function (valueName) {
var questions = this.questions;
for (var i = 0; i < questions.length; i++) {
if (questions[i].getValueName() == valueName)
return questions[i];
}
return null;
};
/**
* Returns question values on the current page
*/
PanelModelBase.prototype.getValue = function () {
var data = {};
var questions = this.questions;
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
if (q.isEmpty())
continue;
var valueName = q.getValueName();
data[valueName] = q.value;
if (!!this.data) {
var comment = this.data.getComment(valueName);
if (!!comment) {
data[valueName + __WEBPACK_IMPORTED_MODULE_8__settings__["a" /* settings */].commentPrefix] = comment;
}
}
}
return data;
};
/**
* Returns question comments on the current page
*/
PanelModelBase.prototype.getComments = function () {
var comments = {};
if (!this.data)
return comments;
var questions = this.questions;
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
var comment = this.data.getComment(q.getValueName());
if (!!comment) {
comments[q.getValueName()] = comment;
}
}
return comments;
};
/**
* Call this function to remove all question values from the current page/panel, that end-user will not be able to enter.
* For example the value that doesn't exists in a radigroup/dropdown/checkbox choices or matrix rows/columns.
* Please note, this function doesn't clear values for invisible questions or values that doesn't associated with questions.
* @see Question.clearIncorrectValues
*/
PanelModelBase.prototype.clearIncorrectValues = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].clearIncorrectValues();
}
};
/**
* Call this function to clear all errors in the panel / page and all its child elements (panels and questions)
*/
PanelModelBase.prototype.clearErrors = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].clearErrors();
}
this.errors = [];
};
PanelModelBase.prototype.markQuestionListDirty = function () {
this.isQuestionsReady = false;
if (this.parent)
this.parent.markQuestionListDirty();
};
Object.defineProperty(PanelModelBase.prototype, "elements", {
/**
* Returns the list of the elements in the object, Panel/Page. Elements can be questions or panels. The function doesn't return elements in the nested Panels.
*/
get: function () {
return this.elementsValue;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getElementsInDesign = function (includeHidden) {
if (includeHidden === void 0) { includeHidden = false; }
return this.elements;
};
/**
* Returns true if the current element belongs to the Panel/Page. It looks in nested Panels as well.
* @param element
* @see PanelModel
*/
PanelModelBase.prototype.containsElement = function (element) {
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
if (el == element)
return true;
var pnl = el.getPanel();
if (!!pnl) {
if (pnl.containsElement(element))
return true;
}
}
return false;
};
Object.defineProperty(PanelModelBase.prototype, "isRequired", {
/**
* Set this property to true, to require the answer at least in one question in the panel.
*/
get: function () {
return this.getPropertyValue("isRequired", false);
},
set: function (val) {
this.setPropertyValue("isRequired", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModelBase.prototype, "requiredIf", {
/**
* An expression that returns true or false. If it returns true the Panel/Page becomes required.
* The library runs the expression on survey start and on changing a question value. If the property is empty then isRequired property is used.
* @see isRequired
*/
get: function () {
return this.getPropertyValue("requiredIf", "");
},
set: function (val) {
this.setPropertyValue("requiredIf", val);
},
enumerable: true,
configurable: true
});
/**
* Returns true, if there is an error on this Page or inside the current Panel
* @param fireCallback set it to true, to show errors in UI
* @param focusOnFirstError set it to true to focus on the first question that doesn't pass the validation
*/
PanelModelBase.prototype.hasErrors = function (fireCallback, focusOnFirstError, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (focusOnFirstError === void 0) { focusOnFirstError = false; }
if (rec === void 0) { rec = null; }
rec = !!rec
? rec
: {
fireCallback: fireCallback,
focuseOnFirstError: focusOnFirstError,
firstErrorQuestion: null,
result: false,
};
this.hasErrorsCore(rec);
if (rec.firstErrorQuestion) {
rec.firstErrorQuestion.focus(true);
}
return rec.result;
};
PanelModelBase.prototype.hasErrorsInPanels = function (rec) {
var errors = [];
this.hasRequiredError(rec, errors);
if (this.survey) {
var customError = this.survey.validatePanel(this);
if (customError) {
errors.push(customError);
rec.result = true;
}
}
if (!!rec.fireCallback) {
this.errors = errors;
}
};
//ISurveyErrorOwner
PanelModelBase.prototype.getErrorCustomText = function (text, error) {
if (!!this.survey)
return this.survey.getErrorCustomText(text, error);
return text;
};
PanelModelBase.prototype.hasRequiredError = function (rec, errors) {
if (!this.isRequired)
return;
var visQuestions = [];
this.addQuestionsToList(visQuestions, true);
if (visQuestions.length == 0)
return;
for (var i = 0; i < visQuestions.length; i++) {
if (!visQuestions[i].isEmpty())
return;
}
rec.result = true;
errors.push(new __WEBPACK_IMPORTED_MODULE_7__error__["b" /* OneAnswerRequiredError */](this.requiredErrorText, this));
if (rec.focuseOnFirstError && !rec.firstErrorQuestion) {
rec.firstErrorQuestion = visQuestions[0];
}
};
PanelModelBase.prototype.hasErrorsCore = function (rec) {
var elements = this.elements;
var element = null;
for (var i = 0; i < elements.length; i++) {
element = elements[i];
if (!element.isVisible)
continue;
if (element.isPanel) {
element.hasErrorsCore(rec);
}
else {
var question = element;
if (question.isReadOnly)
continue;
if (question.hasErrors(rec.fireCallback, rec)) {
if (rec.focuseOnFirstError && rec.firstErrorQuestion == null) {
rec.firstErrorQuestion = question;
}
rec.result = true;
}
}
}
this.hasErrorsInPanels(rec);
this.updateContainsErrors();
};
PanelModelBase.prototype.getContainsErrors = function () {
var res = _super.prototype.getContainsErrors.call(this);
if (res)
return res;
var elements = this.elements;
for (var i = 0; i < elements.length; i++) {
if (elements[i].containsErrors)
return true;
}
return false;
};
PanelModelBase.prototype.updateElementVisibility = function () {
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
el.setPropertyValue("isVisible", el.isVisible);
if (el.isPanel) {
el.updateElementVisibility();
}
}
};
PanelModelBase.prototype.getFirstQuestionToFocus = function (withError) {
if (withError === void 0) { withError = false; }
var elements = this.elements;
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (!el.isVisible)
continue;
if (el.isPanel) {
var res = el.getFirstQuestionToFocus(withError);
if (!!res)
return res;
}
else {
var q = el;
if (q.hasInput && (!withError || q.currentErrorCount > 0))
return q;
}
}
return null;
};
/**
* Call it to focus the input on the first question
*/
PanelModelBase.prototype.focusFirstQuestion = function () {
var q = this.getFirstQuestionToFocus();
if (!!q) {
q.focus();
}
};
/**
* Call it to focus the input of the first question that has an error.
*/
PanelModelBase.prototype.focusFirstErrorQuestion = function () {
var q = this.getFirstQuestionToFocus(true);
if (!!q) {
q.focus();
}
};
/**
* Fill list array with the questions.
* @param list
* @param visibleOnly set it to true to get visible questions only
*/
PanelModelBase.prototype.addQuestionsToList = function (list, visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
this.addElementsToList(list, visibleOnly, includingDesignTime, false);
};
/**
* Fill list array with the panels.
* @param list
*/
PanelModelBase.prototype.addPanelsIntoList = function (list, visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
this.addElementsToList(list, visibleOnly, includingDesignTime, true);
};
PanelModelBase.prototype.addElementsToList = function (list, visibleOnly, includingDesignTime, isPanel) {
if (visibleOnly && !this.visible)
return;
this.addElementsToListCore(list, this.elements, visibleOnly, includingDesignTime, isPanel);
};
PanelModelBase.prototype.addElementsToListCore = function (list, elements, visibleOnly, includingDesignTime, isPanel) {
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (visibleOnly && !el.visible)
continue;
if ((isPanel && el.isPanel) || (!isPanel && !el.isPanel)) {
list.push(el);
}
if (el.isPanel) {
el.addElementsToListCore(list, el.elements, visibleOnly, includingDesignTime, isPanel);
}
else {
if (includingDesignTime) {
this.addElementsToListCore(list, el.getElementsInDesign(false), visibleOnly, includingDesignTime, isPanel);
}
}
}
};
Object.defineProperty(PanelModelBase.prototype, "isActive", {
/**
* Returns true if the current object is Page and it is the current page.
*/
get: function () {
return !this.survey || this.survey.currentPage == this.root;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.updateCustomWidgets = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].updateCustomWidgets();
}
};
Object.defineProperty(PanelModelBase.prototype, "questionTitleLocation", {
/**
* Set this property different from "default" to set the specific question title location for this panel/page.
* @see SurveyModel.questionTitleLocation
*/
get: function () {
return this.getPropertyValue("questionTitleLocation");
},
set: function (value) {
this.setPropertyValue("questionTitleLocation", value.toLowerCase());
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getQuestionTitleLocation = function () {
if (this.onGetQuestionTitleLocation)
return this.onGetQuestionTitleLocation();
if (this.questionTitleLocation != "default")
return this.questionTitleLocation;
if (this.parent)
return this.parent.getQuestionTitleLocation();
return this.survey ? this.survey.questionTitleLocation : "top";
};
PanelModelBase.prototype.getStartIndex = function () {
if (!!this.parent)
return this.parent.getQuestionStartIndex();
if (!!this.survey)
return this.survey.questionStartIndex;
return "";
};
PanelModelBase.prototype.getQuestionStartIndex = function () {
return this.getStartIndex();
};
PanelModelBase.prototype.getChildrenLayoutType = function () {
return "row";
};
PanelModelBase.prototype.getProgressInfo = function () {
return __WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */].getProgressInfoByElements(this.elements, this.isRequired);
};
Object.defineProperty(PanelModelBase.prototype, "root", {
get: function () {
var res = this;
while (res.parent)
res = res.parent;
return res;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.childVisibilityChanged = function () {
var newIsVisibleValue = this.getIsPageVisible(null);
var oldIsVisibleValue = this.getPropertyValue("isVisible", true);
if (newIsVisibleValue !== oldIsVisibleValue) {
this.onVisibleChanged();
}
};
PanelModelBase.prototype.createRow = function () {
return new QuestionRowModel(this);
};
PanelModelBase.prototype.onSurveyLoad = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].onSurveyLoad();
}
this.onElementVisibilityChanged(this);
};
PanelModelBase.prototype.onFirstRendering = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].onFirstRendering();
}
this.onRowsChanged();
};
Object.defineProperty(PanelModelBase.prototype, "rows", {
get: function () {
return this.getPropertyValue("rows");
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.onRowsChanged = function () {
if (this.isLoadingFromJson)
return;
this.setPropertyValue("rows", this.buildRows());
};
PanelModelBase.prototype.onAddElement = function (element, index) {
element.setSurveyImpl(this.surveyImpl);
element.parent = this;
this.markQuestionListDirty();
this.updateRowsOnElementAdded(element, index);
if (element.isPanel) {
var p = element;
if (this.survey) {
this.survey.panelAdded(p, index, this, this.root);
}
}
else {
if (this.survey) {
var q = element;
this.survey.questionAdded(q, index, this, this.root);
}
}
if (!!this.addElementCallback)
this.addElementCallback(element);
var self = this;
element.registerFunctionOnPropertiesValueChanged(["visible", "isVisible"], function () {
self.onElementVisibilityChanged(element);
}, this.id);
element.registerFunctionOnPropertyValueChanged("startWithNewLine", function () {
self.onElementStartWithNewLineChanged(element);
}, this.id);
this.onElementVisibilityChanged(this);
};
PanelModelBase.prototype.onRemoveElement = function (element) {
element.parent = null;
this.markQuestionListDirty();
element.unRegisterFunctionOnPropertiesValueChanged(["visible", "isVisible", "startWithNewLine"], this.id);
this.updateRowsOnElementRemoved(element);
if (!element.isPanel) {
if (this.survey)
this.survey.questionRemoved(element);
}
else {
if (this.survey)
this.survey.panelRemoved(element);
}
if (!!this.removeElementCallback)
this.removeElementCallback(element);
this.onElementVisibilityChanged(this);
};
PanelModelBase.prototype.onElementVisibilityChanged = function (element) {
if (this.isLoadingFromJson)
return;
this.updateRowsVisibility(element);
this.childVisibilityChanged();
if (!!this.parent) {
this.parent.onElementVisibilityChanged(this);
}
};
PanelModelBase.prototype.onElementStartWithNewLineChanged = function (element) {
this.onRowsChanged();
};
PanelModelBase.prototype.updateRowsVisibility = function (element) {
var rows = this.rows;
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
if (row.elements.indexOf(element) > -1) {
row.updateVisible();
break;
}
}
};
PanelModelBase.prototype.canBuildRows = function () {
return !this.isLoadingFromJson && this.getChildrenLayoutType() == "row";
};
PanelModelBase.prototype.buildRows = function () {
if (!this.canBuildRows())
return [];
var result = new Array();
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
var isNewRow = i == 0 || el.startWithNewLine;
var row = isNewRow ? this.createRow() : result[result.length - 1];
if (isNewRow)
result.push(row);
row.addElement(el);
}
for (var i = 0; i < result.length; i++) {
result[i].updateVisible();
}
return result;
};
PanelModelBase.prototype.updateRowsOnElementAdded = function (element, index) {
if (!this.canBuildRows())
return;
var dragDropInfo = new DragDropInfo(null, element);
dragDropInfo.target = element;
dragDropInfo.isEdge = this.elements.length > 1;
if (this.elements.length < 2) {
dragDropInfo.destination = this;
}
else {
dragDropInfo.isBottom = index > 0;
if (index == 0) {
dragDropInfo.destination = this.elements[1];
}
else {
dragDropInfo.destination = this.elements[index - 1];
}
}
this.dragDropAddTargetToRow(dragDropInfo, null);
};
PanelModelBase.prototype.updateRowsOnElementRemoved = function (element) {
if (!this.canBuildRows())
return;
this.updateRowsRemoveElementFromRow(element, this.findRowByElement(element));
};
PanelModelBase.prototype.updateRowsRemoveElementFromRow = function (element, row) {
if (!row || !row.panel)
return;
var elIndex = row.elements.indexOf(element);
if (elIndex < 0)
return;
row.elements.splice(elIndex, 1);
if (row.elements.length > 0) {
row.updateVisible();
}
else {
if (row.index >= 0) {
row.panel.rows.splice(row.index, 1);
}
}
};
PanelModelBase.prototype.findRowByElement = function (el) {
var rows = this.rows;
for (var i = 0; i < rows.length; i++) {
if (rows[i].elements.indexOf(el) > -1)
return rows[i];
}
return null;
};
PanelModelBase.prototype.elementWidthChanged = function (el) {
if (this.isLoadingFromJson)
return;
var row = this.findRowByElement(el);
if (!!row) {
row.updateVisible();
}
};
Object.defineProperty(PanelModelBase.prototype, "processedTitle", {
/**
* Returns rendered title text or html.
*/
get: function () {
return this.getRenderedTitle(this.locTitle.textOrHtml);
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getRenderedTitle = function (str) {
return this.textProcessor != null
? this.textProcessor.processText(str, true)
: str;
};
Object.defineProperty(PanelModelBase.prototype, "visible", {
/**
* Use it to get/set the object visibility.
* @see visibleIf
*/
get: function () {
return this.getPropertyValue("visible", true);
},
set: function (value) {
if (value === this.visible)
return;
this.setPropertyValue("visible", value);
this.setPropertyValue("isVisible", this.isVisible);
if (!this.isLoadingFromJson)
this.onVisibleChanged();
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.onVisibleChanged = function () {
this.setPropertyValue("isVisible", this.isVisible);
};
Object.defineProperty(PanelModelBase.prototype, "isVisible", {
/**
* Returns true if object is visible or survey is in design mode right now.
*/
get: function () {
return this.areInvisibleElementsShowing || this.getIsPageVisible(null);
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.getIsPageVisible = function (exceptionQuestion) {
if (!this.visible)
return false;
for (var i = 0; i < this.elements.length; i++) {
if (this.elements[i] == exceptionQuestion)
continue;
if (this.elements[i].isVisible)
return true;
}
return false;
};
PanelModelBase.prototype.setVisibleIndex = function (index) {
if (!this.isVisible || index < 0) {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].setVisibleIndex(-1);
}
return 0;
}
var startIndex = index;
index += this.beforeSetVisibleIndex(index);
var panelStartIndex = this.getPanelStartIndex(index);
var panelIndex = panelStartIndex;
for (var i = 0; i < this.elements.length; i++) {
panelIndex += this.elements[i].setVisibleIndex(panelIndex);
}
if (this.isContinueNumbering()) {
index += panelIndex - panelStartIndex;
}
return index - startIndex;
};
PanelModelBase.prototype.beforeSetVisibleIndex = function (index) {
return 0;
};
PanelModelBase.prototype.getPanelStartIndex = function (index) {
return index;
};
PanelModelBase.prototype.isContinueNumbering = function () {
return true;
};
Object.defineProperty(PanelModelBase.prototype, "isReadOnly", {
/**
* Returns true if readOnly property is true or survey is in display mode or parent panel/page is readOnly.
* @see SurveyModel.model
* @see readOnly
*/
get: function () {
var isParentReadOnly = !!this.parent && this.parent.isReadOnly;
var isSurveyReadOnly = !!this.survey && this.survey.isDisplayMode;
return this.readOnly || isParentReadOnly || isSurveyReadOnly;
},
enumerable: true,
configurable: true
});
PanelModelBase.prototype.onReadOnlyChanged = function () {
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
el.setPropertyValue("isReadOnly", el.isReadOnly);
}
_super.prototype.onReadOnlyChanged.call(this);
};
PanelModelBase.prototype.updateElementCss = function () {
for (var i = 0; i < this.elements.length; i++) {
var el = this.elements[i];
el.updateElementCss();
}
_super.prototype.updateElementCss.call(this);
};
Object.defineProperty(PanelModelBase.prototype, "enableIf", {
/**
* An expression that returns true or false. If it returns false the Panel/Page becomes read only and an end-user will not able to answer on qustions inside it.
* The library runs the expression on survey start and on changing a question value. If the property is empty then readOnly property is used.
* @see readOnly
* @see isReadOnly
*/
get: function () {
return this.getPropertyValue("enableIf", "");
},
set: function (val) {
this.setPropertyValue("enableIf", val);
},
enumerable: true,
configurable: true
});
/**
* Add an element into Panel or Page. Returns true if the element added successfully. Otherwise returns false.
* @param element
* @param index element index in the elements array
*/
PanelModelBase.prototype.addElement = function (element, index) {
if (index === void 0) { index = -1; }
if (!this.canAddElement(element))
return false;
if (index < 0 || index >= this.elements.length) {
this.elements.push(element);
}
else {
this.elements.splice(index, 0, element);
}
return true;
};
PanelModelBase.prototype.canAddElement = function (element) {
return (!!element && element.isLayoutTypeSupported(this.getChildrenLayoutType()));
};
/**
* Add a question into Panel or Page. Returns true if the question added successfully. Otherwise returns false.
* @param question
* @param index element index in the elements array
*/
PanelModelBase.prototype.addQuestion = function (question, index) {
if (index === void 0) { index = -1; }
return this.addElement(question, index);
};
/**
* Add a panel into Panel or Page. Returns true if the panel added successfully. Otherwise returns false.
* @param panel
* @param index element index in the elements array
*/
PanelModelBase.prototype.addPanel = function (panel, index) {
if (index === void 0) { index = -1; }
return this.addElement(panel, index);
};
/**
* Creates a new question and adds it at location of index, by default the end of the elements list. Returns null, if the question could not be created or could not be added into page or panel.
* @param questionType the possible values are: "text", "checkbox", "dropdown", "matrix", "html", "matrixdynamic", "matrixdropdown" and so on.
* @param name a question name
* @param index element index in the elements array
*/
PanelModelBase.prototype.addNewQuestion = function (questionType, name, index) {
if (name === void 0) { name = null; }
if (index === void 0) { index = -1; }
var question = __WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].Instance.createQuestion(questionType, name);
if (!this.addQuestion(question, index))
return null;
return question;
};
/**
* Creates a new panel and adds it into the end of the elements list. Returns null, if the panel could not be created or could not be added into page or panel.
* @param name a panel name
*/
PanelModelBase.prototype.addNewPanel = function (name) {
if (name === void 0) { name = null; }
var panel = this.createNewPanel(name);
if (!this.addPanel(panel))
return null;
return panel;
};
/**
* Returns the index of element parameter in the elements list.
* @param element question or panel
*/
PanelModelBase.prototype.indexOf = function (element) {
return this.elements.indexOf(element);
};
PanelModelBase.prototype.createNewPanel = function (name) {
return new PanelModel(name);
};
/**
* Remove an element (Panel or Question) from the elements list.
* @param element
* @see elements
*/
PanelModelBase.prototype.removeElement = function (element) {
var index = this.elements.indexOf(element);
if (index < 0) {
for (var i = 0; i < this.elements.length; i++) {
if (this.elements[i].removeElement(element))
return true;
}
return false;
}
this.elements.splice(index, 1);
return true;
};
/**
* Remove question from the elements list.
* @param question
* @see elements
* @see removeElement
*/
PanelModelBase.prototype.removeQuestion = function (question) {
this.removeElement(question);
};
PanelModelBase.prototype.runCondition = function (values, properties) {
if (this.isDesignMode)
return;
var elements = this.elements.slice();
for (var i = 0; i < elements.length; i++) {
elements[i].runCondition(values, properties);
}
if (!this.areInvisibleElementsShowing) {
this.runVisibleCondition(values, properties);
}
this.runEnableCondition(values, properties);
this.runRequiredCondition(values, properties);
};
PanelModelBase.prototype.runVisibleCondition = function (values, properties) {
var _this = this;
if (!this.visibleIf)
return;
var conditionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["b" /* ConditionRunner */](this.visibleIf);
conditionRunner.onRunComplete = function (res) {
_this.visible = res;
};
conditionRunner.run(values, properties);
};
PanelModelBase.prototype.runEnableCondition = function (values, properties) {
var _this = this;
if (!this.enableIf)
return;
var conditionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["b" /* ConditionRunner */](this.enableIf);
conditionRunner.onRunComplete = function (res) {
_this.readOnly = !res;
};
conditionRunner.run(values, properties);
};
PanelModelBase.prototype.runRequiredCondition = function (values, properties) {
var _this = this;
if (!this.requiredIf)
return;
var conditionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["b" /* ConditionRunner */](this.requiredIf);
conditionRunner.onRunComplete = function (res) {
_this.isRequired = res;
};
conditionRunner.run(values, properties);
};
PanelModelBase.prototype.onAnyValueChanged = function (name) {
var els = this.elements;
for (var i = 0; i < els.length; i++) {
els[i].onAnyValueChanged(name);
}
};
PanelModelBase.prototype.checkBindings = function (valueName, value) {
var els = this.elements;
for (var i = 0; i < els.length; i++) {
els[i].checkBindings(valueName, value);
}
};
PanelModelBase.prototype.dragDropAddTarget = function (dragDropInfo) {
var prevRow = this.dragDropFindRow(dragDropInfo.target);
if (this.dragDropAddTargetToRow(dragDropInfo, prevRow)) {
this.updateRowsRemoveElementFromRow(dragDropInfo.target, prevRow);
}
};
PanelModelBase.prototype.dragDropFindRow = function (findElement) {
if (!findElement || findElement.isPage)
return null;
var element = findElement;
var rows = this.rows;
for (var i = 0; i < rows.length; i++) {
if (rows[i].elements.indexOf(element) > -1)
return rows[i];
}
for (var i = 0; i < this.elements.length; i++) {
var pnl = this.elements[i].getPanel();
if (!pnl)
continue;
var row = pnl.dragDropFindRow(element);
if (!!row)
return row;
}
return null;
};
PanelModelBase.prototype.dragDropAddTargetToRow = function (dragDropInfo, prevRow) {
if (!dragDropInfo.destination)
return true;
if (this.dragDropAddTargetToEmptyPanel(dragDropInfo))
return true;
var dest = dragDropInfo.destination;
var destRow = this.dragDropFindRow(dest);
if (!destRow)
return true;
if (!dragDropInfo.target.startWithNewLine)
return this.dragDropAddTargetToExistingRow(dragDropInfo, destRow, prevRow);
return this.dragDropAddTargetToNewRow(dragDropInfo, destRow, prevRow);
};
PanelModelBase.prototype.dragDropAddTargetToEmptyPanel = function (dragDropInfo) {
if (dragDropInfo.destination.isPage) {
this.dragDropAddTargetToEmptyPanelCore(this.root, dragDropInfo.target, dragDropInfo.isBottom);
return true;
}
var dest = dragDropInfo.destination;
if (dest.isPanel && !dragDropInfo.isEdge) {
var panel = dest;
if (dragDropInfo.target["template"] === dest) {
return false;
}
if (dragDropInfo.nestedPanelDepth < 0 ||
dragDropInfo.nestedPanelDepth >= panel.depth) {
this.dragDropAddTargetToEmptyPanelCore(dest, dragDropInfo.target, dragDropInfo.isBottom);
return true;
}
}
return false;
};
PanelModelBase.prototype.dragDropAddTargetToExistingRow = function (dragDropInfo, destRow, prevRow) {
var index = destRow.elements.indexOf(dragDropInfo.destination);
if (index == 0 &&
!dragDropInfo.isBottom &&
destRow.elements[0].startWithNewLine) {
if (destRow.index > 0) {
dragDropInfo.isBottom = true;
destRow = destRow.panel.rows[destRow.index - 1];
dragDropInfo.destination =
destRow.elements[destRow.elements.length - 1];
return this.dragDropAddTargetToExistingRow(dragDropInfo, destRow, prevRow);
}
else {
return this.dragDropAddTargetToNewRow(dragDropInfo, destRow, prevRow);
}
}
var prevRowIndex = -1;
if (prevRow == destRow) {
prevRowIndex = destRow.elements.indexOf(dragDropInfo.target);
}
if (dragDropInfo.isBottom)
index++;
var srcRow = this.findRowByElement(dragDropInfo.source);
if (srcRow == destRow &&
srcRow.elements.indexOf(dragDropInfo.source) == index)
return false;
if (index == prevRowIndex)
return false;
if (prevRowIndex > -1) {
destRow.elements.splice(prevRowIndex, 1);
if (prevRowIndex < index)
index--;
}
destRow.elements.splice(index, 0, dragDropInfo.target);
destRow.updateVisible();
return prevRowIndex < 0;
};
PanelModelBase.prototype.dragDropAddTargetToNewRow = function (dragDropInfo, destRow, prevRow) {
var targetRow = destRow.panel.createRow();
targetRow.addElement(dragDropInfo.target);
var index = destRow.index;
if (dragDropInfo.isBottom) {
index++;
}
//same row
if (!!prevRow && prevRow.panel == targetRow.panel && prevRow.index == index)
return false;
var srcRow = this.findRowByElement(dragDropInfo.source);
if (!!srcRow &&
srcRow.panel == targetRow.panel &&
srcRow.elements.length == 1 &&
srcRow.index == index)
return false;
destRow.panel.rows.splice(index, 0, targetRow);
return true;
};
PanelModelBase.prototype.dragDropAddTargetToEmptyPanelCore = function (panel, target, isBottom) {
var targetRow = panel.createRow();
targetRow.addElement(target);
if (panel.elements.length == 0 || isBottom) {
panel.rows.push(targetRow);
}
else {
panel.rows.splice(0, 0, targetRow);
}
};
PanelModelBase.prototype.dragDropMoveElement = function (src, target, targetIndex) {
var srcIndex = src.parent.elements.indexOf(src);
if (targetIndex > srcIndex) {
targetIndex--;
}
this.removeElement(src);
this.addElement(target, targetIndex);
};
PanelModelBase.prototype.dispose = function () {
for (var i = 0; i < this.elements.length; i++) {
this.elements[i].dispose();
}
this.elements.splice(0, this.elements.length);
};
PanelModelBase.panelCounter = 100;
return PanelModelBase;
}(__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */]));
/**
* A container element, similar to the Page objects. However, unlike the Page, Panel can't be a root.
* It may contain questions and other panels.
*/
var PanelModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(PanelModel, _super);
function PanelModel(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
_this.name = name;
var self = _this;
_this.registerFunctionOnPropertyValueChanged("state", function () {
if (self.stateChangedCallback)
self.stateChangedCallback();
});
_this.registerFunctionOnPropertyValueChanged("width", function () {
if (!!self.parent) {
self.parent.elementWidthChanged(self);
}
});
_this.registerFunctionOnPropertiesValueChanged(["indent", "innerIndent", "rightIndent"], function () {
self.onIndentChanged();
});
return _this;
}
PanelModel.prototype.getType = function () {
return "panel";
};
PanelModel.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.onIndentChanged();
};
Object.defineProperty(PanelModel.prototype, "isPanel", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "page", {
/**
* Get/set the page where the panel is located.
*/
get: function () {
return this.getPage(this.parent);
},
set: function (val) {
this.setPage(this.parent, val);
},
enumerable: true,
configurable: true
});
PanelModel.prototype.delete = function () {
if (!!this.parent) {
this.removeSelfFromList(this.parent.elements);
}
};
Object.defineProperty(PanelModel.prototype, "state", {
/**
* Set this property to "collapsed" to render only Panel title and expanded button and to "expanded" to render the collapsed button in the Panel caption
*/
get: function () {
return this.getPropertyValue("state");
},
set: function (val) {
this.setPropertyValue("state", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "isCollapsed", {
/**
* Returns true if the Panel is in the collapsed state
* @see state
* @see collapse
* @see isExpanded
*/
get: function () {
return this.state == "collapsed";
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "isExpanded", {
/**
* Returns true if the Panel is in the expanded state
* @see state
* @see expand
* @see isCollapsed
*/
get: function () {
if (this.isDesignMode)
return;
return this.state == "expanded";
},
enumerable: true,
configurable: true
});
/**
* Collapse the Panel
* @see state
*/
PanelModel.prototype.collapse = function () {
if (this.isDesignMode)
return;
this.state = "collapsed";
};
/**
* Expand the Panel
* @see state
*/
PanelModel.prototype.expand = function () {
this.state = "expanded";
};
/**
* Move panel to a new container Page/Panel. Add as a last element if insertBefore parameter is not used or inserted into the given index,
* if insert parameter is number, or before the given element, if the insertBefore parameter is a question or panel
* @param container Page or Panel to where a question is relocated.
* @param insertBefore Use it if you want to set the panel to a specific position. You may use a number (use 0 to insert int the beginning) or element, if you want to insert before this element.
*/
PanelModel.prototype.moveTo = function (container, insertBefore) {
if (insertBefore === void 0) { insertBefore = null; }
return this.moveToBase(this.parent, container, insertBefore);
};
Object.defineProperty(PanelModel.prototype, "visibleIndex", {
/**
* Returns the visible index of the panel in the survey. Commonly it is -1 and it doesn't show.
* You have to set showNumber to true to show index/numbering for the Panel
* @see showNumber
*/
get: function () {
return this.getPropertyValue("visibleIndex", -1);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "showNumber", {
/**
* Set showNumber to true to start showing the number for this panel.
* @see visibleIndex
*/
get: function () {
return this.getPropertyValue("showNumber", false);
},
set: function (val) {
this.setPropertyValue("showNumber", val);
this.notifySurveyOnVisibilityChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "showQuestionNumbers", {
/**
* Gets or sets a value that specifies how the elements numbers inside panel are displayed.
*
* The following options are available:
*
* - `default` - display questions numbers as defined in parent panel or survey
* - `onpanel` - display questions numbers, start numbering from beginning of this page
* - `off` - turn off the numbering for questions titles
* @see showNumber
*/
get: function () {
return this.getPropertyValue("showQuestionNumbers", "default");
},
set: function (value) {
this.setPropertyValue("showQuestionNumbers", value);
this.notifySurveyOnVisibilityChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "questionStartIndex", {
/**
* Gets or sets the first question index for elements inside the panel. The first question index is '1.' by default and it is taken from survey.questionStartIndex property.
* You may start it from '100' or from 'A', by setting '100' or 'A' to this property.
* You can set the start index to "(1)" or "# A)" or "a)" to render question number as (1), # A) and a) accordingly.
* @see survey.questionStartIndex
*/
get: function () {
return this.getPropertyValue("questionStartIndex", "");
},
set: function (val) {
this.setPropertyValue("questionStartIndex", val);
},
enumerable: true,
configurable: true
});
PanelModel.prototype.getQuestionStartIndex = function () {
if (!!this.questionStartIndex)
return this.questionStartIndex;
return _super.prototype.getQuestionStartIndex.call(this);
};
Object.defineProperty(PanelModel.prototype, "no", {
/**
* The property returns the question number. If question is invisible then it returns empty string.
* If visibleIndex is 1, then no is 2, or 'B' if survey.questionStartIndex is 'A'.
* @see SurveyModel.questionStartIndex
*/
get: function () {
return this.getPropertyValue("no", "");
},
enumerable: true,
configurable: true
});
PanelModel.prototype.setNo = function (visibleIndex) {
this.setPropertyValue("no", __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].getNumberByIndex(this.visibleIndex, this.getStartIndex()));
};
PanelModel.prototype.beforeSetVisibleIndex = function (index) {
var visibleIndex = -1;
if (this.showNumber && (this.isDesignMode || !this.locTitle.isEmpty)) {
visibleIndex = index;
}
this.setPropertyValue("visibleIndex", visibleIndex);
this.setNo(visibleIndex);
return visibleIndex < 0 ? 0 : 1;
};
PanelModel.prototype.getPanelStartIndex = function (index) {
if (this.showQuestionNumbers == "off")
return -1;
if (this.showQuestionNumbers == "onpanel")
return 0;
return index;
};
PanelModel.prototype.isContinueNumbering = function () {
return (this.showQuestionNumbers != "off" && this.showQuestionNumbers != "onpanel");
};
PanelModel.prototype.notifySurveyOnVisibilityChanged = function () {
if (this.survey != null && !this.isLoadingFromJson) {
this.survey.panelVisibilityChanged(this, this.isVisible);
}
};
PanelModel.prototype.hasErrorsCore = function (rec) {
_super.prototype.hasErrorsCore.call(this, rec);
if (this.isCollapsed && rec.result && rec.fireCallback) {
this.expand();
}
};
PanelModel.prototype.getRenderedTitle = function (str) {
if (!str) {
if (this.isCollapsed || this.isExpanded)
return this.name;
if (this.isDesignMode)
return "[" + this.name + "]";
}
return _super.prototype.getRenderedTitle.call(this, str);
};
Object.defineProperty(PanelModel.prototype, "width", {
/**
* The Panel width.
*/
get: function () {
return this.getPropertyValue("width");
},
set: function (val) {
this.setPropertyValue("width", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "indent", {
/**
* The left indent. Set this property to increase the panel left indent.
*/
get: function () {
return this.getPropertyValue("indent", 0);
},
set: function (val) {
this.setPropertyValue("indent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "innerIndent", {
/**
* The inner indent. Set this property to increase the panel content margin.
*/
get: function () {
return this.getPropertyValue("innerIndent", 0);
},
set: function (val) {
this.setPropertyValue("innerIndent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "renderWidth", {
get: function () {
return this.getPropertyValue("renderWidth");
},
set: function (val) {
this.setPropertyValue("renderWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "startWithNewLine", {
/**
* The Panel renders on the new line if the property is true. If the property is false, the panel tries to render on the same line/row with a previous question/panel.
*/
get: function () {
return this.getPropertyValue("startWithNewLine", true);
},
set: function (value) {
this.setPropertyValue("startWithNewLine", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "rightIndent", {
/**
* The right indent of the Panel.
*/
get: function () {
return this.getPropertyValue("rightIndent", 0);
},
set: function (val) {
this.setPropertyValue("rightIndent", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "paddingLeft", {
get: function () {
return this.getPropertyValue("paddingLeft", "");
},
set: function (val) {
this.setPropertyValue("paddingLeft", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "innerPaddingLeft", {
get: function () {
return this.getPropertyValue("innerPaddingLeft", "");
},
set: function (val) {
this.setPropertyValue("innerPaddingLeft", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PanelModel.prototype, "paddingRight", {
get: function () {
return this.getPropertyValue("paddingRight", "");
},
set: function (val) {
this.setPropertyValue("paddingRight", val);
},
enumerable: true,
configurable: true
});
PanelModel.prototype.onIndentChanged = function () {
this.innerPaddingLeft = this.getIndentSize(this.innerIndent);
this.paddingLeft = this.getIndentSize(this.indent);
this.paddingRight = this.getIndentSize(this.rightIndent);
};
PanelModel.prototype.getIndentSize = function (indent) {
if (indent < 1)
return "";
if (!this.data)
return "";
var css = this.survey["css"];
if (!css)
return "";
return indent * css.question.indent + "px";
};
PanelModel.prototype.clearOnDeletingContainer = function () {
this.elements.forEach(function (element) {
if (element instanceof __WEBPACK_IMPORTED_MODULE_4__question__["a" /* Question */] || element instanceof PanelModel) {
element.clearOnDeletingContainer();
}
});
};
Object.defineProperty(PanelModel.prototype, "hasEditButton", {
get: function () {
if (this.survey && this.survey.state == "preview")
return this.depth == 1;
return false;
},
enumerable: true,
configurable: true
});
PanelModel.prototype.cancelPreview = function () {
if (!this.hasEditButton)
return;
this.survey.cancelPreviewByPage(this);
};
PanelModel.prototype.onVisibleChanged = function () {
_super.prototype.onVisibleChanged.call(this);
this.setPropertyValue("isVisible", this.isVisible);
this.notifySurveyOnVisibilityChanged();
};
return PanelModel;
}(PanelModelBase));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("panelbase", [
"name",
{
name: "elements",
alternativeName: "questions",
baseClassName: "question",
visible: false,
isLightSerializable: false,
},
{ name: "visible:boolean", default: true },
"visibleIf:condition",
"enableIf:condition",
"requiredIf:condition",
"readOnly:boolean",
{
name: "questionTitleLocation",
default: "default",
choices: ["default", "top", "bottom", "left", "hidden"],
},
{ name: "title", serializationProperty: "locTitle" },
{ name: "description:text", serializationProperty: "locDescription" },
], function () {
return new PanelModelBase();
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("panel", [
{
name: "state",
default: "default",
choices: ["default", "collapsed", "expanded"],
},
"isRequired:boolean",
{
name: "requiredErrorText:text",
serializationProperty: "locRequiredErrorText",
},
{ name: "startWithNewLine:boolean", default: true },
"width",
{ name: "innerIndent:number", default: 0, choices: [0, 1, 2, 3] },
{ name: "indent:number", default: 0, choices: [0, 1, 2, 3] },
{
name: "page",
isSerializable: false,
visibleIf: function (obj) {
var survey = obj ? obj.survey : null;
return !survey || survey.pages.length > 1;
},
choices: function (obj) {
var survey = obj ? obj.survey : null;
return survey
? survey.pages.map(function (p) {
return { value: p.name, text: p.title };
})
: [];
},
},
"showNumber:boolean",
{
name: "showQuestionNumbers",
default: "default",
choices: ["default", "onpanel", "off"],
},
"questionStartIndex",
], function () {
return new PanelModel();
}, "panelbase");
/***/ }),
/* 23 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__helpers__ = __webpack_require__(4);
/* unused harmony export TextPreProcessorItem */
/* unused harmony export TextPreProcessorValue */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return TextPreProcessor; });
var TextPreProcessorItem = /** @class */ (function () {
function TextPreProcessorItem() {
}
return TextPreProcessorItem;
}());
var TextPreProcessorValue = /** @class */ (function () {
function TextPreProcessorValue(name, returnDisplayValue) {
this.name = name;
this.returnDisplayValue = returnDisplayValue;
this.isExists = false;
this.canProcess = true;
}
return TextPreProcessorValue;
}());
var TextPreProcessor = /** @class */ (function () {
function TextPreProcessor() {
}
TextPreProcessor.prototype.process = function (text, returnDisplayValue, doEncoding) {
if (returnDisplayValue === void 0) { returnDisplayValue = false; }
if (doEncoding === void 0) { doEncoding = false; }
this.hasAllValuesOnLastRunValue = true;
if (!text)
return text;
if (!this.onProcess)
return text;
var items = this.getItems(text);
for (var i = items.length - 1; i >= 0; i--) {
var item = items[i];
var name = this.getName(text.substring(item.start + 1, item.end));
if (!name)
continue;
var textValue = new TextPreProcessorValue(name, returnDisplayValue);
this.onProcess(textValue);
if (!textValue.isExists) {
if (textValue.canProcess) {
this.hasAllValuesOnLastRunValue = false;
}
continue;
}
if (__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isValueEmpty(textValue.value)) {
this.hasAllValuesOnLastRunValue = false;
}
var replacedValue = !__WEBPACK_IMPORTED_MODULE_0__helpers__["a" /* Helpers */].isValueEmpty(textValue.value)
? textValue.value
: "";
if (doEncoding) {
replacedValue = encodeURIComponent(replacedValue);
}
text =
text.substr(0, item.start) + replacedValue + text.substr(item.end + 1);
}
return text;
};
Object.defineProperty(TextPreProcessor.prototype, "hasAllValuesOnLastRun", {
get: function () {
return !!this.hasAllValuesOnLastRunValue;
},
enumerable: true,
configurable: true
});
TextPreProcessor.prototype.getItems = function (text) {
var items = [];
var length = text.length;
var start = -1;
var ch = "";
for (var i = 0; i < length; i++) {
ch = text[i];
if (ch == "{")
start = i;
if (ch == "}") {
if (start > -1) {
var item = new TextPreProcessorItem();
item.start = start;
item.end = i;
items.push(item);
}
start = -1;
}
}
return items;
};
TextPreProcessor.prototype.getName = function (name) {
if (!name)
return;
return name.trim();
};
return TextPreProcessor;
}());
/***/ }),
/* 24 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__settings__ = __webpack_require__(9);
/* unused harmony export compareVersions */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return confirmAction; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return detectIEOrEdge; });
/* unused harmony export detectIEBrowser */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return loadFileFromBase64; });
/* unused harmony export isMobile */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return isElementVisible; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return findScrollableParent; });
function compareVersions(a, b) {
var i, diff;
var regExStrip0 = /(\.0+)+$/;
var segmentsA = a.replace(regExStrip0, "").split(".");
var segmentsB = b.replace(regExStrip0, "").split(".");
var l = Math.min(segmentsA.length, segmentsB.length);
for (i = 0; i < l; i++) {
diff = parseInt(segmentsA[i], 10) - parseInt(segmentsB[i], 10);
if (diff) {
return diff;
}
}
return segmentsA.length - segmentsB.length;
}
function confirmAction(message) {
if (!!__WEBPACK_IMPORTED_MODULE_0__settings__["a" /* settings */] && !!__WEBPACK_IMPORTED_MODULE_0__settings__["a" /* settings */].confirmActionFunc)
return __WEBPACK_IMPORTED_MODULE_0__settings__["a" /* settings */].confirmActionFunc(message);
return confirm(message);
}
function detectIEBrowser() {
if (typeof window === "undefined")
return false;
var ua = window.navigator.userAgent;
var oldIe = ua.indexOf("MSIE ");
var elevenIe = ua.indexOf("Trident/");
return oldIe > -1 || elevenIe > -1;
}
function detectIEOrEdge() {
if (typeof window === "undefined")
return false;
if (typeof detectIEOrEdge.isIEOrEdge == "undefined") {
var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");
var trident = ua.indexOf("Trident/");
var edge = ua.indexOf("Edge/");
detectIEOrEdge.isIEOrEdge = edge > 0 || trident > 0 || msie > 0;
}
return detectIEOrEdge.isIEOrEdge;
}
function loadFileFromBase64(b64Data, fileName) {
try {
var byteString = atob(b64Data.split(",")[1]);
// separate out the mime component
var mimeString = b64Data.split(",")[0].split(":")[1].split(";")[0];
// write the bytes of the string to an ArrayBuffer
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
// write the ArrayBuffer to a blob, and you're done
var bb = new Blob([ab], { type: mimeString });
if (typeof window !== "undefined" &&
window.navigator &&
window.navigator.msSaveBlob) {
window.navigator.msSaveOrOpenBlob(bb, fileName);
}
}
catch (err) { }
}
function isMobile() {
return (typeof window !== "undefined" && typeof window.orientation !== "undefined");
}
function isElementVisible(element, threshold, mode) {
if (threshold === void 0) { threshold = 0; }
if (mode === void 0) { mode = "visible"; }
if (typeof document === "undefined")
return false;
var elementRect = element.getBoundingClientRect();
var viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight);
var isAbove = elementRect.bottom - threshold < 0;
var isBelow = elementRect.top - viewHeight + threshold >= 0;
return mode === "above"
? isAbove
: mode === "below"
? isBelow
: !isAbove && !isBelow;
}
function findScrollableParent(element) {
if (!element) {
return window;
}
if (element.scrollHeight > element.clientHeight &&
(getComputedStyle(element).overflowY === "scroll" ||
getComputedStyle(element).overflowY === "auto")) {
if (element === document.body) {
return window;
}
return element;
}
else {
return findScrollableParent(element.parentElement);
}
}
/***/ }),
/* 25 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyNavigationBase; });
var SurveyNavigationBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyNavigationBase, _super);
function SurveyNavigationBase(props) {
var _this = _super.call(this, props) || this;
_this.updateStateFunction = null;
_this.state = { update: 0 };
return _this;
}
Object.defineProperty(SurveyNavigationBase.prototype, "survey", {
get: function () {
return this.props.survey;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyNavigationBase.prototype, "css", {
get: function () {
return this.props.css;
},
enumerable: true,
configurable: true
});
SurveyNavigationBase.prototype.componentDidMount = function () {
if (this.survey) {
var self = this;
this.updateStateFunction = function () {
self.setState({ update: self.state.update + 1 });
};
this.survey.onPageVisibleChanged.add(this.updateStateFunction);
}
};
SurveyNavigationBase.prototype.componentWillUnmount = function () {
if (this.survey && this.updateStateFunction) {
this.survey.onPageVisibleChanged.remove(this.updateStateFunction);
this.updateStateFunction = null;
}
};
return SurveyNavigationBase;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
/***/ }),
/* 26 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestion__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestioncheckbox__ = __webpack_require__(39);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__reactquestionradiogroup__ = __webpack_require__(40);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionMatrixDropdownBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMatrixDropdownCell; });
var SurveyQuestionMatrixDropdownBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixDropdownBase, _super);
function SurveyQuestionMatrixDropdownBase(props) {
var _this = _super.call(this, props) || this;
_this.state = _this.getState();
return _this;
}
Object.defineProperty(SurveyQuestionMatrixDropdownBase.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDropdownBase.prototype.getState = function (prevState) {
if (prevState === void 0) { prevState = null; }
return { rowCounter: !prevState ? 0 : prevState.rowCounter + 1 };
};
SurveyQuestionMatrixDropdownBase.prototype.updateVisibleRowsChangedCallback = function () {
var _this = this;
this.question.visibleRowsChangedCallback = function () {
_this.updateStateOnCallback();
};
};
SurveyQuestionMatrixDropdownBase.prototype.renderedTableResetCallback = function () {
var _this = this;
this.question.onRenderedTableResetCallback = function () {
_this.updateStateOnCallback();
};
};
SurveyQuestionMatrixDropdownBase.prototype.updateStateOnCallback = function () {
if (this.isRendering)
return;
this.setState(this.getState(this.state));
};
SurveyQuestionMatrixDropdownBase.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
this.updateVisibleRowsChangedCallback();
this.renderedTableResetCallback();
};
SurveyQuestionMatrixDropdownBase.prototype.renderElement = function () {
return this.renderTableDiv();
};
SurveyQuestionMatrixDropdownBase.prototype.renderTableDiv = function () {
var header = this.renderHeader();
var footers = this.renderFooter();
var rows = this.renderRows();
var divStyle = this.question.horizontalScroll
? { overflowX: "scroll" }
: {};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: divStyle },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("table", { className: this.question.cssClasses.root },
header,
rows,
footers)));
};
SurveyQuestionMatrixDropdownBase.prototype.renderHeader = function () {
var table = this.question.renderedTable;
if (!table.showHeader)
return null;
var headers = [];
var cells = table.headerRow.cells;
for (var i = 0; i < cells.length; i++) {
var cell = cells[i];
var key = "column" + i;
var columnStyle = {};
if (!!cell.width) {
columnStyle.width = cell.width;
}
if (!!cell.minWidth) {
columnStyle.minWidth = cell.minWidth;
}
var columnTitle = this.renderLocString(cell.locTitle);
var requiredSpace = !!cell.requiredText ? __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, "\u00A0") : null;
var requiredText = !!cell.requiredText ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, cell.requiredText)) : null;
headers.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("th", { className: this.question.cssClasses.headerCell, key: key, style: columnStyle },
columnTitle,
requiredSpace,
requiredText));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("thead", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", null, headers)));
};
SurveyQuestionMatrixDropdownBase.prototype.renderFooter = function () {
var table = this.question.renderedTable;
if (!table.showFooter)
return null;
var row = this.renderRow("footer", table.footerRow, this.question.cssClasses);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tfoot", null, row);
};
SurveyQuestionMatrixDropdownBase.prototype.renderRows = function () {
var cssClasses = this.question.cssClasses;
var rows = [];
var renderedRows = this.question.renderedTable.rows;
for (var i = 0; i < renderedRows.length; i++) {
rows.push(this.renderRow(renderedRows[i].id, renderedRows[i], cssClasses));
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tbody", null, rows);
};
SurveyQuestionMatrixDropdownBase.prototype.renderRow = function (keyValue, row, cssClasses) {
var matrixrow = [];
var cells = row.cells;
for (var i = 0; i < cells.length; i++) {
matrixrow.push(this.renderCell(cells[i], i, cssClasses));
}
var key = "row" + keyValue;
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", { key: key }, matrixrow);
};
SurveyQuestionMatrixDropdownBase.prototype.renderCell = function (cell, index, cssClasses) {
var key = "cell" + index;
if (cell.hasQuestion) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDropdownCell, { key: key, cssClasses: cssClasses, cell: cell, creator: this.creator }));
}
var cellContent = null;
var requiredSpace = null;
var requiredText = null;
var cellStyle = null;
if (!!cell.width || !!cell.minWidth) {
cellStyle = {};
if (!!cell.width)
cellStyle.width = cell.width;
if (!!cell.minWidth)
cellStyle.minWidth = cell.minWidth;
}
if (cell.hasTitle) {
cellContent = this.renderLocString(cell.locTitle);
if (cell.requiredText) {
requiredSpace = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, "\u00A0");
requiredText = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, cell.requiredText);
}
}
if (cell.isRemoveRow) {
cellContent = this.renderRemoveButton(cell.row);
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { className: cssClasses.cell, key: key, style: cellStyle },
cellContent,
requiredSpace,
requiredText));
};
SurveyQuestionMatrixDropdownBase.prototype.renderRemoveButton = function (row) {
return null;
};
return SurveyQuestionMatrixDropdownBase;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionMatrixDropdownCell = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixDropdownCell, _super);
function SurveyQuestionMatrixDropdownCell(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionMatrixDropdownCell.prototype, "cell", {
get: function () {
return this.props.cell;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDropdownCell.prototype.getQuestion = function () {
var q = _super.prototype.getQuestion.call(this);
if (!!q)
return q;
return !!this.cell ? this.cell.question : null;
};
SurveyQuestionMatrixDropdownCell.prototype.doAfterRender = function () {
var el = this.cellRef.current;
if (el &&
this.cell &&
this.question &&
this.question.survey &&
el.getAttribute("data-rendered") !== "r") {
el.setAttribute("data-rendered", "r");
var options = {
cell: this.cell,
cellQuestion: this.question,
htmlElement: el,
row: this.cell.row,
column: this.cell.cell.column,
};
this.question.survey.matrixAfterCellRender(this.question, options);
}
};
SurveyQuestionMatrixDropdownCell.prototype.getShowErrors = function () {
return (this.question.isVisible &&
(!this.cell.isChoice || this.cell.isFirstChoice));
};
SurveyQuestionMatrixDropdownCell.prototype.getCellClass = function () {
var question = this.cell.question;
var cellClass = this.cell.question.cssClasses.itemValue;
if (question.errors.length !== 0)
cellClass += " " + question.cssClasses.hasError;
cellClass += " " + question.cssClasses.asCell;
return cellClass;
};
SurveyQuestionMatrixDropdownCell.prototype.getCellStyle = function () {
if (!this.cell.isChoice) {
var res = _super.prototype.getCellStyle.call(this);
if (!!this.cell.width || !!this.cell.minWidth) {
if (!res)
res = {};
if (!!this.cell.width)
res.width = this.cell.width;
if (!!this.cell.minWidth)
res.minWidth = this.cell.minWidth;
}
return res;
}
return { textAlign: "center" };
};
SurveyQuestionMatrixDropdownCell.prototype.getHeaderText = function () {
var column = this.cell.cell && this.cell.cell.column;
return !!(column && column.locTitle) ? column.locTitle.renderedHtml : "";
};
SurveyQuestionMatrixDropdownCell.prototype.renderQuestion = function () {
if (!this.cell.isChoice)
return __WEBPACK_IMPORTED_MODULE_3__reactquestion__["a" /* SurveyQuestion */].renderQuestionBody(this.creator, this.question);
if (this.cell.isCheckbox)
return this.renderCellCheckboxButton();
return this.renderCellRadiogroupButton();
};
SurveyQuestionMatrixDropdownCell.prototype.renderCellCheckboxButton = function () {
var key = this.cell.question.id + "item" + this.cell.choiceIndex;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_4__reactquestioncheckbox__["b" /* SurveyQuestionCheckboxItem */], { key: key, question: this.cell.question, cssClasses: this.cell.question.cssClasses, isDisplayMode: this.cell.question.isDisplayMode, item: this.cell.item, isFirst: this.cell.isFirstChoice, index: this.cell.choiceIndex.toString(), hideCaption: true }));
};
SurveyQuestionMatrixDropdownCell.prototype.renderCellRadiogroupButton = function () {
var key = this.cell.question.id + "item" + this.cell.choiceIndex;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_5__reactquestionradiogroup__["b" /* SurveyQuestionRadioItem */], { key: key, question: this.cell.question, cssClasses: this.cell.question.cssClasses, isDisplayMode: this.cell.question.isDisplayMode, item: this.cell.item, index: this.cell.choiceIndex.toString(), isChecked: this.cell.question.value === this.cell.item.value, isDisabled: this.cell.question.isReadOnly || !this.cell.item.isEnabled, hideCaption: true }));
};
return SurveyQuestionMatrixDropdownCell;
}(__WEBPACK_IMPORTED_MODULE_3__reactquestion__["c" /* SurveyQuestionAndErrorsCell */]));
/***/ }),
/* 27 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__survey__ = __webpack_require__(33);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__surveyWindow__ = __webpack_require__(54);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ReactSurveyModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ReactWindowModel; });
var ReactSurveyModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ReactSurveyModel, _super);
function ReactSurveyModel(jsonObj) {
if (jsonObj === void 0) { jsonObj = null; }
return _super.call(this, jsonObj) || this;
}
ReactSurveyModel.prototype.render = function () {
if (this.renderCallback) {
this.renderCallback();
}
};
ReactSurveyModel.prototype.mergeCss = function (src, dest) {
this.mergeValues(src, dest);
};
ReactSurveyModel.prototype.doAfterRenderSurvey = function (el) {
this.afterRenderSurvey(el);
};
ReactSurveyModel.prototype.onLoadSurveyFromService = function () {
if (!!this.currentPage) {
this.currentPage.setWasShown(false);
this.currentPage.onFirstRendering();
}
this.render();
};
ReactSurveyModel.prototype.onLoadingSurveyFromService = function () {
this.render();
};
ReactSurveyModel.prototype.setCompletedState = function (value, text) {
_super.prototype.setCompletedState.call(this, value, text);
this.render();
};
ReactSurveyModel.prototype.start = function () {
var res = _super.prototype.start.call(this);
this.render();
return res;
};
return ReactSurveyModel;
}(__WEBPACK_IMPORTED_MODULE_1__survey__["a" /* SurveyModel */]));
var ReactWindowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ReactWindowModel, _super);
function ReactWindowModel(jsonObj, model) {
if (jsonObj === void 0) { jsonObj = null; }
if (model === void 0) { model = null; }
return _super.call(this, jsonObj, model) || this;
}
ReactWindowModel.prototype.createSurvey = function (jsonObj) {
return new ReactSurveyModel(jsonObj);
};
Object.defineProperty(ReactWindowModel.prototype, "renderCallback", {
get: function () {
return this.survey.renderCallback;
},
set: function (val) {
this.survey.renderCallback = val;
},
enumerable: true,
configurable: true
});
return ReactWindowModel;
}(__WEBPACK_IMPORTED_MODULE_2__surveyWindow__["a" /* SurveyWindowModel */]));
__WEBPACK_IMPORTED_MODULE_1__survey__["a" /* SurveyModel */].platform = "react";
/***/ }),
/* 28 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__functionsfactory__ = __webpack_require__(29);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditionProcessValue__ = __webpack_require__(15);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return Operand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return BinaryOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return UnaryOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return ArrayOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Const; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return Variable; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FunctionOperand; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return OperandMaker; });
var Operand = /** @class */ (function () {
function Operand() {
}
Operand.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
return "";
};
Operand.prototype.hasFunction = function () {
return false;
};
Operand.prototype.hasAsyncFunction = function () {
return false;
};
Operand.prototype.addToAsyncList = function (list) { };
return Operand;
}());
var BinaryOperand = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(BinaryOperand, _super);
function BinaryOperand(operatorName, left, right, isArithmeticOp) {
if (left === void 0) { left = null; }
if (right === void 0) { right = null; }
if (isArithmeticOp === void 0) { isArithmeticOp = false; }
var _this = _super.call(this) || this;
_this.operatorName = operatorName;
_this.left = left;
_this.right = right;
_this.isArithmeticValue = isArithmeticOp;
if (isArithmeticOp) {
_this.consumer = OperandMaker.binaryFunctions["arithmeticOp"](operatorName);
}
else {
_this.consumer = OperandMaker.binaryFunctions[operatorName];
}
if (_this.consumer == null) {
OperandMaker.throwInvalidOperatorError(operatorName);
}
return _this;
}
BinaryOperand.prototype.getType = function () {
return "binary";
};
Object.defineProperty(BinaryOperand.prototype, "isArithmetic", {
get: function () {
return this.isArithmeticValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BinaryOperand.prototype, "isConjunction", {
get: function () {
return this.operatorName == "or" || this.operatorName == "and";
},
enumerable: true,
configurable: true
});
Object.defineProperty(BinaryOperand.prototype, "conjunction", {
get: function () {
return this.isConjunction ? this.operatorName : "";
},
enumerable: true,
configurable: true
});
Object.defineProperty(BinaryOperand.prototype, "operator", {
get: function () {
return this.operatorName;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BinaryOperand.prototype, "leftOperand", {
get: function () {
return this.left;
},
enumerable: true,
configurable: true
});
Object.defineProperty(BinaryOperand.prototype, "rightOperand", {
get: function () {
return this.right;
},
enumerable: true,
configurable: true
});
BinaryOperand.prototype.evaluateParam = function (x, processValue) {
return x == null ? null : x.evaluate(processValue);
};
BinaryOperand.prototype.evaluate = function (processValue) {
return this.consumer.call(this, this.evaluateParam(this.left, processValue), this.evaluateParam(this.right, processValue));
};
BinaryOperand.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
return ("(" +
OperandMaker.safeToString(this.left, func) +
" " +
OperandMaker.operatorToString(this.operatorName) +
" " +
OperandMaker.safeToString(this.right, func) +
")");
};
BinaryOperand.prototype.setVariables = function (variables) {
if (this.left != null)
this.left.setVariables(variables);
if (this.right != null)
this.right.setVariables(variables);
};
BinaryOperand.prototype.hasFunction = function () {
return ((!!this.left && this.left.hasFunction()) ||
(!!this.right && this.right.hasFunction()));
};
BinaryOperand.prototype.hasAsyncFunction = function () {
return ((!!this.left && this.left.hasAsyncFunction()) ||
(!!this.right && this.right.hasAsyncFunction()));
};
BinaryOperand.prototype.addToAsyncList = function (list) {
if (!!this.left)
this.left.addToAsyncList(list);
if (!!this.right)
this.right.addToAsyncList(list);
};
return BinaryOperand;
}(Operand));
var UnaryOperand = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(UnaryOperand, _super);
function UnaryOperand(expressionValue, operatorName) {
var _this = _super.call(this) || this;
_this.expressionValue = expressionValue;
_this.operatorName = operatorName;
_this.consumer = OperandMaker.unaryFunctions[operatorName];
if (_this.consumer == null) {
OperandMaker.throwInvalidOperatorError(operatorName);
}
return _this;
}
Object.defineProperty(UnaryOperand.prototype, "operator", {
get: function () {
return this.operatorName;
},
enumerable: true,
configurable: true
});
Object.defineProperty(UnaryOperand.prototype, "expression", {
get: function () {
return this.expressionValue;
},
enumerable: true,
configurable: true
});
UnaryOperand.prototype.getType = function () {
return "unary";
};
UnaryOperand.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
return (OperandMaker.operatorToString(this.operatorName) +
" " +
this.expression.toString(func));
};
UnaryOperand.prototype.evaluate = function (processValue) {
var value = this.expression.evaluate(processValue);
return this.consumer.call(this, value);
};
UnaryOperand.prototype.setVariables = function (variables) {
this.expression.setVariables(variables);
};
return UnaryOperand;
}(Operand));
var ArrayOperand = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ArrayOperand, _super);
function ArrayOperand(values) {
var _this = _super.call(this) || this;
_this.values = values;
return _this;
}
ArrayOperand.prototype.getType = function () {
return "array";
};
ArrayOperand.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
return ("[" +
this.values
.map(function (el) {
return el.toString(func);
})
.join(", ") +
"]");
};
ArrayOperand.prototype.evaluate = function (processValue) {
return this.values.map(function (el) {
return el.evaluate(processValue);
});
};
ArrayOperand.prototype.setVariables = function (variables) {
this.values.forEach(function (el) {
el.setVariables(variables);
});
};
ArrayOperand.prototype.hasFunction = function () {
return this.values.some(function (operand) { return operand.hasFunction(); });
};
ArrayOperand.prototype.hasAsyncFunction = function () {
return this.values.some(function (operand) { return operand.hasAsyncFunction(); });
};
ArrayOperand.prototype.addToAsyncList = function (list) {
this.values.forEach(function (operand) { return operand.addToAsyncList(list); });
};
return ArrayOperand;
}(Operand));
var Const = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(Const, _super);
function Const(value) {
var _this = _super.call(this) || this;
_this.value = value;
return _this;
}
Const.prototype.getType = function () {
return "const";
};
Const.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
return this.value.toString();
};
Object.defineProperty(Const.prototype, "correctValue", {
get: function () {
return this.getCorrectValue(this.value);
},
enumerable: true,
configurable: true
});
Const.prototype.evaluate = function () {
return this.getCorrectValue(this.value);
};
Const.prototype.setVariables = function (variables) { };
Const.prototype.getCorrectValue = function (value) {
if (!value || typeof value != "string")
return value;
if (this.isBooleanValue(value))
return value.toLowerCase() === "true";
if (value.length > 1 &&
this.isQuote(value[0]) &&
this.isQuote(value[value.length - 1]))
return value.substr(1, value.length - 2);
if (OperandMaker.isNumeric(value)) {
if (value.indexOf("0x") == 0)
return parseInt(value);
if (value.length > 1 && value[0] == "0")
return value;
return parseFloat(value);
}
return value;
};
Const.prototype.isQuote = function (ch) {
return ch == "'" || ch == '"';
};
Const.prototype.isBooleanValue = function (value) {
return (value &&
(value.toLowerCase() === "true" || value.toLowerCase() === "false"));
};
return Const;
}(Operand));
var Variable = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(Variable, _super);
function Variable(variableName) {
var _this = _super.call(this, variableName) || this;
_this.variableName = variableName;
_this.valueInfo = {};
_this.useValueAsItIs = false;
if (!!_this.variableName &&
_this.variableName.length > 1 &&
_this.variableName[0] === Variable.DisableConversionChar) {
_this.variableName = _this.variableName.substr(1);
_this.useValueAsItIs = true;
}
return _this;
}
Variable.prototype.getType = function () {
return "variable";
};
Variable.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
var prefix = this.useValueAsItIs ? Variable.DisableConversionChar : "";
return "{" + prefix + this.variableName + "}";
};
Object.defineProperty(Variable.prototype, "variable", {
get: function () {
return this.variableName;
},
enumerable: true,
configurable: true
});
Variable.prototype.evaluate = function (processValue) {
this.valueInfo.name = this.variableName;
processValue.getValueInfo(this.valueInfo);
return this.valueInfo.hasValue
? this.getCorrectValue(this.valueInfo.value)
: null;
};
Variable.prototype.setVariables = function (variables) {
variables.push(this.variableName);
};
Variable.prototype.getCorrectValue = function (value) {
if (this.useValueAsItIs)
return value;
return _super.prototype.getCorrectValue.call(this, value);
};
Variable.DisableConversionChar = "#";
return Variable;
}(Const));
var FunctionOperand = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(FunctionOperand, _super);
function FunctionOperand(origionalValue, parameters) {
var _this = _super.call(this) || this;
_this.origionalValue = origionalValue;
_this.parameters = parameters;
_this.isReadyValue = false;
if (Array.isArray(parameters) && parameters.length === 0) {
_this.parameters = new ArrayOperand([]);
}
return _this;
}
FunctionOperand.prototype.getType = function () {
return "function";
};
FunctionOperand.prototype.evaluateAsync = function (processValue) {
var _this = this;
this.isReadyValue = false;
var asyncProcessValue = new __WEBPACK_IMPORTED_MODULE_3__conditionProcessValue__["a" /* ProcessValue */]();
asyncProcessValue.values = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].createCopy(processValue.values);
asyncProcessValue.properties = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].createCopy(processValue.properties);
asyncProcessValue.properties.returnResult = function (result) {
_this.asynResult = result;
_this.isReadyValue = true;
_this.onAsyncReady();
};
this.evaluateCore(asyncProcessValue);
};
FunctionOperand.prototype.evaluate = function (processValue) {
if (this.isReady)
return this.asynResult;
return this.evaluateCore(processValue);
};
FunctionOperand.prototype.evaluateCore = function (processValue) {
return __WEBPACK_IMPORTED_MODULE_2__functionsfactory__["a" /* FunctionFactory */].Instance.run(this.origionalValue, this.parameters.evaluate(processValue), processValue.properties);
};
FunctionOperand.prototype.toString = function (func) {
if (func === void 0) { func = undefined; }
if (!!func) {
var res = func(this);
if (!!res)
return res;
}
return this.origionalValue + "(" + this.parameters.toString(func) + ")";
};
FunctionOperand.prototype.setVariables = function (variables) {
this.parameters.setVariables(variables);
};
Object.defineProperty(FunctionOperand.prototype, "isReady", {
get: function () {
return this.isReadyValue;
},
enumerable: true,
configurable: true
});
FunctionOperand.prototype.hasFunction = function () {
return true;
};
FunctionOperand.prototype.hasAsyncFunction = function () {
return __WEBPACK_IMPORTED_MODULE_2__functionsfactory__["a" /* FunctionFactory */].Instance.isAsyncFunction(this.origionalValue);
};
FunctionOperand.prototype.addToAsyncList = function (list) {
if (this.hasAsyncFunction()) {
list.push(this);
}
};
return FunctionOperand;
}(Operand));
var OperandMaker = /** @class */ (function () {
function OperandMaker() {
}
OperandMaker.throwInvalidOperatorError = function (op) {
throw new Error("Invalid operator: '" + op + "'");
};
OperandMaker.safeToString = function (operand, func) {
return operand == null ? "" : operand.toString(func);
};
OperandMaker.toOperandString = function (value) {
if (!!value &&
!OperandMaker.isNumeric(value) &&
!OperandMaker.isBooleanValue(value))
value = "'" + value + "'";
return value;
};
OperandMaker.isSpaceString = function (str) {
return !!str && !str.replace(" ", "");
};
OperandMaker.isNumeric = function (value) {
if (!!value &&
(value.indexOf("-") > -1 ||
value.indexOf("+") > 1 ||
value.indexOf("*") > -1 ||
value.indexOf("^") > -1 ||
value.indexOf("/") > -1 ||
value.indexOf("%") > -1))
return false;
if (OperandMaker.isSpaceString(value))
return false;
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isNumber(value);
};
OperandMaker.isBooleanValue = function (value) {
return (!!value &&
(value.toLowerCase() === "true" || value.toLowerCase() === "false"));
};
OperandMaker.isTwoValueEquals = function (x, y) {
if (x === "undefined")
x = undefined;
if (y === "undefined")
y = undefined;
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(x, y, true);
};
OperandMaker.operatorToString = function (operatorName) {
var opStr = OperandMaker.signs[operatorName];
return opStr == null ? operatorName : opStr;
};
OperandMaker.unaryFunctions = {
empty: function (value) {
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(value);
},
notempty: function (value) {
return !OperandMaker.unaryFunctions.empty(value);
},
negate: function (value) {
return !value;
},
};
OperandMaker.binaryFunctions = {
arithmeticOp: function (operatorName) {
return function (a, b) {
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(a) && !OperandMaker.isSpaceString(a)) {
a = typeof b === "string" ? "" : 0;
}
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(b) && !OperandMaker.isSpaceString(b)) {
b = typeof a === "string" ? "" : 0;
}
var consumer = OperandMaker.binaryFunctions[operatorName];
return consumer == null ? null : consumer.call(this, a, b);
};
},
and: function (a, b) {
return a && b;
},
or: function (a, b) {
return a || b;
},
plus: function (a, b) {
return a + b;
},
minus: function (a, b) {
return a - b;
},
mul: function (a, b) {
return a * b;
},
div: function (a, b) {
if (!b)
return null;
return a / b;
},
mod: function (a, b) {
if (!b)
return null;
return a % b;
},
power: function (a, b) {
return Math.pow(a, b);
},
greater: function (left, right) {
if (left == null || right == null)
return false;
return left > right;
},
less: function (left, right) {
if (left == null || right == null)
return false;
return left < right;
},
greaterorequal: function (left, right) {
if (OperandMaker.binaryFunctions.equal(left, right))
return true;
return OperandMaker.binaryFunctions.greater(left, right);
},
lessorequal: function (left, right) {
if (OperandMaker.binaryFunctions.equal(left, right))
return true;
return OperandMaker.binaryFunctions.less(left, right);
},
equal: function (left, right) {
return OperandMaker.isTwoValueEquals(left, right);
},
notequal: function (left, right) {
return !OperandMaker.binaryFunctions.equal(left, right);
},
contains: function (left, right) {
return OperandMaker.binaryFunctions.containsCore(left, right, true);
},
notcontains: function (left, right) {
if (!left && !__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right))
return true;
return OperandMaker.binaryFunctions.containsCore(left, right, false);
},
anyof: function (left, right) {
if (!left && __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right))
return true;
if (!left || (!Array.isArray(left) && left.length === 0))
return false;
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right))
return true;
if (!Array.isArray(left))
return OperandMaker.binaryFunctions.contains(right, left);
if (!Array.isArray(right))
return OperandMaker.binaryFunctions.contains(left, right);
for (var i = 0; i < right.length; i++) {
if (OperandMaker.binaryFunctions.contains(left, right[i]))
return true;
}
return false;
},
allof: function (left, right) {
if (!left && !__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(right))
return false;
if (!Array.isArray(right))
return OperandMaker.binaryFunctions.contains(left, right);
for (var i = 0; i < right.length; i++) {
if (!OperandMaker.binaryFunctions.contains(left, right[i]))
return false;
}
return true;
},
containsCore: function (left, right, isContains) {
if (!left)
return false;
if (!left.length) {
left = left.toString();
}
if (typeof left === "string" || left instanceof String) {
if (!right)
return false;
right = right.toString();
var found = left.indexOf(right) > -1;
return isContains ? found : !found;
}
var rightArray = Array.isArray(right) ? right : [right];
for (var rIndex = 0; rIndex < rightArray.length; rIndex++) {
var i = 0;
right = rightArray[rIndex];
for (; i < left.length; i++) {
if (OperandMaker.isTwoValueEquals(left[i], right))
break;
}
if (i == left.length)
return !isContains;
}
return isContains;
},
};
OperandMaker.signs = {
less: "<",
lessorequal: "<=",
greater: ">",
greaterorequal: ">=",
equal: "==",
notequal: "!=",
plus: "+",
minus: "-",
mul: "*",
div: "/",
and: "and",
or: "or",
power: "^",
mod: "%",
negate: "!",
};
return OperandMaker;
}());
/***/ }),
/* 29 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FunctionFactory; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return registerFunction; });
var FunctionFactory = /** @class */ (function () {
function FunctionFactory() {
this.functionHash = {};
this.isAsyncHash = {};
}
FunctionFactory.prototype.register = function (name, func, isAsync) {
if (isAsync === void 0) { isAsync = false; }
this.functionHash[name] = func;
if (isAsync)
this.isAsyncHash[name] = true;
};
FunctionFactory.prototype.unregister = function (name) {
delete this.functionHash[name];
delete this.isAsyncHash[name];
};
FunctionFactory.prototype.hasFunction = function (name) {
return !!this.functionHash[name];
};
FunctionFactory.prototype.isAsyncFunction = function (name) {
return !!this.isAsyncHash[name];
};
FunctionFactory.prototype.clear = function () {
this.functionHash = {};
};
FunctionFactory.prototype.getAll = function () {
var result = [];
for (var key in this.functionHash) {
result.push(key);
}
return result.sort();
};
FunctionFactory.prototype.run = function (name, params, properties) {
if (properties === void 0) { properties = null; }
var func = this.functionHash[name];
if (!func)
return null;
var classRunner = {
func: func,
};
if (properties) {
for (var key in properties) {
classRunner[key] = properties[key];
}
}
return classRunner.func(params);
};
FunctionFactory.Instance = new FunctionFactory();
return FunctionFactory;
}());
var registerFunction = FunctionFactory.Instance.register;
function getParamsAsArray(value, arr) {
if (value === undefined || value === null)
return;
if (Array.isArray(value)) {
for (var i = 0; i < value.length; i++) {
getParamsAsArray(value[i], arr);
}
}
else {
arr.push(value);
}
}
function sum(params) {
var arr = [];
getParamsAsArray(params, arr);
var res = 0;
for (var i = 0; i < arr.length; i++) {
res += arr[i];
}
return res;
}
FunctionFactory.Instance.register("sum", sum);
function min_max(params, isMin) {
var arr = [];
getParamsAsArray(params, arr);
var res = undefined;
for (var i = 0; i < arr.length; i++) {
if (res === undefined) {
res = arr[i];
}
if (isMin) {
if (res > arr[i])
res = arr[i];
}
else {
if (res < arr[i])
res = arr[i];
}
}
return res;
}
function min(params) {
return min_max(params, true);
}
FunctionFactory.Instance.register("min", min);
function max(params) {
return min_max(params, false);
}
FunctionFactory.Instance.register("max", max);
function count(params) {
var arr = [];
getParamsAsArray(params, arr);
return arr.length;
}
FunctionFactory.Instance.register("count", count);
function avg(params) {
var arr = [];
getParamsAsArray(params, arr);
var res = 0;
for (var i = 0; i < arr.length; i++) {
res += arr[i];
}
return arr.length > 0 ? res / arr.length : 0;
}
FunctionFactory.Instance.register("avg", avg);
function getInArrayParams(params) {
if (params.length != 2)
return null;
var arr = params[0];
if (!arr)
return null;
if (!Array.isArray(arr) && !Array.isArray(Object.keys(arr)))
return null;
var name = params[1];
if (typeof name !== "string" && !(name instanceof String))
return null;
return { data: arr, name: name };
}
function calcInArray(params, func) {
var v = getInArrayParams(params);
if (!v)
return undefined;
var res = undefined;
if (Array.isArray(v.data)) {
for (var i = 0; i < v.data.length; i++) {
var item = v.data[i];
if (!!item && item[v.name]) {
res = func(res, item[v.name]);
}
}
}
else {
for (var key in v.data) {
var item = v.data[key];
if (!!item && item[v.name]) {
res = func(res, item[v.name]);
}
}
}
return res;
}
function sumInArray(params) {
var res = calcInArray(params, function (res, val) {
if (res == undefined)
res = 0;
return +res + +val;
});
return res !== undefined ? res : 0;
}
FunctionFactory.Instance.register("sumInArray", sumInArray);
function minInArray(params) {
return calcInArray(params, function (res, val) {
if (res == undefined)
return val;
return res < val ? res : val;
});
}
FunctionFactory.Instance.register("minInArray", minInArray);
function maxInArray(params) {
return calcInArray(params, function (res, val) {
if (res == undefined)
return val;
return res > val ? res : val;
});
}
FunctionFactory.Instance.register("maxInArray", maxInArray);
function countInArray(params) {
var res = calcInArray(params, function (res, val) {
if (res == undefined)
res = 0;
return res + 1;
});
return res !== undefined ? res : 0;
}
FunctionFactory.Instance.register("countInArray", countInArray);
function avgInArray(params) {
var count = countInArray(params);
if (count == 0)
return 0;
return sumInArray(params) / count;
}
FunctionFactory.Instance.register("avgInArray", avgInArray);
function iif(params) {
if (!params && params.length !== 3)
return "";
return params[0] ? params[1] : params[2];
}
FunctionFactory.Instance.register("iif", iif);
function getDate(params) {
if (!params && params.length < 1)
return null;
if (!params[0])
return null;
return new Date(params[0]);
}
FunctionFactory.Instance.register("getDate", getDate);
function age(params) {
if (!params && params.length < 1)
return null;
if (!params[0])
return null;
var birthDay = new Date(params[0]);
var ageDifMs = Date.now() - birthDay.getTime();
var ageDate = new Date(ageDifMs); // miliseconds from epoch
return (Math.abs(ageDate.getUTCFullYear() - 1970) * (ageDifMs / Math.abs(ageDifMs)));
}
FunctionFactory.Instance.register("age", age);
function isContainerReady(params) {
if (!params && params.length < 1)
return false;
if (!params[0] || !this.survey)
return false;
var name = params[0];
var container = this.survey.getPageByName(name);
if (!container)
container = this.survey.getPanelByName(name);
if (!container)
return false;
var questions = container.questions;
for (var i = 0; i < questions.length; i++) {
if (questions[i].hasErrors(false))
return false;
}
return true;
}
FunctionFactory.Instance.register("isContainerReady", isContainerReady);
function isDisplayMode() {
return this.survey && this.survey.isDisplayMode;
}
FunctionFactory.Instance.register("isDisplayMode", isDisplayMode);
function currentDate() {
return new Date();
}
FunctionFactory.Instance.register("currentDate", currentDate);
function today(params) {
var res = new Date();
if (Array.isArray(params) && params.length == 1) {
res.setDate(res.getDate() + params[0]);
}
return res;
}
FunctionFactory.Instance.register("today", today);
/***/ }),
/* 30 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__martixBase__ = __webpack_require__(47);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__ = __webpack_require__(23);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__question_expression__ = __webpack_require__(51);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__functionsfactory__ = __webpack_require__(29);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return matrixDropdownColumnTypes; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return MatrixDropdownColumn; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixDropdownCell; });
/* unused harmony export MatrixDropdownTotalCell */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return MatrixDropdownRowModelBase; });
/* unused harmony export MatrixDropdownTotalRowModel */
/* unused harmony export QuestionMatrixDropdownRenderedCell */
/* unused harmony export QuestionMatrixDropdownRenderedRow */
/* unused harmony export QuestionMatrixDropdownRenderedTable */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return QuestionMatrixDropdownModelBase; });
function onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data) {
cellQuestion.storeOthersAsComment = !!question
? question.storeOthersAsComment
: false;
if ((!cellQuestion.choices || cellQuestion.choices.length == 0) &&
cellQuestion.choicesByUrl.isEmpty) {
cellQuestion.choices = question.choices;
}
if (!cellQuestion.choicesByUrl.isEmpty) {
cellQuestion.choicesByUrl.run(data);
}
}
var matrixDropdownColumnTypes = {
dropdown: {
properties: [
"choices",
"choicesOrder",
"choicesByUrl",
"optionsCaption",
"otherText",
"choicesVisibleIf",
],
onCellQuestionUpdate: function (cellQuestion, column, question, data) {
onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data);
if (!!cellQuestion.locOptionsCaption &&
cellQuestion.locOptionsCaption.isEmpty &&
!question.locOptionsCaption.isEmpty) {
cellQuestion.optionsCaption = question.optionsCaption;
}
},
},
checkbox: {
properties: [
"choices",
"choicesOrder",
"choicesByUrl",
"otherText",
"choicesVisibleIf",
"hasSelectAll",
"hasNone",
],
onCellQuestionUpdate: function (cellQuestion, column, question, data) {
onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data);
cellQuestion.colCount =
column.colCount > -1 ? column.colCount : question.columnColCount;
},
},
radiogroup: {
properties: [
"choices",
"choicesOrder",
"choicesByUrl",
"otherText",
"choicesVisibleIf",
],
onCellQuestionUpdate: function (cellQuestion, column, question, data) {
onUpdateSelectBaseCellQuestion(cellQuestion, column, question, data);
cellQuestion.colCount =
column.colCount > -1 ? column.colCount : question.columnColCount;
},
},
text: {
properties: ["placeHolder", "inputType", "maxLength", "min", "max", "step"],
onCellQuestionUpdate: function (cellQuestion, column, question, data) { },
},
comment: {
properties: ["placeHolder", "rows", "maxLength"],
onCellQuestionUpdate: function (cellQuestion, column, question, data) { },
},
boolean: {
properties: ["defaultValue"],
onCellQuestionUpdate: function (cellQuestion, column, question, data) {
cellQuestion.showTitle = true;
},
},
expression: {
properties: ["expression", "displayStyle", "currency"],
onCellQuestionUpdate: function (cellQuestion, column, question, data) { },
},
rating: {
properties: ["rateValues"],
},
};
var MatrixDropdownColumn = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MatrixDropdownColumn, _super);
function MatrixDropdownColumn(name, title) {
if (title === void 0) { title = null; }
var _this = _super.call(this) || this;
_this.colOwnerValue = null;
_this.indexValue = -1;
_this._isVisible = true;
_this._hasVisibleCell = true;
var self = _this;
_this.createLocalizableString("totalFormat", _this);
_this.registerFunctionOnPropertyValueChanged("showInMultipleColumns", function () {
self.doShowInMultipleColumnsChanged();
});
_this.updateTemplateQuestion();
_this.name = name;
if (title)
_this.title = title;
return _this;
}
MatrixDropdownColumn.getColumnTypes = function () {
var res = [];
for (var key in matrixDropdownColumnTypes) {
res.push(key);
}
return res;
};
MatrixDropdownColumn.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
this.templateQuestion.endLoadingFromJson();
};
MatrixDropdownColumn.prototype.getDynamicPropertyName = function () {
return "cellType";
};
MatrixDropdownColumn.prototype.getDynamicType = function () {
return this.calcCellQuestionType();
};
Object.defineProperty(MatrixDropdownColumn.prototype, "colOwner", {
get: function () {
return this.colOwnerValue;
},
set: function (value) {
this.colOwnerValue = value;
this.updateTemplateQuestion();
},
enumerable: true,
configurable: true
});
MatrixDropdownColumn.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
this.locTitle.strChanged();
};
MatrixDropdownColumn.prototype.addUsedLocales = function (locales) {
_super.prototype.addUsedLocales.call(this, locales);
this.templateQuestion.addUsedLocales(locales);
};
Object.defineProperty(MatrixDropdownColumn.prototype, "index", {
get: function () {
return this.indexValue;
},
enumerable: true,
configurable: true
});
MatrixDropdownColumn.prototype.setIndex = function (val) {
this.indexValue = val;
};
MatrixDropdownColumn.prototype.getType = function () {
return "matrixdropdowncolumn";
};
Object.defineProperty(MatrixDropdownColumn.prototype, "cellType", {
get: function () {
return this.getPropertyValue("cellType");
},
set: function (val) {
val = val.toLocaleLowerCase();
this.setPropertyValue("cellType", val);
this.updateTemplateQuestion();
if (!!this.colOwner) {
this.colOwner.onColumnCellTypeChanged(this);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "templateQuestion", {
get: function () {
return this.templateQuestionValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "value", {
get: function () {
return this.templateQuestion.name;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "isVisible", {
get: function () {
return this._isVisible;
},
enumerable: true,
configurable: true
});
MatrixDropdownColumn.prototype.setIsVisible = function (newVal) {
this._isVisible = newVal;
};
Object.defineProperty(MatrixDropdownColumn.prototype, "hasVisibleCell", {
get: function () {
return this._hasVisibleCell;
},
set: function (newVal) {
this._hasVisibleCell = newVal;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "name", {
get: function () {
return this.templateQuestion.name;
},
set: function (val) {
this.templateQuestion.name = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "title", {
get: function () {
return this.templateQuestion.title;
},
set: function (val) {
this.templateQuestion.title = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "locTitle", {
get: function () {
return this.templateQuestion.locTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "fullTitle", {
get: function () {
return this.locTitle.textOrHtml;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "isRequired", {
get: function () {
return this.templateQuestion.isRequired;
},
set: function (val) {
this.templateQuestion.isRequired = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "requiredText", {
get: function () {
return this.templateQuestion.requiredText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "requiredErrorText", {
get: function () {
return this.templateQuestion.requiredErrorText;
},
set: function (val) {
this.templateQuestion.requiredErrorText = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "locRequiredErrorText", {
get: function () {
return this.templateQuestion.locRequiredErrorText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "readOnly", {
get: function () {
return this.templateQuestion.readOnly;
},
set: function (val) {
this.templateQuestion.readOnly = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "hasOther", {
get: function () {
return this.templateQuestion.hasOther;
},
set: function (val) {
this.templateQuestion.hasOther = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "visibleIf", {
get: function () {
return this.templateQuestion.visibleIf;
},
set: function (val) {
this.templateQuestion.visibleIf = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "enableIf", {
get: function () {
return this.templateQuestion.enableIf;
},
set: function (val) {
this.templateQuestion.enableIf = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "requiredIf", {
get: function () {
return this.templateQuestion.requiredIf;
},
set: function (val) {
this.templateQuestion.requiredIf = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "showInMultipleColumns", {
get: function () {
return this.getPropertyValue("showInMultipleColumns", false);
},
set: function (val) {
this.setPropertyValue("showInMultipleColumns", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "isSupportMultipleColumns", {
get: function () {
return ["checkbox", "radiogroup"].indexOf(this.cellType) > -1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "isShowInMultipleColumns", {
get: function () {
return this.showInMultipleColumns && this.isSupportMultipleColumns;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "validators", {
get: function () {
return this.templateQuestion.validators;
},
set: function (val) {
this.templateQuestion.validators = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalType", {
get: function () {
return this.getPropertyValue("totalType", "none");
},
set: function (val) {
this.setPropertyValue("totalType", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalExpression", {
get: function () {
return this.getPropertyValue("totalExpression");
},
set: function (val) {
this.setPropertyValue("totalExpression", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "hasTotal", {
get: function () {
return this.totalType != "none" || !!this.totalExpression;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalFormat", {
get: function () {
return this.getLocalizableStringText("totalFormat", "");
},
set: function (val) {
this.setLocalizableStringText("totalFormat", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "locTotalFormat", {
get: function () {
return this.getLocalizableString("totalFormat");
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalMaximumFractionDigits", {
get: function () {
return this.getPropertyValue("totalMaximumFractionDigits", -1);
},
set: function (val) {
if (val < -1 || val > 20)
return;
this.setPropertyValue("totalMaximumFractionDigits", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalMinimumFractionDigits", {
get: function () {
return this.getPropertyValue("totalMinimumFractionDigits", -1);
},
set: function (val) {
if (val < -1 || val > 20)
return;
this.setPropertyValue("totalMinimumFractionDigits", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalDisplayStyle", {
get: function () {
return this.getPropertyValue("totalDisplayStyle");
},
set: function (val) {
this.setPropertyValue("totalDisplayStyle", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "totalCurrency", {
get: function () {
return this.getPropertyValue("totalCurrency");
},
set: function (val) {
if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10__question_expression__["b" /* getCurrecyCodes */])().indexOf(val) < 0)
return;
this.setPropertyValue("totalCurrency", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "minWidth", {
get: function () {
return this.getPropertyValue("minWidth", "");
},
set: function (val) {
this.setPropertyValue("minWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "width", {
get: function () {
return this.getPropertyValue("width", "");
},
set: function (val) {
this.setPropertyValue("width", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownColumn.prototype, "colCount", {
get: function () {
return this.getPropertyValue("colCount", -1);
},
set: function (val) {
if (val < -1 || val > 4)
return;
this.setPropertyValue("colCount", val);
},
enumerable: true,
configurable: true
});
MatrixDropdownColumn.prototype.getLocale = function () {
return this.colOwner ? this.colOwner.getLocale() : "";
};
MatrixDropdownColumn.prototype.getMarkdownHtml = function (text) {
return this.colOwner ? this.colOwner.getMarkdownHtml(text) : null;
};
MatrixDropdownColumn.prototype.getProcessedText = function (text) {
return this.colOwner ? this.colOwner.getProcessedText(text) : text;
};
MatrixDropdownColumn.prototype.createCellQuestion = function (data) {
var qType = this.calcCellQuestionType();
var cellQuestion = this.createNewQuestion(qType);
this.callOnCellQuestionUpdate(cellQuestion, data);
return cellQuestion;
};
MatrixDropdownColumn.prototype.updateCellQuestion = function (cellQuestion, data, onUpdateJson) {
if (onUpdateJson === void 0) { onUpdateJson = null; }
this.setQuestionProperties(cellQuestion, onUpdateJson);
this.callOnCellQuestionUpdate(cellQuestion, data);
};
MatrixDropdownColumn.prototype.callOnCellQuestionUpdate = function (cellQuestion, data) {
var qType = cellQuestion.getType();
var qDefinition = matrixDropdownColumnTypes[qType];
if (qDefinition && qDefinition["onCellQuestionUpdate"]) {
qDefinition["onCellQuestionUpdate"](cellQuestion, this, this.colOwner, data);
}
};
MatrixDropdownColumn.prototype.defaultCellTypeChanged = function () {
this.updateTemplateQuestion();
};
MatrixDropdownColumn.prototype.calcCellQuestionType = function () {
if (this.cellType !== "default")
return this.cellType;
if (this.colOwner)
return this.colOwner.getCellType();
return __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].matrixDefaultCellType;
};
MatrixDropdownColumn.prototype.updateTemplateQuestion = function () {
var prevCellType = this.templateQuestion
? this.templateQuestion.getType()
: "";
var curCellType = this.calcCellQuestionType();
if (curCellType === prevCellType)
return;
if (this.templateQuestion) {
this.removeProperties(prevCellType);
}
this.templateQuestionValue = this.createNewQuestion(curCellType);
this.templateQuestion.locOwner = this;
this.addProperties(curCellType);
var self = this;
this.templateQuestion.onPropertyChanged.add(function (sender, options) {
self.doColumnPropertiesChanged(options.name, options.newValue);
});
};
MatrixDropdownColumn.prototype.createNewQuestion = function (cellType) {
var question = __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].createClass(cellType);
if (!question) {
question = __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].createClass("text");
}
question.loadingOwner = this;
this.setQuestionProperties(question);
return question;
};
MatrixDropdownColumn.prototype.setQuestionProperties = function (question, onUpdateJson) {
if (onUpdateJson === void 0) { onUpdateJson = null; }
if (this.templateQuestion) {
var json = new __WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* JsonObject */]().toJsonObject(this.templateQuestion, true);
if (onUpdateJson) {
onUpdateJson(json);
}
json.type = question.getType();
new __WEBPACK_IMPORTED_MODULE_1__jsonobject__["c" /* JsonObject */]().toObject(json, question);
}
};
MatrixDropdownColumn.prototype.propertyValueChanged = function (name, oldValue, newValue) {
_super.prototype.propertyValueChanged.call(this, name, oldValue, newValue);
this.doColumnPropertiesChanged(name, newValue);
};
MatrixDropdownColumn.prototype.doColumnPropertiesChanged = function (name, newValue) {
if (name == "visibleChoices")
return; //TODO descriptor doesn't return that it is a read-only property
if (this.colOwner != null && !this.isLoadingFromJson) {
this.colOwner.onColumnPropertyChanged(this, name, newValue);
}
};
MatrixDropdownColumn.prototype.doShowInMultipleColumnsChanged = function () {
if (this.colOwner != null && !this.isLoadingFromJson) {
this.colOwner.onShowInMultipleColumnsChanged(this);
}
};
MatrixDropdownColumn.prototype.getProperties = function (curCellType) {
return __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].getDynamicPropertiesByObj(this, curCellType);
};
MatrixDropdownColumn.prototype.removeProperties = function (curCellType) {
var properties = this.getProperties(curCellType);
for (var i = 0; i < properties.length; i++) {
var prop = properties[i];
delete this[prop.name];
if (prop.serializationProperty) {
delete this[prop.serializationProperty];
}
}
};
MatrixDropdownColumn.prototype.addProperties = function (curCellType) {
var question = this.templateQuestion;
var properties = this.getProperties(curCellType);
for (var i = 0; i < properties.length; i++) {
var prop = properties[i];
this.addProperty(question, prop.name, false);
if (prop.serializationProperty) {
this.addProperty(question, prop.serializationProperty, true);
}
}
};
MatrixDropdownColumn.prototype.addProperty = function (question, propName, isReadOnly) {
var self = this;
var desc = {
configurable: true,
get: function () {
return question[propName];
},
};
if (!isReadOnly) {
desc["set"] = function (v) {
var oldValue = question[propName];
question[propName] = v;
self.propertyValueChanged(propName, oldValue, v);
};
}
Object.defineProperty(this, propName, desc);
};
return MatrixDropdownColumn;
}(__WEBPACK_IMPORTED_MODULE_4__base__["b" /* Base */]));
var MatrixDropdownCell = /** @class */ (function () {
function MatrixDropdownCell(column, row, data) {
this.column = column;
this.row = row;
this.data = data;
this.questionValue = this.createQuestion(column, row, data);
this.questionValue.updateCustomWidget();
}
MatrixDropdownCell.prototype.locStrsChanged = function () {
this.question.locStrsChanged();
};
MatrixDropdownCell.prototype.createQuestion = function (column, row, data) {
var res = data.createQuestion(this.row, this.column);
res.validateValueCallback = function () {
return data.validateCell(row, column.name, row.value);
};
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["b" /* CustomPropertiesCollection */].getProperties(column.getType()).forEach(function (property) {
var propertyName = property.name;
if (column[propertyName] !== undefined) {
res[propertyName] = column[propertyName];
}
});
return res;
};
Object.defineProperty(MatrixDropdownCell.prototype, "question", {
get: function () {
return this.questionValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownCell.prototype, "value", {
get: function () {
return this.question.value;
},
set: function (value) {
this.question.value = value;
},
enumerable: true,
configurable: true
});
MatrixDropdownCell.prototype.runCondition = function (values, properties) {
this.question.runCondition(values, properties);
};
return MatrixDropdownCell;
}());
var MatrixDropdownTotalCell = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MatrixDropdownTotalCell, _super);
function MatrixDropdownTotalCell(column, row, data) {
var _this = _super.call(this, column, row, data) || this;
_this.column = column;
_this.row = row;
_this.data = data;
_this.updateCellQuestion();
return _this;
}
MatrixDropdownTotalCell.prototype.createQuestion = function (column, row, data) {
var res = __WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].createClass("expression");
res.setSurveyImpl(row);
return res;
};
MatrixDropdownTotalCell.prototype.locStrsChanged = function () {
this.updateCellQuestion();
_super.prototype.locStrsChanged.call(this);
};
MatrixDropdownTotalCell.prototype.updateCellQuestion = function () {
this.question.locCalculation();
this.column.updateCellQuestion(this.question, null, function (json) {
delete json["defaultValue"];
});
this.question.expression = this.getTotalExpression();
this.question.format = this.column.totalFormat;
this.question.currency = this.column.totalCurrency;
this.question.displayStyle = this.column.totalDisplayStyle;
this.question.maximumFractionDigits = this.column.totalMaximumFractionDigits;
this.question.minimumFractionDigits = this.column.totalMinimumFractionDigits;
this.question.unlocCalculation();
};
MatrixDropdownTotalCell.prototype.getTotalExpression = function () {
if (!!this.column.totalExpression)
return this.column.totalExpression;
if (this.column.totalType == "none")
return "";
var funName = this.column.totalType + "InArray";
if (!__WEBPACK_IMPORTED_MODULE_11__functionsfactory__["a" /* FunctionFactory */].Instance.hasFunction(funName))
return "";
return funName + "({self}, '" + this.column.name + "')";
};
return MatrixDropdownTotalCell;
}(MatrixDropdownCell));
var MatrixDropdownRowModelBase = /** @class */ (function () {
function MatrixDropdownRowModelBase(data, value) {
this.isSettingValue = false;
this.cells = [];
this.data = data;
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_5__textPreProcessor__["a" /* TextPreProcessor */]();
var self = this;
this.textPreProcessor.onProcess = function (textValue) {
self.getProcessedTextValue(textValue);
};
this.idValue = MatrixDropdownRowModelBase.getId();
}
MatrixDropdownRowModelBase.getId = function () {
return "srow_" + MatrixDropdownRowModelBase.idCounter++;
};
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "id", {
get: function () {
return this.idValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "rowName", {
get: function () {
return null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "value", {
get: function () {
var result = {};
for (var i = 0; i < this.cells.length; i++) {
var question = this.cells[i].question;
if (!question.isEmpty()) {
result[question.getValueName()] = question.value;
}
if (!!question.comment &&
!!this.getSurvey() &&
this.getSurvey().storeOthersAsComment) {
result[question.getValueName() + __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].commentPrefix] =
question.comment;
}
}
return result;
},
set: function (value) {
this.isSettingValue = true;
for (var i = 0; i < this.cells.length; i++) {
var question = this.cells[i].question;
var val = !!value ? value[question.getValueName()] : null;
var oldComment = question.comment;
var comment = !!value
? value[question.getValueName() + __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].commentPrefix]
: "";
if (comment == undefined)
comment = "";
question.updateValueFromSurvey(val);
if (!!comment || __WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(oldComment, question.comment)) {
question.updateCommentFromSurvey(comment);
}
question.onSurveyValueChanged(val);
}
this.isSettingValue = false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "locText", {
get: function () {
return null;
},
enumerable: true,
configurable: true
});
MatrixDropdownRowModelBase.prototype.getAllValues = function () {
return this.value;
};
MatrixDropdownRowModelBase.prototype.getFilteredValues = function () {
var allValues = this.getAllValues();
var values = { row: allValues };
for (var key in allValues) {
values[key] = allValues[key];
}
return values;
};
MatrixDropdownRowModelBase.prototype.getFilteredProperties = function () {
return { survey: this.getSurvey(), row: this };
};
MatrixDropdownRowModelBase.prototype.runCondition = function (values, properties) {
if (!!this.data) {
values[MatrixDropdownRowModelBase.OwnerVariableName] = this.data.value;
}
values[MatrixDropdownRowModelBase.IndexVariableName] = this.rowIndex;
values[MatrixDropdownRowModelBase.RowValueVariableName] = this.rowName;
if (!properties)
properties = {};
properties[MatrixDropdownRowModelBase.RowVariableName] = this;
for (var i = 0; i < this.cells.length; i++) {
values[MatrixDropdownRowModelBase.RowVariableName] = this.value;
this.cells[i].runCondition(values, properties);
}
};
MatrixDropdownRowModelBase.prototype.onAnyValueChanged = function (name) {
for (var i = 0; i < this.cells.length; i++) {
this.cells[i].question.onAnyValueChanged(name);
}
};
MatrixDropdownRowModelBase.prototype.getDataValueCore = function (valuesHash, key) {
var survey = this.getSurvey();
if (!!survey) {
return survey.getDataValueCore(valuesHash, key);
}
else {
return valuesHash[key];
}
};
MatrixDropdownRowModelBase.prototype.getValue = function (name) {
var question = this.getQuestionByColumnName(name);
return !!question ? question.value : null;
};
MatrixDropdownRowModelBase.prototype.setValue = function (name, newColumnValue) {
this.setValueCore(name, newColumnValue, false);
};
MatrixDropdownRowModelBase.prototype.getVariable = function (name) {
return undefined;
};
MatrixDropdownRowModelBase.prototype.setVariable = function (name, newValue) { };
MatrixDropdownRowModelBase.prototype.getComment = function (name) {
var question = this.getQuestionByColumnName(name);
return !!question ? question.comment : "";
};
MatrixDropdownRowModelBase.prototype.setComment = function (name, newValue, locNotification) {
this.setValueCore(name, newValue, true);
};
MatrixDropdownRowModelBase.prototype.setValueCore = function (name, newColumnValue, isComment) {
if (this.isSettingValue)
return;
var newValue = this.value;
var changedName = isComment ? name + __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].commentPrefix : name;
var changedValue = isComment ? this.getComment(name) : this.getValue(name);
var changedQuestion = this.getQuestionByColumnName(name);
var changingValue = this.data.onRowChanging(this, changedName, newValue);
if (!!changedQuestion &&
!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(changingValue, changedValue)) {
if (isComment) {
changedQuestion.comment = changingValue;
}
else {
changedQuestion.value = changingValue;
}
}
else {
this.data.onRowChanged(this, changedName, newValue, newColumnValue == null && !changedQuestion);
this.onAnyValueChanged(MatrixDropdownRowModelBase.RowVariableName);
}
};
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "isEmpty", {
get: function () {
var val = this.value;
if (__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(val))
return true;
for (var key in val) {
if (val[key] !== undefined && val[key] !== null)
return false;
}
return true;
},
enumerable: true,
configurable: true
});
MatrixDropdownRowModelBase.prototype.getQuestionByColumn = function (column) {
for (var i = 0; i < this.cells.length; i++) {
if (this.cells[i].column == column)
return this.cells[i].question;
}
return null;
};
MatrixDropdownRowModelBase.prototype.getQuestionByColumnName = function (columnName) {
for (var i = 0; i < this.cells.length; i++) {
if (this.cells[i].column.name == columnName)
return this.cells[i].question;
}
return null;
};
MatrixDropdownRowModelBase.prototype.getSharedQuestionByName = function (columnName) {
return !!this.data
? this.data.getSharedQuestionByName(columnName, this)
: null;
};
MatrixDropdownRowModelBase.prototype.clearIncorrectValues = function (val) {
for (var key in val) {
var question = this.getQuestionByColumnName(key);
if (question) {
var qVal = question.value;
question.clearIncorrectValues();
if (!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(qVal, question.value)) {
this.setValue(key, question.value);
}
}
else {
if (!this.getSharedQuestionByName(key)) {
this.setValue(key, null);
}
}
}
};
MatrixDropdownRowModelBase.prototype.getLocale = function () {
return this.data ? this.data.getLocale() : "";
};
MatrixDropdownRowModelBase.prototype.getMarkdownHtml = function (text) {
return this.data ? this.data.getMarkdownHtml(text) : null;
};
MatrixDropdownRowModelBase.prototype.getProcessedText = function (text) {
return this.data ? this.data.getProcessedText(text) : text;
};
MatrixDropdownRowModelBase.prototype.locStrsChanged = function () {
for (var i = 0; i < this.cells.length; i++) {
this.cells[i].locStrsChanged();
}
};
MatrixDropdownRowModelBase.prototype.updateCellQuestionOnColumnChanged = function (column, name, newValue) {
for (var i = 0; i < this.cells.length; i++) {
if (this.cells[i].column === column) {
this.updateCellOnColumnChanged(this.cells[i], name, newValue);
return;
}
}
};
MatrixDropdownRowModelBase.prototype.onQuestionReadOnlyChanged = function (parentIsReadOnly) {
for (var i = 0; i < this.cells.length; i++) {
if (!!this.cells[i].question) {
this.cells[i].question.readOnly = parentIsReadOnly;
}
}
};
MatrixDropdownRowModelBase.prototype.updateCellOnColumnChanged = function (cell, name, newValue) {
cell.question[name] = newValue;
};
MatrixDropdownRowModelBase.prototype.buildCells = function (value) {
this.isSettingValue = true;
var columns = this.data.columns;
for (var i = 0; i < columns.length; i++) {
var column = columns[i];
if (!column.isVisible)
continue;
var cell = this.createCell(column);
this.cells.push(cell);
if (!!value && !__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(value[column.name])) {
cell.question.value = value[column.name];
}
}
this.isSettingValue = false;
};
MatrixDropdownRowModelBase.prototype.createCell = function (column) {
return new MatrixDropdownCell(column, this, this.data);
};
MatrixDropdownRowModelBase.prototype.geSurveyData = function () {
return this;
};
MatrixDropdownRowModelBase.prototype.getSurvey = function () {
return this.data ? this.data.getSurvey() : null;
};
Object.defineProperty(MatrixDropdownRowModelBase.prototype, "rowIndex", {
get: function () {
return !!this.data ? this.data.getRowIndex(this) + 1 : -1;
},
enumerable: true,
configurable: true
});
//ITextProcessor
MatrixDropdownRowModelBase.prototype.getProcessedTextValue = function (textValue) {
var firstName = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(textValue.name);
textValue.isExists =
firstName == MatrixDropdownRowModelBase.RowVariableName;
textValue.canProcess = textValue.isExists;
if (!textValue.isExists)
return;
var values = { row: this.value };
textValue.value = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */]().getValue(textValue.name, values);
};
MatrixDropdownRowModelBase.prototype.getTextProcessor = function () {
return this;
};
MatrixDropdownRowModelBase.prototype.processText = function (text, returnDisplayValue) {
text = this.textPreProcessor.process(text, returnDisplayValue);
if (!this.getSurvey())
return text;
return this.getSurvey().processText(text, returnDisplayValue);
};
MatrixDropdownRowModelBase.prototype.processTextEx = function (text, returnDisplayValue) {
text = this.processText(text, returnDisplayValue);
if (!this.getSurvey())
return text;
var hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;
var res = this.getSurvey().processTextEx(text, returnDisplayValue, false);
res.hasAllValuesOnLastRun =
res.hasAllValuesOnLastRun && hasAllValuesOnLastRun;
return res;
};
MatrixDropdownRowModelBase.RowVariableName = "row";
MatrixDropdownRowModelBase.OwnerVariableName = "self";
MatrixDropdownRowModelBase.IndexVariableName = "rowIndex";
MatrixDropdownRowModelBase.RowValueVariableName = "rowValue";
MatrixDropdownRowModelBase.idCounter = 1;
return MatrixDropdownRowModelBase;
}());
var MatrixDropdownTotalRowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MatrixDropdownTotalRowModel, _super);
function MatrixDropdownTotalRowModel(data) {
var _this = _super.call(this, data, null) || this;
_this.buildCells(null);
return _this;
}
MatrixDropdownTotalRowModel.prototype.createCell = function (column) {
return new MatrixDropdownTotalCell(column, this, this.data);
};
MatrixDropdownTotalRowModel.prototype.setValue = function (name, newValue) {
if (!!this.data && !this.isSettingValue) {
this.data.onTotalValueChanged();
}
};
MatrixDropdownTotalRowModel.prototype.runCondition = function (values, properties) {
var counter = 0;
var prevValue;
do {
prevValue = __WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].getUnbindValue(this.value);
_super.prototype.runCondition.call(this, values, properties);
counter++;
} while (!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(prevValue, this.value) && counter < 3);
};
MatrixDropdownTotalRowModel.prototype.updateCellOnColumnChanged = function (cell, name, newValue) {
cell.updateCellQuestion();
};
return MatrixDropdownTotalRowModel;
}(MatrixDropdownRowModelBase));
var QuestionMatrixDropdownRenderedCell = /** @class */ (function () {
function QuestionMatrixDropdownRenderedCell() {
this.minWidth = "";
this.width = "";
this.idValue = QuestionMatrixDropdownRenderedCell.counter++;
}
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "hasQuestion", {
get: function () {
return !!this.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "hasTitle", {
get: function () {
return !!this.locTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "id", {
get: function () {
return this.idValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "showErrorOnTop", {
get: function () {
return this.showErrorOnCore("top");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "showErrorOnBottom", {
get: function () {
return this.showErrorOnCore("bottom");
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownRenderedCell.prototype.showErrorOnCore = function (location) {
return (this.getShowErrorLocation() == location &&
(!this.isChoice || this.isFirstChoice));
};
QuestionMatrixDropdownRenderedCell.prototype.getShowErrorLocation = function () {
return this.hasQuestion ? this.question.survey.questionErrorLocation : "";
};
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "item", {
get: function () {
return this.itemValue;
},
set: function (val) {
this.itemValue = val;
if (!!val) {
val.hideCaption = true;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "isChoice", {
get: function () {
return !!this.item;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "choiceValue", {
get: function () {
return this.isChoice ? this.item.value : null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "isCheckbox", {
get: function () {
return this.isChoice && this.question.getType() == "checkbox";
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedCell.prototype, "isFirstChoice", {
get: function () {
return this.choiceIndex === 0;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownRenderedCell.counter = 1;
return QuestionMatrixDropdownRenderedCell;
}());
var QuestionMatrixDropdownRenderedRow = /** @class */ (function () {
function QuestionMatrixDropdownRenderedRow() {
this.cells = [];
this.idValue = QuestionMatrixDropdownRenderedRow.counter++;
}
Object.defineProperty(QuestionMatrixDropdownRenderedRow.prototype, "id", {
get: function () {
return this.idValue;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownRenderedRow.counter = 1;
return QuestionMatrixDropdownRenderedRow;
}());
var QuestionMatrixDropdownRenderedTable = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixDropdownRenderedTable, _super);
function QuestionMatrixDropdownRenderedTable(matrix) {
var _this = _super.call(this) || this;
_this.matrix = matrix;
_this.createNewArray("rows");
_this.build();
return _this;
}
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "showHeader", {
get: function () {
return this.getPropertyValue("showHeader");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "showFooter", {
get: function () {
return this.matrix.hasFooter && this.matrix.isColumnLayoutHorizontal;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "hasFooter", {
get: function () {
return !!this.footerRow;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "hasRemoveRows", {
get: function () {
return this.hasRemoveRowsValue;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownRenderedTable.prototype.isRequireReset = function () {
return (this.hasRemoveRows != this.matrix.canRemoveRows ||
!this.matrix.isColumnLayoutHorizontal);
};
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "headerRow", {
get: function () {
return this.headerRowValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "footerRow", {
get: function () {
return this.footerRowValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownRenderedTable.prototype, "rows", {
get: function () {
return this.getPropertyValue("rows");
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownRenderedTable.prototype.build = function () {
this.hasRemoveRowsValue = this.matrix.canRemoveRows;
//build rows now
var rows = this.matrix.visibleRows;
this.buildHeader();
this.buildRows();
this.buildFooter();
};
QuestionMatrixDropdownRenderedTable.prototype.onAddedRow = function () {
if (this.rows.length >= this.matrix.visibleRows.length)
return;
this.rows.push(this.createHorizontalRow(this.matrix.visibleRows[this.matrix.visibleRows.length - 1], this.matrix.visibleRows.length == 1 && !this.matrix.showHeader));
};
QuestionMatrixDropdownRenderedTable.prototype.onRemovedRow = function (index) {
if (this.rows.length <= index)
return;
this.rows.splice(index, 1);
};
QuestionMatrixDropdownRenderedTable.prototype.buildHeader = function () {
var colHeaders = this.matrix.isColumnLayoutHorizontal && this.matrix.showHeader;
var isShown = colHeaders ||
(this.matrix.hasRowText && !this.matrix.isColumnLayoutHorizontal);
this.setPropertyValue("showHeader", isShown);
if (!isShown)
return;
this.headerRowValue = new QuestionMatrixDropdownRenderedRow();
if (this.matrix.hasRowText && this.matrix.showHeader) {
this.headerRow.cells.push(this.createHeaderCell(null));
}
if (this.matrix.isColumnLayoutHorizontal) {
for (var i = 0; i < this.matrix.visibleColumns.length; i++) {
var column = this.matrix.visibleColumns[i];
if (!column.hasVisibleCell)
continue;
if (column.isShowInMultipleColumns) {
this.createMutlipleColumnsHeader(column);
}
else {
this.headerRow.cells.push(this.createHeaderCell(column));
}
}
}
else {
var rows = this.matrix.visibleRows;
for (var i = 0; i < rows.length; i++) {
this.headerRow.cells.push(this.createTextCell(rows[i].locText));
}
if (this.matrix.hasFooter) {
this.headerRow.cells.push(this.createTextCell(this.matrix.getFooterText()));
}
}
if (this.hasRemoveRows) {
this.headerRow.cells.push(this.createHeaderCell(null));
}
};
QuestionMatrixDropdownRenderedTable.prototype.buildFooter = function () {
if (!this.showFooter)
return;
this.footerRowValue = new QuestionMatrixDropdownRenderedRow();
if (this.matrix.hasRowText) {
this.footerRow.cells.push(this.createTextCell(this.matrix.getFooterText()));
}
var cells = this.matrix.visibleTotalRow.cells;
for (var i = 0; i < cells.length; i++) {
var cell = cells[i];
if (!cell.column.hasVisibleCell)
continue;
if (cell.column.isShowInMultipleColumns) {
this.createMutlipleColumnsFooter(this.footerRow, cell);
}
else {
this.footerRow.cells.push(this.createEditCell(cell));
}
}
if (this.hasRemoveRows) {
this.footerRow.cells.push(this.createHeaderCell(null));
}
};
QuestionMatrixDropdownRenderedTable.prototype.buildRows = function () {
var rows = this.matrix.isColumnLayoutHorizontal
? this.buildHorizontalRows()
: this.buildVerticalRows();
this.setPropertyValue("rows", rows);
};
QuestionMatrixDropdownRenderedTable.prototype.canRemoveRow = function (row) {
return this.matrix.canRemoveRow(row);
};
QuestionMatrixDropdownRenderedTable.prototype.buildHorizontalRows = function () {
var rows = this.matrix.visibleRows;
var renderedRows = [];
for (var i = 0; i < rows.length; i++) {
renderedRows.push(this.createHorizontalRow(rows[i], i == 0 && !this.matrix.showHeader));
}
return renderedRows;
};
QuestionMatrixDropdownRenderedTable.prototype.createHorizontalRow = function (row, useAsHeader) {
var res = new QuestionMatrixDropdownRenderedRow();
if (this.matrix.hasRowText) {
var renderedCell = this.createTextCell(row.locText);
res.cells.push(renderedCell);
if (useAsHeader) {
this.setHeaderCellWidth(null, renderedCell);
}
}
for (var i = 0; i < row.cells.length; i++) {
var cell = row.cells[i];
if (!cell.column.hasVisibleCell)
continue;
if (cell.column.isShowInMultipleColumns) {
this.createMutlipleEditCells(res, cell);
}
else {
var renderedCell = this.createEditCell(cell);
res.cells.push(renderedCell);
if (useAsHeader) {
this.setHeaderCellWidth(cell.column, renderedCell);
}
}
}
if (this.hasRemoveRows) {
res.cells.push(this.createRemoveRowCell(row));
}
return res;
};
QuestionMatrixDropdownRenderedTable.prototype.buildVerticalRows = function () {
var columns = this.matrix.columns;
var renderedRows = [];
for (var i = 0; i < columns.length; i++) {
var col = columns[i];
if (col.isVisible && col.hasVisibleCell) {
if (col.isShowInMultipleColumns) {
this.createMutlipleVerticalRows(renderedRows, col, i);
}
else {
renderedRows.push(this.createVerticalRow(col, i));
}
}
}
if (this.hasRemoveRows) {
renderedRows.push(this.createVerticalRemoveRow());
}
return renderedRows;
};
QuestionMatrixDropdownRenderedTable.prototype.createMutlipleVerticalRows = function (renderedRows, column, index) {
var choices = this.getMultipleColumnChoices(column);
if (!choices)
return;
for (var i = 0; i < choices.length; i++) {
renderedRows.push(this.createVerticalRow(column, index, choices[i], i));
}
};
QuestionMatrixDropdownRenderedTable.prototype.createVerticalRow = function (column, index, choice, choiceIndex) {
if (choice === void 0) { choice = null; }
if (choiceIndex === void 0) { choiceIndex = -1; }
var res = new QuestionMatrixDropdownRenderedRow();
if (this.matrix.showHeader) {
var lTitle = !!choice ? choice.locText : column.locTitle;
var hCell = this.createTextCell(lTitle);
if (!choice) {
this.setRequriedToHeaderCell(column, hCell);
}
res.cells.push(hCell);
}
var rows = this.matrix.visibleRows;
for (var i = 0; i < rows.length; i++) {
var rCell = this.createEditCell(rows[i].cells[index]);
rCell.item = choice;
rCell.choiceIndex = choiceIndex >= 0 ? choiceIndex : i;
res.cells.push(rCell);
}
if (this.matrix.hasTotal) {
res.cells.push(this.createEditCell(this.matrix.visibleTotalRow.cells[index]));
}
return res;
};
QuestionMatrixDropdownRenderedTable.prototype.createVerticalRemoveRow = function () {
var res = new QuestionMatrixDropdownRenderedRow();
if (this.matrix.showHeader) {
res.cells.push(this.createTextCell(null));
}
var rows = this.matrix.visibleRows;
for (var i = 0; i < rows.length; i++) {
res.cells.push(this.createRemoveRowCell(rows[i]));
}
if (this.matrix.hasTotal) {
res.cells.push(this.createTextCell(null));
}
return res;
};
QuestionMatrixDropdownRenderedTable.prototype.createMutlipleEditCells = function (rRow, cell, isFooter) {
if (isFooter === void 0) { isFooter = false; }
var choices = this.getMultipleColumnChoices(cell.column);
if (!choices)
return;
for (var i = 0; i < choices.length; i++) {
var rCell = this.createEditCell(cell);
if (!isFooter) {
rCell.item = choices[i];
rCell.choiceIndex = i;
}
rRow.cells.push(rCell);
}
};
QuestionMatrixDropdownRenderedTable.prototype.createEditCell = function (cell) {
var res = new QuestionMatrixDropdownRenderedCell();
res.cell = cell;
res.row = cell.row;
res.question = cell.question;
res.matrix = this.matrix;
return res;
};
QuestionMatrixDropdownRenderedTable.prototype.createMutlipleColumnsFooter = function (rRow, cell) {
this.createMutlipleEditCells(rRow, cell, true);
};
QuestionMatrixDropdownRenderedTable.prototype.createMutlipleColumnsHeader = function (column) {
var choices = this.getMultipleColumnChoices(column);
if (!choices)
return;
for (var i = 0; i < choices.length; i++) {
var cell = this.createTextCell(choices[i].locText);
this.setHeaderCell(column, cell);
this.headerRow.cells.push(cell);
}
};
QuestionMatrixDropdownRenderedTable.prototype.getMultipleColumnChoices = function (column) {
var choices = column.templateQuestion.choices;
if (!!choices && Array.isArray(choices) && choices.length == 0)
return this.matrix.choices;
var choices = column.templateQuestion.visibleChoices;
if (!choices || !Array.isArray(choices))
return null;
return choices;
};
QuestionMatrixDropdownRenderedTable.prototype.createHeaderCell = function (column) {
var cell = this.createTextCell(!!column ? column.locTitle : null);
this.setHeaderCell(column, cell);
return cell;
};
QuestionMatrixDropdownRenderedTable.prototype.setHeaderCell = function (column, cell) {
this.setHeaderCellWidth(column, cell);
this.setRequriedToHeaderCell(column, cell);
};
QuestionMatrixDropdownRenderedTable.prototype.setHeaderCellWidth = function (column, cell) {
cell.minWidth = column != null ? this.matrix.getColumnWidth(column) : "";
cell.width = column != null ? column.width : this.matrix.getRowTitleWidth();
};
QuestionMatrixDropdownRenderedTable.prototype.setRequriedToHeaderCell = function (column, cell) {
if (!!column && column.isRequired && this.matrix.survey) {
cell.requiredText = this.matrix.survey.requiredText;
}
};
QuestionMatrixDropdownRenderedTable.prototype.createRemoveRowCell = function (row) {
var res = new QuestionMatrixDropdownRenderedCell();
res.row = row;
res.isRemoveRow = this.canRemoveRow(row);
return res;
};
QuestionMatrixDropdownRenderedTable.prototype.createTextCell = function (locTitle) {
var cell = new QuestionMatrixDropdownRenderedCell();
cell.locTitle = !!locTitle
? locTitle
: new __WEBPACK_IMPORTED_MODULE_9__localizablestring__["a" /* LocalizableString */](this.matrix, false);
return cell;
};
return QuestionMatrixDropdownRenderedTable;
}(__WEBPACK_IMPORTED_MODULE_4__base__["b" /* Base */]));
/**
* A base class for matrix dropdown and matrix dynamic questions.
*/
var QuestionMatrixDropdownModelBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixDropdownModelBase, _super);
function QuestionMatrixDropdownModelBase(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isRowChanging = false;
_this.lockResetRenderedTable = false;
_this.isDoingonAnyValueChanged = false;
var self = _this;
_this.createItemValues("choices");
_this.createLocalizableString("optionsCaption", _this);
_this.registerFunctionOnPropertyValueChanged("columns", function (newColumns) {
self.updateColumnsIndexes(newColumns);
self.generatedVisibleRows = null;
self.generatedTotalRow = null;
self.resetRenderedTable();
self.fireCallback(self.columnsChangedCallback);
});
_this.registerFunctionOnPropertiesValueChanged(["columnLayout", "addRowLocation"], function () {
self.fireCallback(self.columnLayoutChangedCallback);
});
_this.registerFunctionOnPropertiesValueChanged(["cellType", "optionsCaption", "columnColCount", "rowTitleWidth"], function () {
self.generatedVisibleRows = null;
self.resetRenderedTable();
self.fireCallback(self.columnsChangedCallback);
});
_this.registerFunctionOnPropertiesValueChanged([
"columnLayout",
"showHeader",
"minRowCount",
"isReadOnly",
"rowCount",
"hasFooter",
], function () {
self.resetRenderedTable();
});
return _this;
}
Object.defineProperty(QuestionMatrixDropdownModelBase, "defaultCellType", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].matrixDefaultCellType;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].matrixDefaultCellType = val;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.addDefaultColumns = function (matrix) {
var colNames = __WEBPACK_IMPORTED_MODULE_8__questionfactory__["a" /* QuestionFactory */].DefaultColums;
for (var i = 0; i < colNames.length; i++)
matrix.addColumn(colNames[i]);
};
QuestionMatrixDropdownModelBase.prototype.createColumnValues = function () {
var _this = this;
return this.createNewArray("columns", function (item) {
item.colOwner = _this;
});
};
QuestionMatrixDropdownModelBase.prototype.getType = function () {
return "matrixdropdownbase";
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasSingleInput", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "isRowsDynamic", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnLayout", {
/**
* Set columnLayout to 'vertical' to place columns vertically and rows horizontally. It makes sense when we have many columns and few rows.
* @see columns
* @see rowCount
*/
get: function () {
return this.getPropertyValue("columnLayout");
},
set: function (val) {
this.setPropertyValue("columnLayout", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnsLocation", {
get: function () {
return this.columnLayout;
},
set: function (val) {
this.columnLayout = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "isColumnLayoutHorizontal", {
/**
* Returns true if columns are located horizontally
* @see columnLayout
*/
get: function () {
return this.columnLayout != "vertical";
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasRowText", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.getFooterText = function () {
return null;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "canRemoveRows", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.canRemoveRow = function (row) {
return true;
};
QuestionMatrixDropdownModelBase.prototype.onRowsChanged = function () {
this.resetRenderedTable();
_super.prototype.onRowsChanged.call(this);
};
QuestionMatrixDropdownModelBase.prototype.onStartRowAddingRemoving = function () {
this.lockResetRenderedTable = true;
};
QuestionMatrixDropdownModelBase.prototype.onEndRowAdding = function () {
this.lockResetRenderedTable = false;
if (!this.renderedTable)
return;
if (this.renderedTable.isRequireReset()) {
this.resetRenderedTable();
}
else {
this.renderedTable.onAddedRow();
}
};
QuestionMatrixDropdownModelBase.prototype.onEndRowRemoving = function (index) {
this.lockResetRenderedTable = false;
if (this.renderedTable.isRequireReset()) {
this.resetRenderedTable();
}
else {
this.renderedTable.onRemovedRow(index);
}
};
QuestionMatrixDropdownModelBase.prototype.resetRenderedTable = function () {
if (this.lockResetRenderedTable || this.isLoadingFromJson)
return;
this.renderedTableValue = null;
this.fireCallback(this.onRenderedTableResetCallback);
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "renderedTable", {
get: function () {
if (!this.renderedTableValue) {
this.renderedTableValue = this.createRenderedTable();
if (!!this.onRenderedTableCreatedCallback) {
this.onRenderedTableCreatedCallback(this.renderedTableValue);
}
}
return this.renderedTableValue;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.createRenderedTable = function () {
return new QuestionMatrixDropdownRenderedTable(this);
};
QuestionMatrixDropdownModelBase.prototype.onMatrixRowCreated = function (row) {
if (!this.survey)
return;
var options = {
rowValue: row.value,
row: row,
column: null,
columnName: null,
cell: null,
cellQuestion: null,
value: null,
};
for (var i = 0; i < this.visibleColumns.length; i++) {
options.column = this.visibleColumns[i];
options.columnName = options.column.name;
var cell = row.cells[i];
options.cell = cell;
options.cellQuestion = cell.question;
options.value = cell.value;
if (!!this.onCellCreatedCallback) {
this.onCellCreatedCallback(options);
}
this.survey.matrixCellCreated(this, options);
}
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "cellType", {
/**
* Use this property to change the default cell type.
*/
get: function () {
return this.getPropertyValue("cellType", __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].matrixDefaultCellType);
},
set: function (val) {
val = val.toLowerCase();
if (this.cellType == val)
return;
this.setPropertyValue("cellType", val);
this.updateColumnsCellType();
this.fireCallback(this.updateCellsCallback);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.updateColumnsCellType = function () {
for (var i = 0; i < this.columns.length; i++) {
this.columns[i].defaultCellTypeChanged();
}
};
QuestionMatrixDropdownModelBase.prototype.updateColumnsIndexes = function (cols) {
for (var i = 0; i < cols.length; i++) {
cols[i].setIndex(i);
}
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnColCount", {
/**
* The default column count for radiogroup and checkbox cell types.
*/
get: function () {
return this.getPropertyValue("columnColCount", 0);
},
set: function (value) {
if (value < 0 || value > 4)
return;
this.setPropertyValue("columnColCount", value);
this.fireCallback(this.updateCellsCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "columnMinWidth", {
/**
* Use this property to set the minimum column width.
*/
get: function () {
return this.getPropertyValue("columnMinWidth", "");
},
set: function (val) {
this.setPropertyValue("columnMinWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "horizontalScroll", {
/**
* Set this property to true to show the horizontal scroll.
*/
get: function () {
return this.getPropertyValue("horizontalScroll", false);
},
set: function (val) {
this.setPropertyValue("horizontalScroll", val);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.getRequiredText = function () {
return this.survey ? this.survey.requiredText : "";
};
QuestionMatrixDropdownModelBase.prototype.onColumnPropertyChanged = function (column, name, newValue) {
this.updateHasFooter();
if (!this.generatedVisibleRows)
return;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
this.generatedVisibleRows[i].updateCellQuestionOnColumnChanged(column, name, newValue);
}
if (!!this.generatedTotalRow) {
this.generatedTotalRow.updateCellQuestionOnColumnChanged(column, name, newValue);
}
this.onColumnsChanged();
if (name == "isRequired") {
this.resetRenderedTable();
}
if (column.isShowInMultipleColumns) {
this.onShowInMultipleColumnsChanged(column);
}
};
QuestionMatrixDropdownModelBase.prototype.onShowInMultipleColumnsChanged = function (column) {
this.generatedVisibleRows = null;
this.resetRenderedTable();
};
QuestionMatrixDropdownModelBase.prototype.onColumnCellTypeChanged = function (column) {
this.generatedVisibleRows = null;
this.resetRenderedTable();
};
QuestionMatrixDropdownModelBase.prototype.getRowTitleWidth = function () {
return "";
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasFooter", {
get: function () {
return this.getPropertyValue("hasFooter", false);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.updateHasFooter = function () {
this.setPropertyValue("hasFooter", this.hasTotal);
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "hasTotal", {
get: function () {
for (var i = 0; i < this.columns.length; i++) {
if (this.columns[i].hasTotal)
return true;
}
return false;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.getCellType = function () {
return this.cellType;
};
QuestionMatrixDropdownModelBase.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
if (!path)
return _super.prototype.getConditionJson.call(this);
var columnName = "";
for (var i = path.length - 1; i >= 0; i--) {
if (path[i] == ".")
break;
columnName = path[i] + columnName;
}
var column = this.getColumnByName(columnName);
if (!column)
return null;
var question = column.createCellQuestion(null);
if (!question)
return null;
return question.getConditionJson(operator);
};
QuestionMatrixDropdownModelBase.prototype.clearIncorrectValues = function () {
var rows = this.visibleRows;
if (!rows)
return;
for (var i = 0; i < rows.length; i++) {
rows[i].clearIncorrectValues(this.getRowValue(i));
}
};
QuestionMatrixDropdownModelBase.prototype.clearErrors = function () {
_super.prototype.clearErrors.call(this);
if (!!this.generatedVisibleRows) {
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
for (var j = 0; j < row.cells.length; j++) {
row.cells[j].question.clearErrors();
}
}
}
};
QuestionMatrixDropdownModelBase.prototype.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
var counter = 0;
var prevTotalValue;
do {
prevTotalValue = __WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].getUnbindValue(this.totalValue);
this.runCellsCondition(values, properties);
this.runTotalsCondition(values, properties);
counter++;
} while (!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isTwoValueEquals(prevTotalValue, this.totalValue) &&
counter < 3);
};
QuestionMatrixDropdownModelBase.prototype.shouldRunColumnExpression = function () {
return false;
};
QuestionMatrixDropdownModelBase.prototype.runCellsCondition = function (values, properties) {
if (!this.generatedVisibleRows)
return;
var newValues = this.getRowConditionValues(values);
var rows = this.generatedVisibleRows;
for (var i = 0; i < rows.length; i++) {
rows[i].runCondition(newValues, properties);
}
this.checkColumnsVisibility();
};
QuestionMatrixDropdownModelBase.prototype.checkColumnsVisibility = function () {
var hasChanged = false;
for (var i = 0; i < this.visibleColumns.length; i++) {
if (!this.visibleColumns[i].visibleIf)
continue;
hasChanged =
this.isColumnVisibilityChanged(this.visibleColumns[i]) || hasChanged;
}
if (hasChanged) {
this.resetRenderedTable();
}
};
QuestionMatrixDropdownModelBase.prototype.isColumnVisibilityChanged = function (column) {
var curVis = column.hasVisibleCell;
var hasVisCell = false;
var rows = this.generatedVisibleRows;
for (var i = 0; i < rows.length; i++) {
var cell = rows[i].cells[column.index];
if (!!cell && !!cell.question && cell.question.isVisible) {
hasVisCell = true;
break;
}
}
if (curVis != hasVisCell) {
column.hasVisibleCell = hasVisCell;
}
return curVis != hasVisCell;
};
QuestionMatrixDropdownModelBase.prototype.runTotalsCondition = function (values, properties) {
if (!this.generatedTotalRow)
return;
this.generatedTotalRow.runCondition(this.getRowConditionValues(values), properties);
};
QuestionMatrixDropdownModelBase.prototype.getRowConditionValues = function (values) {
var newValues = {};
if (values && values instanceof Object) {
newValues = JSON.parse(JSON.stringify(values));
}
var totalRow = {};
if (!__WEBPACK_IMPORTED_MODULE_3__helpers__["a" /* Helpers */].isValueEmpty(this.totalValue)) {
totalRow = JSON.parse(JSON.stringify(this.totalValue));
}
newValues["row"] = {};
newValues["totalRow"] = totalRow;
return newValues;
};
QuestionMatrixDropdownModelBase.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
var rows = this.generatedVisibleRows;
if (!rows)
return;
var columns = this.columns;
for (var i = 0; i < columns.length; i++) {
columns[i].locStrsChanged();
}
for (var i = 0; i < rows.length; i++) {
rows[i].locStrsChanged();
}
if (!!this.generatedTotalRow) {
this.generatedTotalRow.locStrsChanged();
}
};
/**
* Returns the column by it's name. Returns null if a column with this name doesn't exist.
* @param column
*/
QuestionMatrixDropdownModelBase.prototype.getColumnByName = function (columnName) {
for (var i = 0; i < this.columns.length; i++) {
if (this.columns[i].name == columnName)
return this.columns[i];
}
return null;
};
QuestionMatrixDropdownModelBase.prototype.getColumnName = function (columnName) {
return this.getColumnByName(columnName);
};
/**
* Returns the column width.
* @param column
*/
QuestionMatrixDropdownModelBase.prototype.getColumnWidth = function (column) {
return column.minWidth ? column.minWidth : this.columnMinWidth;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "choices", {
/**
* The default choices for dropdown, checkbox and radiogroup cell types.
*/
get: function () {
return this.getPropertyValue("choices");
},
set: function (val) {
this.setPropertyValue("choices", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "optionsCaption", {
/**
* The default options caption for dropdown cell type.
*/
get: function () {
return this.getLocalizableStringText("optionsCaption", __WEBPACK_IMPORTED_MODULE_7__surveyStrings__["a" /* surveyLocalization */].getString("optionsCaption"));
},
set: function (val) {
this.setLocalizableStringText("optionsCaption", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "locOptionsCaption", {
get: function () {
return this.getLocalizableString("optionsCaption");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "storeOthersAsComment", {
get: function () {
return !!this.survey ? this.survey.storeOthersAsComment : false;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.addColumn = function (name, title) {
if (title === void 0) { title = null; }
var column = new MatrixDropdownColumn(name, title);
this.columns.push(column);
return column;
};
QuestionMatrixDropdownModelBase.prototype.getVisibleRows = function () {
var _this = this;
if (this.isLoadingFromJson)
return null;
if (!this.generatedVisibleRows) {
this.generatedVisibleRows = this.generateRows();
this.generatedVisibleRows.forEach(function (row) { return _this.onMatrixRowCreated(row); });
if (this.data) {
this.runCellsCondition(this.data.getFilteredValues(), this.data.getFilteredProperties());
}
this.updateValueOnRowsGeneration(this.generatedVisibleRows);
this.updateIsAnswered();
}
return this.generatedVisibleRows;
};
QuestionMatrixDropdownModelBase.prototype.updateValueOnRowsGeneration = function (rows) {
var oldValue = this.createNewValue(true);
var newValue = this.createNewValue();
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
var rowValue = this.getRowValue(i);
var rValue = row.value;
if (this.isTwoValueEquals(rowValue, rValue))
continue;
newValue = this.getNewValueOnRowChanged(row, "", rValue, false, newValue)
.value;
}
if (this.isTwoValueEquals(oldValue, newValue))
return;
this.isRowChanging = true;
this.setNewValue(newValue);
this.isRowChanging = false;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "totalValue", {
get: function () {
if (!this.hasTotal || !this.visibleTotalRow)
return {};
return this.visibleTotalRow.value;
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.getVisibleTotalRow = function () {
if (this.isLoadingFromJson)
return null;
if (this.hasTotal) {
if (!this.generatedTotalRow) {
this.generatedTotalRow = this.generateTotalRow();
if (this.data) {
var properties = { survey: this.survey };
this.runTotalsCondition(this.data.getAllValues(), properties);
}
}
}
else {
this.generatedTotalRow = null;
}
return this.generatedTotalRow;
};
Object.defineProperty(QuestionMatrixDropdownModelBase.prototype, "visibleTotalRow", {
get: function () {
return this.getVisibleTotalRow();
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModelBase.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.updateColumnsIndexes(this.columns);
this.generatedVisibleRows = null;
this.generatedTotalRow = null;
this.updateHasFooter();
};
/**
* Returns the row value. If the row value is empty, the object is empty: {}.
* @param rowIndex row index from 0 to visible row count - 1.
*/
QuestionMatrixDropdownModelBase.prototype.getRowValue = function (rowIndex) {
if (rowIndex < 0)
return null;
var visRows = this.visibleRows;
if (rowIndex >= visRows.length)
return null;
var newValue = this.createNewValue();
return this.getRowValueCore(visRows[rowIndex], newValue);
};
/**
* Set the row value.
* @param rowIndex row index from 0 to visible row count - 1.
* @param rowValue an object {"column name": columnValue,... }
*/
QuestionMatrixDropdownModelBase.prototype.setRowValue = function (rowIndex, rowValue) {
if (rowIndex < 0)
return null;
var visRows = this.visibleRows;
if (rowIndex >= visRows.length)
return null;
visRows[rowIndex].value = rowValue;
this.onRowChanged(visRows[rowIndex], "", rowValue, false);
};
QuestionMatrixDropdownModelBase.prototype.generateRows = function () {
return null;
};
QuestionMatrixDropdownModelBase.prototype.generateTotalRow = function () {
return new MatrixDropdownTotalRowModel(this);
};
QuestionMatrixDropdownModelBase.prototype.createNewValue = function (nullOnEmpty) {
if (nullOnEmpty === void 0) { nullOnEmpty = false; }
var res = !this.value ? {} : this.createValueCopy();
if (nullOnEmpty && this.isMatrixValueEmpty(res))
return null;
return res;
};
QuestionMatrixDropdownModelBase.prototype.getRowValueCore = function (row, questionValue, create) {
if (create === void 0) { create = false; }
var result = !!questionValue && !!questionValue[row.rowName]
? questionValue[row.rowName]
: null;
if (!result && create) {
result = {};
if (!!questionValue) {
questionValue[row.rowName] = result;
}
}
return result;
};
QuestionMatrixDropdownModelBase.prototype.getRowDisplayValue = function (row, rowValue) {
if (!rowValue)
return rowValue;
for (var key in rowValue) {
var question = row.getQuestionByColumnName(key);
if (!question) {
question = this.getSharedQuestionByName(key, row);
}
if (!!question) {
rowValue[key] = question.displayValue;
}
}
return rowValue;
};
QuestionMatrixDropdownModelBase.prototype.getPlainData = function (options) {
var _this = this;
if (options === void 0) { options = {
includeEmpty: true,
}; }
var questionPlainData = _super.prototype.getPlainData.call(this, options);
if (!!questionPlainData) {
questionPlainData.isNode = true;
questionPlainData.data = this.visibleRows.map(function (row) {
var rowDataItem = {
name: row.rowName,
title: row.rowName,
value: row.value,
displayValue: _this.getRowDisplayValue(row, row.value),
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: true,
data: row.cells
.map(function (cell) {
return cell.question.getPlainData(options);
})
.filter(function (d) { return !!d; }),
};
(options.calculations || []).forEach(function (calculation) {
rowDataItem[calculation.propertyName] = row[calculation.propertyName];
});
return rowDataItem;
});
}
return questionPlainData;
};
QuestionMatrixDropdownModelBase.prototype.getProgressInfo = function () {
return __WEBPACK_IMPORTED_MODULE_4__base__["a" /* SurveyElement */].getProgressInfoByElements(this.getCellQuestions(), this.isRequired);
};
QuestionMatrixDropdownModelBase.prototype.getCellQuestions = function () {
var rows = this.visibleRows;
if (!rows)
return [];
var questions = [];
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
for (var j = 0; j < row.cells.length; j++) {
questions.push(row.cells[j].question);
}
}
return questions;
};
QuestionMatrixDropdownModelBase.prototype.onBeforeValueChanged = function (val) { };
QuestionMatrixDropdownModelBase.prototype.onSetQuestionValue = function () {
if (this.isRowChanging)
return;
this.onBeforeValueChanged(this.value);
if (!this.generatedVisibleRows || this.generatedVisibleRows.length == 0)
return;
this.isRowChanging = true;
var val = this.createNewValue();
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
this.generatedVisibleRows[i].value = this.getRowValueCore(row, val);
}
this.isRowChanging = false;
};
QuestionMatrixDropdownModelBase.prototype.setQuestionValue = function (newValue) {
_super.prototype.setQuestionValue.call(this, newValue, false);
this.onSetQuestionValue();
this.updateIsAnswered();
};
QuestionMatrixDropdownModelBase.prototype.supportGoNextPageAutomatic = function () {
var rows = this.generatedVisibleRows;
if (!rows)
rows = this.visibleRows;
if (!rows)
return true;
for (var i = 0; i < rows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
if (!cells)
continue;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
var question = cells[colIndex].question;
if (question &&
(!question.supportGoNextPageAutomatic() || !question.value))
return false;
}
}
return true;
};
QuestionMatrixDropdownModelBase.prototype.getContainsErrors = function () {
return (_super.prototype.getContainsErrors.call(this) ||
this.checkForAnswersOrErrors(function (question) { return question.containsErrors; }, false));
};
QuestionMatrixDropdownModelBase.prototype.getIsAnswered = function () {
return (_super.prototype.getIsAnswered.call(this) &&
this.checkForAnswersOrErrors(function (question) { return question.isAnswered; }, true));
};
QuestionMatrixDropdownModelBase.prototype.checkForAnswersOrErrors = function (predicate, every) {
if (every === void 0) { every = false; }
var rows = this.generatedVisibleRows;
if (!rows)
return false;
for (var i = 0; i < rows.length; i++) {
var cells = rows[i].cells;
if (!cells)
continue;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
if (!cells[colIndex])
continue;
var question = cells[colIndex].question;
if (question && question.isVisible)
if (predicate(question)) {
if (!every)
return true;
}
else {
if (every)
return false;
}
}
}
return every ? true : false;
};
QuestionMatrixDropdownModelBase.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
var errosInColumns = this.hasErrorInColumns(fireCallback, rec);
return _super.prototype.hasErrors.call(this, fireCallback) || errosInColumns;
};
QuestionMatrixDropdownModelBase.prototype.getIsRunningValidators = function () {
if (_super.prototype.getIsRunningValidators.call(this))
return true;
if (!this.generatedVisibleRows)
return false;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
if (!cells)
continue;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
if (!cells[colIndex])
continue;
var question = cells[colIndex].question;
if (!!question && question.isRunningValidators)
return true;
}
}
return false;
};
QuestionMatrixDropdownModelBase.prototype.getAllErrors = function () {
var result = _super.prototype.getAllErrors.call(this);
var rows = this.generatedVisibleRows;
if (rows === null)
return result;
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
for (var j = 0; j < row.cells.length; j++) {
var errors = row.cells[j].question.getAllErrors();
if (errors && errors.length > 0) {
result = result.concat(errors);
}
}
}
return result;
};
QuestionMatrixDropdownModelBase.prototype.hasErrorInColumns = function (fireCallback, rec) {
var _this = this;
if (!this.generatedVisibleRows)
return false;
var res = false;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
if (!cells)
continue;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
if (!cells[colIndex])
continue;
var question = cells[colIndex].question;
if (!question || !question.visible)
continue;
question.onCompletedAsyncValidators = function (hasErrors) {
_this.raiseOnCompletedAsyncValidators();
};
if (!!rec && rec.isOnValueChanged === true && question.isEmpty())
continue;
res = question.hasErrors(fireCallback, rec) || res;
}
}
return res;
};
QuestionMatrixDropdownModelBase.prototype.getFirstInputElementId = function () {
var question = this.getFirstCellQuestion(false);
return question ? question.inputId : _super.prototype.getFirstInputElementId.call(this);
};
QuestionMatrixDropdownModelBase.prototype.getFirstErrorInputElementId = function () {
var question = this.getFirstCellQuestion(true);
return question ? question.inputId : _super.prototype.getFirstErrorInputElementId.call(this);
};
QuestionMatrixDropdownModelBase.prototype.getFirstCellQuestion = function (onError) {
if (!this.generatedVisibleRows)
return null;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var cells = this.generatedVisibleRows[i].cells;
for (var colIndex = 0; colIndex < cells.length; colIndex++) {
if (!onError)
return cells[colIndex].question;
if (cells[colIndex].question.currentErrorCount > 0)
return cells[colIndex].question;
}
}
return null;
};
QuestionMatrixDropdownModelBase.prototype.onReadOnlyChanged = function () {
_super.prototype.onReadOnlyChanged.call(this);
if (!this.generateRows)
return;
for (var i = 0; i < this.visibleRows.length; i++) {
this.visibleRows[i].onQuestionReadOnlyChanged(this.isReadOnly);
}
};
//IMatrixDropdownData
QuestionMatrixDropdownModelBase.prototype.createQuestion = function (row, column) {
return this.createQuestionCore(row, column);
};
QuestionMatrixDropdownModelBase.prototype.createQuestionCore = function (row, column) {
var question = column.createCellQuestion(row);
if (this.isReadOnly) {
question.readOnly = true;
}
question.setSurveyImpl(row);
return question;
};
QuestionMatrixDropdownModelBase.prototype.deleteRowValue = function (newValue, row) {
if (!newValue)
return newValue;
delete newValue[row.rowName];
return this.isObject(newValue) && Object.keys(newValue).length == 0
? null
: newValue;
};
QuestionMatrixDropdownModelBase.prototype.onAnyValueChanged = function (name) {
if (this.isLoadingFromJson ||
this.isDoingonAnyValueChanged ||
!this.generatedVisibleRows)
return;
this.isDoingonAnyValueChanged = true;
var rows = this.visibleRows;
for (var i = 0; i < rows.length; i++) {
rows[i].onAnyValueChanged(name);
}
var totalRow = this.visibleTotalRow;
if (!!totalRow) {
totalRow.onAnyValueChanged(name);
}
this.isDoingonAnyValueChanged = false;
};
QuestionMatrixDropdownModelBase.prototype.isObject = function (value) {
return value !== null && typeof value === "object";
};
QuestionMatrixDropdownModelBase.prototype.getOnCellValueChangedOptions = function (row, columnName, rowValue) {
var self = this;
var getQuestion = function (colName) {
for (var i = 0; self.columns.length; i++) {
if (self.columns[i].name === colName) {
return row.cells[i].question;
}
}
return null;
};
return {
row: row,
columnName: columnName,
rowValue: rowValue,
value: !!rowValue ? rowValue[columnName] : null,
getCellQuestion: getQuestion,
};
};
QuestionMatrixDropdownModelBase.prototype.onCellValueChanged = function (row, columnName, rowValue) {
if (!this.survey)
return;
var options = this.getOnCellValueChangedOptions(row, columnName, rowValue);
if (!!this.onCellValueChangedCallback) {
this.onCellValueChangedCallback(options);
}
this.survey.matrixCellValueChanged(this, options);
};
QuestionMatrixDropdownModelBase.prototype.validateCell = function (row, columnName, rowValue) {
if (!this.survey)
return;
var self = this;
var getQuestion = function (colName) {
for (var i = 0; self.columns.length; i++) {
if (self.columns[i].name === colName) {
return row.cells[i].question;
}
}
return null;
};
var options = {
row: row,
columnName: columnName,
rowValue: rowValue,
value: rowValue[columnName],
getCellQuestion: getQuestion,
};
return this.survey.matrixCellValidate(this, options);
};
QuestionMatrixDropdownModelBase.prototype.onRowChanging = function (row, columnName, rowValue) {
if (!this.survey)
return !!rowValue ? rowValue[columnName] : null;
var options = this.getOnCellValueChangedOptions(row, columnName, rowValue);
var oldRowValue = this.getRowValueCore(row, this.createNewValue(), true);
options.oldValue = !!oldRowValue ? oldRowValue[columnName] : null;
this.survey.matrixCellValueChanging(this, options);
return options.value;
};
QuestionMatrixDropdownModelBase.prototype.onRowChanged = function (row, columnName, newRowValue, isDeletingValue) {
var oldValue = this.createNewValue(true);
var combine = this.getNewValueOnRowChanged(row, columnName, newRowValue, isDeletingValue, this.createNewValue());
if (this.isTwoValueEquals(oldValue, combine.value))
return;
this.isRowChanging = true;
this.setNewValue(combine.value);
this.isRowChanging = false;
if (columnName) {
this.onCellValueChanged(row, columnName, combine.rowValue);
}
};
QuestionMatrixDropdownModelBase.prototype.getNewValueOnRowChanged = function (row, columnName, newRowValue, isDeletingValue, newValue) {
var rowValue = this.getRowValueCore(row, newValue, true);
if (isDeletingValue) {
delete rowValue[columnName];
}
for (var i = 0; i < row.cells.length; i++) {
var key = row.cells[i].question.getValueName();
delete rowValue[key];
}
if (newRowValue) {
newRowValue = JSON.parse(JSON.stringify(newRowValue));
for (var key in newRowValue) {
if (!this.isValueEmpty(newRowValue[key])) {
rowValue[key] = newRowValue[key];
}
}
}
if (this.isObject(rowValue) && Object.keys(rowValue).length === 0) {
newValue = this.deleteRowValue(newValue, row);
}
return { value: newValue, rowValue: rowValue };
};
QuestionMatrixDropdownModelBase.prototype.getRowIndex = function (row) {
if (!this.generatedVisibleRows)
return -1;
return this.visibleRows.indexOf(row);
};
QuestionMatrixDropdownModelBase.prototype.getSharedQuestionByName = function (columnName, row) {
if (!this.survey || !this.valueName)
return null;
var index = this.getRowIndex(row);
if (index < 0)
return null;
return (this.survey.getQuestionByValueNameFromArray(this.valueName, columnName, index));
};
QuestionMatrixDropdownModelBase.prototype.onTotalValueChanged = function () {
if (!!this.data &&
!!this.visibleTotalRow &&
!this.isLoadingFromJson &&
!this.isSett) {
this.data.setValue(this.getValueName() + __WEBPACK_IMPORTED_MODULE_12__settings__["a" /* settings */].matrixTotalValuePostFix, this.totalValue, false);
}
};
QuestionMatrixDropdownModelBase.prototype.getQuestionFromArray = function (name, index) {
if (index >= this.visibleRows.length)
return null;
return this.visibleRows[index].getQuestionByColumnName(name);
};
QuestionMatrixDropdownModelBase.prototype.isMatrixValueEmpty = function (val) {
if (!val)
return;
if (Array.isArray(val)) {
for (var i = 0; i < val.length; i++) {
if (this.isObject(val[i]) && Object.keys(val[i]).length > 0)
return false;
}
return true;
}
return Object.keys(val).length == 0;
};
QuestionMatrixDropdownModelBase.prototype.getSurvey = function () {
return this.survey;
};
return QuestionMatrixDropdownModelBase;
}(__WEBPACK_IMPORTED_MODULE_2__martixBase__["a" /* QuestionMatrixBaseModel */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("matrixdropdowncolumn", [
{ name: "!name", isUnique: true },
{ name: "title", serializationProperty: "locTitle" },
{
name: "cellType",
default: "default",
choices: function () {
var res = MatrixDropdownColumn.getColumnTypes();
res.splice(0, 0, "default");
return res;
},
},
{ name: "colCount", default: -1, choices: [-1, 0, 1, 2, 3, 4] },
"isRequired:boolean",
{
name: "requiredErrorText:text",
serializationProperty: "locRequiredErrorText",
},
"readOnly:boolean",
"minWidth",
"width",
"visibleIf:condition",
"enableIf:condition",
"requiredIf:condition",
{
name: "showInMultipleColumns:boolean",
dependsOn: "cellType",
visibleIf: function (obj) {
if (!obj)
return false;
return obj.isSupportMultipleColumns;
},
},
{
name: "validators:validators",
baseClassName: "surveyvalidator",
classNamePart: "validator",
},
{
name: "totalType",
default: "none",
choices: ["none", "sum", "count", "min", "max", "avg"],
},
"totalExpression:expression",
{ name: "totalFormat", serializationProperty: "locTotalFormat" },
{
name: "totalDisplayStyle",
default: "none",
choices: ["none", "decimal", "currency", "percent"],
},
{
name: "totalCurrency",
choices: function () {
return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_10__question_expression__["b" /* getCurrecyCodes */])();
},
default: "USD",
},
{ name: "totalMaximumFractionDigits:number", default: -1 },
{ name: "totalMinimumFractionDigits:number", default: -1 },
], function () {
return new MatrixDropdownColumn("");
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("matrixdropdownbase", [
{
name: "columns:matrixdropdowncolumns",
className: "matrixdropdowncolumn",
},
{
name: "columnLayout",
alternativeName: "columnsLocation",
default: "horizontal",
choices: ["horizontal", "vertical"],
},
"horizontalScroll:boolean",
{
name: "choices:itemvalue[]",
},
{ name: "optionsCaption", serializationProperty: "locOptionsCaption" },
{
name: "cellType",
default: "dropdown",
choices: function () {
return MatrixDropdownColumn.getColumnTypes();
},
},
{ name: "columnColCount", default: 0, choices: [0, 1, 2, 3, 4] },
"columnMinWidth",
], function () {
return new QuestionMatrixDropdownModelBase("");
}, "matrixbase");
/***/ }),
/* 31 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionNonValue; });
/**
* A Model for non value question. This question doesn't add any new functionality. It hides some properties, including the value.
*/
var QuestionNonValue = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionNonValue, _super);
function QuestionNonValue(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
QuestionNonValue.prototype.getType = function () {
return "nonvalue";
};
Object.defineProperty(QuestionNonValue.prototype, "hasInput", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionNonValue.prototype, "hasTitle", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionNonValue.prototype.getTitleLocation = function () {
return "";
};
Object.defineProperty(QuestionNonValue.prototype, "hasComment", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionNonValue.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
return false;
};
QuestionNonValue.prototype.getAllErrors = function () {
return [];
};
QuestionNonValue.prototype.supportGoNextPageAutomatic = function () {
return false;
};
QuestionNonValue.prototype.addConditionObjectsByContext = function (objects, context) { };
QuestionNonValue.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
return null;
};
return QuestionNonValue;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("nonvalue", [
{ name: "title", visible: false },
{ name: "description", visible: false },
{ name: "valueName", visible: false },
{ name: "enableIf", visible: false },
{ name: "defaultValue", visible: false },
{ name: "correctAnswer", visible: false },
{ name: "isRequired", visible: false, isSerializable: false },
{ name: "requiredErrorText", visible: false },
{ name: "readOnly", visible: false },
{ name: "requiredIf", visible: false },
{ name: "validators", visible: false },
{ name: "titleLocation", visible: false },
{ name: "useDisplayValuesInTitle", visible: false },
], function () {
return new QuestionNonValue("");
}, "question");
/***/ }),
/* 32 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defaultCss_cssstandard__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return StylesManager; });
var StylesManager = /** @class */ (function () {
function StylesManager() {
this.sheet = null;
if (StylesManager.Enabled) {
this.sheet = StylesManager.findSheet(StylesManager.SurveyJSStylesSheetId);
if (!this.sheet) {
this.sheet = StylesManager.createSheet(StylesManager.SurveyJSStylesSheetId);
this.initializeStyles(this.sheet);
}
}
}
StylesManager.findSheet = function (styleSheetId) {
if (typeof document === "undefined")
return null;
for (var i = 0; i < document.styleSheets.length; i++) {
if (!!document.styleSheets[i].ownerNode &&
document.styleSheets[i].ownerNode["id"] === styleSheetId) {
return document.styleSheets[i];
}
}
return null;
};
StylesManager.createSheet = function (styleSheetId) {
var style = document.createElement("style");
style.id = styleSheetId;
// Add a media (and/or media query) here if you'd like!
// style.setAttribute("media", "screen")
// style.setAttribute("media", "only screen and (max-width : 1024px)")
style.appendChild(document.createTextNode(""));
document.head.appendChild(style);
return style.sheet;
};
StylesManager.applyTheme = function (themeName, themeSelector) {
if (themeName === void 0) { themeName = "default"; }
if (themeSelector === void 0) { themeSelector = ".sv_main"; }
var ThemeCss;
if (themeName === "modern")
themeSelector = ".sv-root-modern ";
if (["bootstrap", "bootstrapmaterial", "modern"].indexOf(themeName) !== -1) {
ThemeCss = StylesManager[themeName + "ThemeCss"];
__WEBPACK_IMPORTED_MODULE_0__defaultCss_cssstandard__["b" /* surveyCss */].currentType = themeName;
}
else {
ThemeCss = StylesManager.ThemeCss;
__WEBPACK_IMPORTED_MODULE_0__defaultCss_cssstandard__["b" /* surveyCss */].currentType = "standard";
}
if (StylesManager.Enabled) {
var sheet_1 = StylesManager.findSheet(themeName + themeSelector);
if (!sheet_1) {
sheet_1 = StylesManager.createSheet(themeName + themeSelector);
var theme_1 = StylesManager.ThemeColors[themeName] ||
StylesManager.ThemeColors["default"];
Object.keys(ThemeCss).forEach(function (selector) {
var cssRuleText = ThemeCss[selector];
Object.keys(theme_1).forEach(function (colorVariableName) {
return (cssRuleText = cssRuleText.replace(new RegExp("\\" + colorVariableName, "g"), theme_1[colorVariableName]));
});
try {
sheet_1.insertRule(themeSelector + selector + " { " + cssRuleText + " }", 0);
}
catch (e) { }
});
}
}
};
StylesManager.prototype.initializeStyles = function (sheet) {
if (StylesManager.Enabled) {
Object.keys(StylesManager.Styles).forEach(function (selector) {
try {
sheet.insertRule(selector + " { " + StylesManager.Styles[selector] + " }", 0);
}
catch (e) { }
});
Object.keys(StylesManager.Media).forEach(function (selector) {
try {
sheet.insertRule(StylesManager.Media[selector].media +
" { " +
selector +
" { " +
StylesManager.Media[selector].style +
" } }", 0);
}
catch (e) { }
});
}
};
StylesManager.SurveyJSStylesSheetId = "surveyjs-styles";
StylesManager.Styles = {
// ".sv_bootstrap_css":
// "position: relative; width: 100%; background-color: #f4f4f4",
// ".sv_bootstrap_css .sv_custom_header":
// "position: absolute; width: 100%; height: 275px; background-color: #e7e7e7;",
// ".sv_bootstrap_css .sv_container":
// "max-width: 80%; margin: auto; position: relative; color: #6d7072; padding: 0 1em;",
// ".sv_bootstrap_css .panel-body":
// "background-color: white; padding: 1em 1em 5em 1em; border-top: 2px solid lightgray;",
".sv_main span": "word-break: break-word;",
".sv_main legend": "border: none; margin: 0;",
".sv_bootstrap_css .sv_qstn": "padding: 0.5em 1em 1.5em 1em;",
".sv_bootstrap_css .sv_qcbc input[type=checkbox], .sv_bootstrap_css .sv_qcbc input[type=radio]": "vertical-align: middle; margin-top: -1px",
".sv_bootstrap_css .sv_qstn fieldset": "display: block;",
".sv_bootstrap_css .sv_qstn .sv_q_checkbox_inline, .sv_bootstrap_css .sv_qstn .sv_q_radiogroup_inline": "display: inline-block;",
".sv_bootstrap_css .sv-paneldynamic__progress-container ": "position: relative; margin-right: 250px; margin-left: 40px; margin-top: 10px;",
".sv_main.sv_bootstrapmaterial_css .sv_q_radiogroup_control_label": "display: inline; position: static;",
".sv_main.sv_bootstrapmaterial_css .checkbox": "margin-top:10px;margin-bottom:10px;",
".sv_row": "clear: both; min-width:300px;",
".sv_row .sv_qstn": "float: left",
".sv_row .sv_qstn:last-child": "float: none",
".sv_qstn": "display: inline-block; vertical-align: top; overflow: auto; min-width:300px;",
".sv_p_container": "display: inline-block; vertical-align: top; min-width:300px;",
".sv_qbln .checkbox-material": "margin-right: 3px;",
".sv_qcbx .checkbox-material": "margin-right: 5px;",
".sv_qcbx .checkbox label": "justify-content: left; display: inline-block;",
".sv_qstn .radio label": "justify-content: left; display: inline-block;",
".sv_qstn .sv_q_imgsel > label img": "pointer-events: none;",
".sv_qstn .sv_q_imgsel.sv_q_imagepicker_inline": "display: inline-block;",
".sv_qstn label.sv_q_m_label": "position: absolute; margin: 0; display: block; width: 100%;",
".sv_qstn td": "position: relative;",
".sv_q_mt_item_value": "float: left;",
'[dir="rtl"] .sv_q_mt_item_value': "float: right;",
".sv_qstn.sv_qstn_left": "margin-top: 0.75em;",
".sv_qstn .title-left": "float: left; margin-right: 1em;",
'[dir="rtl"] .sv_qstn .title-left': "float: right; margin-left: 1em;",
".sv_qstn .content-left": "overflow: hidden",
".sv_q_radiogroup_inline .sv_q_radiogroup_other": "display: inline-block;",
".sv_q_checkbox_inline .sv_q_checkbox_other": "display: inline-block;",
".sv_q_checkbox_inline, .sv_q_radiogroup_inline, .sv_q_imagepicker_inline": "line-height: 2.5em;",
".form-inline .sv_q_checkbox_inline:not(:last-child)": "margin-right: 1em;",
".form-inline .sv_q_radiogroup_inline:not(:last-child)": "margin-right: 1em;",
".sv_imgsel .sv_q_imagepicker_inline:not(:last-child)": "margin-right: 1em;",
".sv_qstn fieldset": "border: none; margin: 0; padding: 0;",
".sv_qstn .sv_q_file_placeholder": "display:none",
".sv_p_title": "padding-left: 1em; padding-bottom: 0.3em;",
".sv_p_title_expandable": "cursor: pointer;",
".sv_p_title .sv_panel_icon": "float: right; margin-right: 1em;",
".sv_p_title .sv_panel_icon::before": "content: ''; background-repeat: no-repeat; background-position: center; padding: 0.5em; display: inline-block; background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMi4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAxMCAxMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTAgMTA7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOiM2RDcwNzI7fQ0KPC9zdHlsZT4NCjxwb2x5Z29uIGNsYXNzPSJzdDAiIHBvaW50cz0iMiwyIDAsNCA1LDkgMTAsNCA4LDIgNSw1ICIvPg0KPC9zdmc+DQo=);",
".sv_p_title .sv_panel_icon.sv_expanded::before": "transform: rotate(180deg);",
".sv_p_footer": "padding-left: 1em; padding-bottom: 1em;padding-top: 1em;",
".sv_q_file > input[type=file], .sv_q_file > button": "display: inline-block;",
".sv_q_file_preview": "display: inline-block; vertical-align: top; border: 1px solid lightgray; padding: 5px; margin-top: 10px;",
".sv_q_file_preview > a": "display: block; overflow: hidden; vertical-align: top; white-space: nowrap; text-overflow: ellipsis;",
".sv_q_file_remove_button": "line-height: normal;",
".sv_q_file_remove": "display: block; cursor: pointer;",
".sv_q_m_cell_text": "cursor: pointer;",
".sv_q_dd_other": "margin-top: 1em;",
".sv_q_dd_other input": "width: 100%;",
".sv_qstn .sv-q-col-1, .sv-question .sv-q-col-1": "width: 100%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-col-2, .sv-question .sv-q-col-2": "width: 50%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-col-3, .sv-question .sv-q-col-3": "width: 33.33333%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-col-4, .sv-question .sv-q-col-4": "width: 25%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-col-5, .sv-question .sv-q-col-5": "width: 20%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-column-1, .sv-question .sv-q-column-1": "width: 100%; max-width: 100%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-column-2, .sv-question .sv-q-column-2": "max-width: 50%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-column-3, .sv-question .sv-q-column-3": "max-width: 33.33333%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-column-4, .sv-question .sv-q-column-4": "max-width: 25%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv-q-column-5, .sv-question .sv-q-column-5": "max-width: 20%; display: inline-block; padding-right: 1em; box-sizing: border-box; word-break: break-word;",
".sv_qstn .sv_q_file_input": "color: transparent;",
".sv_qstn .sv_q_imgsel label > div": "overflow: hidden; white-space: nowrap; text-overflow: ellipsis; padding: 4px; border: 1px solid lightgray; border-radius: 4px;",
".sv_qstn .sv_q_imgsel label > div > img, .sv_qstn .sv_q_imgsel label > div > embed": "display: block;",
".sv_qstn table tr td .sv_q_m_cell_label": "position: absolute; left: 0; right: 0; top: 0; bottom: 0;",
"f-panel": "padding: 0.5em 1em; display: inline-block; line-height: 2em;",
".sv_progress_bar > span": "white-space: nowrap;",
".sv_qstn .sv_q_select_column": "display: inline-block; vertical-align: top; min-width: 10%;",
".sv_qstn .sv_q_select_column > *:not(.sv_technical)": "display: block;",
".sv_main .sv_container .sv_body .sv_p_root .sv_qstn .sv_q_select_column textarea": "margin-left: 0; padding-left: 0; line-height: initial;",
".sv_main .sv-hidden": "display: none !important;",
".sv_main .sv-visuallyhidden": "position: absolute; height: 1px !important; width: 1px !important; overflow: hidden; clip: rect(1px 1px 1px 1px); clip: rect(1px, 1px, 1px, 1px);",
// paneldynamic progress
".sv_main .sv-progress": "height: 0.19em; background-color: $header-background-color;",
".sv_main .sv-progress__bar": "background-color: $main-color; height: 100%; position: relative;",
// EO paneldynamic progress
// paneldynamic
".sv_main .sv-paneldynamic__progress-container": "position: relative; display: inline-block; width: calc(100% - 250px); margin-top: 20px;",
".sv_main .sv-paneldynamic__add-btn": "float: right;",
".sv_main .sv-paneldynamic__add-btn--list-mode": "float: none; margin-top: 0;",
".sv_main .sv-paneldynamic__remove-btn ": "margin-top: 1.25em;",
".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "box-sizing: border-box; display: inline-block; cursor: pointer; width: 0.7em; top: -0.28em; position: absolute;",
".sv_main .sv-paneldynamic__prev-btn": "left: -1.3em; transform: rotate(90deg);",
".sv_main .sv-paneldynamic__next-btn ": "right: -1.3em; transform: rotate(270deg);",
".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "cursor: auto;",
".sv_main .sv-paneldynamic__progress-text": "font-weight: bold; font-size: 0.87em; margin-top: 0.69em; margin-left: 4em",
// EO paneldynamic
//boolean
".sv_main .sv-boolean__switch": "display: inline-block; box-sizing: border-box; width: 63px; height: 24px; margin-right: 17px; margin-left: 21px; padding: 2px 3px; vertical-align: middle; border-radius: 12px; cursor: pointer;",
".sv_main .sv-boolean__slider": "display: inline-block; width: 20px; height: 20px; transition-duration: .4s; transition-property: margin-left; border: none; border-radius: 100%;",
".sv_main .sv-boolean__label": "vertical-align: middle; cursor: pointer;",
".sv_main .sv-boolean--indeterminate .sv-boolean__slider": "margin-left: calc(50% - 10px);",
".sv_main .sv-boolean--checked .sv-boolean__slider": "margin-left: calc(100% - 20px);",
"[dir='rtl'] .sv-boolean__label ": "float: right;",
"[dir='rtl'] .sv-boolean--indeterminate .sv-boolean__slider": "margin-right: calc(50% - 0.625em);",
"[dir='rtl'] .sv-boolean--checked .sv-boolean__slider": "margin-right: calc(100% - 1.25em);",
"[dir='rtl'] .sv-boolean__switch": "float: right;",
"[style*='direction:rtl'] .sv-boolean__label ": "float: right;",
"[style*='direction:rtl'] .sv-boolean--indeterminate .sv-boolean__slider": "margin-right: calc(50% - 0.625em);",
"[style*='direction:rtl'] .sv-boolean--checked .sv-boolean__slider": "margin-right: calc(100% - 1.25em);",
"[style*='direction:rtl'] .sv-boolean__switch": "float: right;",
// EO boolean
".sv_main .sv_q_num": "",
".sv_main .sv_q_num + span": "",
// SignaturePad
".sv_main .sjs_sp_container": "position: relative;",
".sv_main .sjs_sp_controls": "position: absolute; left: 0; bottom: 0;",
".sv_main .sjs_sp_controls > button": "user-select: none;",
".sv_main .sjs_sp_container>div>canvas:focus": "outline: none;",
// logo
// ".sv_main .sv_header": "white-space: nowrap;",
".sv_main .sv_logo": "",
".sv_main .sv-logo--left": "display: inline-block; vertical-align: top; margin-right: 2em;",
".sv_main .sv-logo--right": "display: inline-block; vertical-align: top; margin-left: 2em; float: right;",
".sv_main .sv-logo--right+.sv-logo--right-tail": "clear: both;",
".sv_main .sv-logo--top": "display: block; width: 100%; text-align: center;",
".sv_main .sv-logo--bottom": "display: block; width: 100%; text-align: center;",
".sv_main .sv_header__text": "display: inline-block; vertical-align: top;",
};
StylesManager.Media = {
".sv_qstn fieldset .sv-q-col-1": {
style: "width: 100%;",
media: "@media only screen and (max-width: 480px)",
},
".sv_qstn fieldset .sv-q-col-2": {
style: "width: 100%;",
media: "@media only screen and (max-width: 480px)",
},
".sv_qstn fieldset .sv-q-col-3": {
style: "width: 100%;",
media: "@media only screen and (max-width: 480px)",
},
".sv_qstn fieldset .sv-q-col-4": {
style: "width: 100%;",
media: "@media only screen and (max-width: 480px)",
},
".sv_qstn fieldset .sv-q-col-5": {
style: "width: 100%;",
media: "@media only screen and (max-width: 480px)",
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn": {
style: "display: block; width: 100% !important;",
media: "@media (max-width: 600px)",
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .title-left": {
style: "float: none;",
media: "@media (max-width: 600px)",
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_radiogroup_inline, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_checkbox_inline, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .sv_q_imagepicker_inline": {
style: "display: block;",
media: "@media (max-width: 600px)",
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table": {
style: "display: block;",
media: "@media (max-width: 600px)",
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table thead": {
style: "display: none;",
media: "@media (max-width: 600px)",
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table tbody, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table tr, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table td": {
style: "display: block;",
media: "@media (max-width: 600px)",
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.table:not(.sv_q_matrix) td:before": {
style: "content: attr(headers);",
media: "@media (max-width: 600px)",
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn table.sv_q_matrix td:after": {
style: "content: attr(headers); padding-left: 1em",
media: "@media (max-width: 600px)",
},
".sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .radio label, .sv_main .sv_container .panel-body.card-block .sv_row .sv_qstn .checkbox label": {
style: "line-height: 12px; vertical-align: top;",
media: "@media (max-width: 600px)",
},
".sv_qstn label.sv_q_m_label": {
style: "display: inline;",
media: "@media (max-width: 600px)",
},
".sv_main .sv_custom_header": {
style: "display: none;",
media: "@media (max-width: 1300px)",
},
".sv_main .sv_container .sv_header h3": {
style: "font-size: 1.5em;",
media: "@media (max-width: 1300px)",
},
".sv_main .sv_container .sv_header h3 span": {
style: "font-size: 0.75em;",
media: "@media (max-width: 700px)",
},
".sv_main.sv_bootstrap_css .sv-progress__text": {
style: "margin-left: 8em;",
media: "@media (min-width: 768px)",
},
".sv_row": {
style: " display: flex; flex-wrap: wrap;",
media: "@supports (display: flex)",
},
".sv-vue-row-additional-div": {
style: " display: flex; flex-wrap: wrap; flex-basis: 100%;",
media: "@supports (display: flex)",
},
".sv-row > .sv-row__panel, .sv-row__question:not(:last-child)": {
style: "float: left;",
media: "@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none)",
},
"[dir='rtl'],[style*='direction:rtl'] .sv-row__question:not(:last-child)": {
style: "float: right;",
media: "@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none)",
},
".sv-row > .sv-row__panel, .sv-row__question": {
style: "width: 100% !important; padding-right: 0 !important;",
media: "@media only screen and (max-width: 600px)",
},
};
StylesManager.ThemeColors = {
default: {
"$header-background-color": "#e7e7e7",
"$body-container-background-color": "#f4f4f4",
"$main-color": "#1ab394",
"$main-hover-color": "#0aa384",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#6d7072",
"$header-color": "#6d7072",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf",
},
orange: {
"$header-background-color": "#4a4a4a",
"$body-container-background-color": "#f8f8f8",
"$main-color": "#f78119",
"$main-hover-color": "#e77109",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#4a4a4a",
"$header-color": "#f78119",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf",
},
darkblue: {
"$header-background-color": "#d9d8dd",
"$body-container-background-color": "#f6f7f2",
"$main-color": "#3c4f6d",
"$main-hover-color": "#2c3f5d",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#4a4a4a",
"$header-color": "#6d7072",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf",
},
darkrose: {
"$header-background-color": "#ddd2ce",
"$body-container-background-color": "#f7efed",
"$main-color": "#68656e",
"$main-hover-color": "#58555e",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#4a4a4a",
"$header-color": "#6d7072",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf",
},
stone: {
"$header-background-color": "#cdccd2",
"$body-container-background-color": "#efedf4",
"$main-color": "#0f0f33",
"$main-hover-color": "#191955",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#0f0f33",
"$header-color": "#0f0f33",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf",
},
winter: {
"$header-background-color": "#82b8da",
"$body-container-background-color": "#dae1e7",
"$main-color": "#3c3b40",
"$main-hover-color": "#1e1d20",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#000",
"$header-color": "#000",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$disable-color": "#dbdbdb",
"$progress-text-color": "#9d9d9d",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf",
},
winterstone: {
"$header-background-color": "#323232",
"$body-container-background-color": "#f8f8f8",
"$main-color": "#5ac8fa",
"$main-hover-color": "#06a1e7",
"$body-background-color": "white",
"$inputs-background-color": "white",
"$text-color": "#000",
"$header-color": "#fff",
"$border-color": "#e7e7e7",
"$error-color": "#ed5565",
"$error-background-color": "#fd6575",
"$disable-color": "#dbdbdb",
"$progress-text-color": "#9d9d9d",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf",
},
modern: {
"$main-color": "#1ab394",
"$add-button-color": "#1948b3",
"$remove-button-color": "#ff1800",
"$disable-color": "#dbdbdb",
"$progress-text-color": "#9d9d9d",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf",
"$error-color": "#d52901",
"$text-color": "#404040",
"$inputs-background-color": "#f4f4f4",
"$main-hover-color": "#9f9f9f",
"$body-container-background-color": "#f4f4f4",
"$text-border-color": "#d4d4d4",
"$disabled-text-color": "rgba(64, 64, 64, 0.5)",
"$border-color": "rgb(64, 64, 64, 0.5)",
"$dropdown-border-color": "#d4d4d4",
"$header-background-color": "#e7e7e7",
"$answer-background-color": "rgba(26, 179, 148, 0.2)",
"$error-background-color": "rgba(213, 41, 1, 0.2)",
"$radio-checked-color": "#404040",
"$clean-button-color": "#1948b3",
"$body-background-color": "#ffffff",
},
bootstrap: {
"$main-color": "#18a689",
"$text-color": "#404040;",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$header-background-color": "#e7e7e7",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf",
},
bootstrapmaterial: {
"$main-color": "#18a689",
"$text-color": "#404040;",
"$progress-text-color": "#9d9d9d",
"$disable-color": "#dbdbdb",
"$header-background-color": "#e7e7e7",
"$disabled-label-color": "rgba(64, 64, 64, 0.5)",
"$slider-color": "white",
"$disabled-switch-color": "#9f9f9f",
"$disabled-slider-color": "#cfcfcf",
"$body-background-color": "#ffffff",
},
};
StylesManager.ThemeCss = {
".sv_default_css": "background-color: $body-container-background-color;",
".sv_default_css hr": "border-color: $border-color;",
".sv_default_css input[type='button'], .sv_default_css button": "color: $body-background-color; background-color: $main-color;",
".sv_default_css input[type='button']:hover, .sv_default_css button:hover": "background-color: $main-hover-color;",
".sv_default_css .sv_header": "color: $header-color;",
".sv_default_css .sv_custom_header": "background-color: $header-background-color;",
".sv_default_css .sv_container": "color: $text-color;",
".sv_default_css .sv_body": "background-color: $body-background-color; border-color: $main-color;",
".sv_default_css .sv_progress": "background-color: $border-color;",
".sv_default_css .sv_progress_bar": "background-color: $main-color;",
".sv_default_css .sv_p_root > .sv_row": "border-color: $border-color;",
".sv_default_css .sv_p_root > .sv_row:nth-child(odd)": "background-color: $body-background-color;",
".sv_default_css .sv_p_root > .sv_row:nth-child(even)": "background-color: $body-container-background-color;",
".sv_default_css .sv_q_other input": "color: $text-color; -webkit-text-fill-color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css .sv_q_text_root": "color: $text-color; -webkit-text-fill-color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css .sv_q_dropdown_control": "color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css input[type='text']": "color: $text-color; -webkit-text-fill-color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css select": "color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css textarea": "color: $text-color; -webkit-text-fill-color: $text-color; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css input:not([type='button']):not([type='reset']):not([type='submit']):not([type='image']):not([type='checkbox']):not([type='radio'])": "border: 1px solid $border-color; background-color: $inputs-background-color;color: $text-color; -webkit-text-fill-color: $text-color;",
".sv_default_css input:not([type='button']):not([type='reset']):not([type='submit']):not([type='image']):not([type='checkbox']):not([type='radio']):focus": "border: 1px solid $main-color;",
".sv_default_css .sv_container .sv_body .sv_p_root .sv_q .sv_select_wrapper .sv_q_dropdown_control ": "background-color: $inputs-background-color;",
".sv_default_css .sv_q_other input:focus": "border-color: $main-color;",
".sv_default_css .sv_q_text_root:focus": "border-color: $main-color;",
".sv_default_css .sv_q_dropdown_control:focus": "border-color: $main-color;",
".sv_default_css input[type='text']:focus": "border-color: $main-color;",
'.sv_default_css .sv_container .sv_body .sv_p_root .sv_q input[type="radio"]:focus, .sv_default_css .sv_container .sv_body .sv_p_root .sv_q input[type="checkbox"]:focus': "outline: 1px dotted $main-color;",
".sv_default_css select:focus": "border-color: $main-color;",
".sv_default_css textarea:focus": "border-color: $main-color;",
".sv_default_css .sv_select_wrapper": "background-color: $body-background-color;",
".sv_default_css .sv_select_wrapper::before": "background-color: $main-color;",
".sv_default_css .sv_q_rating_item.active .sv_q_rating_item_text": "background-color: $main-hover-color; border-color: $main-hover-color; color: $body-background-color;",
".sv_default_css .sv_q_rating_item .sv_q_rating_item_text": "border-color: $border-color;",
".sv_default_css .sv_q_rating_item .sv_q_rating_item_text:hover": "border-color: $main-hover-color;",
".sv_default_css table.sv_q_matrix tr": "border-color: $border-color;",
".sv_default_css table.sv_q_matrix_dropdown tr": "border-color: $border-color;",
".sv_default_css table.sv_q_matrix_dynamic tr": "border-color: $border-color;",
".sv_default_css .sv_q_m_cell_selected": "color: $body-background-color; background-color: $main-hover-color;",
".sv_main .sv_q_file_remove:hover": "color: $main-color;",
".sv_main .sv_q_file_choose_button": "color: $body-background-color; background-color: $main-color;",
".sv_main .sv_q_file_choose_button:hover": "background-color: $main-hover-color;",
".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color",
".sv_default_css .sv_p_description": "padding-left: 1.29em;",
//progress bar
".sv_main .sv-progress": "background-color: $header-background-color;",
".sv_main .sv-progress__bar": "background-color: $main-color;",
//paneldynamic
".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "fill: $disable-color;",
".sv_main .sv-paneldynamic__progress-text": "color: $progress-text-color;",
".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "fill: $text-color",
//boolean
".sv_main .sv-boolean__switch": "background-color: $main-color;",
".sv_main .sv-boolean__slider": "background-color: $slider-color;",
".sv_main .sv-boolean__label--disabled": "color: $disabled-label-color;",
".sv_main .sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;",
".sv_main .sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;",
};
StylesManager.modernThemeCss = {
// ".sv-paneldynamic__add-btn": "background-color: $add-button-color;",
// ".sv-paneldynamic__remove-btn": "background-color: $remove-button-color;",
".sv-boolean__switch": "background-color: $main-color;",
".sv-boolean__slider": "background-color: $slider-color;",
".sv-boolean__label--disabled": "color: $disabled-label-color;",
".sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;",
".sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;",
".sv-btn": "color: $inputs-background-color;",
".sv-checkbox__svg": "border-color: $border-color; fill: transparent;",
".sv-checkbox--allowhover:hover .sv-checkbox__svg": "background-color: $main-hover-color; fill: $inputs-background-color;",
".sv-checkbox--checked .sv-checkbox__svg": "background-color: $main-color; fill: $inputs-background-color;",
".sv-checkbox--checked.sv-checkbox--disabled .sv-checkbox__svg": "background-color: $disable-color; fill: $inputs-background-color;",
".sv-checkbox--disabled .sv-checkbox__svg": "border-color: $disable-color;",
".sv-comment": "border-color: $text-border-color;",
".sv-comment:focus": "border-color: $main-color;",
".sv-completedpage": "color: $text-color; background-color: $body-container-background-color;",
".sv-container-modern": "color: $text-color;",
".sv-container-modern__title": "color: $main-color;",
".sv-description": "color: $disabled-text-color;",
".sv-dropdown": "border-bottom: 0.06em solid $text-border-color;",
".sv-dropdown:focus": "border-color: $dropdown-border-color;",
".sv-dropdown--error": "border-color: $error-color; color: $error-color;",
".sv-dropdown--error::placeholder": "color: $error-color;",
".sv-dropdown--error::-ms-input-placeholder": "color: $error-color;",
".sv-file__decorator": "background-color: $body-container-background-color;",
".sv-file__clean-btn": "background-color: $remove-button-color;",
".sv-file__choose-btn": "background-color: $add-button-color;",
".sv-file__choose-btn--disabled": "background-color: $disable-color;",
".sv-file__remove-svg": "fill: #ff1800;",
".sv-file__sign a": "color: $text-color;",
".sv-footer__complete-btn": "background-color: $main-color;",
".sv-footer__next-btn": "background-color: $main-color;",
".sv-footer__prev-btn": "background-color: $main-color;",
".sv-footer__start-btn": "background-color: $main-color;",
".sv-footer__preview-btn": "background-color: $main-color;",
".sv-footer__edit-btn": "background-color: $main-color;",
".sv-imagepicker__item--allowhover:hover .sv-imagepicker__image": "background-color: $main-hover-color; border-color: $main-hover-color;",
".sv-imagepicker__item--checked .sv-imagepicker__image": "background-color: $main-color; border-color: $main-color;",
".sv-imagepicker__item--disabled.sv-imagepicker__item--checked .sv-imagepicker__image": "background-color: $disable-color; border-color: $disable-color;",
".sv-item__control:focus + .sv-item__decorator": "border-color: $main-color;",
".sv-matrix__text--checked": "color: $inputs-background-color; background-color: $main-color;",
".sv-matrix__text--disabled.sv-matrix__text--checked": "background-color: $disable-color;",
".sv-matrixdynamic__add-btn": "background-color: $add-button-color;",
".sv-matrixdynamic__remove-btn": "background-color: $remove-button-color;",
".sv-paneldynamic__add-btn": "background-color: $add-button-color;",
".sv-paneldynamic__remove-btn": "background-color: $remove-button-color;",
".sv-paneldynamic__prev-btn, .sv-paneldynamic__next-btn": "fill: $text-color;",
".sv-paneldynamic__prev-btn--disabled, .sv-paneldynamic__next-btn--disabled": "fill: $disable-color;",
".sv-paneldynamic__progress-text": "color: $progress-text-color;",
".sv-progress": "background-color: $header-background-color;",
".sv-progress__bar": "background-color: $main-color;",
".sv-progress__text": "color: $progress-text-color;",
".sv-question__erbox": "color: $error-color;",
".sv-question__title--answer": "background-color: $answer-background-color;",
".sv-question__title--error": "background-color: $error-background-color;",
".sv-panel__title--error": "background-color: $error-background-color;",
".sv-radio__svg": "border-color: $border-color; fill: transparent;",
".sv-radio--allowhover:hover .sv-radio__svg": "fill: $border-color;",
".sv-radio--checked .sv-radio__svg": "border-color: $radio-checked-color; fill: $radio-checked-color;",
".sv-radio--disabled .sv-radio__svg": "border-color: $disable-color;",
".sv-radio--disabled.sv-radio--checked .sv-radio__svg": "fill: $disable-color;",
".sv-rating": "color: $text-color;",
".sv-rating input:focus + .sv-rating__min-text + .sv-rating__item-text, .sv-rating input:focus + .sv-rating__item-text": "outline-color: $main-color;",
".sv-rating__item-text": "color: $main-hover-color; border: solid 0.1875em $main-hover-color;",
".sv-rating__item-text:hover": "background-color: $main-hover-color; color: $body-background-color;",
".sv-rating__item--selected .sv-rating__item-text": "background-color: $main-color; color: $body-background-color; border-color: $main-color;",
".sv-rating--disabled .sv-rating__item-text": "color: $disable-color; border-color: $disable-color;",
".sv-rating--disabled .sv-rating__item-text:hover": "background-color: transparent;",
".sv-rating--disabled .sv-rating__item-text:hover .sv-rating__item--selected .sv-rating__item-text": "background-color: $disable-color; color: $body-background-color;",
"::-webkit-scrollbar": "background-color: $main-hover-color;",
"::-webkit-scrollbar-thumb": "background: $main-color;",
".sv-selectbase__clear-btn": "background-color: $clean-button-color;",
".sv-table": "background-color: rgba($main-hover-color, 0.1);",
".sv-text:focus": "border-color: $main-color;",
'.sv-text[type="date"]::-webkit-calendar-picker-indicator': "color: transparent; background: transparent;",
".sv-text--error": "color: $error-color; border-color: $error-color;",
".sv-text--error::placeholder": "color: $error-color;",
".sv-text--error::-ms-placeholder": "color: $error-color;",
".sv-text--error:-ms-placeholder": "color: $error-color;",
".sv-text::placeholder": "color: $text-color;",
".sv-text::-ms-placeholder": "color: $text-color;",
".sv-text:-ms-placeholder": "color: $text-color;",
};
StylesManager.bootstrapThemeCss = {
".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color",
".sv_main .sv_p_description": "padding-left: 1.66em;",
".sv_main .sv_qstn_error_bottom": "margin-top: 20px; margin-bottom: 0;",
".sv_main .progress": "width: 60%;",
".sv_main .progress-bar": "width: auto; margin-left: 2px; margin-right: 2px;",
".sv_main .table>tbody>tr>td": "min-width: 90px;",
".sv_main f-panel .sv_qstn": "padding: 0; vertical-align: middle;",
".sv_main .sv_q_image": "display: inline-block;",
//progress bar
".sv_main .sv-progress": "background-color: $header-background-color;",
".sv_main .sv-progress__bar": "background-color: $main-color;",
//paneldynamic
".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "fill: $disable-color;",
".sv_main .sv-paneldynamic__progress-text": "color: $progress-text-color;",
".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "fill: $text-color",
//boolean
".sv_main .sv-boolean__switch": "background-color: $main-color;",
".sv_main .sv-boolean__slider": "background-color: $slider-color;",
".sv_main .sv-boolean__label--disabled": "color: $disabled-label-color;",
".sv_main .sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;",
".sv_main .sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;",
};
StylesManager.bootstrapmaterialThemeCss = {
".sv_main.sv_bootstrapmaterial_css .form-group.is-focused .form-control": "linear-gradient(0deg, $main-color 2px, $main-color 0),linear-gradient(0deg, #D2D2D2 1px, transparent 0);",
".sv_main.sv_bootstrapmaterial_css .sv_qstn": "margin-bottom: 1rem;",
".sv_main.sv_bootstrapmaterial_css .sv_qstn label.sv_q_m_label": "height: 100%;",
".sv_main.sv_bootstrapmaterial_css .sv_q_image": "display: inline-block;",
".sv_main.sv_bootstrapmaterial_css .checkbox input[type=checkbox]:checked + .checkbox-material .check": "border-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css label.checkbox-inline input[type=checkbox]:checked + .checkbox-material .check": "border-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .checkbox input[type=checkbox]:checked + .checkbox-material .check:before": "color: $main-color;",
".sv_main.sv_bootstrapmaterial_css label.checkbox-inline input[type=checkbox]:checked + .checkbox-material .check:before": "color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .radio input[type=radio]:checked ~ .circle": "border-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css label.radio-inline input[type=radio]:checked ~ .circle": "border-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .radio input[type=radio]:checked ~ .check": "background-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css label.radio-inline input[type=radio]:checked ~ .check": "background-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .btn-default.active": "background-color: $main-color; color: $body-background-color;",
".sv_main.sv_bootstrapmaterial_css .btn-default:active": "background-color: $main-color; color: $body-background-color;",
".sv_main.sv_bootstrapmaterial_css .btn-secondary.active": "background-color: $main-color; color: $body-background-color;",
".sv_main.sv_bootstrapmaterial_css .btn-secondary:active": "background-color: $main-color; color: $body-background-color;",
".sv_main.sv_bootstrapmaterial_css .open>.dropdown-toggle.btn-default": "background-color: $main-color; color: $body-background-color;",
".sv_main.sv_bootstrapmaterial_css input[type='button'].btn-primary, .sv_main.sv_bootstrapmaterial_css button.btn-primary": "color: $body-background-color; background-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css input[type='button'].btn-primary:hover, .sv_main.sv_bootstrapmaterial_css button.btn-primary:hover": "background-color: $main-hover-color;",
".sv_main .sv_q_imgsel.checked label>div": "background-color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .sv_q_file_remove:hover": "color: $main-color;",
".sv_main.sv_bootstrapmaterial_css .form-group input[type=file]": "position: relative; opacity: 1;",
".sv_main.sv_bootstrapmaterial_css .progress": "width: 60%; height: 1.5em;",
".sv_main.sv_bootstrapmaterial_css .progress-bar": "width: auto; margin-left: 2px; margin-right: 2px;",
//progress bar
".sv_main .sv-progress": "background-color: $header-background-color;",
".sv_main .sv-progress__bar": "background-color: $main-color;",
//paneldynamic
".sv_main .sv-paneldynamic__prev-btn.sv-paneldynamic__prev-btn--disabled, .sv_main .sv-paneldynamic__next-btn.sv-paneldynamic__next-btn--disabled": "fill: $disable-color;",
".sv_main .sv-paneldynamic__progress-text": "color: $progress-text-color;",
".sv_main .sv-paneldynamic__prev-btn, .sv_main .sv-paneldynamic__next-btn": "fill: $text-color",
//boolean
".sv_main .sv-boolean .checkbox-decorator": "display: none;",
".sv_main .sv-boolean__switch": "background-color: $main-color;",
".sv_main .sv-boolean__slider": "background-color: $slider-color;",
".sv_main .sv-boolean__label.sv-boolean__label--disabled": "color: $disabled-label-color;",
".sv_main .sv-boolean__label": "color: $text-color;",
".sv_main .sv-boolean--disabled .sv-boolean__switch": "background-color: $disabled-switch-color;",
".sv_main .sv-boolean--disabled .sv-boolean__slider": "background-color: $disabled-slider-color;",
};
StylesManager.Enabled = true;
return StylesManager;
}());
/***/ }),
/* 33 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssstandard__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__page__ = __webpack_require__(48);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__textPreProcessor__ = __webpack_require__(23);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__dxSurveyService__ = __webpack_require__(45);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__stylesmanager__ = __webpack_require__(32);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__surveytimer__ = __webpack_require__(55);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyModel; });
/**
* The `Survey` object contains information about the survey, Pages, Questions, flow logic and etc.
*/
var SurveyModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyModel, _super);
function SurveyModel(jsonObj) {
if (jsonObj === void 0) { jsonObj = null; }
var _this = _super.call(this) || this;
_this.valuesHash = {};
_this.variablesHash = {};
_this.localeValue = "";
_this.completedStateValue = "";
_this.completedStateTextValue = "";
_this.isTimerStarted = false;
/**
* The event is fired before the survey is completed and the `onComplete` event is fired. You can prevent the survey from completing by setting `options.allowComplete` to `false`
* `sender` - the survey object that fires the event.
* `options.allowComplete` - Specifies whether a user can complete a survey. Set this property to `false` to prevent the survey from completing. The default value is `true`.
* `options.isCompleteOnTrigger` - returns true if the survey is completing on "complete" trigger.
* @see onComplete
*/
_this.onCompleting = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired after a user clicks the 'Complete' button and finishes a survey. Use this event to send the survey data to your web server.
* `sender` - the survey object that fires the event.
* `options.showDataSaving(text)` - call this method to show that the survey is saving survey data on your server. The `text` is an optional parameter to show a custom message instead of default.
* `options.showDataSavingError(text)` - call this method to show that an error occurred while saving the data on your server. If you want to show a custom error, use an optional `text` parameter.
* `options.showDataSavingSuccess(text)` - call this method to show that the data was successfully saved on the server.
* `options.showDataSavingClear` - call this method to hide the text about the saving progress.
* `options.isCompleteOnTrigger` - returns true if the survey is completed on "complete" trigger.
* @see data
* @see clearInvisibleValues
* @see completeLastPage
* @see surveyPostId
*/
_this.onComplete = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired after a user clicks the 'Complete' button. The event allows you to specify the URL opened after completing a survey.
* Specify the `navigateToUrl` property to make survey navigate to another url.
* `sender` - the survey object that fires the event.
* `options.url` - Specifies a URL opened after completing a survey. Set this property to an empty string to cancel the navigation and show the completed survey page.
* @see navigateToUrl
* @see navigateToUrlOnCondition
*/
_this.onNavigateToUrl = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired after the survey changed it's state from "starting" to "running". The "starting" state means that survey shows the started page.
* The `firstPageIsStarted` property should be set to `true`, if you want to display a start page in your survey. In this case, an end user should click the "Start" button to start the survey.
* @see firstPageIsStarted
*/
_this.onStarted = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on clicking the 'Next' button if the `sendResultOnPageNext` is set to `true`. You can use it to save the intermediate results, for example, if your survey is large enough.
* `sender` - the survey object that fires the event.
* @see sendResultOnPageNext
*/
_this.onPartialSend = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before the current page changes to another page. Typically it happens when a user click the 'Next' or 'Prev' buttons.
* `sender` - the survey object that fires the event.
* `option.oldCurrentPage` - the previous current/active page.
* `option.newCurrentPage` - a new current/active page.
* `option.allowChanging` - set it to `false` to disable the current page changing. It is `true` by default.
* `option.isNextPage` - commonly means, that end-user press the next page button. In general, it means that options.newCurrentPage is the next page after options.oldCurrentPage
* `option.isPrevPage` - commonly means, that end-user press the previous page button. In general, it means that options.newCurrentPage is the previous page before options.oldCurrentPage
* @see currentPage
* @see currentPageNo
* @see nextPage
* @see prevPage
* @see completeLastPage
* @see onCurrentPageChanged
**/
_this.onCurrentPageChanging = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired when the current page has been changed to another page. Typically it happens when a user click on 'Next' or 'Prev' buttons.
* `sender` - the survey object that fires the event.
* `option.oldCurrentPage` - a previous current/active page.
* `option.newCurrentPage` - a new current/active page.
* `option.isNextPage` - commonly means, that end-user press the next page button. In general, it means that options.newCurrentPage is the next page after options.oldCurrentPage
* `option.isPrevPage` - commonly means, that end-user press the previous page button. In general, it means that options.newCurrentPage is the previous page before options.oldCurrentPage
* @see currentPage
* @see currentPageNo
* @see nextPage
* @see prevPage
* @see completeLastPage
* @see onCurrentPageChanging
*/
_this.onCurrentPageChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before the question value (answer) is changed. It can be done via UI by a user or programmatically on calling the `setValue` method.
* `sender` - the survey object that fires the event.
* `options.name` - the value name that has being changed.
* `options.question` - a question which `question.name` equals to the value name. If there are several questions with the same name, the first question is used. If there is no such questions, the `options.question` is null.
* `options.oldValue` - an old, previous value.
* `options.value` - a new value. You can change it.
* @see setValue
* @see onValueChanged
*/
_this.onValueChanging = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired when the question value (i.e., answer) has been changed. The question value can be changed in UI (by a user) or programmatically (on calling `setValue` method).
* Use the `onDynamicPanelItemValueChanged` and `onMatrixCellValueChanged` events to handle changes in a question in the Panel Dynamic and a cell question in matrices.
* `sender` - the survey object that fires the event.
* `options.name` - the value name that has been changed.
* `options.question` - a question which `question.name` equals to the value name. If there are several questions with the same name, the first question is used. If there is no such questions, the `options.question` is `null`.
* `options.value` - a new value.
* @see setValue
* @see onValueChanging
* @see onDynamicPanelItemValueChanged
* @see onMatrixCellValueChanged
*/
_this.onValueChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired when a question visibility has been changed.
* `sender` - the survey object that fires the event.
* `options.question` - a question which visibility has been changed.
* `options.name` - a question name.
* `options.visible` - a question `visible` boolean value.
* @see Question.visibile
* @see Question.visibileIf
*/
_this.onVisibleChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on changing a page visibility.
* `sender` - the survey object that fires the event.
* `options.page` - a page which visibility has been changed.
* `options.visible` - a page `visible` boolean value.
* @see PageModel.visibile
* @see PageModel.visibileIf
*/
_this.onPageVisibleChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on changing a panel visibility.
* `sender` - the survey object that fires the event.
* `options.panel` - a panel which visibility has been changed.
* `options.visible` - a panel `visible` boolean value.
* @see PanelModel.visibile
* @see PanelModel.visibileIf
*/
_this.onPanelVisibleChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on creating a new question.
* Unlike the onQuestionAdded event, this event calls for all question created in survey including inside: a page, panel, matrix cell, dynamic panel and multiple text.
* or inside a matrix cell or it can be a text question in multiple text items or inside a panel of a panel dynamic.
* You can use this event to set up properties to a question based on it's type for all questions, regardless where they are located, on the page or inside a matrix cell.
* Please note: If you want to use this event for questions loaded from JSON then you have to create survey with empty/null JSON parameter, assign the event and call survey.fromJSON(yourJSON) function.
* `sender` - the survey object that fires the event.
* `options.question` - a newly created question object.
* @see Question
* @see onQuestionAdded
*/
_this.onQuestionCreated = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on adding a new question into survey.
* `sender` - the survey object that fires the event.
* `options.question` - a newly added question object.
* `options.name` - a question name.
* `options.index` - an index of the question in the container (page or panel).
* `options.parentPanel` - a container where a new question is located. It can be a page or panel.
* `options.rootPanel` - typically, it is a page.
* @see Question
* @see onQuestionCreated
*/
_this.onQuestionAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on removing a question from survey.
* `sender` - the survey object that fires the event.
* `options.question` - a removed question object.
* `options.name` - a question name.
* @see Question
*/
_this.onQuestionRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on adding a panel into survey.
* `sender` - the survey object that fires the event.
* `options.panel` - a newly added panel object.
* `options.name` - a panel name.
* `options.index` - an index of the panel in the container (a page or panel).
* `options.parentPanel` - a container (a page or panel) where a new panel is located.
* `options.rootPanel` - a root container, typically it is a page.
* @see PanelModel
*/
_this.onPanelAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on removing a panel from survey.
* `sender` - the survey object that fires the event.
* `options.panel` - a removed panel object.
* `options.name` - a panel name.
* @see PanelModel
*/
_this.onPanelRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on adding a page into survey.
* `sender` - the survey object that fires the event.
* `options.page` - a newly added `panel` object.
* @see PanelModel
*/
_this.onPageAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on validating value in a question. You can specify a custom error message using `options.error`. The survey blocks completing the survey or going to the next page when the error messages are displayed.
* `sender` - the survey object that fires the event.
* `options.question` - a validated question.
* `options.name` - a question name.
* `options.value` - the current question value (answer).
* `options.error` - an error string. It is empty by default.
* @see onServerValidateQuestions
* @see onSettingQuestionErrors
*/
_this.onValidateQuestion = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before errors are assigned to a question. You may add/remove/modify errors for a question.
* `sender` - the survey object that fires the event.
* `options.question` - a validated question.
* `options.errors` - the list of errors. The list is empty by default and remains empty if a validated question has no errors.
* @see onValidateQuestion
*/
_this.onSettingQuestionErrors = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to validate data on your server.
* `sender` - the survey object that fires the event.
* `options.data` - the values of all non-empty questions on the current page. You can get a question value as `options.data["myQuestionName"]`.
* `options.errors` - set your errors to this object as: `options.errors["myQuestionName"] = "Error text";`. It will be shown as a question error.
* `options.complete()` - call this function to tell survey that your server callback has been processed.
* @see onValidateQuestion
* @see onValidatePanel
*/
_this.onServerValidateQuestions = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to modify the HTML before rendering, for example HTML on a completed page.
* `sender` - the survey object that fires the event.
* `options.html` - an HTML that you may change before text processing and then rendering.
* @see completedHtml
* @see loadingHtml
* @see QuestionHtmlModel.html
*/
/**
* The event is fired on validating a panel. Set your error to `options.error` and survey will show the error for the panel and block completing the survey or going to the next page.
* `sender` - the survey object that fires the event.
* `options.name` - a panel name.
* `options.error` - an error string. It is empty by default.
* @see onValidateQuestion
*/
_this.onValidatePanel = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use the event to change the default error text.
* `sender` - the survey object that fires the event.
* `options.text` - an error text.
* `options.error` - an instance of the `SurveyError` object.
* `options.name` - the error name. The following error names are available:
* required, requireoneanswer, requirenumeric, exceedsize, webrequest, webrequestempty, otherempty,
* uploadingfile, requiredinallrowserror, minrowcounterror, keyduplicationerror, custom
*/
_this.onErrorCustomText = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use the this event to be notified when the survey finished validate questions on the current page. It commonly happens when a user try to go to the next page or complete the survey
* options.questions - the list of questions that have errors
* options.errors - the list of errors
* options.page - the page where question(s) are located
*/
_this.onValidatedErrorsOnCurrentPage = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to modify the HTML content before rendering, for example `completeHtml` or `loadingHtml`.
* `options.html` - specifies the modified HTML content.
* @see completedHtml
* @see loadingHtml
*/
_this.onProcessHtml = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to change the question title in code. If you want to remove question numbering then set showQuestionNumbers to "off".
* `sender` - the survey object that fires the event.
* `options.title` - a calculated question title, based on question `title`, `name`.
* `options.question` - a question object.
* @see showQuestionNumbers
* @see requiredText
*/
_this.onGetQuestionTitle = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to change the question no in code. If you want to remove question numbering then set showQuestionNumbers to "off".
* `sender` - the survey object that fires the event.
* `options.no` - a calculated question no, based on question `visibleIndex`, survey `.questionStartIndex` properties. You can change it.
* `options.question` - a question object.
* @see showQuestionNumbers
* @see questionStartIndex
*/
_this.onGetQuestionNo = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to change the progress text in code.
* `sender` - the survey object that fires the event.
* `options.text` - a progress text, that SurveyJS will render in progress bar.
* `options.questionCount` - a number of questions that have input(s). We do not count html or expression questions
* `options.answeredQuestionCount` - a number of questions that have input(s) and an user has answered.
* `options.requiredQuestionCount` - a number of required questions that have input(s). We do not count html or expression questions
* `options.requiredAnsweredQuestionCount` - a number of required questions that have input(s) and an user has answered.
* @see progressBarType
*/
_this.onProgressText = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to process the markdown text.
* `sender` - the survey object that fires the event.
* `options.element` - SurveyJS element (a question, panel, page, or survey) where the string is going to be rendered.
* `options.text` - a text that is going to be rendered.
* `options.html` - an HTML content. It is `null` by default. Use this property to specify the HTML content rendered instead of `options.text`.
*/
_this.onTextMarkdown = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event fires when it gets response from the [api.surveyjs.io](https://api.surveyjs.io) service on saving survey results. Use it to find out if the results have been saved successfully.
* `sender` - the survey object that fires the event.
* `options.success` - it is `true` if the results has been sent to the service successfully.
* `options.response` - a response from the service.
*/
_this.onSendResult = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use it to get results after calling the `getResult` method. It returns a simple analytics from [api.surveyjs.io](https://api.surveyjs.io) service.
* `sender` - the survey object that fires the event.
* `options.success` - it is `true` if the results were got from the service successfully.
* `options.data` - the object `{AnswersCount, QuestionResult : {} }`. `AnswersCount` is the number of posted survey results. `QuestionResult` is an object with all possible unique answers to the question and number of these answers.
* `options.dataList` - an array of objects `{name, value}`, where `name` is a unique value/answer to the question and `value` is a number/count of such answers.
* `options.response` - the server response.
* @see getResult
*/
_this.onGetResult = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on uploading the file in QuestionFile when `storeDataAsText` is set to `false`. Use this event to change the uploaded file name or to prevent a particular file from being uploaded.
* `sender` - the survey object that fires the event.
* `options.question` - the file question instance.
* `options.name` - the file question name.
* `options.files` - the Javascript File objects array to upload.
* @see uploadFiles
* @see QuestionFileModel.storeDataAsText
*/
_this.onUploadFiles = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on downloading a file in QuestionFile. Use this event to pass the file to a preview.
* `sender` - the survey object that fires the event.
* `options.name` - the question name.
* `options.content` - the file content.
* `options.fileValue` - single file question value.
* `options.callback` - a call back function to get the status on downloading the file and the downloaded file content.
* @see downloadFile
*/
_this.onDownloadFile = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* This event is fired on clearing the value in a QuestionFile. Use this event to remove files stored on your server.
* `sender` - the survey object that fires the event.
* `question` - the question instance.
* `options.name` - the question name.
* `options.value` - the question value.
* `options.fileName` - a removed file's name, set it to `null` to clear all files.
* `options.callback` - a call back function to get the status on clearing the files operation.
* @see clearFiles
*/
_this.onClearFiles = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired after choices for radiogroup, checkbox, and dropdown has been loaded from a RESTful service and before they are assigned to a question.
* You may change the choices, before they are assigned or disable/enabled make visible/invisible question, based on loaded results.
* `sender` - the survey object that fires the event.
* `question` - the question where loaded choices are going to be assigned.
* `choices` - the loaded choices. You can change the loaded choices to before they are assigned to question.
* `serverResult` - a result that comes from the server as it is.
*/
_this.onLoadChoicesFromServer = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired after survey is loaded from api.surveyjs.io service.
* You can use this event to perform manipulation with the survey model after it was loaded from the web service.
* `sender` - the survey object that fires the event.
* @see surveyId
* @see loadSurveyFromService
*/
_this.onLoadedSurveyFromService = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on processing the text when it finds a text in brackets: `{somevalue}`. By default, it uses the value of survey question values and variables.
* For example, you may use the text processing in loading choices from the web. If your `choicesByUrl.url` equals to "UrlToServiceToGetAllCities/{country}/{state}",
* you may set on this event `options.value` to "all" or empty string when the "state" value/question is non selected by a user.
* `sender` - the survey object that fires the event.
* `options.name` - the name of the processing value, for example, "state" in our example.
* `options.value` - the value of the processing text.
* `options.isExists` - a boolean value. Set it to `true` if you want to use the value and set it to `false` if you don't.
*/
_this.onProcessTextValue = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before rendering a question. Use it to override the default question CSS classes.
* `sender` - the survey object that fires the event.
* `options.question` - a question for which you can change the CSS classes.
* `options.cssClasses` - an object with CSS classes. For example `{root: "table", button: "button"}`. You can change them to your own CSS classes.
*/
_this.onUpdateQuestionCssClasses = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before rendering a panel. Use it to override the default panel CSS classes.
* `sender` - the survey object that fires the event.
* `options.panel` - a panel for which you can change the CSS classes.
* `options.cssClasses` - an object with CSS classes. For example `{title: "sv_p_title", description: "small"}`. You can change them to your own CSS classes.
*/
_this.onUpdatePanelCssClasses = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before rendering a page. Use it to override the default page CSS classes.
* `sender` - the survey object that fires the event.
* `options.page` - a page for which you can change the CSS classes.
* `options.cssClasses` - an object with CSS classes. For example `{title: "sv_p_title", description: "small"}`. You can change them to your own CSS classes.
*/
_this.onUpdatePageCssClasses = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired right after survey is rendered in DOM.
* `sender` - the survey object that fires the event.
* `options.htmlElement` - a root HTML element bound to the survey object.
*/
_this.onAfterRenderSurvey = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired right after a page is rendered in DOM. Use it to modify HTML elements.
* `sender` - the survey object that fires the event.
* `options.htmlElement` - an HTML element bound to the survey header object.
*/
_this.onAfterRenderHeader = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired right after a page is rendered in DOM. Use it to modify HTML elements.
* `sender` - the survey object that fires the event.
* `options.page` - a page object for which the event is fired. Typically the current/active page.
* `options.htmlElement` - an HTML element bound to the page object.
*/
_this.onAfterRenderPage = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired right after a question is rendered in DOM. Use it to modify HTML elements.
* `sender` - the survey object that fires the event.
* `options.question` - a question object for which the event is fired.
* `options.htmlElement` - an HTML element bound to the question object.
*/
_this.onAfterRenderQuestion = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired right after a non-composite question (text, comment, dropdown, radiogroup, checkbox) is rendered in DOM. Use it to modify HTML elements.
* This event is not fired for matrices, panels, multiple text and image picker.
* `sender` - the survey object that fires the event.
* `options.question` - a question object for which the event is fired.
* `options.htmlElement` - an HTML element bound to the question object.
*/
_this.onAfterRenderQuestionInput = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired right after a panel is rendered in DOM. Use it to modify HTML elements.
* `sender` - the survey object that fires the event
* `options.panel` - a panel object for which the event is fired
* `options.htmlElement` - an HTML element bound to the panel object
*/
_this.onAfterRenderPanel = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on adding a new row in Matrix Dynamic question.
* `sender` - the survey object that fires the event
* `options.question` - a matrix question.
* `options.row` - a new added row.
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDynamicModel.visibleRows
*/
_this.onMatrixRowAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before adding a new row in Matrix Dynamic question.
* `sender` - the survey object that fires the event
* `options.question` - a matrix question.
* `options.canAddRow` - specifies whether a new row can be added
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDynamicModel.visibleRows
*/
_this.onMatrixBeforeRowAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on removing a row from Matrix Dynamic question.
* `sender` - the survey object that fires the event
* `options.question` - a matrix question
* `options.rowIndex` - a removed row index
* `options.row` - a removed row object
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDynamicModel.visibleRows
*/
_this.onMatrixRowRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before rendering "Remove" button for removing a row from Matrix Dynamic question.
* `sender` - the survey object that fires the event
* `options.question` - a matrix question.
* `options.rowIndex` - a row index.
* `options.row` - a row object.
* `options.allow` - a boolean property. Set it to `false` to disable the row removing.
* @see QuestionMatrixDynamicModel
*/
_this.onMatrixAllowRemoveRow = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired for every cell created in Matrix Dynamic and Matrix Dropdown questions.
* `sender` - the survey object that fires the event.
* `options.question` - the matrix question.
* `options.cell` - the matrix cell.
* `options.cellQuestion` - the question/editor in the cell. You may customize it, change it's properties, like choices or visible.
* `options.rowValue` - the value of the current row. To access a particular column's value within the current row, use: `options.rowValue["columnValue"]`.
* `options.column` - the matrix column object.
* `options.columName` - the matrix column name.
* `options.row` - the matrix row object.
* @see onMatrixBeforeRowAdded
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellCreated = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired for every cell after is has been rendered in DOM.
* `sender` - the survey object that fires the event.
* `options.question` - the matrix question.
* `options.cell` - the matrix cell.
* `options.cellQuestion` - the question/editor in the cell.
* `options.htmlElement` - an HTML element bound to the `cellQuestion` object.
* `options.column` - the matrix column object.
* `options.row` - the matrix row object.
* @see onMatrixCellCreated
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixAfterCellRender = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired when cell value is changed in Matrix Dynamic and Matrix Dropdown questions.
* `sender` - the survey object that fires the event.
* `options.question` - the matrix question.
* `options.columName` - the matrix column name.
* `options.value` - a new value.
* `options.row` - the matrix row object.
* `options.getCellQuestion(columnName)` - the function that returns the cell question by column name.
* @see onMatrixCellValueChanging
* @see onMatrixBeforeRowAdded
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellValueChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on changing cell value in Matrix Dynamic and Matrix Dropdown questions. You may change the `options.value` property to change a cell value.
* `sender` - the survey object that fires the event.
* `options.question` - the matrix question.
* `options.columName` - the matrix column name.
* `options.value` - a new value.
* `options.oldValue` - the old value.
* `options.row` - the matrix row object.
* `options.getCellQuestion(columnName)` - the function that returns a cell question by column name.
* @see onMatrixCellValueChanged
* @see onMatrixBeforeRowAdded
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellValueChanging = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired when Matrix Dynamic and Matrix Dropdown questions validate the cell value.
* `sender` - the survey object that fires the event.
* `options.question` - the matrix question.
* `options.columName` - the matrix column name.
* `options.value` - a cell value.
* `options.row` - the matrix row object.
* `options.getCellQuestion(columnName)` - the function that returns the cell question by column name.
* @see onMatrixBeforeRowAdded
* @see onMatrixRowAdded
* @see QuestionMatrixDynamicModel
* @see QuestionMatrixDropdownModel
*/
_this.onMatrixCellValidate = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on adding a new panel in Panel Dynamic question.
* `sender` - the survey object that fires the event.
* `options.question` - a panel question.
* @see QuestionPanelDynamicModel
* @see QuestionPanelDynamicModel.panels
*/
_this.onDynamicPanelAdded = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired on removing a panel from Panel Dynamic question.
* `sender` - the survey object that fires the event.
* `options.question` - a panel question.
* `options.panelIndex` - a removed panel index.
* `options.panel` - a removed panel.
* @see QuestionPanelDynamicModel
* @see QuestionPanelDynamicModel.panels
*/
_this.onDynamicPanelRemoved = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired every second if the method `startTimer` has been called.
* @see startTimer
* @see timeSpent
* @see Page.timeSpent
*/
_this.onTimer = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired before displaying a new information in the Timer Panel. Use it to change the default text.
* `sender` - the survey object that fires the event.
* `options.text` - the timer panel info text.
*/
_this.onTimerPanelInfoText = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The event is fired when item value is changed in Panel Dynamic question.
* `sender` - the survey object that fires the event.
* `options.question` - the panel question.
* `options.panel` - the dynamic panel item.
* `options.name` - the item name.
* `options.value` - a new value.
* `options.itemIndex` - the panel item index.
* `options.itemValue` - the panel item object.
* @see onDynamicPanelAdded
* @see QuestionPanelDynamicModel
*/
_this.onDynamicPanelItemValueChanged = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to define, whether an answer to a question is correct or not.
* `sender` - the survey object that fires the event.
* `options.question` - a question on which you have to decide if the answer is correct or not.
* `options.result` - returns `true`, if an answer is correct, or `false`, if the answer is not correct. Use questions' `value` and `correctAnswer` properties to return the correct value.
* `options.correctAnswers` - you may change the default number of correct or incorrect answers in the question, for example for matrix, where each row is a quiz question.
* @see Question.value
* @see Question.correctAnswer
*/
_this.onIsAnswerCorrect = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to control drag&drop operations during design mode.
* `sender` - the survey object that fires the event.
* `options.allow` - set it to `false` to disable dragging.
* `options.target` - a target element that is dragged.
* `options.source` - a source element. It can be `null`, if it is a new element, dragging from toolbox.
* `options.parent` - a page or panel where target element is dragging.
* `options.insertBefore` - an element before the target element is dragging. It can be `null` if parent container (page or panel) is empty or dragging an element after the last element in a container.
* `options.insertAfter` - an element after the target element is dragging. It can be `null` if parent container (page or panel) is empty or dragging element to the first position within the parent container.
* @see setDesignMode
* @see isDesignMode
*/
_this.onDragDropAllow = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* Use this event to control scrolling element to top. You can cancel the default behavior by setting options.cancel property to true.
* `sender` - the survey object that fires the event.
* `options.element` - an element that is going to be scrolled on top.
* `options.question` - a question that is going to be scrolled on top. It can be null if options.page is not null.
* `options.page` - a page that is going to be scrolled on top. It can be null if options.question is not null.
* `options.elementId` - the unique element DOM Id.
* `options.cancel` - set this property to true to cancel the default scrolling.
*/
_this.onScrollingElementToTop = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
_this.onLocaleChangedEvent = new __WEBPACK_IMPORTED_MODULE_3__base__["c" /* Event */]();
/**
* The list of errors on loading survey JSON. If the list is empty after loading a JSON, then the JSON is correct and has no errors.
* @see JsonError
*/
_this.jsonErrors = null;
_this.cssValue = null;
/**
* Gets or sets whether to hide all required errors.
*/
_this.hideRequiredErrors = false;
_this._isDesignMode = false;
/**
* Gets or sets whether the survey must ignore validation like required questions and others, on `nextPage` and `completeLastPage` function calls. The default is `false`.
* @see nextPage
* @see completeLastPage
* @see mode
*/
_this.ignoreValidation = false;
_this.isNavigationButtonPressed = false;
_this.runningPages = null;
_this.origionalPages = null;
_this.isTriggerIsRunning = false;
_this.triggerValues = null;
_this.triggerKeys = null;
_this.conditionValues = null;
_this.isValueChangedOnRunningCondition = false;
_this.conditionRunnerCounter = 0;
_this.conditionUpdateVisibleIndexes = false;
_this.conditionNotifyElementsOnAnyValueOrVariableChanged = false;
_this.isEndLoadingFromJson = null;
_this.questionHashes = {
names: {},
namesInsensitive: {},
valueNames: {},
valueNamesInsensitive: {},
};
_this.timerFunc = null;
/**
* Returns the time in seconds an end user spends on the survey
* @see startTimer
* @see PageModel.timeSpent
*/
_this.timeSpent = 0;
var self = _this;
if (typeof document !== "undefined") {
SurveyModel.stylesManager = new __WEBPACK_IMPORTED_MODULE_12__stylesmanager__["a" /* StylesManager */]();
}
_this.createLocalizableString("title", _this, true);
_this.createLocalizableString("description", _this, true);
_this.createLocalizableString("logo", _this, false);
_this.createLocalizableString("completedHtml", _this);
_this.createLocalizableString("completedBeforeHtml", _this);
_this.createLocalizableString("loadingHtml", _this);
_this.createLocalizableString("startSurveyText", _this);
_this.createLocalizableString("pagePrevText", _this);
_this.createLocalizableString("pageNextText", _this);
_this.createLocalizableString("completeText", _this);
_this.createLocalizableString("previewText", _this);
_this.createLocalizableString("editText", _this);
_this.createLocalizableString("questionTitleTemplate", _this, true);
_this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_6__textPreProcessor__["a" /* TextPreProcessor */]();
_this.textPreProcessor.onProcess = function (textValue) {
self.getProcessedTextValue(textValue);
};
_this.createNewArray("pages", function (value) {
self.doOnPageAdded(value);
}, function (value) {
self.doOnPageRemoved(value);
});
_this.createNewArray("triggers", function (value) {
value.setOwner(self);
});
_this.createNewArray("calculatedValues", function (value) {
value.setOwner(self);
});
_this.createNewArray("completedHtmlOnCondition", function (value) {
value.locOwner = self;
});
_this.createNewArray("navigateToUrlOnCondition", function (value) {
value.locOwner = self;
});
_this.registerFunctionOnPropertyValueChanged("firstPageIsStarted", function () {
self.onFirstPageIsStartedChanged();
});
_this.registerFunctionOnPropertyValueChanged("mode", function () {
self.onModeChanged();
});
_this.registerFunctionOnPropertyValueChanged("progressBarType", function () {
self.updateProgressText();
});
_this.onProgressText.onCallbacksChanged = function () {
_this.updateProgressText();
};
_this.onBeforeCreating();
if (jsonObj) {
if (typeof jsonObj === "string" || jsonObj instanceof String) {
jsonObj = JSON.parse(jsonObj);
}
if (jsonObj && jsonObj.clientId) {
_this.clientId = jsonObj.clientId;
}
_this.fromJSON(jsonObj);
if (_this.surveyId) {
_this.loadSurveyFromService(_this.surveyId, _this.clientId);
}
}
_this.onCreating();
return _this;
}
Object.defineProperty(SurveyModel.prototype, "platformName", {
get: function () {
return SurveyModel.platform;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "commentPrefix", {
/**
* You can display an additional field (comment field) for the most of questions; users can enter additional comments to their response.
* The comment field input is saved as `'question name' + 'commentPrefix'`.
* @see data
* @see Question.hasComment
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_15__settings__["a" /* settings */].commentPrefix;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_15__settings__["a" /* settings */].commentPrefix = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "currentPageValue", {
get: function () {
return this.getPropertyValue("currentPageValue", null);
},
set: function (val) {
this.setPropertyValue("currentPageValue", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getType = function () {
return "survey";
};
SurveyModel.prototype.onPropertyValueChanged = function (name, oldValue, newValue) {
if (name === "questionsOnPageMode") {
this.onQuestionsOnPageModeChanged(oldValue);
}
};
Object.defineProperty(SurveyModel.prototype, "pages", {
/**
* Returns a list of all pages in the survey, including invisible pages.
* @see PageModel
* @see visiblePages
*/
get: function () {
return this.getPropertyValue("pages");
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getCss = function () {
return this.css;
};
Object.defineProperty(SurveyModel.prototype, "css", {
get: function () {
if (!this.cssValue) {
this.cssValue = {};
this.copyCssClasses(this.cssValue, __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssstandard__["b" /* surveyCss */].getCss());
}
return this.cssValue;
},
set: function (value) {
this.mergeValues(value, this.css);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "cssNavigationComplete", {
get: function () {
return this.getNavigationCss(this.css.navigationButton, this.css.navigation.complete);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "cssNavigationPreview", {
get: function () {
return this.getNavigationCss(this.css.navigationButton, this.css.navigation.preview);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "cssNavigationEdit", {
get: function () {
return this.getNavigationCss(this.css.navigationButton, this.css.navigation.edit);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "cssNavigationPrev", {
get: function () {
return this.getNavigationCss(this.css.navigationButton, this.css.navigation.prev);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "cssNavigationStart", {
get: function () {
return this.getNavigationCss(this.css.navigationButton, this.css.navigation.start);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "cssNavigationNext", {
get: function () {
return this.getNavigationCss(this.css.navigationButton, this.css.navigation.next);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedCss", {
get: function () {
var css = this.css;
return css.body + " " + css.completedPage;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getNavigationCss = function (main, btn) {
var res = "";
if (main)
res = main;
if (btn)
res += " " + btn;
return res;
};
Object.defineProperty(SurveyModel.prototype, "triggers", {
/**
* Gets or sets a list of triggers in the survey.
* @see SurveyTrigger
*/
get: function () {
return this.getPropertyValue("triggers");
},
set: function (val) {
this.setPropertyValue("triggers", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "calculatedValues", {
/**
* Gets or sets a list of calculated values in the survey.
* @see CalculatedValue
*/
get: function () {
return this.getPropertyValue("calculatedValues");
},
set: function (val) {
this.setPropertyValue("calculatedValues", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "surveyId", {
/**
* Gets or sets an identifier of a survey model loaded from the [api.surveyjs.io](https://api.surveyjs.io) service. When specified, the survey JSON is automatically loaded from [api.surveyjs.io](https://api.surveyjs.io) service.
* @see loadSurveyFromService
* @see onLoadedSurveyFromService
*/
get: function () {
return this.getPropertyValue("surveyId", "");
},
set: function (val) {
this.setPropertyValue("surveyId", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "surveyPostId", {
/**
* Gets or sets an identifier of a survey model saved to the [api.surveyjs.io](https://api.surveyjs.io) service. When specified, the survey data is automatically saved to the [api.surveyjs.io](https://api.surveyjs.io) service.
* @see onComplete
* @see surveyShowDataSaving
*/
get: function () {
return this.getPropertyValue("surveyPostId", "");
},
set: function (val) {
this.setPropertyValue("surveyPostId", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "clientId", {
/**
* Gets or sets user's identifier (e.g., e-mail or unique customer id) in your web application.
* If you load survey or post survey results from/to [api.surveyjs.io](https://api.surveyjs.io) service, then the library do not allow users to run the same survey the second time.
* On the second run, the user will see the survey complete page.
*/
get: function () {
return this.getPropertyValue("clientId", "");
},
set: function (val) {
this.setPropertyValue("clientId", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "cookieName", {
/**
* Gets or sets a cookie name used to save information about completing the survey.
* If the property is not empty, before starting the survey, the Survey library checks if the cookie with this name exists.
* If it is `true`, the survey goes to complete mode and a user sees the survey complete page. On completing the survey the cookie with this name is created.
*/
get: function () {
return this.getPropertyValue("cookieName", "");
},
set: function (val) {
this.setPropertyValue("cookieName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "sendResultOnPageNext", {
/**
* Gets or sets whether to save survey results on completing every page. If the property value is set to `true`, the `onPartialSend` event is fired.
* @see onPartialSend
* @see clientId
*/
get: function () {
return this.getPropertyValue("sendResultOnPageNext", false);
},
set: function (val) {
this.setPropertyValue("sendResultOnPageNext", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "surveyShowDataSaving", {
/**
* Gets or sets whether to show the progress on saving/sending data into the [api.surveyjs.io](https://api.surveyjs.io) service.
* @see surveyPostId
*/
get: function () {
return this.getPropertyValue("surveyShowDataSaving", false);
},
set: function (val) {
this.setPropertyValue("surveyShowDataSaving", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "focusFirstQuestionAutomatic", {
/**
* Gets or sets whether the first input is focused on showing a next or a previous page.
*/
get: function () {
return this.getPropertyValue("focusFirstQuestionAutomatic", true);
},
set: function (val) {
this.setPropertyValue("focusFirstQuestionAutomatic", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "focusOnFirstError", {
/**
* Gets or sets whether the first input is focused if the current page has errors.
* Set this property to `false` (the default value is `true`) if you do not want to bring the focus to the first question that has error on the page.
*/
get: function () {
return this.getPropertyValue("focusOnFirstError", true);
},
set: function (val) {
this.setPropertyValue("focusOnFirstError", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showNavigationButtons", {
/**
* Gets or sets the navigation buttons position.
* Possible values: 'bottom' (default), 'top', 'both' and 'none'. Set it to 'none' to hide 'Prev', 'Next' and 'Complete' buttons.
* It makes sense if you are going to create a custom navigation, have only a single page, or the `goNextPageAutomatic` property is set to `true`.
* @see goNextPageAutomatic
* @see showPrevButton
*/
get: function () {
return this.getPropertyValue("showNavigationButtons");
},
set: function (val) {
if (val === true || val === undefined) {
val = "bottom";
}
if (val === false) {
val = "none";
}
this.setPropertyValue("showNavigationButtons", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showPrevButton", {
/**
* Gets or sets whether the Survey displays "Prev" button in its pages. Set it to `false` to prevent end-users from going back to their answers.
* @see showNavigationButtons
*/
get: function () {
return this.getPropertyValue("showPrevButton", true);
},
set: function (val) {
this.setPropertyValue("showPrevButton", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showTitle", {
/**
* Gets or sets whether the Survey displays survey title in its pages. Set it to `false` to hide a survey title.
* @see title
*/
get: function () {
return this.getPropertyValue("showTitle", true);
},
set: function (val) {
this.setPropertyValue("showTitle", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showPageTitles", {
/**
* Gets or sets whether the Survey displays page titles. Set it to `false` to hide page titles.
* @see PageModel.title
*/
get: function () {
return this.getPropertyValue("showPageTitles", true);
},
set: function (val) {
this.setPropertyValue("showPageTitles", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showCompletedPage", {
/**
* On finishing the survey the complete page is shown. Set the property to `false`, to hide the complete page.
* @see data
* @see onComplete
* @see navigateToUrl
*/
get: function () {
return this.getPropertyValue("showCompletedPage", true);
},
set: function (val) {
this.setPropertyValue("showCompletedPage", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "navigateToUrl", {
/**
* Set this property to a url you want to navigate after a user completing the survey.
* By default it uses after calling onComplete event. In case calling options.showDataSaving callback in onComplete event, navigateToUrl will be used on calling options.showDataSavingSuccess callback.
*/
get: function () {
return this.getPropertyValue("navigateToUrl");
},
set: function (val) {
this.setPropertyValue("navigateToUrl", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "navigateToUrlOnCondition", {
/**
* Gets or sets a list of URL condition items. If the expression of this item returns `true`, then survey will navigate to the item URL.
* @see UrlConditionItem
* @see navigateToUrl
*/
get: function () {
return this.getPropertyValue("navigateToUrlOnCondition");
},
set: function (val) {
this.setPropertyValue("navigateToUrlOnCondition", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getNavigateToUrl = function () {
var item = this.getExpressionItemOnRunCondition(this.navigateToUrlOnCondition);
var url = !!item ? item.url : this.navigateToUrl;
if (!!url) {
url = this.processText(url, true);
}
return url;
};
SurveyModel.prototype.navigateTo = function () {
var url = this.getNavigateToUrl();
var options = { url: url };
this.onNavigateToUrl.fire(this, options);
if (!options.url || typeof window === "undefined" || !window.location)
return;
window.location.href = options.url;
};
Object.defineProperty(SurveyModel.prototype, "requiredText", {
/**
* Gets or sets the required question mark. The required question mark is a char or string that is rendered in the required questions' titles.
* @see Question.title
*/
get: function () {
return this.getPropertyValue("requiredText", "*");
},
set: function (val) {
this.setPropertyValue("requiredText", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.beforeSettingQuestionErrors = function (question, errors) {
if (this.hideRequiredErrors) {
for (var i = 0; i < errors.length; i++) {
if (errors[i].getErrorType() == "required") {
errors[i].visible = false;
}
}
}
this.onSettingQuestionErrors.fire(this, {
question: question,
errors: errors,
});
};
Object.defineProperty(SurveyModel.prototype, "questionStartIndex", {
/**
* Gets or sets the first question index. The first question index is '1' by default. You may start it from '100' or from 'A', by setting '100' or 'A' to this property.
* You can set the start index to "(1)" or "# A)" or "a)" to render question number as (1), # A) and a) accordingly.
* @see Question.title
* @see requiredText
*/
get: function () {
return this.getPropertyValue("questionStartIndex", "");
},
set: function (val) {
this.setPropertyValue("questionStartIndex", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "storeOthersAsComment", {
/**
* Gets or sets whether the "Others" option text is stored as question comment.
*
* By default the entered text in the "Others" input in the checkbox/radiogroup/dropdown is stored as `"question name " + "-Comment"`. The value itself is `"question name": "others"`.
* Set this property to `false`, to store the entered text directly in the `"question name"` key.
* @see commentPrefix
*/
get: function () {
return this.getPropertyValue("storeOthersAsComment", true);
},
set: function (val) {
this.setPropertyValue("storeOthersAsComment", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "maxTextLength", {
/**
* Specifies the default maximum length for questions like text and comment, including matrix cell questions.
*
* The default value is `0`, that means that the text and comment have the same max length as the standard HTML input - 524288 characters: https://www.w3schools.com/tags/att_input_maxlength.asp.
* @see maxOthersLength
*/
get: function () {
return this.getPropertyValue("maxTextLength", 0);
},
set: function (val) {
this.setPropertyValue("maxTextLength", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "maxOthersLength", {
/**
* Gets or sets the default maximum length for question comments and others
*
* The default value is `0`, that means that the question comments have the same max length as the standard HTML input - 524288 characters: https://www.w3schools.com/tags/att_input_maxlength.asp.
* @see Question.hasComment
* @see Question.hasOther
* @see maxTextLength
*/
get: function () {
return this.getPropertyValue("maxOthersLength", 0);
},
set: function (val) {
this.setPropertyValue("maxOthersLength", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "goNextPageAutomatic", {
/**
* Gets or ses whether a user can navigate the next page automatically after answering all the questions on a page without pressing the "Next" button.
* The available options:
*
* - `true` - navigate the next page and submit survey data automatically.
* - `autogonext` - navigate the next page automatically but do not submit survey data.
* - `false` - do not navigate the next page and do not submit survey data automatically.
* @see showNavigationButtons
*/
get: function () {
return this.getPropertyValue("goNextPageAutomatic", false);
},
set: function (val) {
this.setPropertyValue("goNextPageAutomatic", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "allowCompleteSurveyAutomatic", {
/**
* Gets or sets whether a survey is automatically completed when `goNextPageAutomatic = true`. Set it to `false` if you do not want to submit survey automatically on completing the last survey page.
* @see goNextPageAutomatic
*/
get: function () {
return this.getPropertyValue("allowCompleteSurveyAutomatic", true);
},
set: function (val) {
this.setPropertyValue("allowCompleteSurveyAutomatic", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "checkErrorsMode", {
/**
* Gets or sets a value that specifies how the survey validates the question answers.
*
* The following options are available:
*
* - `onNextPage` (default) - check errors on navigating to the next page or on completing the survey.
* - `onValueChanged` - check errors on every question value (i.e., answer) changing.
* - `onComplete` - to validate all visible questions on complete button click. If there are errors on previous pages, then the page with the first error becomes the current.
*/
get: function () {
return this.getPropertyValue("checkErrorsMode");
},
set: function (val) {
this.setPropertyValue("checkErrorsMode", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "textUpdateMode", {
/**
* Gets or sets a value that specifies how the survey updates its questions' text values.
*
* The following options are available:
*
* - `onBlur` (default) - the value is updated after an input loses the focus.
* - `onTyping` - update the value of text questions, "text" and "comment", on every key press.
*
* Note, that setting to "onTyping" may lead to a performance degradation, in case you have many expressions in the survey.
*/
get: function () {
return this.getPropertyValue("textUpdateMode");
},
set: function (val) {
this.setPropertyValue("textUpdateMode", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "clearInvisibleValues", {
/**
* Gets or sets a value that specifies how the invisible data is included in survey data.
*
* The following options are available:
*
* - `none` - include the invisible values into the survey data.
* - `onHidden` - clear the question value when it becomes invisible. If a question has value and it was invisible initially then survey clears the value on completing.
* - `onComplete` (default) - clear invisible question values on survey complete. In this case, the invisible questions will not be stored on the server.
* @see Question.visible
* @see onComplete
*/
get: function () {
return this.getPropertyValue("clearInvisibleValues");
},
set: function (val) {
if (val === true)
val = "onComplete";
if (val === false)
val = "none";
this.setPropertyValue("clearInvisibleValues", val);
},
enumerable: true,
configurable: true
});
/**
* Call this function to remove all question values from the survey, that end-user will not be able to enter.
* For example the value that doesn't exists in a radiogroup/dropdown/checkbox choices or matrix rows/columns.
* Please note, this function doesn't clear values for invisible questions or values that doesn't associated with questions.
* In fact this function just call clearIncorrectValues function of all questions in the survey
* @param removeNonExisingRootKeys - set this parameter to true to remove keys from survey.data that doesn't have corresponded questions and calculated values
* @see Question.clearIncorrectValues
* @see Page.clearIncorrectValues
* @see Panel.clearIncorrectValues
*/
SurveyModel.prototype.clearIncorrectValues = function (removeNonExisingRootKeys) {
if (removeNonExisingRootKeys === void 0) { removeNonExisingRootKeys = false; }
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].clearIncorrectValues();
}
if (!removeNonExisingRootKeys)
return;
var data = this.data;
var hasChanges = false;
for (var key in data) {
if (!!this.getQuestionByValueName(key))
continue;
var calcValue = this.getCalculatedValueByName(key);
if (!!calcValue && calcValue.includeIntoResult)
continue;
hasChanges = true;
delete data[key];
}
if (hasChanges) {
this.data = data;
}
};
Object.defineProperty(SurveyModel.prototype, "locale", {
/**
* Gets or sets the survey locale. The default value it is empty, this means the 'en' locale is used.
* You can set it to 'de' - German, 'fr' - French and so on. The library has built-in localization for several languages. The library has a multi-language support as well.
*/
get: function () {
return this.localeValue;
},
set: function (value) {
__WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].currentLocale = value;
this.localeValue = __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].currentLocale;
this.setPropertyValue("locale", this.localeValue);
if (this.isLoadingFromJson)
return;
this.locStrsChanged();
this.onLocaleChanged();
this.onLocaleChangedEvent.fire(this, value);
},
enumerable: true,
configurable: true
});
/**
* Returns an array of locales that are used in the survey's translation.
*/
SurveyModel.prototype.getUsedLocales = function () {
var locs = new Array();
this.addUsedLocales(locs);
//Replace the default locale with the real one
var index = locs.indexOf("default");
if (index > -1) {
var defaultLoc = __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].defaultLocale;
//Remove the defaultLoc
var defIndex = locs.indexOf(defaultLoc);
if (defIndex > -1) {
locs.splice(defIndex, 1);
}
index = locs.indexOf("default");
locs[index] = defaultLoc;
}
return locs;
};
SurveyModel.prototype.onLocaleChanged = function () { };
//ILocalizableOwner
SurveyModel.prototype.getLocale = function () {
return this.locale;
};
SurveyModel.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
this.updateProgressText();
if (this.isStartedState && this.startedPage) {
this.startedPage.locStrsChanged();
}
if (this.currentPage) {
this.currentPage.locStrsChanged();
}
};
SurveyModel.prototype.getMarkdownHtml = function (text) {
return this.getSurveyMarkdownHtml(this, text);
};
SurveyModel.prototype.getProcessedText = function (text) {
return this.processText(text, true);
};
SurveyModel.prototype.getLocString = function (str) {
return __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].getString(str);
};
//ISurveyErrorOwner
SurveyModel.prototype.getErrorCustomText = function (text, error) {
var options = { text: text, name: error.getErrorType(), error: error };
this.onErrorCustomText.fire(this, options);
return options.text;
};
Object.defineProperty(SurveyModel.prototype, "emptySurveyText", {
/**
* Returns the text that is displayed when there are no any visible pages and questiona.
*/
get: function () {
return this.getLocString("emptySurvey");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "title", {
/**
* Gets or sets a survey title.
* @see description
*/
get: function () {
return this.getLocalizableStringText("title");
},
set: function (value) {
this.setLocalizableStringText("title", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locTitle", {
get: function () {
return this.getLocalizableString("title");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "description", {
/**
* Gets or sets a survey description. The survey description is displayed under a survey title.
* @see title
*/
get: function () {
return this.getLocalizableStringText("description");
},
set: function (value) {
this.setLocalizableStringText("description", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locDescription", {
get: function () {
return this.getLocalizableString("description");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "logo", {
/**
* Gets or sets a survey logo.
* @see title
*/
get: function () {
return this.getLocalizableStringText("logo");
},
set: function (value) {
this.setLocalizableStringText("logo", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locLogo", {
get: function () {
return this.getLocalizableString("logo");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "logoWidth", {
/**
* Gets or sets a survey logo width.
* @see logo
*/
get: function () {
return this.getPropertyValue("logoWidth", 300);
},
set: function (value) {
this.setPropertyValue("logoWidth", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "logoHeight", {
/**
* Gets or sets a survey logo height.
* @see logo
*/
get: function () {
return this.getPropertyValue("logoHeight", 200);
},
set: function (value) {
this.setPropertyValue("logoHeight", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "logoPosition", {
/**
* Gets or sets a survey logo position.
* @see logo
*/
get: function () {
return this.getPropertyValue("logoPosition", "left");
},
set: function (value) {
this.setPropertyValue("logoPosition", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "hasLogo", {
get: function () {
return !!this.logo && this.logoPosition !== "none";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isLogoBefore", {
get: function () {
return (this.hasLogo &&
(this.logoPosition === "left" || this.logoPosition === "top"));
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isLogoAfter", {
get: function () {
return (this.hasLogo &&
(this.logoPosition === "right" || this.logoPosition === "bottom"));
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "logoClassNames", {
get: function () {
var logoClasses = {
left: "sv-logo--left",
right: "sv-logo--right",
top: "sv-logo--top",
bottom: "sv-logo--bottom",
};
return this.css.logo + " " + logoClasses[this.logoPosition];
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "logoFit", {
/**
* The logo fit mode.
* @see logo
*/
get: function () {
return this.getPropertyValue("logoFit");
},
set: function (val) {
this.setPropertyValue("logoFit", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedHtml", {
/**
* Gets or sets the HTML content displayed on the complete page. Use this property to change the default complete page text.
* @see showCompletedPage
* @see completedHtmlOnCondition
* @see locale
*/
get: function () {
return this.getLocalizableStringText("completedHtml");
},
set: function (value) {
this.setLocalizableStringText("completedHtml", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locCompletedHtml", {
get: function () {
return this.getLocalizableString("completedHtml");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedHtmlOnCondition", {
/**
* The list of HTML condition items. If the expression of this item returns `true`, then a survey will use this item HTML instead of `completedHtml`.
* @see HtmlConditionItem
* @see completeHtml
*/
get: function () {
return this.getPropertyValue("completedHtmlOnCondition");
},
set: function (val) {
this.setPropertyValue("completedHtmlOnCondition", val);
},
enumerable: true,
configurable: true
});
/**
* Calculates a given expression and returns a result value.
* @param expression
*/
SurveyModel.prototype.runExpression = function (expression) {
if (!expression)
return null;
var values = this.getFilteredValues();
var properties = this.getFilteredProperties();
return new __WEBPACK_IMPORTED_MODULE_14__conditions__["a" /* ExpressionRunner */](expression).run(values, properties);
};
/**
* Calculates a given expression and returns `true` or `false`.
* @param expression
*/
SurveyModel.prototype.runCondition = function (expression) {
if (!expression)
return false;
var values = this.getFilteredValues();
var properties = this.getFilteredProperties();
return new __WEBPACK_IMPORTED_MODULE_14__conditions__["b" /* ConditionRunner */](expression).run(values, properties);
};
/**
* Run all triggers that performs on value changed and not on moving to the next page.
*/
SurveyModel.prototype.runTriggers = function () {
this.checkTriggers(this.data, false);
};
Object.defineProperty(SurveyModel.prototype, "renderedCompletedHtml", {
get: function () {
var item = this.getExpressionItemOnRunCondition(this.completedHtmlOnCondition);
return !!item ? item.html : this.completedHtml;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getExpressionItemOnRunCondition = function (items) {
if (items.length == 0)
return null;
var values = this.getFilteredValues();
var properties = this.getFilteredProperties();
for (var i = 0; i < items.length; i++) {
if (items[i].runCondition(values, properties)) {
return items[i];
}
}
return null;
};
Object.defineProperty(SurveyModel.prototype, "completedBeforeHtml", {
/**
* The HTML content displayed to an end user that has already completed the survey.
* @see clientId
* @see locale
*/
get: function () {
return this.getLocalizableStringText("completedBeforeHtml");
},
set: function (value) {
this.setLocalizableStringText("completedBeforeHtml", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locCompletedBeforeHtml", {
get: function () {
return this.getLocalizableString("completedBeforeHtml");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "loadingHtml", {
/**
* The HTML that shows on loading survey Json from the [api.surveyjs.io](https://api.surveyjs.io) service.
* @see surveyId
* @see locale
*/
get: function () {
return this.getLocalizableStringText("loadingHtml");
},
set: function (value) {
this.setLocalizableStringText("loadingHtml", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locLoadingHtml", {
get: function () {
return this.getLocalizableString("loadingHtml");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "startSurveyText", {
/**
* Gets or sets the 'Start' button caption.
* The 'Start' button is shown on the started page. Set the `firstPageIsStarted` property to `true`, to display the started page.
* @see firstPageIsStarted
* @see locale
*/
get: function () {
return this.getLocalizableStringText("startSurveyText", this.getLocString("startSurveyText"));
},
set: function (newValue) {
this.setLocalizableStringText("startSurveyText", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locStartSurveyText", {
get: function () {
return this.getLocalizableString("startSurveyText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "pagePrevText", {
/**
* Gets or sets the 'Prev' button caption.
* @see locale
*/
get: function () {
return this.getLocalizableStringText("pagePrevText", this.getLocString("pagePrevText"));
},
set: function (newValue) {
this.setLocalizableStringText("pagePrevText", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locPagePrevText", {
get: function () {
return this.getLocalizableString("pagePrevText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "pageNextText", {
/**
* Gets or sets the 'Next' button caption.
* @see locale
*/
get: function () {
return this.getLocalizableStringText("pageNextText", this.getLocString("pageNextText"));
},
set: function (newValue) {
this.setLocalizableStringText("pageNextText", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locPageNextText", {
get: function () {
return this.getLocalizableString("pageNextText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completeText", {
/**
* Gets or sets the 'Complete' button caption.
* @see locale
*/
get: function () {
return this.getLocalizableStringText("completeText", this.getLocString("completeText"));
},
set: function (newValue) {
this.setLocalizableStringText("completeText", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locCompleteText", {
get: function () {
return this.getLocalizableString("completeText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "previewText", {
/**
* Gets or sets the 'Preview' button caption.
* @see locale
* @see showPreviewBeforeComplete
* @see editText
* @see showPreview
*/
get: function () {
return this.getLocalizableStringText("previewText", this.getLocString("previewText"));
},
set: function (newValue) {
this.setLocalizableStringText("previewText", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locPreviewText", {
get: function () {
return this.getLocalizableString("previewText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "editText", {
/**
* Gets or sets the 'Edit' button caption.
* @see locale
* @see showPreviewBeforeComplete
* @see previewText
* @see cancelPreview
*/
get: function () {
return this.getLocalizableStringText("editText", this.getLocString("editText"));
},
set: function (newValue) {
this.setLocalizableStringText("editText", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "locEditText", {
get: function () {
return this.getLocalizableString("editText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionTitlePattern", {
/**
* Set the pattern for question title. Default is "numTitleRequire", 1. What is your name? *,
* You can set it to numRequireTitle: 1. * What is your name?
* You can set it to requireNumTitle: * 1. What is your name?
* You can set it to numTitle (remove require symbol completely): 1. What is your name?
* @see QuestionModel.title
*/
get: function () {
return this.getPropertyValue("questionTitlePattern", "numTitleRequire");
},
set: function (val) {
if (val !== "numRequireTitle" &&
val !== "requireNumTitle" &&
val != "numTitle") {
val = "numTitleRequire";
}
this.setPropertyValue("questionTitlePattern", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getQuestionTitlePatternOptions = function () {
var res = new Array();
var title = this.getLocString("questionTitlePatternText");
var num = !!this.questionStartIndex ? this.questionStartIndex : "1.";
res.push({
value: "numTitleRequire",
text: num + " " + title + " " + this.requiredText,
});
res.push({
value: "numRequireTitle",
text: num + " " + this.requiredText + " " + title,
});
res.push({
value: "requireNumTitle",
text: this.requiredText + " " + num + " " + title,
});
res.push({
value: "numTitle",
text: num + " " + title,
});
return res;
};
Object.defineProperty(SurveyModel.prototype, "questionTitleTemplate", {
/**
* Gets or sets a question title template. Obsolete, please use questionTitlePattern
* @see QuestionModel.title
* @see questionTitlePattern
*/
get: function () {
return this.getLocalizableStringText("questionTitleTemplate");
},
set: function (value) {
this.setLocalizableStringText("questionTitleTemplate", value);
this.questionTitlePattern = this.getNewTitlePattern(value);
this.questionStartIndex = this.getNewQuestionTitleElement(value, "no", this.questionStartIndex, "1");
this.requiredText = this.getNewQuestionTitleElement(value, "require", this.requiredText, "*");
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getNewTitlePattern = function (template) {
if (!!template) {
var strs = [];
while (template.indexOf("{") > -1) {
template = template.substr(template.indexOf("{") + 1);
var ind = template.indexOf("}");
if (ind < 0)
break;
strs.push(template.substr(0, ind));
template = template.substr(ind + 1);
}
if (strs.length > 1) {
if (strs[0] == "require")
return "requireNumTitle";
if (strs[1] == "require" && strs.length == 3)
return "numRequireTitle";
if (strs.indexOf("require") < 0)
return "numTitle";
}
if (strs.length == 1 && strs[0] == "title") {
return "numTitle";
}
}
return "numTitleRequire";
};
SurveyModel.prototype.getNewQuestionTitleElement = function (template, name, currentValue, defaultValue) {
name = "{" + name + "}";
if (!template || template.indexOf(name) < 0)
return currentValue;
var ind = template.indexOf(name);
var prefix = "";
var postfix = "";
var i = ind - 1;
for (; i >= 0; i--) {
if (template[i] == "}")
break;
}
if (i < ind - 1) {
prefix = template.substr(i + 1, ind - i - 1);
}
ind += name.length;
i = ind;
for (; i < template.length; i++) {
if (template[i] == "{")
break;
}
if (i > ind) {
postfix = template.substr(ind, i - ind);
}
i = 0;
while (i < prefix.length && prefix.charCodeAt(i) < 33)
i++;
prefix = prefix.substr(i);
i = postfix.length - 1;
while (i >= 0 && postfix.charCodeAt(i) < 33)
i--;
postfix = postfix.substr(0, i + 1);
if (!prefix && !postfix)
return currentValue;
var value = !!currentValue ? currentValue : defaultValue;
return prefix + value + postfix;
};
Object.defineProperty(SurveyModel.prototype, "locQuestionTitleTemplate", {
get: function () {
return this.getLocalizableString("questionTitleTemplate");
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getUpdatedQuestionTitle = function (question, title) {
if (this.onGetQuestionTitle.isEmpty)
return title;
var options = { question: question, title: title };
this.onGetQuestionTitle.fire(this, options);
return options.title;
};
SurveyModel.prototype.getUpdatedQuestionNo = function (question, no) {
if (this.onGetQuestionNo.isEmpty)
return no;
var options = { question: question, no: no };
this.onGetQuestionNo.fire(this, options);
return options.no;
};
Object.defineProperty(SurveyModel.prototype, "showPageNumbers", {
/**
* Gets or sets whether the survey displays page numbers on pages titles.
*/
get: function () {
return this.getPropertyValue("showPageNumbers", false);
},
set: function (value) {
if (value === this.showPageNumbers)
return;
this.setPropertyValue("showPageNumbers", value);
this.updateVisibleIndexes();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showQuestionNumbers", {
/**
* Gets or sets a value that specifies how the question numbers are displayed.
*
* The following options are available:
*
* - `on` - display question numbers
* - `onpage` - display question numbers, start numbering on every page
* - `off` - turn off the numbering for questions titles
*/
get: function () {
return this.getPropertyValue("showQuestionNumbers");
},
set: function (value) {
value = value.toLowerCase();
value = value === "onpage" ? "onPage" : value;
if (value === this.showQuestionNumbers)
return;
this.setPropertyValue("showQuestionNumbers", value);
this.updateVisibleIndexes();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showProgressBar", {
/**
* Gets or sets the survey progress bar position.
*
* The following options are available:
*
* - `top` - show progress bar in the top
* - `bottom` - show progress bar in the bottom
* - `both` - show progress bar in both sides: top and bottom.
*/
get: function () {
return this.getPropertyValue("showProgressBar");
},
set: function (newValue) {
this.setPropertyValue("showProgressBar", newValue.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "progressBarType", {
/**
* Gets or sets the type of info in the progress bar.
*
* The following options are available:
*
* - `pages` (default),
* - `questions`,
* - `requiredQuestions`,
* - `correctQuestions`.
*/
get: function () {
return this.getPropertyValue("progressBarType");
},
set: function (newValue) {
this.setPropertyValue("progressBarType", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isShowProgressBarOnTop", {
get: function () {
return this.showProgressBar === "top" || this.showProgressBar === "both";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isShowProgressBarOnBottom", {
get: function () {
return this.showProgressBar === "bottom" || this.showProgressBar === "both";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "processedTitle", {
/**
* Returns the text/HTML that is rendered as a survey title.
*/
get: function () {
return this.locTitle.renderedHtml;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionTitleLocation", {
/**
* Gets or sets the question title location.
*
* The following options are available:
*
* - `bottom` - show a question title to bottom
* - `left` - show a question title to left
* - `top` - show a question title to top.
*
* > Some questions, for example matrixes, do not support 'left' value. The title for them will be displayed to the top.
*/
get: function () {
return this.getPropertyValue("questionTitleLocation");
},
set: function (value) {
this.setPropertyValue("questionTitleLocation", value.toLowerCase());
if (!this.isLoadingFromJson) {
this.updateElementCss();
}
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.updateElementCss = function () {
var pages = this.visiblePages;
for (var i = 0; i < pages.length; i++) {
pages[i].updateElementCss();
}
};
Object.defineProperty(SurveyModel.prototype, "questionErrorLocation", {
/**
* Gets or sets the error message position.
*
* The following options are available:
*
* - `top` - to show question error(s) over the question,
* - `bottom` - to show question error(s) under the question.
*/
get: function () {
return this.getPropertyValue("questionErrorLocation");
},
set: function (value) {
this.setPropertyValue("questionErrorLocation", value.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionDescriptionLocation", {
/**
* Gets or sets the question description position.
*
* The following options are available:
*
* - `underTitle` - show question description under the question title,
* - `underInput` - show question description under the question input instead of question title.
*/
get: function () {
return this.getPropertyValue("questionDescriptionLocation");
},
set: function (value) {
this.setPropertyValue("questionDescriptionLocation", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "mode", {
/**
* Gets or sets the survey edit mode.
*
* The following options are available:
*
* - `edit` (default) - make a survey editable,
* - `display` - make a survey read-only.
*/
get: function () {
return this.getPropertyValue("mode");
},
set: function (value) {
value = value.toLowerCase();
if (value == this.mode)
return;
if (value != "edit" && value != "display")
return;
this.setPropertyValue("mode", value);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.onModeChanged = function () {
for (var i = 0; i < this.pages.length; i++) {
var page = this.pages[i];
page.setPropertyValue("isReadOnly", page.isReadOnly);
}
};
Object.defineProperty(SurveyModel.prototype, "data", {
/**
* Gets or sets an object that stores the survey results/data. You can set it directly as `{ 'question name': questionValue, ... }`
*
* > If you set the `data` property after creating the survey, you may need to set the `currentPageNo` to `0`, if you are using `visibleIf` properties for questions/pages/panels to ensure that you are starting from the first page.
* @see setValue
* @see getValue
* @see mergeData
* @see currentPageNo
*/
get: function () {
var result = {};
var keys = this.getValuesKeys();
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
var dataValue = this.getDataValueCore(this.valuesHash, key);
if (dataValue !== undefined) {
result[key] = dataValue;
}
}
this.setCalcuatedValuesIntoResult(result);
return result;
},
set: function (data) {
this.valuesHash = {};
this.setDataCore(data);
},
enumerable: true,
configurable: true
});
/**
* Merge the values into survey.data. It works as survey.data, except it doesn't clean the existing data, but overrides them.
* @param data data to merge. It should be an object {keyValue: Value, ...}
* @see data
* @see setValue
*/
SurveyModel.prototype.mergeData = function (data) {
if (!data)
return;
this.setDataCore(data);
};
SurveyModel.prototype.setDataCore = function (data) {
if (data) {
for (var key in data) {
this.setDataValueCore(this.valuesHash, key, data[key]);
}
}
this.updateAllQuestionsValue();
this.notifyAllQuestionsOnValueChanged();
this.notifyElementsOnAnyValueOrVariableChanged("");
this.runConditions();
};
Object.defineProperty(SurveyModel.prototype, "editingObj", {
get: function () {
return this.editingObjValue;
},
set: function (val) {
var _this = this;
if (this.editingObj == val)
return;
if (!!this.editingObj) {
this.editingObj.onPropertyChanged.remove(this.onEditingObjPropertyChanged);
}
this.editingObjValue = val;
this.setDataCore({});
if (!!this.editingObj) {
this.onEditingObjPropertyChanged = function (sender, options) {
_this.updateOnSetValue(options.name, options.newValue);
};
this.editingObj.onPropertyChanged.add(this.onEditingObjPropertyChanged);
}
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.setCalcuatedValuesIntoResult = function (result) {
for (var i = 0; i < this.calculatedValues.length; i++) {
var calValue = this.calculatedValues[i];
if (calValue.includeIntoResult &&
!!calValue.name &&
this.getVariable(calValue.name) !== undefined) {
result[calValue.name] = this.getVariable(calValue.name);
}
}
};
SurveyModel.prototype.getAllValues = function () {
return this.data;
};
/**
* Returns survey result data as an array of plain objects: with question `title`, `name`, `value`, and `displayValue`.
*
* For complex questions (like matrix, etc.) `isNode` flag is set to `true` and data contains array of nested objects (rows).
*
* Set `options.includeEmpty` to `false` if you want to skip empty answers.
*/
SurveyModel.prototype.getPlainData = function (options) {
if (options === void 0) { options = {
includeEmpty: true,
includeQuestionTypes: false,
}; }
var result = [];
this.getAllQuestions().forEach(function (question) {
var resultItem = question.getPlainData(options);
if (!!resultItem) {
result.push(resultItem);
}
});
return result;
};
SurveyModel.prototype.getFilteredValues = function () {
var values = {};
for (var key in this.variablesHash)
values[key] = this.variablesHash[key];
var keys = this.getValuesKeys();
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
values[key] = this.getDataValueCore(this.valuesHash, key);
}
return values;
};
SurveyModel.prototype.getFilteredProperties = function () {
return { survey: this };
};
SurveyModel.prototype.getValuesKeys = function () {
if (!this.editingObj)
return Object.keys(this.valuesHash);
var props = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].getPropertiesByObj(this.editingObj);
var res = [];
for (var i = 0; i < props.length; i++) {
res.push(props[i].name);
}
return res;
};
SurveyModel.prototype.getDataValueCore = function (valuesHash, key) {
if (!!this.editingObj)
return this.editingObj.getPropertyValue(key);
return valuesHash[key];
};
SurveyModel.prototype.setDataValueCore = function (valuesHash, key, value) {
if (!!this.editingObj) {
this.editingObj[key] = value;
}
else {
valuesHash[key] = value;
}
};
SurveyModel.prototype.deleteDataValueCore = function (valuesHash, key) {
if (!!this.editingObj) {
this.editingObj[key] = null;
}
else {
delete valuesHash[key];
}
};
Object.defineProperty(SurveyModel.prototype, "comments", {
/**
* Returns all comments from the data.
* @see data
*/
get: function () {
var result = {};
var keys = this.getValuesKeys();
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (key.indexOf(this.commentPrefix) > 0) {
result[key] = this.getDataValueCore(this.valuesHash, key);
}
}
return result;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "visiblePages", {
/**
* Returns a list of visible pages. If all pages are visible, then this property returns the same list as the `pages` property.
* @see pages
* @see PageModel.visible
* @see PageModel.visibleIf
*/
get: function () {
if (this.isDesignMode)
return this.pages;
var result = new Array();
for (var i = 0; i < this.pages.length; i++) {
if (this.pages[i].isVisible) {
result.push(this.pages[i]);
}
}
return result;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isEmpty", {
/**
* Returns `true` if the survey contains no pages. The survey is empty.
*/
get: function () {
return this.pages.length == 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "PageCount", {
/**
* Deprecated. Use the `pageCount` property instead.
*/
get: function () {
return this.pageCount;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "pageCount", {
/**
* Returns the survey page count.
* @see visiblePageCount
* @see pages
*/
get: function () {
return this.pages.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "visiblePageCount", {
/**
* Returns a number of visible pages within the survey.
* @see pageCount
* @see visiblePages
*/
get: function () {
return this.visiblePages.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "startedPage", {
/**
* Returns the started page. This property works if the `firstPageIsStarted` property is set to `true`.
* @see firstPageIsStarted
*/
get: function () {
var page = this.firstPageIsStarted && this.pages.length > 0 ? this.pages[0] : null;
if (!!page) {
page.onFirstRendering();
page.setWasShown(true);
}
return page;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "currentPage", {
/**
* Gets or sets the current survey page. If a survey is rendered, then this property returns a page that a user can see/edit.
*/
get: function () {
var vPages = this.visiblePages;
if (this.currentPageValue != null) {
if (vPages.indexOf(this.currentPageValue) < 0) {
if (!this.onContainsPageCallback ||
!this.onContainsPageCallback(this.currentPageValue)) {
this.currentPage = null;
}
}
}
if (this.currentPageValue == null && vPages.length > 0) {
this.currentPage = vPages[0];
}
return this.currentPageValue;
},
set: function (value) {
var newPage = this.getPageByObject(value);
if (!!value && !newPage)
return;
var vPages = this.visiblePages;
if (newPage != null && vPages.indexOf(newPage) < 0)
return;
if (newPage == this.currentPageValue)
return;
var oldValue = this.currentPageValue;
if (!this.currentPageChanging(newPage, oldValue))
return;
if (!!newPage) {
newPage.onFirstRendering();
}
this.currentPageValue = newPage;
if (!!newPage) {
newPage.updateCustomWidgets();
newPage.setWasShown(true);
}
this.locStrsChanged();
this.currentPageChanged(newPage, oldValue);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getPageByObject = function (value) {
if (!value)
return null;
if (value.getType && value.getType() == "page")
return value;
if (typeof value === "string" || value instanceof String)
return this.getPageByName(String(value));
if (!isNaN(value)) {
var index = Number(value);
var vPages = this.visiblePages;
if (value < 0 || value >= vPages.length)
return null;
return vPages[index];
}
return value;
};
Object.defineProperty(SurveyModel.prototype, "currentPageNo", {
/**
* The zero-based index of the current page in the visible pages array.
*/
get: function () {
return this.visiblePages.indexOf(this.currentPage);
},
set: function (value) {
var vPages = this.visiblePages;
if (value < 0 || value >= vPages.length)
return;
this.currentPage = vPages[value];
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionsOrder", {
/**
* Gets or sets the question display order. Use this property to randomize questions. You can randomize questions on a specific page.
*
* The following options are available:
*
* - `random` - randomize questions
* - `initial` - keep questions in the same order, as in a survey model.
* @see SurveyPage.questionsOrder
*/
get: function () {
return this.getPropertyValue("questionsOrder");
},
set: function (val) {
this.setPropertyValue("questionsOrder", val);
},
enumerable: true,
configurable: true
});
/**
* Sets the input focus to the first question with the input field.
*/
SurveyModel.prototype.focusFirstQuestion = function () {
var page = this.currentPage;
if (page) {
page.scrollToTop();
page.focusFirstQuestion();
}
};
SurveyModel.prototype.scrollToTopOnPageChange = function () {
var page = this.currentPage;
if (!page)
return;
page.scrollToTop();
if (this.focusFirstQuestionAutomatic) {
page.focusFirstQuestion();
}
};
Object.defineProperty(SurveyModel.prototype, "state", {
/**
* Returns the current survey state:
*
* - `loading` - loading from the JSON,
* - `completed` - a user has completed the survey,
* - `starting` - the started page is showing,
* - `running` - a user answers questions right now,
* - `empty` - there is nothing to show in the current survey.
*/
get: function () {
if (this.isLoading)
return "loading";
if (this.isCompleted)
return "completed";
if (this.isCompletedBefore)
return "completedbefore";
if (!this.isDesignMode &&
this.isEditMode &&
this.isStartedState &&
this.startedPage)
return "starting";
if (this.isShowingPreview)
return this.currentPage ? "preview" : "empty";
return this.currentPage ? "running" : "empty";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isCompleted", {
get: function () {
return this.getPropertyValue("isCompleted", false);
},
set: function (val) {
this.setPropertyValue("isCompleted", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isShowingPreview", {
get: function () {
return this.getPropertyValue("isShowingPreview", false);
},
set: function (val) {
if (this.isShowingPreview == val)
return;
this.setPropertyValue("isShowingPreview", val);
this.onShowingPreviewChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isStartedState", {
get: function () {
return this.getPropertyValue("isStartedState", false);
},
set: function (val) {
this.setPropertyValue("isStartedState", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isCompletedBefore", {
get: function () {
return this.getPropertyValue("isCompletedBefore", false);
},
set: function (val) {
this.setPropertyValue("isCompletedBefore", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isLoading", {
get: function () {
return this.getPropertyValue("isLoading", false);
},
set: function (val) {
this.setPropertyValue("isLoading", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedState", {
get: function () {
return this.completedStateValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "completedStateText", {
get: function () {
return this.completedStateTextValue;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.setCompletedState = function (value, text) {
this.completedStateValue = value;
if (!text) {
if (value == "saving")
text = this.getLocString("savingData");
if (value == "error")
text = this.getLocString("savingDataError");
if (value == "success")
text = this.getLocString("savingDataSuccess");
}
this.completedStateTextValue = text;
};
/**
* Clears the survey data and state. If the survey has a `completed` state, it will get a `running` state.
* @param clearData clear the data
* @param gotoFirstPage make the first page as a current page.
* @see data
* @see state
* @see currentPage
*/
SurveyModel.prototype.clear = function (clearData, gotoFirstPage) {
if (clearData === void 0) { clearData = true; }
if (gotoFirstPage === void 0) { gotoFirstPage = true; }
if (clearData) {
this.data = null;
this.variablesHash = {};
}
this.timeSpent = 0;
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].timeSpent = 0;
this.pages[i].setWasShown(false);
}
this.isCompleted = false;
this.isCompletedBefore = false;
this.isLoading = false;
this.isStartedState = this.firstPageIsStarted;
if (gotoFirstPage && this.visiblePageCount > 0) {
this.currentPage = this.visiblePages[0];
}
if (clearData) {
this.updateValuesWithDefaults();
}
};
SurveyModel.prototype.mergeValues = function (src, dest) {
if (!dest || !src)
return;
for (var key in src) {
var value = src[key];
if (value && typeof value === "object") {
if (!dest[key])
dest[key] = {};
this.mergeValues(value, dest[key]);
}
else {
dest[key] = value;
}
}
};
SurveyModel.prototype.updateValuesWithDefaults = function () {
if (this.isDesignMode || this.isLoading)
return;
for (var i = 0; i < this.pages.length; i++) {
var questions = this.pages[i].questions;
for (var j = 0; j < questions.length; j++) {
questions[j].updateValueWithDefaults();
}
}
};
SurveyModel.prototype.updateCustomWidgets = function (page) {
if (!page)
return;
page.updateCustomWidgets();
};
SurveyModel.prototype.currentPageChanging = function (newValue, oldValue) {
var options = {
oldCurrentPage: oldValue,
newCurrentPage: newValue,
allowChanging: true,
isNextPage: this.isNextPage(newValue, oldValue),
isPrevPage: this.isPrevPage(newValue, oldValue),
};
this.onCurrentPageChanging.fire(this, options);
return options.allowChanging;
};
SurveyModel.prototype.currentPageChanged = function (newValue, oldValue) {
this.onCurrentPageChanged.fire(this, {
oldCurrentPage: oldValue,
newCurrentPage: newValue,
isNextPage: this.isNextPage(newValue, oldValue),
isPrevPage: this.isPrevPage(newValue, oldValue),
});
};
SurveyModel.prototype.isNextPage = function (newValue, oldValue) {
if (!newValue || !oldValue)
return false;
return newValue.visibleIndex == oldValue.visibleIndex + 1;
};
SurveyModel.prototype.isPrevPage = function (newValue, oldValue) {
if (!newValue || !oldValue)
return false;
return newValue.visibleIndex + 1 == oldValue.visibleIndex;
};
/**
* Returns the progress that a user made while going through the survey.
* It depends from progressBarType property
* @see progressBarType
* @see progressValue
*/
SurveyModel.prototype.getProgress = function () {
if (this.currentPage == null)
return 0;
if (this.progressBarType !== "pages") {
var info = this.getProgressInfo();
if (this.progressBarType === "requiredQuestions") {
return info.requiredQuestionCount > 1
? Math.ceil((info.requiredAnsweredQuestionCount * 100) /
info.requiredQuestionCount)
: 100;
}
return info.questionCount > 1
? Math.ceil((info.answeredQuestionCount * 100) / info.questionCount)
: 100;
}
var index = this.visiblePages.indexOf(this.currentPage) + 1;
return Math.ceil((index * 100) / this.visiblePageCount);
};
Object.defineProperty(SurveyModel.prototype, "progressValue", {
/**
* Returns the progress that a user made while going through the survey.
* It depends from progressBarType property
* @see progressBarType
*/
get: function () {
return this.getPropertyValue("progressValue", 0);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isNavigationButtonsShowing", {
/**
* Returns the navigation buttons (i.e., 'Prev', 'Next', or 'Complete') position.
*/
get: function () {
if (this.isDesignMode)
return "none";
var page = this.currentPage;
if (!page)
return "none";
if (page.navigationButtonsVisibility === "show") {
return "bottom";
}
if (page.navigationButtonsVisibility === "hide") {
return "none";
}
return this.showNavigationButtons;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isEditMode", {
/**
* Returns `true` if the survey is in edit mode.
* @see mode
*/
get: function () {
return this.mode == "edit";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isCompleteButtonVisible", {
get: function () {
return (this.isEditMode &&
(!this.isShowPreviewBeforeComplete || this.state == "preview"));
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isPreviewButtonVisible", {
get: function () {
return (this.isEditMode &&
this.isShowPreviewBeforeComplete &&
this.state == "running");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isCancelPreviewButtonVisible", {
get: function () {
return (this.isEditMode &&
this.isShowPreviewBeforeComplete &&
this.state == "preview");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isDisplayMode", {
/**
* Returns `true` if the survey is in display mode or in preview mode.
* @see mode
* @see showPreviewBeforeComplete
*/
get: function () {
return this.mode == "display" || this.state == "preview";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isUpdateValueTextOnTyping", {
get: function () {
return this.textUpdateMode == "onTyping";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isDesignMode", {
/**
* Returns `true` if the survey is in design mode. It is used by SurveyJS Editor.
* @see setDesignMode
*/
get: function () {
return this._isDesignMode;
},
enumerable: true,
configurable: true
});
/**
* Sets the survey into design mode.
* @param value use true to set the survey into the design mode.
*/
SurveyModel.prototype.setDesignMode = function (value) {
this._isDesignMode = value;
this.onQuestionsOnPageModeChanged("standard");
};
Object.defineProperty(SurveyModel.prototype, "showInvisibleElements", {
/**
* Gets or sets whether to show all elements in the survey, regardless their visibility. The default value is `false`.
*/
get: function () {
return this.getPropertyValue("showInvisibleElements", false);
},
set: function (val) {
var visPages = this.visiblePages;
this.setPropertyValue("showInvisibleElements", val);
if (this.isLoadingFromJson)
return;
this.runConditions();
this.updateAllElementsVisibility(visPages);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.updateAllElementsVisibility = function (visPages) {
for (var i = 0; i < this.pages.length; i++) {
var page = this.pages[i];
page.updateElementVisibility();
if (visPages.indexOf(page) > -1 != page.isVisible) {
this.onPageVisibleChanged.fire(this, {
page: page,
visible: page.isVisible,
});
}
}
};
Object.defineProperty(SurveyModel.prototype, "areInvisibleElementsShowing", {
get: function () {
return this.isDesignMode || this.showInvisibleElements;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "areEmptyElementsHidden", {
get: function () {
return (this.isShowingPreview &&
this.showPreviewBeforeComplete == "showAnsweredQuestions");
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "hasCookie", {
/**
* Returns `true`, if a user has already completed the survey in this browser and there is a cookie about it. Survey goes to `completed` state if the function returns `true`.
* @see cookieName
* @see setCookie
* @see deleteCookie
* @see state
*/
get: function () {
if (!this.cookieName || typeof document === "undefined")
return false;
var cookies = document.cookie;
return cookies && cookies.indexOf(this.cookieName + "=true") > -1;
},
enumerable: true,
configurable: true
});
/**
* Set the cookie with `cookieName` in user's browser. It is done automatically on survey complete if the `cookieName` property value is not empty.
* @see cookieName
* @see hasCookie
* @see deleteCookie
*/
SurveyModel.prototype.setCookie = function () {
if (!this.cookieName || typeof document === "undefined")
return;
document.cookie =
this.cookieName + "=true; expires=Fri, 31 Dec 9999 0:0:0 GMT";
};
/**
* Deletes the cookie with `cookieName` from the browser.
* @see cookieName
* @see hasCookie
* @see setCookie
*/
SurveyModel.prototype.deleteCookie = function () {
if (!this.cookieName)
return;
document.cookie = this.cookieName + "=;";
};
/**
* Navigates user to the next page.
*
* Returns `false` in the following cases:
*
* - if the current page is the last page.
* - if the current page contains errors (for example, a required question is empty).
* @see isCurrentPageHasErrors
* @see prevPage
* @see completeLastPage
*/
SurveyModel.prototype.nextPage = function () {
if (this.isLastPage)
return false;
return this.doCurrentPageComplete(false);
};
SurveyModel.prototype.hasErrorsOnNavigate = function (doComplete) {
if (this.ignoreValidation || !this.isEditMode)
return false;
if (this.checkErrorsMode == "onComplete") {
if (!this.isLastPage)
return false;
if (this.hasErrors(true, true))
return true;
}
else {
if (this.isCurrentPageHasErrors)
return true;
}
return this.checkForAsyncQuestionValidation(doComplete);
};
SurveyModel.prototype.checkForAsyncQuestionValidation = function (doComplete) {
var _this = this;
this.clearAsyncValidationQuesitons();
var questions = this.currentPage.questions;
for (var i = 0; i < questions.length; i++) {
if (questions[i].isRunningValidators) {
questions[i].onCompletedAsyncValidators = function (hasErrors) {
_this.onCompletedAsyncQuestionValidators(doComplete, hasErrors);
};
this.asyncValidationQuesitons.push(questions[i]);
}
}
return this.asyncValidationQuesitons.length > 0;
};
SurveyModel.prototype.clearAsyncValidationQuesitons = function () {
if (!!this.asyncValidationQuesitons) {
var asynQuestions = this.asyncValidationQuesitons;
for (var i = 0; i < asynQuestions.length; i++) {
asynQuestions[i].onCompletedAsyncValidators = null;
}
}
this.asyncValidationQuesitons = [];
};
SurveyModel.prototype.onCompletedAsyncQuestionValidators = function (doComplete, hasErrors) {
if (hasErrors) {
this.clearAsyncValidationQuesitons();
return;
}
var asynQuestions = this.asyncValidationQuesitons;
for (var i = 0; i < asynQuestions.length; i++) {
if (asynQuestions[i].isRunningValidators)
return;
}
this.doCurrentPageCompleteCore(doComplete);
};
Object.defineProperty(SurveyModel.prototype, "isCurrentPageHasErrors", {
/**
* Returns `true`, if the current page contains errors, for example, the required question is empty or a question validation is failed.
* @see nextPage
*/
get: function () {
return this.checkIsCurrentPageHasErrors();
},
enumerable: true,
configurable: true
});
/**
* Returns `true`, if any of the survey pages contains errors.
* @param fireCallback set it to `true`, to show errors in UI.
* @param focusOnFirstError set it to `true` to focus on the first question that doesn't pass the validation and make the page, where the question is located, the current.
*/
SurveyModel.prototype.hasErrors = function (fireCallback, focusOnFirstError) {
if (fireCallback === void 0) { fireCallback = true; }
if (focusOnFirstError === void 0) { focusOnFirstError = false; }
var visPages = this.visiblePages;
var firstErrorPage = null;
var res = false;
for (var i = 0; i < visPages.length; i++) {
if (visPages[i].hasErrors(fireCallback, false)) {
if (!firstErrorPage)
firstErrorPage = visPages[i];
res = true;
}
}
if (focusOnFirstError && !!firstErrorPage) {
this.currentPage = firstErrorPage;
var questions = firstErrorPage.questions;
for (var i = 0; i < questions.length; i++) {
if (questions[i].errors.length > 0) {
questions[i].focus(true);
break;
}
}
}
return res;
};
/**
* Checks whether survey elements (pages, panels, and questions) have unique question names.
* You can check for unique names for individual page and panel (and all their elements) or a question.
* If the parameter is not specified, then a survey checks that all its elements have unique names.
* @param element page, panel or question, it is `null` by default, that means all survey elements will be checked
*/
SurveyModel.prototype.ensureUniqueNames = function (element) {
if (element === void 0) { element = null; }
if (element == null) {
for (var i = 0; i < this.pages.length; i++) {
this.ensureUniqueName(this.pages[i]);
}
}
else {
this.ensureUniqueName(element);
}
};
SurveyModel.prototype.ensureUniqueName = function (element) {
if (element.isPage) {
this.ensureUniquePageName(element);
}
if (element.isPanel) {
this.ensureUniquePanelName(element);
}
if (element.isPage || element.isPanel) {
var elements = element.elements;
for (var i = 0; i < elements.length; i++) {
this.ensureUniqueNames(elements[i]);
}
}
else {
this.ensureUniqueQuestionName(element);
}
};
SurveyModel.prototype.ensureUniquePageName = function (element) {
var _this = this;
return this.ensureUniqueElementName(element, function (name) {
return _this.getPageByName(name);
});
};
SurveyModel.prototype.ensureUniquePanelName = function (element) {
var _this = this;
return this.ensureUniqueElementName(element, function (name) {
return _this.getPanelByName(name);
});
};
SurveyModel.prototype.ensureUniqueQuestionName = function (element) {
var _this = this;
return this.ensureUniqueElementName(element, function (name) {
return _this.getQuestionByName(name);
});
};
SurveyModel.prototype.ensureUniqueElementName = function (element, getElementByName) {
var existingElement = getElementByName(element.name);
if (!existingElement || existingElement == element)
return;
var newName = this.getNewName(element.name);
while (!!getElementByName(newName)) {
var newName = this.getNewName(element.name);
}
element.name = newName;
};
SurveyModel.prototype.getNewName = function (name) {
var pos = name.length;
while (pos > 0 && name[pos - 1] >= "0" && name[pos - 1] <= "9") {
pos--;
}
var base = name.substr(0, pos);
var num = 0;
if (pos < name.length) {
num = parseInt(name.substr(pos));
}
num++;
return base + num;
};
SurveyModel.prototype.checkIsCurrentPageHasErrors = function (isFocuseOnFirstError) {
if (isFocuseOnFirstError === void 0) { isFocuseOnFirstError = undefined; }
return this.checkIsPageHasErrors(this.currentPage, isFocuseOnFirstError);
};
SurveyModel.prototype.checkIsPageHasErrors = function (page, isFocuseOnFirstError) {
if (isFocuseOnFirstError === void 0) { isFocuseOnFirstError = undefined; }
if (isFocuseOnFirstError === undefined) {
isFocuseOnFirstError = this.focusOnFirstError;
}
if (!page)
return true;
var res = page.hasErrors(true, isFocuseOnFirstError);
this.fireValidatedErrorsOnPage(page);
return res;
};
SurveyModel.prototype.fireValidatedErrorsOnPage = function (page) {
if (this.onValidatedErrorsOnCurrentPage.isEmpty || !page)
return;
var questionsOnPage = page.questions;
var questions = new Array();
var errors = new Array();
for (var i = 0; i < questionsOnPage.length; i++) {
var q = questionsOnPage[i];
if (q.errors.length > 0) {
questions.push(q);
for (var j = 0; j < q.errors.length; j++) {
errors.push(q.errors[j]);
}
}
}
this.onValidatedErrorsOnCurrentPage.fire(this, {
questions: questions,
errors: errors,
page: page,
});
};
/**
* Navigates user to a previous page. If the current page is the first page, `prevPage` returns `false`. `prevPage` does not perform any checks, required questions can be empty.
* @see isFirstPage
*/
SurveyModel.prototype.prevPage = function () {
if (this.isFirstPage)
return false;
this.resetNavigationButton();
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage);
this.currentPage = vPages[index - 1];
};
/**
* Completes the survey, if the current page is the last one. It returns `false` if the last page has errors.
* If the last page has no errors, `completeLastPage` calls `doComplete` and returns `true`.
* @see isCurrentPageHasErrors
* @see nextPage
* @see doComplete
*/
SurveyModel.prototype.completeLastPage = function () {
var res = this.doCurrentPageComplete(true);
if (res) {
this.cancelPreview();
}
return res;
};
SurveyModel.prototype.navigationMouseDown = function () {
this.isNavigationButtonPressed = true;
return true;
};
SurveyModel.prototype.resetNavigationButton = function () {
this.isNavigationButtonPressed = false;
};
/**
* Show preview for the survey. Go to the "preview" state
* @see showPreviewBeforeComplete
* @see cancelPreview
* @see state
*/
SurveyModel.prototype.showPreview = function () {
this.resetNavigationButton();
if (this.hasErrorsOnNavigate(true))
return false;
this.isShowingPreview = true;
return true;
};
/**
* Canel preview and go back to the "running" state.
* @param curPage - a new current page. If the parameter is underfined then the last page becomes current.
* @see showPreviewBeforeComplete
* @see showPreview
* @see state
*/
SurveyModel.prototype.cancelPreview = function (curPage) {
if (curPage === void 0) { curPage = null; }
if (!this.isShowingPreview)
return;
this.isShowingPreview = false;
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(curPage) && this.visiblePageCount > 0) {
curPage = this.visiblePageCount - 1;
}
if (curPage !== null) {
this.currentPage = curPage;
}
};
SurveyModel.prototype.cancelPreviewByPage = function (panel) {
this.cancelPreview(panel["originalPage"]);
};
SurveyModel.prototype.doCurrentPageComplete = function (doComplete) {
this.resetNavigationButton();
if (this.hasErrorsOnNavigate(doComplete))
return false;
return this.doCurrentPageCompleteCore(doComplete);
};
SurveyModel.prototype.doCurrentPageCompleteCore = function (doComplete) {
if (this.doServerValidation(doComplete))
return false;
if (doComplete) {
this.doComplete();
}
else {
this.doNextPage();
}
return true;
};
Object.defineProperty(SurveyModel.prototype, "isSinglePage", {
/**
* Obsolete use the `questionsOnPageMode` property instead.
* @see questionsOnPageMode
*/
get: function () {
return this.questionsOnPageMode == "singlePage";
},
set: function (val) {
this.questionsOnPageMode = val ? "singlePage" : "standard";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "questionsOnPageMode", {
/**
* Gets or sets a value that specifies how the survey combines questions, panels, and pages.
*
* The following options are available:
*
* - `singlePage` - combine all survey pages in a single page. Pages will be converted to panels.
* - `questionPerPage` - show one question per page. Survey will create a separate page for every question.
*/
get: function () {
return this.getPropertyValue("questionsOnPageMode", "standard");
},
set: function (val) {
this.setPropertyValue("questionsOnPageMode", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "firstPageIsStarted", {
/**
* Gets or sets whether the first survey page is a start page. Set this property to `true`, to make the first page a starting page.
* An end user cannot navigate to the start page and the start page does not affect a survey progress.
*/
get: function () {
return this.getPropertyValue("firstPageIsStarted", false);
},
set: function (val) {
this.setPropertyValue("firstPageIsStarted", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.isPageStarted = function (page) {
return (this.firstPageIsStarted && this.pages.length > 0 && this.pages[0] === page);
};
Object.defineProperty(SurveyModel.prototype, "showPreviewBeforeComplete", {
/**
* Set this property to "showAllQuestions" or "showAnsweredQuestions" to preview results to a user before he/she completes the survey.
*/
get: function () {
return this.getPropertyValue("showPreviewBeforeComplete", "noPreview");
},
set: function (val) {
this.setPropertyValue("showPreviewBeforeComplete", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isShowPreviewBeforeComplete", {
get: function () {
var preview = this.showPreviewBeforeComplete;
return preview == "showAllQuestions" || preview == "showAnsweredQuestions";
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.onFirstPageIsStartedChanged = function () {
if (this.pages.length == 0)
return;
this.isStartedState = this.firstPageIsStarted;
this.pageVisibilityChanged(this.pages[0], !this.firstPageIsStarted);
};
SurveyModel.prototype.onShowingPreviewChanged = function () {
if (this.isDesignMode)
return;
if (this.isShowingPreview) {
this.runningPages = this.pages.slice(0, this.pages.length);
this.setupPagesForPageModes(true);
}
else {
if (this.runningPages) {
this.restoreOrigionalPages(this.runningPages);
}
this.runningPages = null;
}
this.updateAllElementsVisibility(this.pages);
this.updateVisibleIndexes();
this.currentPageNo = 0;
};
SurveyModel.prototype.onQuestionsOnPageModeChanged = function (oldValue) {
if (this.isShowingPreview)
return;
if (this.questionsOnPageMode == "standard" || this.isDesignMode) {
if (this.origionalPages) {
this.restoreOrigionalPages(this.origionalPages);
}
this.origionalPages = null;
}
else {
if (!oldValue || oldValue == "standard") {
this.origionalPages = this.pages.slice(0, this.pages.length);
}
this.setupPagesForPageModes(this.isSinglePage);
}
this.updateVisibleIndexes();
};
SurveyModel.prototype.restoreOrigionalPages = function (originalPages) {
this.questionHashesClear();
this.pages.splice(0, this.pages.length);
for (var i = 0; i < originalPages.length; i++) {
this.pages.push(originalPages[i]);
}
};
SurveyModel.prototype.setupPagesForPageModes = function (isSinglePage) {
this.questionHashesClear();
var startIndex = this.firstPageIsStarted ? 1 : 0;
_super.prototype.startLoadingFromJson.call(this);
var newPages = this.createPagesForQuestionOnPageMode(isSinglePage, startIndex);
var deletedLen = this.pages.length - startIndex;
this.pages.splice(startIndex, deletedLen);
for (var i = 0; i < newPages.length; i++) {
this.pages.push(newPages[i]);
}
_super.prototype.endLoadingFromJson.call(this);
for (var i = 0; i < newPages.length; i++) {
newPages[i].endLoadingFromJson();
newPages[i].setSurveyImpl(this);
}
this.doElementsOnLoad();
};
SurveyModel.prototype.createPagesForQuestionOnPageMode = function (isSinglePage, startIndex) {
if (isSinglePage) {
return [this.createSinglePage(startIndex)];
}
return this.createPagesForEveryQuestion(startIndex);
};
SurveyModel.prototype.createSinglePage = function (startIndex) {
var single = this.createNewPage("all");
single.setSurveyImpl(this);
for (var i = startIndex; i < this.pages.length; i++) {
var page = this.pages[i];
var panel = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].createClass("panel");
panel.originalPage = page;
single.addPanel(panel);
var json = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* JsonObject */]().toJsonObject(page);
new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* JsonObject */]().toObject(json, panel);
if (!this.showPageTitles) {
panel.title = "";
}
}
return single;
};
SurveyModel.prototype.createPagesForEveryQuestion = function (startIndex) {
var res = [];
for (var i = startIndex; i < this.pages.length; i++) {
var originalPage = this.pages[i];
// Initialize randomization
originalPage.setWasShown(true);
for (var j = 0; j < originalPage.elements.length; j++) {
var originalElement = originalPage.elements[j];
var element = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].createClass(originalElement.getType());
if (!element)
continue;
var jsonObj = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* JsonObject */]();
//Deserialize page properties only, excluding elements
jsonObj.lightSerializing = true;
var pageJson = jsonObj.toJsonObject(originalPage);
var page = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].createClass(originalPage.getType());
page.fromJSON(pageJson);
page.name = "page" + (res.length + 1);
page.setSurveyImpl(this);
res.push(page);
var json = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* JsonObject */]().toJsonObject(originalElement);
new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* JsonObject */]().toObject(json, element);
page.addElement(element);
for (var k = 0; k < page.questions.length; k++) {
this.questionHashesAdded(page.questions[k]);
}
}
}
return res;
};
Object.defineProperty(SurveyModel.prototype, "isFirstPage", {
/**
* Gets whether the current page is the first one.
*/
get: function () {
if (this.currentPage == null)
return true;
return this.visiblePages.indexOf(this.currentPage) == 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isShowPrevButton", {
get: function () {
if (this.isFirstPage || !this.showPrevButton)
return false;
var page = this.visiblePages[this.currentPageNo - 1];
return this.getPageMaxTimeToFinish(page) <= 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isLastPage", {
/**
* Gets whether the current page is the last one.
*/
get: function () {
if (this.currentPage == null)
return true;
var vPages = this.visiblePages;
return vPages.indexOf(this.currentPage) == vPages.length - 1;
},
enumerable: true,
configurable: true
});
/**
* Completes the survey.
*
* Calling this function performs the following tasks:
*
* - writes cookie if the `cookieName` property is not empty
* - sets the survey into `completed` state
* - fires the `onComplete` event
* - calls `sendResult` function.
*
* Calling the `doComplete` function does not perform any validation, unlike the `completeLastPage` function.
* It calls `navigateToUrl` after calling `onComplete` event.
* In case calling `options.showDataSaving` callback in the `onComplete` event, `navigateToUrl` is used on calling `options.showDataSavingSuccess` callback.
* @see completeLastPage
* @see cookieName
* @see state
* @see onComplete
* @see surveyPostId
* @see completeLastPage
* @see navigateToUrl
* @see navigateToUrlOnCondition
*/
SurveyModel.prototype.doComplete = function (isCompleteOnTrigger) {
if (isCompleteOnTrigger === void 0) { isCompleteOnTrigger = false; }
var onCompletingOptions = {
allowComplete: true,
isCompleteOnTrigger: isCompleteOnTrigger,
};
this.onCompleting.fire(this, onCompletingOptions);
if (!onCompletingOptions.allowComplete)
return;
var previousCookie = this.hasCookie;
this.stopTimer();
this.setCompleted();
this.clearUnusedValues();
this.setCookie();
var self = this;
var savingDataStarted = false;
var onCompleteOptions = {
isCompleteOnTrigger: isCompleteOnTrigger,
showDataSaving: function (text) {
savingDataStarted = true;
self.setCompletedState("saving", text);
},
showDataSavingError: function (text) {
self.setCompletedState("error", text);
},
showDataSavingSuccess: function (text) {
self.setCompletedState("success", text);
self.navigateTo();
},
showDataSavingClear: function (text) {
self.setCompletedState("", "");
},
};
this.onComplete.fire(this, onCompleteOptions);
if (!previousCookie && this.surveyPostId) {
this.sendResult();
}
if (!savingDataStarted) {
this.navigateTo();
}
};
/**
* Starts the survey. Changes the survey mode from "starting" to "running". Call this function if your survey has a start page, otherwise this function does nothing.
* @see firstPageIsStarted
*/
SurveyModel.prototype.start = function () {
if (!this.firstPageIsStarted)
return false;
if (this.checkIsPageHasErrors(this.startedPage, true))
return false;
this.isStartedState = false;
this.startTimerFromUI();
this.onStarted.fire(this, {});
return true;
};
Object.defineProperty(SurveyModel.prototype, "isValidatingOnServer", {
/**
* Gets whether the question values on the current page are validating on the server at the current moment.
* @see onServerValidateQuestions
*/
get: function () {
return this.getPropertyValue("isValidatingOnServer", false);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.setIsValidatingOnServer = function (val) {
if (val == this.isValidatingOnServer)
return;
this.setPropertyValue("isValidatingOnServer", val);
this.onIsValidatingOnServerChanged();
};
SurveyModel.prototype.onIsValidatingOnServerChanged = function () { };
SurveyModel.prototype.doServerValidation = function (doComplete) {
if (!this.onServerValidateQuestions ||
this.onServerValidateQuestions.isEmpty)
return false;
if (!doComplete && this.checkErrorsMode === "onComplete")
return false;
var self = this;
var options = {
data: {},
errors: {},
survey: this,
complete: function () {
self.completeServerValidation(options);
},
};
if (doComplete && this.checkErrorsMode === "onComplete") {
options.data = this.data;
}
else {
for (var i = 0; i < this.currentPage.questions.length; i++) {
var question = this.currentPage.questions[i];
if (!question.visible)
continue;
var value = this.getValue(question.getValueName());
if (!this.isValueEmpty(value))
options.data[question.getValueName()] = value;
}
}
this.setIsValidatingOnServer(true);
if (typeof this.onServerValidateQuestions === "function") {
this.onServerValidateQuestions(this, options);
}
else {
this.onServerValidateQuestions.fire(this, options);
}
return true;
};
SurveyModel.prototype.completeServerValidation = function (options) {
this.setIsValidatingOnServer(false);
if (!options && !options.survey)
return;
var self = options.survey;
var hasErrors = false;
if (options.errors) {
var hasToFocus = this.focusOnFirstError;
for (var name in options.errors) {
var question = self.getQuestionByName(name);
if (question && question["errors"]) {
hasErrors = true;
question.addError(new __WEBPACK_IMPORTED_MODULE_10__error__["a" /* CustomError */](options.errors[name], this));
if (hasToFocus) {
hasToFocus = false;
if (!!question.page) {
this.currentPage = question.page;
}
question.focus(true);
}
}
}
}
if (!hasErrors) {
if (self.isLastPage)
self.doComplete();
else
self.doNextPage();
}
};
SurveyModel.prototype.doNextPage = function () {
var curPage = this.currentPage;
this.checkOnPageTriggers();
if (!this.isCompleted) {
if (this.sendResultOnPageNext) {
this.sendResult(this.surveyPostId, this.clientId, true);
}
if (curPage === this.currentPage) {
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage);
this.currentPage = vPages[index + 1];
}
}
else {
this.doComplete(true);
}
};
SurveyModel.prototype.setCompleted = function () {
this.isCompleted = true;
};
Object.defineProperty(SurveyModel.prototype, "processedCompletedHtml", {
/**
* Returns the HTML content for the complete page.
* @see completedHtml
*/
get: function () {
var html = this.renderedCompletedHtml;
if (html) {
return this.processHtml(html);
}
return "
" + this.getLocString("completingSurvey") + "
";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "processedCompletedBeforeHtml", {
/**
* Returns the HTML content, that is shown to a user that had completed the survey before.
* @see completedHtml
* @see cookieName
*/
get: function () {
if (this.completedBeforeHtml) {
return this.processHtml(this.completedBeforeHtml);
}
return "
";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "processedLoadingHtml", {
/**
* Returns the HTML content, that is shows when a survey loads the survey JSON.
*/
get: function () {
if (this.loadingHtml) {
return this.processHtml(this.loadingHtml);
}
return "
" + this.getLocString("loadingSurvey") + "
";
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getProgressInfo = function () {
return __WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */].getProgressInfoByElements(this.visiblePages, false);
};
Object.defineProperty(SurveyModel.prototype, "progressText", {
/**
* Returns the text for the current progress.
*/
get: function () {
var res = this.getPropertyValue("progressText", "");
if (!res) {
this.updateProgressText();
res = this.getPropertyValue("progressText", "");
}
return res;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.updateProgressText = function (onValueChanged) {
if (onValueChanged === void 0) { onValueChanged = false; }
if (this.isDesignMode)
return;
if (onValueChanged &&
this.progressBarType == "pages" &&
this.onProgressText.isEmpty)
return;
this.setPropertyValue("progressText", this.getProgressText());
this.setPropertyValue("progressValue", this.getProgress());
};
SurveyModel.prototype.getProgressText = function () {
if (this.isDesignMode || this.currentPage == null)
return "";
var options = {
questionCount: 0,
answeredQuestionCount: 0,
requiredQuestionCount: 0,
requiredAnsweredQuestionCount: 0,
text: "",
};
var type = this.progressBarType.toLowerCase();
if (type === "questions" ||
type === "requiredquestions" ||
type === "correctquestions" ||
!this.onProgressText.isEmpty) {
var info = this.getProgressInfo();
options.questionCount = info.questionCount;
options.answeredQuestionCount = info.answeredQuestionCount;
options.requiredQuestionCount = info.requiredQuestionCount;
options.requiredAnsweredQuestionCount =
info.requiredAnsweredQuestionCount;
}
options.text = this.getProgressTextCore(options);
this.onProgressText.fire(this, options);
return options.text;
};
SurveyModel.prototype.getProgressTextCore = function (info) {
var type = this.progressBarType.toLowerCase();
if (type === "questions") {
return this.getLocString("questionsProgressText")["format"](info.answeredQuestionCount, info.questionCount);
}
if (type === "requiredquestions") {
return this.getLocString("questionsProgressText")["format"](info.requiredAnsweredQuestionCount, info.requiredQuestionCount);
}
if (type === "correctquestions") {
var correctAnswersCount = this.getCorrectedAnswerCount();
return this.getLocString("questionsProgressText")["format"](correctAnswersCount, info.questionCount);
}
var vPages = this.visiblePages;
var index = vPages.indexOf(this.currentPage) + 1;
return this.getLocString("progressText")["format"](index, vPages.length);
};
SurveyModel.prototype.afterRenderSurvey = function (htmlElement) {
this.onAfterRenderSurvey.fire(this, {
survey: this,
htmlElement: htmlElement,
});
};
SurveyModel.prototype.updateQuestionCssClasses = function (question, cssClasses) {
this.onUpdateQuestionCssClasses.fire(this, {
question: question,
cssClasses: cssClasses,
});
};
SurveyModel.prototype.updatePanelCssClasses = function (panel, cssClasses) {
this.onUpdatePanelCssClasses.fire(this, {
panel: panel,
cssClasses: cssClasses,
});
};
SurveyModel.prototype.updatePageCssClasses = function (page, cssClasses) {
this.onUpdatePageCssClasses.fire(this, {
page: page,
cssClasses: cssClasses,
});
};
SurveyModel.prototype.afterRenderPage = function (htmlElement) {
if (this.onAfterRenderPage.isEmpty)
return;
this.onAfterRenderPage.fire(this, {
page: this.currentPage,
htmlElement: htmlElement,
});
};
SurveyModel.prototype.afterRenderHeader = function (htmlElement) {
if (this.onAfterRenderHeader.isEmpty)
return;
this.onAfterRenderHeader.fire(this, {
htmlElement: htmlElement,
});
};
SurveyModel.prototype.afterRenderQuestion = function (question, htmlElement) {
this.onAfterRenderQuestion.fire(this, {
question: question,
htmlElement: htmlElement,
});
};
SurveyModel.prototype.afterRenderQuestionInput = function (question, htmlElement) {
if (this.onAfterRenderQuestionInput.isEmpty)
return;
var id = question.inputId;
if (!!id && htmlElement.id !== id && typeof document !== "undefined") {
var el = document.getElementById(id);
if (!!el) {
htmlElement = el;
}
}
this.onAfterRenderQuestionInput.fire(this, {
question: question,
htmlElement: htmlElement,
});
};
SurveyModel.prototype.afterRenderPanel = function (panel, htmlElement) {
this.onAfterRenderPanel.fire(this, {
panel: panel,
htmlElement: htmlElement,
});
};
SurveyModel.prototype.matrixBeforeRowAdded = function (options) {
this.onMatrixBeforeRowAdded.fire(this, options);
};
SurveyModel.prototype.matrixRowAdded = function (question, row) {
this.onMatrixRowAdded.fire(this, { question: question, row: row });
};
SurveyModel.prototype.getQuestionByValueNameFromArray = function (valueName, name, index) {
var questions = this.getQuestionsByValueNameCore(valueName);
if (!questions)
return;
for (var i = 0; i < questions.length; i++) {
var res = questions[i].getQuestionFromArray(name, index);
if (!!res)
return res;
}
return null;
};
SurveyModel.prototype.matrixRowRemoved = function (question, rowIndex, row) {
this.onMatrixRowRemoved.fire(this, {
question: question,
rowIndex: rowIndex,
row: row,
});
};
SurveyModel.prototype.matrixAllowRemoveRow = function (question, rowIndex, row) {
var options = {
question: question,
rowIndex: rowIndex,
row: row,
allow: true,
};
this.onMatrixAllowRemoveRow.fire(this, options);
return options.allow;
};
SurveyModel.prototype.matrixCellCreated = function (question, options) {
options.question = question;
this.onMatrixCellCreated.fire(this, options);
};
SurveyModel.prototype.matrixAfterCellRender = function (question, options) {
options.question = question;
this.onMatrixAfterCellRender.fire(this, options);
};
SurveyModel.prototype.matrixCellValueChanged = function (question, options) {
options.question = question;
this.onMatrixCellValueChanged.fire(this, options);
};
SurveyModel.prototype.matrixCellValueChanging = function (question, options) {
options.question = question;
this.onMatrixCellValueChanging.fire(this, options);
};
SurveyModel.prototype.matrixCellValidate = function (question, options) {
options.question = question;
this.onMatrixCellValidate.fire(this, options);
return options.error ? new __WEBPACK_IMPORTED_MODULE_10__error__["a" /* CustomError */](options.error, this) : null;
};
SurveyModel.prototype.dynamicPanelAdded = function (question) {
this.onDynamicPanelAdded.fire(this, { question: question });
};
SurveyModel.prototype.dynamicPanelRemoved = function (question, panelIndex, panel) {
var questions = !!panel ? panel.questions : [];
for (var i = 0; i < questions.length; i++) {
questions[i].clearOnDeletingContainer();
}
this.onDynamicPanelRemoved.fire(this, {
question: question,
panelIndex: panelIndex,
panel: panel,
});
};
SurveyModel.prototype.dynamicPanelItemValueChanged = function (question, options) {
options.question = question;
this.onDynamicPanelItemValueChanged.fire(this, options);
};
SurveyModel.prototype.dragAndDropAllow = function (options) {
options.allow = true;
this.onDragDropAllow.fire(this, options);
return options.allow;
};
SurveyModel.prototype.scrollElementToTop = function (element, question, page, id) {
var options = {
element: element,
question: question,
page: page,
elementId: id,
cancel: false,
};
this.onScrollingElementToTop.fire(this, options);
if (!options.cancel) {
__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */].ScrollElementToTop(options.elementId);
}
};
/**
* Uploads a file to server.
* @param question a file question object
* @param name a question name
* @param files files to upload
* @param uploadingCallback a call back function to get the status on uploading the files
*/
SurveyModel.prototype.uploadFiles = function (question, name, files, uploadingCallback) {
if (this.onUploadFiles.isEmpty) {
uploadingCallback("error", files);
}
else {
this.onUploadFiles.fire(this, {
question: question,
name: name,
files: files || [],
callback: uploadingCallback,
});
}
if (this.surveyPostId) {
this.uploadFilesCore(name, files, uploadingCallback);
}
};
/**
* Downloads a file from server
* @param name a question name
* @param fileValue a single file question value
* @param callback a call back function to get the status on downloading the file and the downloaded file content
*/
SurveyModel.prototype.downloadFile = function (questionName, fileValue, callback) {
if (this.onDownloadFile.isEmpty) {
!!callback && callback("success", fileValue.content || fileValue);
}
this.onDownloadFile.fire(this, {
name: questionName,
content: fileValue.content || fileValue,
fileValue: fileValue,
callback: callback,
});
};
/**
* Clears files from server.
* @param question question
* @param name question name
* @param value file question value
* @param callback call back function to get the status of the clearing operation
*/
SurveyModel.prototype.clearFiles = function (question, name, value, fileName, callback) {
if (this.onClearFiles.isEmpty) {
!!callback && callback("success", value);
}
this.onClearFiles.fire(this, {
question: question,
name: name,
value: value,
fileName: fileName,
callback: callback,
});
};
SurveyModel.prototype.updateChoicesFromServer = function (question, choices, serverResult) {
var options = {
question: question,
choices: choices,
serverResult: serverResult,
};
this.onLoadChoicesFromServer.fire(this, options);
return options.choices;
};
SurveyModel.prototype.createSurveyService = function () {
return new __WEBPACK_IMPORTED_MODULE_8__dxSurveyService__["a" /* dxSurveyService */]();
};
SurveyModel.prototype.uploadFilesCore = function (name, files, uploadingCallback) {
var _this = this;
var responses = [];
files.forEach(function (file) {
if (uploadingCallback)
uploadingCallback("uploading", file);
_this.createSurveyService().sendFile(_this.surveyPostId, file, function (success, response) {
if (success) {
responses.push({ content: response, file: file });
if (responses.length === files.length) {
if (uploadingCallback)
uploadingCallback("success", responses);
}
}
else {
if (uploadingCallback)
uploadingCallback("error", { response: response, file: file });
}
});
});
};
SurveyModel.prototype.getPage = function (index) {
return this.pages[index];
};
/**
* Adds an existing page to the survey.
* @param page a newly added page
* @param index - a page index to where insert a page. It is -1 by default and the page will be added into the end.
* @see addNewPage
*/
SurveyModel.prototype.addPage = function (page, index) {
if (index === void 0) { index = -1; }
if (page == null)
return;
if (index < 0 || index >= this.pages.length) {
this.pages.push(page);
}
else {
this.pages.splice(index, 0, page);
}
};
/**
* Creates a new page and adds it to a survey. Generates a new name if the `name` parameter is not specified.
* @param name a page name
* @param index - a page index to where insert a new page. It is -1 by default and the page will be added into the end.
* @see addPage
*/
SurveyModel.prototype.addNewPage = function (name, index) {
if (name === void 0) { name = null; }
if (index === void 0) { index = -1; }
var page = this.createNewPage(name);
this.addPage(page, index);
return page;
};
/**
* Removes a page from a survey.
* @param page
*/
SurveyModel.prototype.removePage = function (page) {
var index = this.pages.indexOf(page);
if (index < 0)
return;
this.pages.splice(index, 1);
if (this.currentPageValue == page) {
this.currentPage = this.pages.length > 0 ? this.pages[0] : null;
}
};
/**
* Returns a question by its name.
* @param name a question name
* @param caseInsensitive
* @see getQuestionByValueName
*/
SurveyModel.prototype.getQuestionByName = function (name, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
if (!name)
return null;
if (caseInsensitive) {
name = name.toLowerCase();
}
var hash = !!caseInsensitive
? this.questionHashes.namesInsensitive
: this.questionHashes.names;
var res = hash[name];
if (!res)
return null;
return res[0];
};
/**
* Returns a question by its value name
* @param valueName a question name
* @param caseInsensitive
* @see getQuestionByName
* @see Question.valueName
*/
SurveyModel.prototype.getQuestionByValueName = function (valueName, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
var res = this.getQuestionsByValueNameCore(valueName, caseInsensitive);
return !!res ? res[0] : null;
};
SurveyModel.prototype.getCalculatedValueByName = function (name) {
for (var i = 0; i < this.calculatedValues.length; i++) {
if (name == this.calculatedValues[i].name)
return this.calculatedValues[i];
}
return null;
};
SurveyModel.prototype.getQuestionsByValueNameCore = function (valueName, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
var hash = !!caseInsensitive
? this.questionHashes.valueNamesInsensitive
: this.questionHashes.valueNames;
var res = hash[valueName];
if (!res)
return null;
return res;
};
/**
* Gets a list of questions by their names.
* @param names an array of question names
* @param caseInsensitive
*/
SurveyModel.prototype.getQuestionsByNames = function (names, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
var result = [];
if (!names)
return result;
for (var i = 0; i < names.length; i++) {
if (!names[i])
continue;
var question = this.getQuestionByName(names[i], caseInsensitive);
if (question)
result.push(question);
}
return result;
};
/**
* Returns a page on which an element (question or panel) is placed.
* @param element Question or Panel
*/
SurveyModel.prototype.getPageByElement = function (element) {
for (var i = 0; i < this.pages.length; i++) {
var page = this.pages[i];
if (page.containsElement(element))
return page;
}
return null;
};
/**
* Returns a page on which a question is located.
* @param question
*/
SurveyModel.prototype.getPageByQuestion = function (question) {
return this.getPageByElement(question);
};
/**
* Returns a page by it's name.
* @param name
*/
SurveyModel.prototype.getPageByName = function (name) {
for (var i = 0; i < this.pages.length; i++) {
if (this.pages[i].name == name)
return this.pages[i];
}
return null;
};
/**
* Returns a list of pages by their names.
* @param names a list of page names
*/
SurveyModel.prototype.getPagesByNames = function (names) {
var result = [];
if (!names)
return result;
for (var i = 0; i < names.length; i++) {
if (!names[i])
continue;
var page = this.getPageByName(names[i]);
if (page)
result.push(page);
}
return result;
};
/**
* Returns a list of all questions in a survey.
* @param visibleOnly set it `true`, if you want to get only visible questions
*/
SurveyModel.prototype.getAllQuestions = function (visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
var result = new Array();
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].addQuestionsToList(result, visibleOnly, includingDesignTime);
}
return result;
};
/**
* Returns quiz questions. All visible questions that has input(s) widgets.
* @see getQuizQuestionCount
*/
SurveyModel.prototype.getQuizQuestions = function () {
var result = new Array();
var startIndex = this.firstPageIsStarted ? 1 : 0;
for (var i = startIndex; i < this.pages.length; i++) {
if (!this.pages[i].isVisible)
continue;
var questions = this.pages[i].questions;
for (var j = 0; j < questions.length; j++) {
var q = questions[j];
if (q.quizQuestionCount > 0) {
result.push(q);
}
}
}
return result;
};
/**
* Returns a panel by its name.
* @param name a panel name
* @param caseInsensitive
* @see getQuestionByName
*/
SurveyModel.prototype.getPanelByName = function (name, caseInsensitive) {
if (caseInsensitive === void 0) { caseInsensitive = false; }
var panels = this.getAllPanels();
if (caseInsensitive)
name = name.toLowerCase();
for (var i = 0; i < panels.length; i++) {
var panelName = panels[i].name;
if (caseInsensitive)
panelName = panelName.toLowerCase();
if (panelName == name)
return panels[i];
}
return null;
};
/**
* Returns a list of all survey's panels.
*/
SurveyModel.prototype.getAllPanels = function (visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
var result = new Array();
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].addPanelsIntoList(result, visibleOnly, includingDesignTime);
}
return result;
};
/**
* Creates and returns a new page, but do not add it into the survey.
* You can use addPage(page) function to add it into survey later.
* @see addPage
* @see addNewPage
*/
SurveyModel.prototype.createNewPage = function (name) {
return new __WEBPACK_IMPORTED_MODULE_5__page__["a" /* PageModel */](name);
};
SurveyModel.prototype.questionOnValueChanging = function (valueName, newValue) {
if (this.onValueChanging.isEmpty)
return newValue;
var options = {
name: valueName,
question: this.getQuestionByValueName(valueName),
value: __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(newValue),
oldValue: this.getValue(valueName),
};
this.onValueChanging.fire(this, options);
return options.value;
};
SurveyModel.prototype.updateQuestionValue = function (valueName, newValue) {
if (this.isLoadingFromJson)
return;
var questions = this.getQuestionsByValueNameCore(valueName);
if (!!questions) {
for (var i = 0; i < questions.length; i++) {
if (this.isTwoValueEquals(questions[i].value, newValue))
continue;
questions[i].updateValueFromSurvey(newValue);
}
}
};
SurveyModel.prototype.checkQuestionErrorOnValueChanged = function (question) {
if (!this.isNavigationButtonPressed &&
(this.checkErrorsMode == "onValueChanged" || question.errors.length > 0)) {
var oldErrorCount = question.errors.length;
question.hasErrors(true, { isOnValueChanged: true });
if (!!question.page &&
(oldErrorCount > 0 || question.errors.length > 0)) {
this.fireValidatedErrorsOnPage(question.page);
}
}
};
SurveyModel.prototype.notifyQuestionOnValueChanged = function (valueName, newValue) {
if (this.isLoadingFromJson)
return;
var questions = this.getQuestionsByValueNameCore(valueName);
if (!!questions) {
for (var i = 0; i < questions.length; i++) {
var question = questions[i];
this.checkQuestionErrorOnValueChanged(question);
question.onSurveyValueChanged(newValue);
this.onValueChanged.fire(this, {
name: valueName,
question: question,
value: newValue,
});
}
}
else {
this.onValueChanged.fire(this, {
name: valueName,
question: null,
value: newValue,
});
}
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].checkBindings(valueName, newValue);
}
this.notifyElementsOnAnyValueOrVariableChanged(valueName);
};
SurveyModel.prototype.notifyElementsOnAnyValueOrVariableChanged = function (name) {
if (this.isEndLoadingFromJson === "processing")
return;
if (this.isRunningConditions) {
this.conditionNotifyElementsOnAnyValueOrVariableChanged = true;
return;
}
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].onAnyValueChanged(name);
}
if (!this.isEndLoadingFromJson) {
this.locStrsChanged();
}
};
SurveyModel.prototype.updateAllQuestionsValue = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
var valName = q.getValueName();
q.updateValueFromSurvey(this.getValue(valName));
if (q.requireUpdateCommentValue) {
q.updateCommentFromSurvey(this.getComment(valName));
}
}
};
SurveyModel.prototype.notifyAllQuestionsOnValueChanged = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
questions[i].onSurveyValueChanged(this.getValue(questions[i].getValueName()));
}
};
SurveyModel.prototype.checkOnPageTriggers = function () {
var questions = this.getCurrentPageQuestions(true);
var values = {};
for (var i = 0; i < questions.length; i++) {
var question = questions[i];
var name = question.getValueName();
values[name] = this.getValue(name);
}
this.checkTriggers(values, true);
};
SurveyModel.prototype.getCurrentPageQuestions = function (includeInvsible) {
if (includeInvsible === void 0) { includeInvsible = false; }
var result = [];
var page = this.currentPage;
if (!page)
return result;
for (var i = 0; i < page.questions.length; i++) {
var question = page.questions[i];
if ((!includeInvsible && !question.visible) || !question.name)
continue;
result.push(question);
}
return result;
};
SurveyModel.prototype.checkTriggers = function (key, isOnNextPage) {
if (this.isCompleted || this.triggers.length == 0)
return;
if (this.isTriggerIsRunning) {
this.triggerValues = this.getFilteredValues();
for (var k in key) {
this.triggerKeys[k] = key[k];
}
return;
}
this.isTriggerIsRunning = true;
this.triggerKeys = key;
this.triggerValues = this.getFilteredValues();
var properties = this.getFilteredProperties();
for (var i = 0; i < this.triggers.length; i++) {
var trigger = this.triggers[i];
if (trigger.isOnNextPage == isOnNextPage) {
trigger.checkExpression(this.triggerKeys, this.triggerValues, properties);
}
}
this.isTriggerIsRunning = false;
};
SurveyModel.prototype.doElementsOnLoad = function () {
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].onSurveyLoad();
}
};
Object.defineProperty(SurveyModel.prototype, "isRunningConditions", {
get: function () {
return !!this.conditionValues;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.runConditions = function () {
if (this.isCompleted ||
this.isEndLoadingFromJson === "processing" ||
this.isRunningConditions)
return;
this.conditionValues = this.getFilteredValues();
var properties = this.getFilteredProperties();
var oldCurrentPageIndex = this.pages.indexOf(this.currentPageValue);
this.runConditionsCore(properties);
this.checkIfNewPagesBecomeVisible(oldCurrentPageIndex);
this.conditionValues = null;
if (this.isValueChangedOnRunningCondition &&
this.conditionRunnerCounter <
__WEBPACK_IMPORTED_MODULE_15__settings__["a" /* settings */].maximumConditionRunCountOnValueChanged) {
this.isValueChangedOnRunningCondition = false;
this.conditionRunnerCounter++;
this.runConditions();
}
else {
this.isValueChangedOnRunningCondition = false;
this.conditionRunnerCounter = 0;
if (this.conditionUpdateVisibleIndexes) {
this.conditionUpdateVisibleIndexes = false;
this.updateVisibleIndexes();
}
if (this.conditionNotifyElementsOnAnyValueOrVariableChanged) {
this.conditionNotifyElementsOnAnyValueOrVariableChanged = false;
this.notifyElementsOnAnyValueOrVariableChanged("");
}
}
};
SurveyModel.prototype.runConditionOnValueChanged = function (name, value) {
if (this.isRunningConditions) {
this.conditionValues[name] = value;
this.isValueChangedOnRunningCondition = true;
}
else {
this.runConditions();
}
};
SurveyModel.prototype.runConditionsCore = function (properties) {
var pages = this.pages;
for (var i = 0; i < this.calculatedValues.length; i++) {
this.calculatedValues[i].resetCalculation();
}
for (var i = 0; i < this.calculatedValues.length; i++) {
this.calculatedValues[i].doCalculation(this.calculatedValues, this.conditionValues, properties);
}
for (var i = 0; i < pages.length; i++) {
pages[i].runCondition(this.conditionValues, properties);
}
};
SurveyModel.prototype.checkIfNewPagesBecomeVisible = function (oldCurrentPageIndex) {
var newCurrentPageIndex = this.pages.indexOf(this.currentPageValue);
if (newCurrentPageIndex <= oldCurrentPageIndex + 1)
return;
for (var i = oldCurrentPageIndex + 1; i < newCurrentPageIndex; i++) {
if (this.pages[i].isVisible) {
this.currentPage = this.pages[i];
break;
}
}
};
/**
* Sends a survey result to the [api.surveyjs.io](https://api.surveyjs.io) service.
* @param postId [api.surveyjs.io](https://api.surveyjs.io) service postId
* @param clientId Typically a customer e-mail or an identifier
* @param isPartialCompleted Set it to `true` if the survey is not completed yet and the results are intermediate
* @see surveyPostId
* @see clientId
*/
SurveyModel.prototype.sendResult = function (postId, clientId, isPartialCompleted) {
if (postId === void 0) { postId = null; }
if (clientId === void 0) { clientId = null; }
if (isPartialCompleted === void 0) { isPartialCompleted = false; }
if (!this.isEditMode)
return;
if (isPartialCompleted && this.onPartialSend) {
this.onPartialSend.fire(this, null);
}
if (!postId && this.surveyPostId) {
postId = this.surveyPostId;
}
if (!postId)
return;
if (clientId) {
this.clientId = clientId;
}
if (isPartialCompleted && !this.clientId)
return;
var self = this;
if (this.surveyShowDataSaving) {
this.setCompletedState("saving", "");
}
this.createSurveyService().sendResult(postId, this.data, function (success, response, request) {
if (self.surveyShowDataSaving) {
if (success) {
self.setCompletedState("success", "");
}
else {
self.setCompletedState("error", response);
}
}
self.onSendResult.fire(self, {
success: success,
response: response,
request: request,
});
}, this.clientId, isPartialCompleted);
};
/**
* Calls the [api.surveyjs.io](https://api.surveyjs.io) service and, on callback, fires the `onGetResult` event with all answers that your users made for a question.
* @param resultId [api.surveyjs.io](https://api.surveyjs.io) service resultId
* @param name The question name
* @see onGetResult
*/
SurveyModel.prototype.getResult = function (resultId, name) {
var self = this;
this.createSurveyService().getResult(resultId, name, function (success, data, dataList, response) {
self.onGetResult.fire(self, {
success: success,
data: data,
dataList: dataList,
response: response,
});
});
};
/**
* Loads the survey JSON from the [api.surveyjs.io](https://api.surveyjs.io) service.
* If `clientId` is not `null` and a user had completed a survey before, the survey switches to `completedbefore` state.
* @param surveyId [api.surveyjs.io](https://api.surveyjs.io) service surveyId
* @param clientId users' indentifier, for example an e-mail or a unique customer id in your web application.
* @see state
* @see onLoadedSurveyFromService
*/
SurveyModel.prototype.loadSurveyFromService = function (surveyId, cliendId) {
if (surveyId === void 0) { surveyId = null; }
if (cliendId === void 0) { cliendId = null; }
if (surveyId) {
this.surveyId = surveyId;
}
if (cliendId) {
this.clientId = cliendId;
}
var self = this;
this.isLoading = true;
this.onLoadingSurveyFromService();
if (cliendId) {
this.createSurveyService().getSurveyJsonAndIsCompleted(this.surveyId, this.clientId, function (success, json, isCompleted, response) {
self.isLoading = false;
if (success) {
self.isCompletedBefore = isCompleted == "completed";
self.loadSurveyFromServiceJson(json);
}
});
}
else {
this.createSurveyService().loadSurvey(this.surveyId, function (success, result, response) {
self.isLoading = false;
if (success) {
self.loadSurveyFromServiceJson(result);
}
});
}
};
SurveyModel.prototype.loadSurveyFromServiceJson = function (json) {
if (!json)
return;
this.fromJSON(json);
this.notifyAllQuestionsOnValueChanged();
this.onLoadSurveyFromService();
this.onLoadedSurveyFromService.fire(this, {});
};
SurveyModel.prototype.onLoadingSurveyFromService = function () { };
SurveyModel.prototype.onLoadSurveyFromService = function () { };
SurveyModel.prototype.updateVisibleIndexes = function () {
if (this.isLoadingFromJson || !!this.isEndLoadingFromJson)
return;
if (this.isRunningConditions &&
this.onVisibleChanged.isEmpty &&
this.onPageVisibleChanged.isEmpty) {
//Run update visible index only one time on finishing running conditions
this.conditionUpdateVisibleIndexes = true;
return;
}
this.updatePageVisibleIndexes(this.showPageNumbers);
if (this.showQuestionNumbers == "onPage") {
var visPages = this.visiblePages;
for (var i = 0; i < visPages.length; i++) {
visPages[i].setVisibleIndex(0);
}
}
else {
var index = this.showQuestionNumbers == "on" ? 0 : -1;
for (var i = 0; i < this.pages.length; i++) {
index += this.pages[i].setVisibleIndex(index);
}
}
this.updateProgressText(true);
};
SurveyModel.prototype.updatePageVisibleIndexes = function (showIndex) {
var index = 0;
for (var i = 0; i < this.pages.length; i++) {
var isPageVisible = this.pages[i].isVisible;
this.pages[i].visibleIndex = isPageVisible ? index++ : -1;
this.pages[i].num =
showIndex && isPageVisible ? this.pages[i].visibleIndex + 1 : -1;
}
};
SurveyModel.prototype.fromJSON = function (json) {
if (!json)
return;
this.questionHashesClear();
this.jsonErrors = null;
var jsonConverter = new __WEBPACK_IMPORTED_MODULE_2__jsonobject__["c" /* JsonObject */]();
jsonConverter.toObject(json, this);
if (jsonConverter.errors.length > 0) {
this.jsonErrors = jsonConverter.errors;
}
};
SurveyModel.prototype.setJsonObject = function (jsonObj) {
this.fromJSON(jsonObj);
};
SurveyModel.prototype.endLoadingFromJson = function () {
this.isEndLoadingFromJson = "processing";
this.isStartedState = this.firstPageIsStarted;
this.onQuestionsOnPageModeChanged("standard");
_super.prototype.endLoadingFromJson.call(this);
if (this.hasCookie) {
this.doComplete();
}
this.doElementsOnLoad();
this.isEndLoadingFromJson = "conditions";
this.runConditions();
this.notifyElementsOnAnyValueOrVariableChanged("");
this.isEndLoadingFromJson = null;
this.updateVisibleIndexes();
};
SurveyModel.prototype.onBeforeCreating = function () { };
SurveyModel.prototype.onCreating = function () { };
SurveyModel.prototype.getProcessedTextValue = function (textValue) {
this.getProcessedTextValueCore(textValue);
if (!this.onProcessTextValue.isEmpty) {
var wasEmpty = this.isValueEmpty(textValue.value);
this.onProcessTextValue.fire(this, textValue);
textValue.isExists =
textValue.isExists || (wasEmpty && !this.isValueEmpty(textValue.value));
}
};
SurveyModel.prototype.getProcessedTextValueCore = function (textValue) {
var name = textValue.name.toLocaleLowerCase();
if (["no", "require", "title"].indexOf(name) !== -1) {
return;
}
if (name === "pageno") {
textValue.isExists = true;
var page = this.currentPage;
textValue.value = page != null ? this.visiblePages.indexOf(page) + 1 : 0;
return;
}
if (name === "pagecount") {
textValue.isExists = true;
textValue.value = this.visiblePageCount;
return;
}
if (name === "locale") {
textValue.isExists = true;
textValue.value = !!this.locale
? this.locale
: __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].defaultLocale;
return;
}
if (name === "correctedanswers" || name === "correctedanswercount") {
textValue.isExists = true;
textValue.value = this.getCorrectedAnswerCount();
return;
}
if (name === "incorrectedanswers" || name === "incorrectedanswercount") {
textValue.isExists = true;
textValue.value = this.getInCorrectedAnswerCount();
return;
}
if (name === "questioncount") {
textValue.isExists = true;
textValue.value = this.getQuizQuestionCount();
return;
}
var firstName = new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(name, this.data);
var variable = this.getVariable(name);
if (variable !== undefined) {
textValue.isExists = true;
textValue.value = variable;
return;
}
if (!!firstName)
firstName = firstName.toLowerCase();
var question = this.getQuestionByValueName(firstName, true);
if (question) {
textValue.isExists = true;
name = question.getValueName() + name.substr(firstName.length);
name = name.toLocaleLowerCase();
var values = {};
values[firstName] = textValue.returnDisplayValue
? question.getDisplayValue(false, undefined)
: question.value;
textValue.value = new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]().getValue(name, values);
return;
}
var value = this.getValue(textValue.name);
if (value !== undefined) {
textValue.isExists = true;
textValue.value = value;
}
};
SurveyModel.prototype.clearUnusedValues = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
questions[i].clearUnusedValues();
}
if (this.clearInvisibleValues != "none") {
this.clearInvisibleQuestionValues();
}
};
SurveyModel.prototype.hasVisibleQuestionByValueName = function (valueName) {
var questions = this.getQuestionsByValueNameCore(valueName);
if (!questions)
return false;
for (var i = 0; i < questions.length; i++) {
if (questions[i].isVisible)
return true;
}
return false;
};
SurveyModel.prototype.questionCountByValueName = function (valueName) {
var questions = this.getQuestionsByValueNameCore(valueName);
return !!questions ? questions.length : 0;
};
SurveyModel.prototype.clearInvisibleQuestionValues = function () {
var questions = this.getAllQuestions();
for (var i = 0; i < questions.length; i++) {
questions[i].clearValueIfInvisible();
}
};
/**
* Returns a variable value. Variable, unlike values, are not stored in the survey results.
* @param name A variable name
* @see SetVariable
*/
SurveyModel.prototype.getVariable = function (name) {
if (!name)
return null;
name = name.toLowerCase();
var res = this.variablesHash[name];
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(res))
return res;
if (name.indexOf(".") > -1 || name.indexOf("[") > -1) {
if (new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]().hasValue(name, this.variablesHash))
return new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]().getValue(name, this.variablesHash);
}
return res;
};
/**
* Sets a variable value. Variable, unlike values, are not stored in the survey results.
* @param name A variable name
* @param newValue A variable new value
* @see GetVariable
*/
SurveyModel.prototype.setVariable = function (name, newValue) {
if (!name)
return;
name = name.toLowerCase();
this.variablesHash[name] = newValue;
this.notifyElementsOnAnyValueOrVariableChanged(name);
this.runConditionOnValueChanged(name, newValue);
};
//ISurvey data
SurveyModel.prototype.getUnbindValue = function (value) {
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(value);
};
/**
* Returns a question value (answer) by a question's name.
* @param name A question name
* @see data
* @see setValue
*/
SurveyModel.prototype.getValue = function (name) {
if (!name || name.length == 0)
return null;
var value = this.getDataValueCore(this.valuesHash, name);
return this.getUnbindValue(value);
};
/**
* Sets a question value (answer). It runs all triggers and conditions (`visibleIf` properties).
*
* Goes to the next page if `goNextPageAutomatic` is `true` and all questions on the current page are answered correctly.
* @param name A question name
* @param newValue A new question value
* @see data
* @see getValue
* @see PageModel.visibleIf
* @see Question.visibleIf
* @see goNextPageAutomatic
*/
SurveyModel.prototype.setValue = function (name, newQuestionValue, locNotification, allowNotifyValueChanged) {
if (locNotification === void 0) { locNotification = false; }
if (allowNotifyValueChanged === void 0) { allowNotifyValueChanged = true; }
var newValue = newQuestionValue;
if (allowNotifyValueChanged)
newValue = this.questionOnValueChanging(name, newQuestionValue);
if (!this.editingObj &&
this.isValueEqual(name, newValue) &&
this.isTwoValueEquals(newValue, newQuestionValue))
return;
if (this.isValueEmpty(newValue)) {
this.deleteDataValueCore(this.valuesHash, name);
}
else {
newValue = this.getUnbindValue(newValue);
this.setDataValueCore(this.valuesHash, name, newValue);
}
this.updateOnSetValue(name, newValue, locNotification, allowNotifyValueChanged);
};
SurveyModel.prototype.updateOnSetValue = function (name, newValue, locNotification, allowNotifyValueChanged) {
if (locNotification === void 0) { locNotification = false; }
if (allowNotifyValueChanged === void 0) { allowNotifyValueChanged = true; }
this.updateQuestionValue(name, newValue);
if (locNotification === true)
return;
var triggerKeys = {};
triggerKeys[name] = newValue;
this.checkTriggers(triggerKeys, false);
this.runConditionOnValueChanged(name, newValue);
if (allowNotifyValueChanged)
this.notifyQuestionOnValueChanged(name, newValue);
if (locNotification !== "text") {
this.tryGoNextPageAutomatic(name);
}
this.updateProgressText(true);
};
SurveyModel.prototype.isValueEqual = function (name, newValue) {
if (newValue === "" || newValue === undefined)
newValue = null;
var oldValue = this.getValue(name);
if (oldValue === "" || oldValue === undefined)
oldValue = null;
if (newValue === null || oldValue === null)
return newValue === oldValue;
return this.isTwoValueEquals(newValue, oldValue);
};
SurveyModel.prototype.doOnPageAdded = function (page) {
page.setSurveyImpl(this);
if (!page.name)
page.name = this.generateNewName(this.pages, "page");
this.questionHashesPanelAdded(page);
this.updateVisibleIndexes();
var options = { page: page };
this.onPageAdded.fire(this, options);
};
SurveyModel.prototype.doOnPageRemoved = function (page) {
this.updateVisibleIndexes();
};
SurveyModel.prototype.generateNewName = function (elements, baseName) {
var keys = {};
for (var i = 0; i < elements.length; i++)
keys[elements[i]["name"]] = true;
var index = 1;
while (keys[baseName + index])
index++;
return baseName + index;
};
SurveyModel.prototype.tryGoNextPageAutomatic = function (name) {
if (!!this.isEndLoadingFromJson ||
!this.goNextPageAutomatic ||
!this.currentPage)
return;
var question = this.getQuestionByValueName(name);
if (!question ||
(!!question &&
(!question.visible || !question.supportGoNextPageAutomatic())))
return;
if (question.hasErrors(false) && !question.supportGoNextPageError())
return;
var questions = this.getCurrentPageQuestions();
if (questions.indexOf(question) < 0)
return;
for (var i = 0; i < questions.length; i++) {
if (questions[i].hasInput && questions[i].isEmpty())
return;
}
if (!this.checkIsCurrentPageHasErrors(false)) {
if (!this.isLastPage) {
this.nextPage();
}
else {
if (this.goNextPageAutomatic === true &&
this.allowCompleteSurveyAutomatic) {
this.completeLastPage();
}
}
}
};
/**
* Returns the comment value.
* @param name A comment's name.
* @see setComment
*/
SurveyModel.prototype.getComment = function (name) {
var result = this.data[name + this.commentPrefix];
if (result == null)
result = "";
return result;
};
/**
* Sets a comment value.
* @param name A comment name.
* @param newValue A new comment value.
* @see getComment
*/
SurveyModel.prototype.setComment = function (name, newValue, locNotification) {
if (locNotification === void 0) { locNotification = false; }
if (!newValue)
newValue = "";
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(newValue, this.getComment(name)))
return;
var commentName = name + this.commentPrefix;
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(newValue)) {
this.deleteDataValueCore(this.valuesHash, commentName);
}
else {
this.setDataValueCore(this.valuesHash, commentName, newValue);
}
var questions = this.getQuestionsByValueNameCore(name);
if (!!questions) {
for (var i = 0; i < questions.length; i++) {
questions[i].updateCommentFromSurvey(newValue);
this.checkQuestionErrorOnValueChanged(questions[i]);
}
}
if (locNotification !== "text") {
this.tryGoNextPageAutomatic(name);
}
var question = this.getQuestionByName(name);
if (question) {
this.onValueChanged.fire(this, {
name: commentName,
question: question,
value: newValue,
});
}
};
/**
* Removes a value from the survey results.
* @param {string} name The name of the value. Typically it is a question name.
*/
SurveyModel.prototype.clearValue = function (name) {
this.setValue(name, null);
this.setComment(name, null);
};
Object.defineProperty(SurveyModel.prototype, "clearValueOnDisableItems", {
/**
* Gets or sets whether to clear value on disable items in checkbox, dropdown and radiogroup questions.
* By default, values are not cleared on disabled the corresponded items. This property is not persisted in survey JSON and you have to set it in code.
*/
get: function () {
return this.getPropertyValue("clearValueOnDisableItems", false);
},
set: function (val) {
this.setPropertyValue("clearValueOnDisableItems", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isClearValueOnHidden", {
get: function () {
return this.clearInvisibleValues == "onHidden";
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.questionVisibilityChanged = function (question, newValue) {
this.updateVisibleIndexes();
this.onVisibleChanged.fire(this, {
question: question,
name: question.name,
visible: newValue,
});
};
SurveyModel.prototype.pageVisibilityChanged = function (page, newValue) {
this.updateVisibleIndexes();
this.onPageVisibleChanged.fire(this, { page: page, visible: newValue });
};
SurveyModel.prototype.panelVisibilityChanged = function (panel, newValue) {
this.updateVisibleIndexes();
this.onPanelVisibleChanged.fire(this, { panel: panel, visible: newValue });
};
SurveyModel.prototype.questionCreated = function (question) {
this.onQuestionCreated.fire(this, { question: question });
};
SurveyModel.prototype.questionAdded = function (question, index, parentPanel, rootPanel) {
if (!question.name) {
question.name = this.generateNewName(this.getAllQuestions(false, true), "question");
}
if (!!question.page) {
this.questionHashesAdded(question);
}
this.updateVisibleIndexes();
this.onQuestionAdded.fire(this, {
question: question,
name: question.name,
index: index,
parentPanel: parentPanel,
rootPanel: rootPanel,
});
};
SurveyModel.prototype.questionRemoved = function (question) {
this.questionHashesRemoved(question, question.name, question.getValueName());
this.updateVisibleIndexes();
this.onQuestionRemoved.fire(this, {
question: question,
name: question.name,
});
};
SurveyModel.prototype.questionRenamed = function (question, oldName, oldValueName) {
this.questionHashesRemoved(question, oldName, oldValueName);
this.questionHashesAdded(question);
};
SurveyModel.prototype.questionHashesClear = function () {
this.questionHashes.names = {};
this.questionHashes.namesInsensitive = {};
this.questionHashes.valueNames = {};
this.questionHashes.valueNamesInsensitive = {};
};
SurveyModel.prototype.questionHashesPanelAdded = function (panel) {
if (this.isLoadingFromJson)
return;
var questions = panel.questions;
for (var i = 0; i < questions.length; i++) {
this.questionHashesAdded(questions[i]);
}
};
SurveyModel.prototype.questionHashesAdded = function (question) {
this.questionHashAddedCore(this.questionHashes.names, question, question.name);
this.questionHashAddedCore(this.questionHashes.namesInsensitive, question, question.name.toLowerCase());
this.questionHashAddedCore(this.questionHashes.valueNames, question, question.getValueName());
this.questionHashAddedCore(this.questionHashes.valueNamesInsensitive, question, question.getValueName().toLowerCase());
};
SurveyModel.prototype.questionHashesRemoved = function (question, name, valueName) {
if (!!name) {
this.questionHashRemovedCore(this.questionHashes.names, question, name);
this.questionHashRemovedCore(this.questionHashes.namesInsensitive, question, name.toLowerCase());
}
if (!!valueName) {
this.questionHashRemovedCore(this.questionHashes.valueNames, question, valueName);
this.questionHashRemovedCore(this.questionHashes.valueNamesInsensitive, question, valueName.toLowerCase());
}
};
SurveyModel.prototype.questionHashAddedCore = function (hash, question, name) {
var res = hash[name];
if (!!res) {
var res = hash[name];
if (res.indexOf(question) < 0) {
res.push(question);
}
}
else {
hash[name] = [question];
}
};
SurveyModel.prototype.questionHashRemovedCore = function (hash, question, name) {
var res = hash[name];
if (!res)
return;
var index = res.indexOf(question);
if (index > -1) {
res.splice(index, 1);
}
if (res.length == 0) {
delete hash[name];
}
};
SurveyModel.prototype.panelAdded = function (panel, index, parentPanel, rootPanel) {
if (!panel.name) {
panel.name = this.generateNewName(this.getAllPanels(false, true), "panel");
}
this.questionHashesPanelAdded(panel);
this.updateVisibleIndexes();
this.onPanelAdded.fire(this, {
panel: panel,
name: panel.name,
index: index,
parentPanel: parentPanel,
rootPanel: rootPanel,
});
};
SurveyModel.prototype.panelRemoved = function (panel) {
this.updateVisibleIndexes();
this.onPanelRemoved.fire(this, { panel: panel, name: panel.name });
};
SurveyModel.prototype.validateQuestion = function (question) {
if (this.onValidateQuestion.isEmpty)
return null;
var options = {
name: question.name,
question: question,
value: question.value,
error: null,
};
this.onValidateQuestion.fire(this, options);
return options.error ? new __WEBPACK_IMPORTED_MODULE_10__error__["a" /* CustomError */](options.error, this) : null;
};
SurveyModel.prototype.validatePanel = function (panel) {
if (this.onValidatePanel.isEmpty)
return null;
var options = {
name: panel.name,
panel: panel,
error: null,
};
this.onValidatePanel.fire(this, options);
return options.error ? new __WEBPACK_IMPORTED_MODULE_10__error__["a" /* CustomError */](options.error, this) : null;
};
SurveyModel.prototype.processHtml = function (html) {
var options = { html: html };
this.onProcessHtml.fire(this, options);
return this.processText(options.html, true);
};
SurveyModel.prototype.processText = function (text, returnDisplayValue) {
return this.processTextEx(text, returnDisplayValue, false).text;
};
SurveyModel.prototype.processTextEx = function (text, returnDisplayValue, doEncoding) {
var res = {
text: this.processTextCore(text, returnDisplayValue, doEncoding),
hasAllValuesOnLastRun: true,
};
res.hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;
return res;
};
SurveyModel.prototype.processTextCore = function (text, returnDisplayValue, doEncoding) {
if (doEncoding === void 0) { doEncoding = false; }
if (this.isDesignMode)
return text;
return this.textPreProcessor.process(text, returnDisplayValue, doEncoding);
};
SurveyModel.prototype.getSurveyMarkdownHtml = function (element, text) {
var options = { element: element, text: text, html: null };
this.onTextMarkdown.fire(this, options);
return options.html;
};
/**
* Returns an amount of corrected quiz answers.
*/
SurveyModel.prototype.getCorrectedAnswerCount = function () {
return this.getCorrectedAnswerCountCore(true);
};
/**
* Returns quiz question number. It may be different from `getQuizQuestions.length` because some widgets like matrix may have several questions.
* @see getQuizQuestions
*/
SurveyModel.prototype.getQuizQuestionCount = function () {
var questions = this.getQuizQuestions();
var res = 0;
for (var i = 0; i < questions.length; i++) {
res += questions[i].quizQuestionCount;
}
return res;
};
/**
* Returns an amount of incorrect quiz answers.
*/
SurveyModel.prototype.getInCorrectedAnswerCount = function () {
return this.getCorrectedAnswerCountCore(false);
};
SurveyModel.prototype.getCorrectedAnswerCountCore = function (isCorrect) {
var questions = this.getQuizQuestions();
var counter = 0;
var options = {
question: null,
result: false,
correctAnswers: 0,
incorrectAnswers: 0,
};
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
var quizQuestionCount = q.quizQuestionCount;
options.question = q;
options.correctAnswers = q.correctAnswerCount;
options.incorrectAnswers = quizQuestionCount - options.correctAnswers;
options.result = options.question.isAnswerCorrect();
this.onIsAnswerCorrect.fire(this, options);
if (isCorrect) {
if (options.result || options.correctAnswers < quizQuestionCount) {
var addCount = options.correctAnswers;
if (addCount == 0 && options.result)
addCount = 1;
counter += addCount;
}
}
else {
if (!options.result || options.incorrectAnswers < quizQuestionCount) {
counter += options.incorrectAnswers;
}
}
}
return counter;
};
SurveyModel.prototype.getCorrectedAnswers = function () {
return this.getCorrectedAnswerCount();
};
SurveyModel.prototype.getInCorrectedAnswers = function () {
return this.getInCorrectedAnswerCount();
};
Object.defineProperty(SurveyModel.prototype, "showTimerPanel", {
/**
* Gets or sets a timer panel position. The timer panel displays information about how much time an end user spends on a survey/page.
*
* The available options:
* - `top` - display timer panel in the top.
* - `bottom` - display timer panel in the bottom.
* - `none` - do not display a timer panel.
*
* If the value is not equal to 'none', the survey calls the `startTimer()` method on survey rendering.
* @see showTimerPanelMode
* @see startTimer
* @see stopTimer
*/
get: function () {
return this.getPropertyValue("showTimerPanel", "none");
},
set: function (val) {
this.setPropertyValue("showTimerPanel", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isTimerPanelShowingOnTop", {
get: function () {
return this.isTimerStarted && this.showTimerPanel == "top";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "isTimerPanelShowingOnBottom", {
get: function () {
return this.isTimerStarted && this.showTimerPanel == "bottom";
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "showTimerPanelMode", {
/**
* Gets or set a value that specifies whether the timer displays information for the page or for the entire survey.
*
* The available options:
*
* - `page` - show timer information for page
* - `survey` - show timer information for survey
*
* Use the `onTimerPanelInfoText` event to change the default text.
* @see showTimerPanel
* @see onTimerPanelInfoText
*/
get: function () {
return this.getPropertyValue("showTimerPanelMode", "all");
},
set: function (val) {
this.setPropertyValue("showTimerPanelMode", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "timerInfoText", {
get: function () {
var options = { text: this.getTimerInfoText() };
this.onTimerPanelInfoText.fire(this, options);
var loc = new __WEBPACK_IMPORTED_MODULE_11__localizablestring__["a" /* LocalizableString */](this, true);
loc.text = options.text;
return loc.textOrHtml;
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getTimerInfoText = function () {
var page = this.currentPage;
if (!page)
return "";
var pageSpent = this.getDisplayTime(page.timeSpent);
var surveySpent = this.getDisplayTime(this.timeSpent);
var pageLimitSec = this.getPageMaxTimeToFinish(page);
var pageLimit = this.getDisplayTime(pageLimitSec);
var surveyLimit = this.getDisplayTime(this.maxTimeToFinish);
if (this.showTimerPanelMode == "page")
return this.getTimerInfoPageText(page, pageSpent, pageLimit);
if (this.showTimerPanelMode == "survey")
return this.getTimerInfoSurveyText(surveySpent, surveyLimit);
if (this.showTimerPanelMode == "all") {
if (pageLimitSec <= 0 && this.maxTimeToFinish <= 0) {
return this.getLocString("timerSpentAll")["format"](pageSpent, surveySpent);
}
if (pageLimitSec > 0 && this.maxTimeToFinish > 0) {
return this.getLocString("timerLimitAll")["format"](pageSpent, pageLimit, surveySpent, surveyLimit);
}
var pageText = this.getTimerInfoPageText(page, pageSpent, pageLimit);
var surveyText = this.getTimerInfoSurveyText(surveySpent, surveyLimit);
return pageText + " " + surveyText;
}
return "";
};
SurveyModel.prototype.getTimerInfoPageText = function (page, pageSpent, pageLimit) {
return this.getPageMaxTimeToFinish(page) > 0
? this.getLocString("timerLimitPage")["format"](pageSpent, pageLimit)
: this.getLocString("timerSpentPage")["format"](pageSpent, pageLimit);
};
SurveyModel.prototype.getTimerInfoSurveyText = function (surveySpent, surveyLimit) {
return this.maxTimeToFinish > 0
? this.getLocString("timerLimitSurvey")["format"](surveySpent, surveyLimit)
: this.getLocString("timerSpentSurvey")["format"](surveySpent, surveyLimit);
};
SurveyModel.prototype.getDisplayTime = function (val) {
var min = Math.floor(val / 60);
var sec = val % 60;
var res = "";
if (min > 0) {
res += min + " " + this.getLocString("timerMin");
}
if (res && sec == 0)
return res;
if (res)
res += " ";
return res + sec + " " + this.getLocString("timerSec");
};
/**
* Starts a timer that will calculate how much time end-user spends on the survey or on pages.
* @see stopTimer
* @see timeSpent
*/
SurveyModel.prototype.startTimer = function () {
if (this.isTimerStarted || this.isDesignMode)
return;
var self = this;
this.timerFunc = function () {
self.doTimer();
};
this.isTimerStarted = true;
__WEBPACK_IMPORTED_MODULE_13__surveytimer__["a" /* SurveyTimer */].instance.start(this.timerFunc);
};
SurveyModel.prototype.startTimerFromUI = function () {
if (this.showTimerPanel != "none" && this.state === "running") {
this.startTimer();
}
};
/**
* Stops the timer.
* @see startTimer
* @see timeSpent
*/
SurveyModel.prototype.stopTimer = function () {
if (!this.isTimerStarted)
return;
this.isTimerStarted = false;
__WEBPACK_IMPORTED_MODULE_13__surveytimer__["a" /* SurveyTimer */].instance.stop(this.timerFunc);
};
Object.defineProperty(SurveyModel.prototype, "maxTimeToFinish", {
/**
* Gets or sets the maximum time in seconds that end user has to complete a survey. If the value is 0 or less, an end user has no time limit to finish a survey.
* @see startTimer
* @see maxTimeToFinishPage
*/
get: function () {
return this.getPropertyValue("maxTimeToFinish", 0);
},
set: function (val) {
this.setPropertyValue("maxTimeToFinish", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyModel.prototype, "maxTimeToFinishPage", {
/**
* Gets or sets the maximum time in seconds that end user has to complete a page in the survey. If the value is 0 or less, an end user has no time limit.
*
* You may override this value for every page.
* @see startTimer
* @see maxTimeToFinish
* @see PageModel.maxTimeToFinish
*/
get: function () {
return this.getPropertyValue("maxTimeToFinishPage", 0);
},
set: function (val) {
this.setPropertyValue("maxTimeToFinishPage", val);
},
enumerable: true,
configurable: true
});
SurveyModel.prototype.getPageMaxTimeToFinish = function (page) {
if (!page || page.maxTimeToFinish < 0)
return 0;
return page.maxTimeToFinish > 0
? page.maxTimeToFinish
: this.maxTimeToFinishPage;
};
SurveyModel.prototype.doTimer = function () {
var page = this.currentPage;
if (page) {
page.timeSpent = page.timeSpent + 1;
}
this.timeSpent = this.timeSpent + 1;
this.onTimer.fire(this, {});
if (this.maxTimeToFinish > 0 && this.maxTimeToFinish == this.timeSpent) {
this.completeLastPage();
}
if (page) {
var pageLimit = this.getPageMaxTimeToFinish(page);
if (pageLimit > 0 && pageLimit == page.timeSpent) {
if (this.isLastPage) {
this.completeLastPage();
}
else {
this.nextPage();
}
}
}
};
//ISurveyImplementor
SurveyModel.prototype.geSurveyData = function () {
return this;
};
SurveyModel.prototype.getSurvey = function () {
return this;
};
SurveyModel.prototype.getTextProcessor = function () {
return this;
};
//ISurveyTriggerOwner
SurveyModel.prototype.getObjects = function (pages, questions) {
var result = [];
Array.prototype.push.apply(result, this.getPagesByNames(pages));
Array.prototype.push.apply(result, this.getQuestionsByNames(questions));
return result;
};
SurveyModel.prototype.setTriggerValue = function (name, value, isVariable) {
if (!name)
return;
if (isVariable) {
this.setVariable(name, value);
}
else {
var question = this.getQuestionByName(name);
if (!!question) {
question.value = value;
}
else {
var processor = new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]();
var firstName = processor.getFirstName(name);
if (firstName == name) {
this.setValue(name, value);
}
else {
if (!this.getQuestionByName(firstName))
return;
var data = this.getUnbindValue(this.getFilteredValues());
processor.setValue(data, name, value);
this.setValue(firstName, data[firstName]);
}
}
}
};
SurveyModel.prototype.copyTriggerValue = function (name, fromName) {
if (!name || !fromName)
return;
var processor = new __WEBPACK_IMPORTED_MODULE_7__conditionProcessValue__["a" /* ProcessValue */]();
var value = processor.getValue(fromName, this.getFilteredValues());
this.setTriggerValue(name, value, false);
};
SurveyModel.prototype.focusQuestion = function (name) {
var question = this.getQuestionByName(name, true);
if (!question || !question.isVisible || !question.page)
return false;
this.currentPage = question.page;
setTimeout(function () {
question.focus(), 1;
});
return true;
};
/**
* Use this method to dispose survey model properly.
*/
SurveyModel.prototype.dispose = function () {
for (var i = 0; i < this.pages.length; i++) {
this.pages[i].dispose();
}
this.pages.splice(0, this.pages.length);
};
SurveyModel.stylesManager = null;
SurveyModel.platform = "unknown";
return SurveyModel;
}(__WEBPACK_IMPORTED_MODULE_3__base__["b" /* Base */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("survey", [
{
name: "locale",
choices: function () {
return __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].getLocales();
},
onGetValue: function (obj) {
return obj.locale == __WEBPACK_IMPORTED_MODULE_9__surveyStrings__["a" /* surveyLocalization */].defaultLocale ? null : obj.locale;
},
},
{ name: "title", serializationProperty: "locTitle" },
{ name: "description:text", serializationProperty: "locDescription" },
{ name: "logo", serializationProperty: "locLogo" },
{ name: "logoWidth:number", default: 300, minValue: 0 },
{ name: "logoHeight:number", default: 200, minValue: 0 },
{
name: "logoFit",
default: "contain",
choices: ["none", "contain", "cover", "fill"],
},
{
name: "logoPosition",
default: "left",
choices: ["none", "left", "right", "top", "bottom"],
},
{ name: "focusFirstQuestionAutomatic:boolean", default: true },
{ name: "focusOnFirstError:boolean", default: true },
{ name: "completedHtml:html", serializationProperty: "locCompletedHtml" },
{
name: "completedBeforeHtml:html",
serializationProperty: "locCompletedBeforeHtml",
},
{
name: "completedHtmlOnCondition:htmlconditions",
className: "htmlconditionitem",
},
{ name: "loadingHtml:html", serializationProperty: "locLoadingHtml" },
{ name: "pages:surveypages", className: "page" },
{
name: "questions",
alternativeName: "elements",
baseClassName: "question",
visible: false,
isLightSerializable: false,
onGetValue: function (obj) {
return null;
},
onSetValue: function (obj, value, jsonConverter) {
var page = obj.addNewPage("");
jsonConverter.toObject({ questions: value }, page);
},
},
{
name: "triggers:triggers",
baseClassName: "surveytrigger",
classNamePart: "trigger",
},
{
name: "calculatedValues:calculatedvalues",
className: "calculatedvalue",
},
{ name: "surveyId", visible: false },
{ name: "surveyPostId", visible: false },
{ name: "surveyShowDataSaving:boolean", visible: false },
"cookieName",
"sendResultOnPageNext:boolean",
{
name: "showNavigationButtons",
default: "bottom",
choices: ["none", "top", "bottom", "both"],
},
{ name: "showPrevButton:boolean", default: true },
{ name: "showTitle:boolean", default: true },
{ name: "showPageTitles:boolean", default: true },
{ name: "showCompletedPage:boolean", default: true },
"navigateToUrl",
{
name: "navigateToUrlOnCondition:urlconditions",
className: "urlconditionitem",
},
{
name: "questionsOrder",
default: "initial",
choices: ["initial", "random"],
},
"showPageNumbers:boolean",
{
name: "showQuestionNumbers",
default: "on",
choices: ["on", "onPage", "off"],
},
{
name: "questionTitleLocation",
default: "top",
choices: ["top", "bottom", "left"],
},
{
name: "questionDescriptionLocation",
default: "underTitle",
choices: ["underInput", "underTitle"],
},
{ name: "questionErrorLocation", default: "top", choices: ["top", "bottom"] },
{
name: "showProgressBar",
default: "off",
choices: ["off", "top", "bottom", "both"],
},
{
name: "progressBarType",
default: "pages",
choices: ["pages", "questions", "requiredQuestions", "correctQuestions"],
},
{ name: "mode", default: "edit", choices: ["edit", "display"] },
{ name: "storeOthersAsComment:boolean", default: true },
{ name: "maxTextLength:number", default: 0, minValue: 0 },
{ name: "maxOthersLength:number", default: 0, minValue: 0 },
"goNextPageAutomatic:boolean",
{
name: "clearInvisibleValues",
default: "onComplete",
choices: ["none", "onComplete", "onHidden"],
},
{
name: "checkErrorsMode",
default: "onNextPage",
choices: ["onNextPage", "onValueChanged", "onComplete"],
},
{
name: "textUpdateMode",
default: "onBlur",
choices: ["onBlur", "onTyping"],
},
{ name: "startSurveyText", serializationProperty: "locStartSurveyText" },
{ name: "pagePrevText", serializationProperty: "locPagePrevText" },
{ name: "pageNextText", serializationProperty: "locPageNextText" },
{ name: "completeText", serializationProperty: "locCompleteText" },
{ name: "previewText", serializationProperty: "locPreviewText" },
{ name: "editText", serializationProperty: "locEditText" },
{ name: "requiredText", default: "*" },
{
name: "questionStartIndex",
dependsOn: ["showQuestionNumbers"],
visibleIf: function (survey) {
return !survey || survey.showQuestionNumbers !== "off";
},
},
{
name: "questionTitlePattern",
default: "numTitleRequire",
dependsOn: ["questionStartIndex", "requiredText"],
choices: function (obj) {
if (!obj)
return [];
return obj.getQuestionTitlePatternOptions();
},
},
{
name: "questionTitleTemplate",
visible: false,
isSerializable: false,
serializationProperty: "locQuestionTitleTemplate",
},
{ name: "firstPageIsStarted:boolean", default: false },
{
name: "isSinglePage:boolean",
default: false,
visible: false,
isSerializable: false,
},
{
name: "questionsOnPageMode",
default: "standard",
choices: ["singlePage", "standard", "questionPerPage"],
},
{
name: "showPreviewBeforeComplete",
default: "noPreview",
choices: ["noPreview", "showAllQuestions", "showAnsweredQuestions"],
},
{ name: "maxTimeToFinish:number", default: 0, minValue: 0 },
{ name: "maxTimeToFinishPage:number", default: 0, minValue: 0 },
{
name: "showTimerPanel",
default: "none",
choices: ["none", "top", "bottom"],
},
{
name: "showTimerPanelMode",
default: "all",
choices: ["all", "page", "survey"],
},
]);
/***/ }),
/* 34 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return ValidatorResult; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return SurveyValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ValidatorRunner; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return NumericValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return TextValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return AnswerCountValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return RegexValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return EmailValidator; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return ExpressionValidator; });
var ValidatorResult = /** @class */ (function () {
function ValidatorResult(value, error) {
if (error === void 0) { error = null; }
this.value = value;
this.error = error;
}
return ValidatorResult;
}());
/**
* Base SurveyJS validator class.
*/
var SurveyValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyValidator, _super);
function SurveyValidator() {
var _this = _super.call(this) || this;
_this.createLocalizableString("text", _this, true);
return _this;
}
Object.defineProperty(SurveyValidator.prototype, "text", {
get: function () {
return this.getLocalizableStringText("text");
},
set: function (value) {
this.setLocalizableStringText("text", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyValidator.prototype, "isValidateAllValues", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyValidator.prototype, "locText", {
get: function () {
return this.getLocalizableString("text");
},
enumerable: true,
configurable: true
});
SurveyValidator.prototype.getErrorText = function (name) {
if (this.text)
return this.text;
return this.getDefaultErrorText(name);
};
SurveyValidator.prototype.getDefaultErrorText = function (name) {
return "";
};
SurveyValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
return null;
};
Object.defineProperty(SurveyValidator.prototype, "isRunning", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyValidator.prototype, "isAsync", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
SurveyValidator.prototype.getLocale = function () {
return !!this.errorOwner ? this.errorOwner.getLocale() : "";
};
SurveyValidator.prototype.getMarkdownHtml = function (text) {
return !!this.errorOwner ? this.errorOwner.getMarkdownHtml(text) : null;
};
SurveyValidator.prototype.getProcessedText = function (text) {
return !!this.errorOwner ? this.errorOwner.getProcessedText(text) : text;
};
SurveyValidator.prototype.createCustomError = function (name) {
return new __WEBPACK_IMPORTED_MODULE_2__error__["a" /* CustomError */](this.getErrorText(name), this.errorOwner);
};
SurveyValidator.prototype.toString = function () {
var res = this.getType().replace("validator", "");
if (!!this.text) {
res += ", " + this.text;
}
return res;
};
return SurveyValidator;
}(__WEBPACK_IMPORTED_MODULE_1__base__["b" /* Base */]));
var ValidatorRunner = /** @class */ (function () {
function ValidatorRunner() {
}
ValidatorRunner.prototype.run = function (owner) {
var _this = this;
var res = [];
var values = null;
var properties = null;
this.prepareAsyncValidators();
var asyncResults = [];
var validators = owner.getValidators();
for (var i = 0; i < validators.length; i++) {
var validator = validators[i];
if (!values && validator.isValidateAllValues) {
values = owner.getDataFilteredValues();
properties = owner.getDataFilteredProperties();
}
if (validator.isAsync) {
this.asyncValidators.push(validator);
validator.onAsyncCompleted = function (result) {
if (!!result && !!result.error)
asyncResults.push(result.error);
if (!_this.onAsyncCompleted)
return;
for (var i = 0; i < _this.asyncValidators.length; i++) {
if (_this.asyncValidators[i].isRunning)
return;
}
_this.onAsyncCompleted(asyncResults);
};
}
}
validators = owner.getValidators();
for (var i = 0; i < validators.length; i++) {
var validator = validators[i];
var validatorResult = validator.validate(owner.validatedValue, owner.getValidatorTitle(), values, properties);
if (!!validatorResult && !!validatorResult.error) {
res.push(validatorResult.error);
}
}
if (this.asyncValidators.length == 0 && !!this.onAsyncCompleted)
this.onAsyncCompleted([]);
return res;
};
ValidatorRunner.prototype.prepareAsyncValidators = function () {
if (!!this.asyncValidators) {
for (var i = 0; i < this.asyncValidators.length; i++) {
this.asyncValidators[i].onAsyncCompleted = null;
}
}
this.asyncValidators = [];
};
return ValidatorRunner;
}());
/**
* Validate numeric values.
*/
var NumericValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(NumericValidator, _super);
function NumericValidator(minValue, maxValue) {
if (minValue === void 0) { minValue = null; }
if (maxValue === void 0) { maxValue = null; }
var _this = _super.call(this) || this;
_this.minValue = minValue;
_this.maxValue = maxValue;
return _this;
}
NumericValidator.prototype.getType = function () {
return "numericvalidator";
};
NumericValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value))
return null;
if (!__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isNumber(value)) {
return new ValidatorResult(null, new __WEBPACK_IMPORTED_MODULE_2__error__["d" /* RequreNumericError */](null, this.errorOwner));
}
var result = new ValidatorResult(parseFloat(value));
if (this.minValue !== null && this.minValue > result.value) {
result.error = this.createCustomError(name);
return result;
}
if (this.maxValue !== null && this.maxValue < result.value) {
result.error = this.createCustomError(name);
return result;
}
return typeof value === "number" ? null : result;
};
NumericValidator.prototype.getDefaultErrorText = function (name) {
var vName = name ? name : __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("value");
if (this.minValue !== null && this.maxValue !== null) {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("numericMinMax")["format"](vName, this.minValue, this.maxValue);
}
else {
if (this.minValue !== null) {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("numericMin")["format"](vName, this.minValue);
}
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("numericMax")["format"](vName, this.maxValue);
}
};
Object.defineProperty(NumericValidator.prototype, "minValue", {
/**
* The minValue property.
*/
get: function () {
return this.getPropertyValue("minValue");
},
set: function (val) {
this.setPropertyValue("minValue", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(NumericValidator.prototype, "maxValue", {
/**
* The maxValue property.
*/
get: function () {
return this.getPropertyValue("maxValue");
},
set: function (val) {
this.setPropertyValue("maxValue", val);
},
enumerable: true,
configurable: true
});
return NumericValidator;
}(SurveyValidator));
/**
* Validate text values.
*/
var TextValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(TextValidator, _super);
function TextValidator(minLength, maxLength, allowDigits) {
if (minLength === void 0) { minLength = 0; }
if (maxLength === void 0) { maxLength = 0; }
if (allowDigits === void 0) { allowDigits = true; }
var _this = _super.call(this) || this;
_this.minLength = minLength;
_this.maxLength = maxLength;
_this.allowDigits = allowDigits;
return _this;
}
TextValidator.prototype.getType = function () {
return "textvalidator";
};
TextValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (value !== "" && __WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value))
return null;
if (!this.allowDigits) {
var reg = /^[A-Za-z\s]*$/;
if (!reg.test(value)) {
return new ValidatorResult(null, this.createCustomError(name));
}
}
if (this.minLength > 0 && value.length < this.minLength) {
return new ValidatorResult(null, this.createCustomError(name));
}
if (this.maxLength > 0 && value.length > this.maxLength) {
return new ValidatorResult(null, this.createCustomError(name));
}
return null;
};
TextValidator.prototype.getDefaultErrorText = function (name) {
if (this.minLength > 0 && this.maxLength > 0)
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("textMinMaxLength")["format"](this.minLength, this.maxLength);
if (this.minLength > 0)
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("textMinLength")["format"](this.minLength);
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("textMaxLength")["format"](this.maxLength);
};
Object.defineProperty(TextValidator.prototype, "minLength", {
/**
* The minLength property.
*/
get: function () {
return this.getPropertyValue("minLength");
},
set: function (val) {
this.setPropertyValue("minLength", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextValidator.prototype, "maxLength", {
/**
* The maxLength property.
*/
get: function () {
return this.getPropertyValue("maxLength");
},
set: function (val) {
this.setPropertyValue("maxLength", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(TextValidator.prototype, "allowDigits", {
/**
* The allowDigits property.
*/
get: function () {
return this.getPropertyValue("allowDigits", true);
},
set: function (val) {
this.setPropertyValue("allowDigits", val);
},
enumerable: true,
configurable: true
});
return TextValidator;
}(SurveyValidator));
var AnswerCountValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(AnswerCountValidator, _super);
function AnswerCountValidator(minCount, maxCount) {
if (minCount === void 0) { minCount = null; }
if (maxCount === void 0) { maxCount = null; }
var _this = _super.call(this) || this;
_this.minCount = minCount;
_this.maxCount = maxCount;
return _this;
}
AnswerCountValidator.prototype.getType = function () {
return "answercountvalidator";
};
AnswerCountValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (value == null || value.constructor != Array)
return null;
var count = value.length;
if (this.minCount && count < this.minCount) {
return new ValidatorResult(null, this.createCustomError(__WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("minSelectError")["format"](this.minCount)));
}
if (this.maxCount && count > this.maxCount) {
return new ValidatorResult(null, this.createCustomError(__WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("maxSelectError")["format"](this.maxCount)));
}
return null;
};
AnswerCountValidator.prototype.getDefaultErrorText = function (name) {
return name;
};
Object.defineProperty(AnswerCountValidator.prototype, "minCount", {
/**
* The minCount property.
*/
get: function () {
return this.getPropertyValue("minCount");
},
set: function (val) {
this.setPropertyValue("minCount", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(AnswerCountValidator.prototype, "maxCount", {
/**
* The maxCount property.
*/
get: function () {
return this.getPropertyValue("maxCount");
},
set: function (val) {
this.setPropertyValue("maxCount", val);
},
enumerable: true,
configurable: true
});
return AnswerCountValidator;
}(SurveyValidator));
/**
* Use it to validate the text by regular expressions.
*/
var RegexValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(RegexValidator, _super);
function RegexValidator(regex) {
if (regex === void 0) { regex = null; }
var _this = _super.call(this) || this;
_this.regex = regex;
return _this;
}
RegexValidator.prototype.getType = function () {
return "regexvalidator";
};
RegexValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (!this.regex || __WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value))
return null;
var re = new RegExp(this.regex);
if (Array.isArray(value)) {
for (var i = 0; i < value.length; i++) {
var res = this.hasError(re, value[i], name);
if (res)
return res;
}
}
return this.hasError(re, value, name);
};
RegexValidator.prototype.hasError = function (re, value, name) {
if (re.test(value))
return null;
return new ValidatorResult(value, this.createCustomError(name));
};
Object.defineProperty(RegexValidator.prototype, "regex", {
/**
* The regex property.
*/
get: function () {
return this.getPropertyValue("regex");
},
set: function (val) {
this.setPropertyValue("regex", val);
},
enumerable: true,
configurable: true
});
return RegexValidator;
}(SurveyValidator));
/**
* Validate e-mail address in the text input
*/
var EmailValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(EmailValidator, _super);
function EmailValidator() {
var _this = _super.call(this) || this;
_this.re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()=[\]\.,;:\s@\"]+\.)+[^<>()=[\]\.,;:\s@\"]{2,})$/i;
return _this;
}
EmailValidator.prototype.getType = function () {
return "emailvalidator";
};
EmailValidator.prototype.validate = function (value, name, values, properties) {
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (!value)
return null;
if (this.re.test(value))
return null;
return new ValidatorResult(value, this.createCustomError(name));
};
EmailValidator.prototype.getDefaultErrorText = function (name) {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("invalidEmail");
};
return EmailValidator;
}(SurveyValidator));
/**
* Show error if expression returns false
*/
var ExpressionValidator = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ExpressionValidator, _super);
function ExpressionValidator(expression) {
if (expression === void 0) { expression = null; }
var _this = _super.call(this) || this;
_this.conditionRunner = null;
_this.isRunningValue = false;
_this.expression = expression;
return _this;
}
ExpressionValidator.prototype.getType = function () {
return "expressionvalidator";
};
Object.defineProperty(ExpressionValidator.prototype, "isValidateAllValues", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ExpressionValidator.prototype, "isAsync", {
get: function () {
if (!this.ensureConditionRunner())
return false;
return this.conditionRunner.isAsync;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ExpressionValidator.prototype, "isRunning", {
get: function () {
return this.isRunningValue;
},
enumerable: true,
configurable: true
});
ExpressionValidator.prototype.validate = function (value, name, values, properties) {
var _this = this;
if (name === void 0) { name = null; }
if (values === void 0) { values = null; }
if (properties === void 0) { properties = null; }
if (!this.ensureConditionRunner())
return null;
this.conditionRunner.onRunComplete = function (res) {
_this.isRunningValue = false;
if (!!_this.onAsyncCompleted) {
_this.onAsyncCompleted(_this.generateError(res, value));
}
};
this.isRunningValue = true;
var res = this.conditionRunner.run(values, properties);
if (this.conditionRunner.isAsync)
return null;
this.isRunningValue = false;
return this.generateError(res, value);
};
ExpressionValidator.prototype.generateError = function (res, value) {
if (!res) {
return new ValidatorResult(value, this.createCustomError(name));
}
return null;
};
ExpressionValidator.prototype.getDefaultErrorText = function (name) {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("invalidExpression")["format"](this.expression);
};
ExpressionValidator.prototype.ensureConditionRunner = function () {
if (!!this.conditionRunner) {
this.conditionRunner.expression = this.expression;
return true;
}
if (!this.expression)
return false;
this.conditionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["b" /* ConditionRunner */](this.expression);
return true;
};
Object.defineProperty(ExpressionValidator.prototype, "expression", {
/**
* The expression property.
*/
get: function () {
return this.getPropertyValue("expression");
},
set: function (val) {
this.setPropertyValue("expression", val);
},
enumerable: true,
configurable: true
});
return ExpressionValidator;
}(SurveyValidator));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("surveyvalidator", [
{ name: "text", serializationProperty: "locText" }
]);
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("numericvalidator", ["minValue:number", "maxValue:number"], function () {
return new NumericValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("textvalidator", ["minLength:number", "maxLength:number", "allowDigits:boolean"], function () {
return new TextValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("answercountvalidator", ["minCount:number", "maxCount:number"], function () {
return new AnswerCountValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("regexvalidator", ["regex"], function () {
return new RegexValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("emailvalidator", [], function () {
return new EmailValidator();
}, "surveyvalidator");
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("expressionvalidator", ["expression:condition"], function () {
return new ExpressionValidator();
}, "surveyvalidator");
/***/ }),
/* 35 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__panel_base__ = __webpack_require__(53);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyPage; });
var SurveyPage = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyPage, _super);
function SurveyPage(props) {
return _super.call(this, props) || this;
}
SurveyPage.prototype.getPanelBase = function () {
return this.props.page;
};
Object.defineProperty(SurveyPage.prototype, "page", {
get: function () {
return this.panelBase;
},
enumerable: true,
configurable: true
});
SurveyPage.prototype.canRender = function () {
return _super.prototype.canRender.call(this) && !!this.survey && !!this.page;
};
SurveyPage.prototype.renderElement = function () {
var title = this.renderTitle();
var description = this.renderDescription();
var rows = this.renderRows(this.panelBase.cssClasses);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: this.rootRef, className: this.panelBase.cssClasses.page.root },
title,
description,
rows));
};
SurveyPage.prototype.renderTitle = function () {
if (!this.page._showTitle)
return null;
var text = __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.page.locTitle);
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h4", { className: this.panelBase.cssClasses.page.title }, text);
};
SurveyPage.prototype.renderDescription = function () {
if (!this.page._showDescription)
return null;
var text = __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.page.locDescription);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.panelBase.cssClasses.page.description }, text));
};
return SurveyPage;
}(__WEBPACK_IMPORTED_MODULE_3__panel_base__["a" /* SurveyPanelBase */]));
/***/ }),
/* 36 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactsurveymodel__ = __webpack_require__(27);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__page__ = __webpack_require__(35);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactSurveyNavigation__ = __webpack_require__(37);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__reactquestionfactory__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssstandard__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__reactSurveyProgress__ = __webpack_require__(38);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__reacttimerpanel__ = __webpack_require__(41);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__stylesmanager__ = __webpack_require__(32);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Survey; });
var Survey = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(Survey, _super);
function Survey(props) {
var _this = _super.call(this, props) || this;
_this.previousJSON = {};
_this.isCurrentPageChanged = false;
_this.onCurrentPageChangedHandler = function (sender, options) {
_this.isCurrentPageChanged = true;
};
_this.handleTryAgainClick = _this.handleTryAgainClick.bind(_this);
_this.createSurvey(props);
_this.updateSurvey(props, {});
//set the first page
var dummy = _this.survey.currentPage;
_this.rootRef = __WEBPACK_IMPORTED_MODULE_1_react__["createRef"]();
return _this;
}
Object.defineProperty(Survey, "cssType", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssstandard__["b" /* surveyCss */].currentType;
},
set: function (value) {
__WEBPACK_IMPORTED_MODULE_10__stylesmanager__["a" /* StylesManager */].applyTheme(value);
},
enumerable: true,
configurable: true
});
Survey.prototype.getStateElement = function () {
return this.survey;
};
Survey.prototype.shouldComponentUpdate = function (nextProps, nextState) {
if (this.isModelJSONChanged(nextProps)) {
this.createSurvey(nextProps);
this.updateSurvey(nextProps, {});
}
return true;
};
Survey.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
if (this.isCurrentPageChanged) {
this.isCurrentPageChanged = false;
this.survey.scrollToTopOnPageChange();
}
this.updateSurvey(this.props, prevProps);
};
Survey.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
var el = this.rootRef.current;
if (el && this.survey)
this.survey.doAfterRenderSurvey(el);
if (this.survey) {
this.survey.startTimerFromUI();
}
};
Survey.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (this.survey) {
this.survey.stopTimer();
this.survey.onCurrentPageChanged.remove(this.onCurrentPageChangedHandler);
}
};
Survey.prototype.doRender = function () {
var renderResult;
if (this.survey.state == "completed") {
renderResult = this.renderCompleted();
}
else if (this.survey.state == "completedbefore") {
renderResult = this.renderCompletedBefore();
}
else if (this.survey.state == "loading") {
renderResult = this.renderLoading();
}
else if (this.survey.state == "starting") {
renderResult = this.renderStartPage();
}
else {
renderResult = this.renderSurvey();
}
var header = this.renderHeader();
var onSubmit = function (event) {
event.preventDefault();
};
var customHeader = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: "sv_custom_header" });
if (this.survey.hasLogo) {
customHeader = null;
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: this.rootRef, className: this.css.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("form", { onSubmit: onSubmit },
customHeader,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.container },
header,
renderResult))));
};
Survey.prototype.renderElement = function () {
return this.doRender();
};
Object.defineProperty(Survey.prototype, "css", {
get: function () {
return this.survey.css;
},
set: function (value) {
this.survey.css = value;
},
enumerable: true,
configurable: true
});
Survey.prototype.handleTryAgainClick = function (event) {
this.survey.doComplete();
};
Survey.prototype.renderCompleted = function () {
if (!this.survey.showCompletedPage)
return null;
var completedState = null;
if (this.survey.completedState) {
var tryAgainButton = null;
if (this.survey.completedState == "error") {
var btnText = this.survey.getLocString("saveAgainButton");
tryAgainButton = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { type: "button", value: btnText, className: this.css.saveData.saveAgainButton, onClick: this.handleTryAgainClick }));
}
var css = this.css.saveData[this.survey.completedState];
completedState = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.saveData.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: css },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, this.survey.completedStateText),
tryAgainButton)));
}
var htmlValue = { __html: this.survey.processedCompletedHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue, className: [this.css.body, this.css.completedPage].join(" ") }),
completedState));
};
Survey.prototype.renderCompletedBefore = function () {
var htmlValue = { __html: this.survey.processedCompletedBeforeHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue, className: this.css.body }));
};
Survey.prototype.renderLoading = function () {
var htmlValue = { __html: this.survey.processedLoadingHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue, className: this.css.body }));
};
Survey.prototype.renderStartPage = function () {
var startedPage = this.survey.startedPage
? this.renderPage(this.survey.startedPage)
: null;
var pageId = this.survey.startedPage ? this.survey.startedPage.id : "";
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: pageId, className: this.css.body },
this.renderNavigation("top"),
startedPage,
this.renderNavigation("bottom"))));
};
Survey.prototype.renderSurvey = function () {
var currentPage = this.survey.currentPage
? this.renderPage(this.survey.currentPage)
: null;
var pageId = this.survey.currentPage ? this.survey.currentPage.id : "";
var topProgress = this.survey.isShowProgressBarOnTop
? this.renderProgress(true)
: null;
var bottomProgress = this.survey.isShowProgressBarOnBottom
? this.renderProgress(false)
: null;
if (!currentPage) {
currentPage = this.renderEmptySurvey();
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: pageId, className: !currentPage ? this.css.bodyEmpty : this.css.body },
topProgress,
this.renderTimerPanel("top"),
this.renderNavigation("top"),
currentPage,
this.renderTimerPanel("bottom"),
bottomProgress,
this.renderNavigation("bottom")));
};
Survey.prototype.renderTitle = function () {
var title = null;
var description = null;
if (this.survey.title && this.survey.showTitle) {
title = __WEBPACK_IMPORTED_MODULE_9__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.survey.locTitle);
description = __WEBPACK_IMPORTED_MODULE_9__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.survey.locDescription);
}
return title ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.headerText },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h3", { className: this.css.title }, title),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("h5", { className: this.css.description }, description))) : null;
};
Survey.prototype.renderHeader = function () {
if ((this.survey.title && this.survey.showTitle) || this.survey.hasLogo) {
var title = this.renderTitle();
var style = { objectFit: this.survey.logoFit };
var imageBefore = null;
var imageAfter = [];
if (this.survey.isLogoBefore) {
imageBefore = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.survey.logoClassNames },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("img", { className: this.survey.css.logoImage, src: this.survey.locLogo.renderedHtml, width: this.survey.logoWidth ? this.survey.logoWidth + "px" : undefined, height: this.survey.logoHeight
? this.survey.logoHeight + "px"
: undefined, style: style })));
}
if (this.survey.isLogoAfter) {
imageAfter.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.survey.logoClassNames },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("img", { className: this.survey.css.logoImage, src: this.survey.locLogo.renderedHtml, width: this.survey.logoWidth ? this.survey.logoWidth + "px" : undefined, height: this.survey.logoHeight
? this.survey.logoHeight + "px"
: undefined, style: style })));
imageAfter.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: "sv-logo--right-tail" }));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.header },
imageBefore,
title,
imageAfter));
}
return null;
};
Survey.prototype.renderTimerPanel = function (location) {
if (this.survey.showTimerPanel != location)
return null;
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_8__reacttimerpanel__["a" /* SurveyTimerPanel */], { survey: this.survey });
};
Survey.prototype.renderPage = function (page) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__page__["a" /* SurveyPage */], { survey: this.survey, page: page, css: this.css, creator: this }));
};
Survey.prototype.renderProgress = function (isTop) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_7__reactSurveyProgress__["a" /* SurveyProgress */], { survey: this.survey, css: this.css, isTop: isTop });
};
Survey.prototype.renderNavigation = function (navPosition) {
if (this.survey.isNavigationButtonsShowing !== "both" &&
(this.survey.isNavigationButtonsShowing === "none" ||
this.survey.isNavigationButtonsShowing !== navPosition)) {
return null;
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_4__reactSurveyNavigation__["a" /* SurveyNavigation */], { survey: this.survey, css: this.css });
};
Survey.prototype.renderEmptySurvey = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, this.survey.emptySurveyText);
};
Survey.prototype.createSurvey = function (newProps) {
if (!newProps)
newProps = {};
this.previousJSON = {};
if (newProps) {
if (newProps.model) {
this.survey = newProps.model;
}
else {
if (newProps.json) {
this.previousJSON = newProps.json;
this.survey = new __WEBPACK_IMPORTED_MODULE_2__reactsurveymodel__["a" /* ReactSurveyModel */](newProps.json);
}
}
}
else {
this.survey = new __WEBPACK_IMPORTED_MODULE_2__reactsurveymodel__["a" /* ReactSurveyModel */]();
}
if (!!newProps.css) {
this.survey.mergeCss(newProps.css, this.css);
}
this.setSurveyEvents();
};
Survey.prototype.isModelJSONChanged = function (newProps) {
if (!!newProps["model"]) {
return this.survey !== newProps["model"];
}
if (!!newProps["json"]) {
return !__WEBPACK_IMPORTED_MODULE_11__helpers__["a" /* Helpers */].isTwoValueEquals(newProps["json"], this.previousJSON);
}
return false;
};
Survey.prototype.updateSurvey = function (newProps, oldProps) {
if (!newProps)
return;
oldProps = oldProps || {};
for (var key in newProps) {
if (key == "model" || key == "children" || key == "json") {
continue;
}
if (key == "css") {
this.survey.mergeValues(newProps.css, this.survey.getCss());
this.survey["updateElementCss"]();
continue;
}
if (newProps[key] === oldProps[key])
continue;
if (key.indexOf("on") == 0 && this.survey[key] && this.survey[key].add) {
if (!!oldProps[key]) {
this.survey[key].remove(oldProps[key]);
}
this.survey[key].add(newProps[key]);
}
else {
this.survey[key] = newProps[key];
}
}
};
Survey.prototype.setSurveyEvents = function () {
var self = this;
this.survey.renderCallback = function () {
var counter = !!self.state && !!self.state.modelChanged ? self.state.modelChanged : 0;
self.setState({ modelChanged: counter + 1 });
};
this.survey.onPartialSend.add(function (sender) {
if (!!self.state) {
self.setState(self.state);
}
});
this.survey.onCurrentPageChanged.add(this.onCurrentPageChangedHandler);
};
//ISurveyCreator
Survey.prototype.createQuestionElement = function (question) {
return __WEBPACK_IMPORTED_MODULE_5__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.createQuestion(question.getTemplate(), {
question: question,
isDisplayMode: question.isReadOnly,
creator: this,
});
};
Survey.prototype.renderError = function (key, error, cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: key },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.error.icon, "aria-hidden": "true" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.error.item },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_9__reactquestionelement__["e" /* SurveyLocString */], { locStr: error.locText }))));
};
Survey.prototype.questionTitleLocation = function () {
return this.survey.questionTitleLocation;
};
Survey.prototype.questionErrorLocation = function () {
return this.survey.questionErrorLocation;
};
return Survey;
}(__WEBPACK_IMPORTED_MODULE_9__reactquestionelement__["a" /* SurveyElementBase */]));
/***/ }),
/* 37 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__ = __webpack_require__(25);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyNavigation; });
var SurveyNavigation = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyNavigation, _super);
function SurveyNavigation(props) {
var _this = _super.call(this, props) || this;
_this.mouseDownPage = null;
_this.handlePrevClick = _this.handlePrevClick.bind(_this);
_this.handleNextClick = _this.handleNextClick.bind(_this);
_this.handleNextMouseDown = _this.handleNextMouseDown.bind(_this);
_this.handleMouseDown = _this.handleMouseDown.bind(_this);
_this.handleCompleteClick = _this.handleCompleteClick.bind(_this);
_this.handlePreviewClick = _this.handlePreviewClick.bind(_this);
_this.handleStartClick = _this.handleStartClick.bind(_this);
return _this;
}
SurveyNavigation.prototype.handlePrevClick = function (event) {
this.survey.prevPage();
};
SurveyNavigation.prototype.handleNextClick = function (event) {
if (!!this.mouseDownPage && this.mouseDownPage !== this.survey.currentPage)
return;
this.mouseDownPage = null;
this.survey.nextPage();
};
SurveyNavigation.prototype.handleNextMouseDown = function (event) {
this.mouseDownPage = this.survey.currentPage;
return this.survey.navigationMouseDown();
};
SurveyNavigation.prototype.handleMouseDown = function (event) {
return this.survey.navigationMouseDown();
};
SurveyNavigation.prototype.handleCompleteClick = function (event) {
this.survey.completeLastPage();
};
SurveyNavigation.prototype.handlePreviewClick = function (event) {
this.survey.showPreview();
};
SurveyNavigation.prototype.handleStartClick = function (event) {
this.survey.start();
};
SurveyNavigation.prototype.render = function () {
if (!this.survey || this.survey.isNavigationButtonsShowing === "none")
return null;
var isStartedPage = this.survey.state === "starting";
var prevButton = !isStartedPage && !this.survey.isFirstPage && this.survey.isShowPrevButton
? this.renderButton(this.handlePrevClick, this.handleMouseDown, this.survey.pagePrevText, this.survey.cssNavigationPrev)
: null;
var nextButton = !isStartedPage && !this.survey.isLastPage
? this.renderButton(this.handleNextClick, this.handleNextMouseDown, this.survey.pageNextText, this.survey.cssNavigationNext)
: null;
var completeButton = !isStartedPage &&
this.survey.isLastPage &&
this.survey.isCompleteButtonVisible
? this.renderButton(this.handleCompleteClick, this.handleMouseDown, this.survey.completeText, this.survey.cssNavigationComplete)
: null;
var previewButton = !isStartedPage &&
this.survey.isLastPage &&
this.survey.isPreviewButtonVisible
? this.renderButton(this.handlePreviewClick, this.handleMouseDown, this.survey.previewText, this.survey.cssNavigationPreview)
: null;
var startButton = isStartedPage
? this.renderButton(this.handleStartClick, null, this.survey.startSurveyText, this.survey.cssNavigationStart)
: null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.footer },
startButton,
prevButton,
nextButton,
previewButton,
completeButton));
};
SurveyNavigation.prototype.renderButton = function (click, mouseDown, text, btnClassName) {
var style = { marginRight: "5px" };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: btnClassName, style: style, type: "button", onMouseDown: mouseDown, onClick: click, value: text }));
};
return SurveyNavigation;
}(__WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__["a" /* SurveyNavigationBase */]));
/***/ }),
/* 38 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__ = __webpack_require__(25);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyProgress; });
var SurveyProgress = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyProgress, _super);
function SurveyProgress(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyProgress.prototype, "isTop", {
get: function () {
return this.props.isTop;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyProgress.prototype, "progress", {
get: function () {
return this.survey.progressValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyProgress.prototype, "progressText", {
get: function () {
return this.survey.progressText;
},
enumerable: true,
configurable: true
});
SurveyProgress.prototype.render = function () {
var style = this.isTop ? {} : { marginTop: "1em" };
var progressStyle = {
width: this.progress + "%",
};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.progress, style: style },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: progressStyle, className: this.css.progressBar, role: "progressbar", "aria-valuemin": 0, "aria-valuemax": 100 },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.css.progressText + " " + this.css.progressTextInBar }, this.progressText)),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.css.progressText + " " + this.css.progressTextUnderBar }, this.progressText)));
};
return SurveyProgress;
}(__WEBPACK_IMPORTED_MODULE_2__reactSurveyNavigationBase__["a" /* SurveyNavigationBase */]));
/***/ }),
/* 39 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionCheckbox; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionCheckboxItem; });
var SurveyQuestionCheckbox = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionCheckbox, _super);
function SurveyQuestionCheckbox(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionCheckbox.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionCheckbox.prototype.renderElement = function () {
var _this = this;
var cssClasses = this.question.cssClasses;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("fieldset", { className: cssClasses.root, ref: function (fieldset) { return (_this.control = fieldset); } },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("legend", { "aria-label": this.question.locTitle.renderedHtml }),
this.question.hasColumns
? this.getColumns(cssClasses)
: this.getItems(cssClasses)));
};
SurveyQuestionCheckbox.prototype.getColumns = function (cssClasses) {
var _this = this;
return this.question.columns.map(function (column, ci) {
var items = column.map(function (item, ii) {
return _this.renderItem("item" + ii, item, ci === 0 && ii === 0, cssClasses, "" + ci + ii);
});
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: "column" + ci, className: _this.question.getColumnClass() }, items));
});
};
SurveyQuestionCheckbox.prototype.getItems = function (cssClasses) {
var items = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
items.push(this.renderItem(key, item, i == 0, cssClasses, "" + i));
}
return items;
};
Object.defineProperty(SurveyQuestionCheckbox.prototype, "textStyle", {
get: function () {
return null;
},
enumerable: true,
configurable: true
});
SurveyQuestionCheckbox.prototype.renderItem = function (key, item, isFirst, cssClasses, index) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionCheckboxItem, { key: key, question: this.question, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, item: item, textStyle: this.textStyle, isFirst: isFirst, index: index }));
};
return SurveyQuestionCheckbox;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionCheckboxItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionCheckboxItem, _super);
function SurveyQuestionCheckboxItem(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
_this.selectAllChanged = _this.selectAllChanged.bind(_this);
return _this;
}
SurveyQuestionCheckboxItem.prototype.getStateElement = function () {
return this.item;
};
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "question", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "item", {
get: function () {
return this.props.item;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "textStyle", {
get: function () {
return this.props.textStyle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "isFirst", {
get: function () {
return this.props.isFirst;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "index", {
get: function () {
return this.props.index;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "hideCaption", {
get: function () {
return this.props.hideCaption === true;
},
enumerable: true,
configurable: true
});
SurveyQuestionCheckboxItem.prototype.shouldComponentUpdate = function () {
return (!this.question.customWidget ||
!!this.question.customWidgetData.isNeedRender ||
!!this.question.customWidget.widgetJson.isDefaultRender ||
!!this.question.customWidget.widgetJson.render);
};
SurveyQuestionCheckboxItem.prototype.handleOnChange = function (event) {
var newValue = [].concat(this.question.renderedValue || []);
var index = newValue.indexOf(this.item.value);
if (event.target.checked) {
if (index < 0) {
newValue.push(this.item.value);
}
}
else {
if (index > -1) {
newValue.splice(index, 1);
}
}
this.question.renderedValue = newValue;
};
SurveyQuestionCheckboxItem.prototype.selectAllChanged = function (event) {
this.question.toggleSelectAll();
};
SurveyQuestionCheckboxItem.prototype.canRender = function () {
return !!this.item && !!this.question;
};
SurveyQuestionCheckboxItem.prototype.renderElement = function () {
var isChecked = this.question.isItemSelected(this.item);
var otherItem = this.item.value === this.question.otherItem.value && isChecked
? this.renderOther()
: null;
return this.renderCheckbox(isChecked, otherItem);
};
Object.defineProperty(SurveyQuestionCheckboxItem.prototype, "inputStyle", {
get: function () {
return { marginRight: "3px" };
},
enumerable: true,
configurable: true
});
SurveyQuestionCheckboxItem.prototype.renderCheckbox = function (isChecked, otherItem) {
var id = this.question.inputId + "_" + this.index;
var text = !this.hideCaption ? this.renderLocString(this.item.locText) : "";
var itemClass = this.question.getItemClass(this.item);
var labelClass = this.question.getLabelClass(this.item);
var onItemChanged = this.item == this.question.selectAllItem
? this.selectAllChanged
: this.handleOnChange;
var locText = this.item.locText;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: itemClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: labelClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: this.cssClasses.itemControl, type: "checkbox", value: this.item.value, id: id, style: this.inputStyle, disabled: this.isDisplayMode || !this.item.isEnabled, checked: isChecked, onChange: onItemChanged, "aria-required": this.question.isRequired, "aria-label": locText.renderedHtml, "aria-invalid": this.question.errors.length > 0, "aria-describedby": this.question.errors.length > 0
? this.question.id + "_errors"
: null }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.cssClasses.materialDecorator },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { viewBox: "0 0 24 24", className: this.cssClasses.itemDecorator },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("path", { d: "M5,13l2-2l3,3l7-7l2,2l-9,9L5,13z" })),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "check" })),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.cssClasses.controlLabel, title: locText["koRenderedHtml"] }, text)),
otherItem));
};
SurveyQuestionCheckboxItem.prototype.renderOther = function () {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: "form-group" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, otherCss: this.cssClasses.other, cssClasses: this.cssClasses, isDisplayMode: this.isDisplayMode })));
};
return SurveyQuestionCheckboxItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["d" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("checkbox", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionCheckbox, props);
});
/***/ }),
/* 40 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionRadiogroup; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionRadioItem; });
var SurveyQuestionRadiogroup = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionRadiogroup, _super);
function SurveyQuestionRadiogroup(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionRadiogroup.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionRadiogroup.prototype.renderElement = function () {
var _this = this;
var cssClasses = this.question.cssClasses;
var clearButton = null;
if (this.question.canShowClearButton) {
clearButton = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { type: "button", className: this.question.cssClasses.clearButton, onClick: function () { return _this.question.clearValue(); }, value: this.question.clearButtonCaption })));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("fieldset", { className: cssClasses.root, ref: function (fieldset) { return (_this.control = fieldset); }, role: "radiogroup" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("legend", { "aria-label": this.question.locTitle.renderedHtml }),
this.question.hasColumns
? this.getColumns(cssClasses)
: this.getItems(cssClasses),
clearButton));
};
SurveyQuestionRadiogroup.prototype.getColumns = function (cssClasses) {
var _this = this;
var value = this.getStateValue();
return this.question.columns.map(function (column, ci) {
var items = column.map(function (item, ii) {
return _this.renderItem(item, value, cssClasses, "" + ci + ii);
});
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: "column" + ci, className: _this.question.getColumnClass() }, items));
});
};
SurveyQuestionRadiogroup.prototype.getItems = function (cssClasses) {
var items = [];
var value = this.getStateValue();
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
items.push(this.renderItem(item, value, cssClasses, "" + i));
}
return items;
};
Object.defineProperty(SurveyQuestionRadiogroup.prototype, "textStyle", {
get: function () {
return { marginLeft: "3px", display: "inline", position: "static" };
},
enumerable: true,
configurable: true
});
SurveyQuestionRadiogroup.prototype.renderItem = function (item, value, cssClasses, index) {
var key = "item" + index;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionRadioItem, { key: key, question: this.question, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, item: item, textStyle: this.textStyle, index: index, isChecked: value === item.value }));
};
SurveyQuestionRadiogroup.prototype.getStateValue = function () {
return !this.question.isEmpty() ? this.question.renderedValue : "";
};
return SurveyQuestionRadiogroup;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionRadioItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionRadioItem, _super);
function SurveyQuestionRadioItem(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
SurveyQuestionRadioItem.prototype.getStateElement = function () {
return this.item;
};
Object.defineProperty(SurveyQuestionRadioItem.prototype, "question", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionRadioItem.prototype, "item", {
get: function () {
return this.props.item;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionRadioItem.prototype, "textStyle", {
get: function () {
return this.props.textStyle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionRadioItem.prototype, "index", {
get: function () {
return this.props.index;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionRadioItem.prototype, "isChecked", {
get: function () {
return this.props.isChecked;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionRadioItem.prototype, "hideCaption", {
get: function () {
return this.props.hideCaption === true;
},
enumerable: true,
configurable: true
});
SurveyQuestionRadioItem.prototype.shouldComponentUpdate = function () {
return (!this.question.customWidget ||
!!this.question.customWidgetData.isNeedRender ||
!!this.question.customWidget.widgetJson.isDefaultRender ||
!!this.question.customWidget.widgetJson.render);
};
SurveyQuestionRadioItem.prototype.handleOnChange = function (event) {
this.question.renderedValue = this.item.value;
};
SurveyQuestionRadioItem.prototype.canRender = function () {
return !!this.question && !!this.item;
};
SurveyQuestionRadioItem.prototype.renderElement = function () {
var otherItem = this.isChecked && this.item.value === this.question.otherItem.value
? this.renderOther(this.cssClasses)
: null;
var id = this.question.inputId + "_" + this.index;
var itemText = !this.hideCaption
? this.renderLocString(this.item.locText, this.textStyle)
: "";
var itemClass = this.question.getItemClass(this.item);
var labelClass = this.question.getLabelClass(this.item);
var locText = this.item.locText;
var controlLabelClass = this.question.getControlLabelClass(this.item);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: itemClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: labelClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: this.cssClasses.itemControl, id: id, type: "radio", name: this.question.name + "_" + this.question.id, checked: this.isChecked, value: this.item.value, disabled: this.isDisplayMode || !this.item.isEnabled, onChange: this.handleOnChange, "aria-required": this.question.isRequired, "aria-label": locText.renderedHtml, "aria-invalid": this.question.errors.length > 0, "aria-describedby": this.question.errors.length > 0
? this.question.id + "_errors"
: null, role: "radio" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.cssClasses.materialDecorator },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { className: this.cssClasses.itemDecorator, viewBox: "-12 -12 24 24" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("circle", { r: "6", cx: "0", cy: "0" }))),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "check" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: controlLabelClass, title: locText["koRenderedHtml"] }, itemText)),
otherItem));
};
SurveyQuestionRadioItem.prototype.renderOther = function (cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: "form-group" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, otherCss: cssClasses.other, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode })));
};
return SurveyQuestionRadioItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["d" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("radiogroup", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionRadiogroup, props);
});
/***/ }),
/* 41 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTimerPanel; });
var SurveyTimerPanel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTimerPanel, _super);
function SurveyTimerPanel(props) {
var _this = _super.call(this, props) || this;
_this.update = function () {
_this.setState({ timeSpent: _this.survey.timeSpent });
};
return _this;
}
Object.defineProperty(SurveyTimerPanel.prototype, "survey", {
get: function () {
return this.props.survey;
},
enumerable: true,
configurable: true
});
SurveyTimerPanel.prototype.componentDidMount = function () {
this.survey.onTimer.add(this.update);
};
SurveyTimerPanel.prototype.componentWillUnmount = function () {
this.survey.onTimer.remove(this.update);
};
SurveyTimerPanel.prototype.render = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null, this.survey.timerInfoText);
};
return SurveyTimerPanel;
}(__WEBPACK_IMPORTED_MODULE_1_react__["Component"]));
/***/ }),
/* 42 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__element_factory__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyRow; });
var SurveyRow = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyRow, _super);
function SurveyRow(props) {
var _this = _super.call(this, props) || this;
_this.rootRef = __WEBPACK_IMPORTED_MODULE_1_react__["createRef"]();
return _this;
}
SurveyRow.prototype.getStateElement = function () {
return this.row;
};
Object.defineProperty(SurveyRow.prototype, "row", {
get: function () {
return this.props.row;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyRow.prototype, "survey", {
get: function () {
return this.props.survey;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyRow.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyRow.prototype, "css", {
get: function () {
return this.props.css;
},
enumerable: true,
configurable: true
});
SurveyRow.prototype.canRender = function () {
return !!this.row && !!this.survey && !!this.creator && this.row.visible;
};
SurveyRow.prototype.renderElement = function () {
var _this = this;
var elements = null;
if (this.row.isNeedRender) {
elements = this.row.elements.map(function (element) {
return _this.createElement(element);
});
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: this.rootRef, className: this.css.row }, elements));
};
SurveyRow.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
var el = this.rootRef.current;
if (!!el) {
if (!this.row.isNeedRender) {
var rowContainerDiv = el;
this.row.startLazyRendering(rowContainerDiv);
}
}
};
SurveyRow.prototype.shouldComponentUpdate = function (nextProps, nextState) {
if (nextProps.row !== this.row) {
nextProps.row.isNeedRender = this.row.isNeedRender;
this.stopLazyRendering();
}
return true;
};
SurveyRow.prototype.stopLazyRendering = function () {
this.row.stopLazyRendering();
this.row.isNeedRender = !__WEBPACK_IMPORTED_MODULE_4__settings__["a" /* settings */].lazyRowsRendering;
};
SurveyRow.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
this.stopLazyRendering();
};
SurveyRow.prototype.createElement = function (element) {
var elementType = element.getType();
if (!__WEBPACK_IMPORTED_MODULE_3__element_factory__["a" /* ReactElementFactory */].Instance.isElementRegisgered(elementType)) {
elementType = "question";
}
return __WEBPACK_IMPORTED_MODULE_3__element_factory__["a" /* ReactElementFactory */].Instance.createElement(elementType, {
key: element.name,
element: element,
creator: this.creator,
survey: this.survey,
css: this.css,
});
};
return SurveyRow;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["a" /* SurveyElementBase */]));
/***/ }),
/* 43 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ChoicesRestfull; });
var XmlParser = /** @class */ (function () {
function XmlParser() {
this.parser = new DOMParser();
}
XmlParser.prototype.assignValue = function (target, name, value) {
if (Array.isArray(target[name])) {
target[name].push(value);
}
else if (target[name] !== undefined) {
target[name] = [target[name]].concat(value);
}
else if (typeof value === "object" &&
Object.keys(value).length === 1 &&
Object.keys(value)[0] === name) {
target[name] = value[name];
}
else {
target[name] = value;
}
};
XmlParser.prototype.xml2Json = function (xmlNode, result) {
if (xmlNode.children && xmlNode.children.length > 0) {
for (var i = 0; i < xmlNode.children.length; i++) {
var childNode = xmlNode.children[i];
var childObject = {};
this.xml2Json(childNode, childObject);
this.assignValue(result, childNode.nodeName, childObject);
}
}
else {
this.assignValue(result, xmlNode.nodeName, xmlNode.textContent);
}
};
XmlParser.prototype.parseXmlString = function (xmlString) {
var xmlRoot = this.parser.parseFromString(xmlString, "text/xml");
var json = {};
this.xml2Json(xmlRoot, json);
return json;
};
return XmlParser;
}());
/**
* A definition for filling choices for checkbox, dropdown and radiogroup questions from resfull services.
* The run method call a restfull service and results can be get on getResultCallback.
*/
var ChoicesRestfull = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ChoicesRestfull, _super);
function ChoicesRestfull() {
var _this = _super.call(this) || this;
_this.lastObjHash = "";
_this.isRunningValue = false;
_this.processedUrl = "";
_this.processedPath = "";
_this.isUsingCacheFromUrl = undefined;
_this.error = null;
return _this;
}
Object.defineProperty(ChoicesRestfull, "EncodeParameters", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters = val;
},
enumerable: true,
configurable: true
});
ChoicesRestfull.clearCache = function () {
ChoicesRestfull.itemsResult = {};
ChoicesRestfull.sendingSameRequests = {};
};
ChoicesRestfull.addSameRequest = function (obj) {
if (!obj.isUsingCache)
return false;
var hash = obj.objHash;
var res = ChoicesRestfull.sendingSameRequests[hash];
if (!res) {
ChoicesRestfull.sendingSameRequests[obj.objHash] = [];
return false;
}
res.push(obj);
return true;
};
ChoicesRestfull.unregisterSameRequests = function (obj, items) {
if (!obj.isUsingCache)
return;
var res = ChoicesRestfull.sendingSameRequests[obj.objHash];
delete ChoicesRestfull.sendingSameRequests[obj.objHash];
for (var i = 0; i < res.length; i++) {
if (!!res[i].getResultCallback) {
res[i].getResultCallback(items);
}
}
};
ChoicesRestfull.getCachedItemsResult = function (obj) {
var hash = obj.objHash;
var res = ChoicesRestfull.itemsResult[hash];
if (!res)
return false;
if (obj.getResultCallback) {
obj.getResultCallback(res);
}
return true;
};
ChoicesRestfull.prototype.run = function (textProcessor) {
if (textProcessor === void 0) { textProcessor = null; }
if (!this.url || !this.getResultCallback)
return;
this.processedText(textProcessor);
if (!this.processedUrl) {
this.doEmptyResultCallback({});
this.lastObjHash = this.objHash;
return;
}
if (this.lastObjHash === this.objHash)
return;
this.lastObjHash = this.objHash;
this.error = null;
if (this.useChangedItemsResults())
return;
if (ChoicesRestfull.addSameRequest(this))
return;
this.sendRequest();
};
Object.defineProperty(ChoicesRestfull.prototype, "isUsingCache", {
get: function () {
if (this.isUsingCacheFromUrl === true)
return true;
if (this.isUsingCacheFromUrl === false)
return false;
return __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].useCachingForChoicesRestfull;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "isRunning", {
get: function () {
return this.isRunningValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "isWaitingForParameters", {
get: function () {
return this.url && !this.processedUrl;
},
enumerable: true,
configurable: true
});
ChoicesRestfull.prototype.useChangedItemsResults = function () {
return ChoicesRestfull.getCachedItemsResult(this);
};
ChoicesRestfull.prototype.doEmptyResultCallback = function (serverResult) {
var items = [];
if (this.updateResultCallback) {
items = this.updateResultCallback(items, serverResult);
}
this.getResultCallback(items);
};
ChoicesRestfull.prototype.processedText = function (textProcessor) {
var urlText = this.url;
if (!!urlText) {
urlText = urlText
.replace(ChoicesRestfull.cacheText, "")
.replace(ChoicesRestfull.noCacheText, "");
}
if (textProcessor) {
var pUrl = textProcessor.processTextEx(urlText, false, __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters);
var pPath = textProcessor.processTextEx(this.path, false, __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].webserviceEncodeParameters);
if (!pUrl.hasAllValuesOnLastRun || !pPath.hasAllValuesOnLastRun) {
this.processedUrl = "";
this.processedPath = "";
}
else {
this.processedUrl = pUrl.text;
this.processedPath = pPath.text;
}
}
else {
this.processedUrl = urlText;
this.processedPath = this.path;
}
};
ChoicesRestfull.prototype.parseResponse = function (response) {
var parsedResponse;
if (!!response &&
typeof response.indexOf === "function" &&
response.indexOf("<") === 0) {
var parser = new XmlParser();
parsedResponse = parser.parseXmlString(response);
}
else {
try {
parsedResponse = JSON.parse(response);
}
catch (_a) {
parsedResponse = (response || "")
.split("\n")
.map(function (s) { return s.trim(" "); })
.filter(function (s) { return !!s; });
}
}
return parsedResponse;
};
ChoicesRestfull.prototype.sendRequest = function () {
this.isRunningValue = true;
var xhr = new XMLHttpRequest();
xhr.open("GET", this.processedUrl);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var self = this;
var loadingObjHash = this.objHash;
xhr.onload = function () {
self.isRunningValue = false;
if (xhr.status === 200) {
self.onLoad(self.parseResponse(xhr.response), loadingObjHash);
}
else {
self.onError(xhr.statusText, xhr.responseText);
}
};
var options = { request: xhr };
if (!!ChoicesRestfull.onBeforeSendRequest) {
ChoicesRestfull.onBeforeSendRequest(this, options);
}
this.beforeSendRequest();
options.request.send();
};
ChoicesRestfull.prototype.getType = function () {
return "choicesByUrl";
};
Object.defineProperty(ChoicesRestfull.prototype, "isEmpty", {
get: function () {
return (!this.url &&
!this.path &&
!this.valueName &&
!this.titleName &&
!this.imageLinkName);
},
enumerable: true,
configurable: true
});
ChoicesRestfull.prototype.getCustomPropertiesNames = function () {
var properties = this.getCustomProperties();
var res = new Array();
for (var i = 0; i < properties.length; i++) {
res.push(this.getCustomPropertyName(properties[i].name));
}
return res;
};
ChoicesRestfull.prototype.getCustomPropertyName = function (propertyName) {
return propertyName + "Name";
};
ChoicesRestfull.prototype.getCustomProperties = function () {
var properties = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].getProperties(this.itemValueType);
var res = [];
for (var i = 0; i < properties.length; i++) {
if (properties[i].name === "value" ||
properties[i].name === "text" ||
properties[i].name === "visibleIf" ||
properties[i].name === "enableIf")
continue;
res.push(properties[i]);
}
return res;
};
ChoicesRestfull.prototype.setData = function (json) {
this.clear();
if (json.url)
this.url = json.url;
if (json.path)
this.path = json.path;
if (json.valueName)
this.valueName = json.valueName;
if (json.titleName)
this.titleName = json.titleName;
if (json.imageLinkName)
this.imageLinkName = json.imageLinkName;
if (json.allowEmptyResponse !== undefined)
this.allowEmptyResponse = json.allowEmptyResponse;
if (json.attachOriginalItems !== undefined)
this.attachOriginalItems = json.attachOriginalItems;
var properties = this.getCustomPropertiesNames();
for (var i = 0; i < properties.length; i++) {
if (json[properties[i]])
this[properties[i]] = json[properties[i]];
}
};
ChoicesRestfull.prototype.getData = function () {
if (this.isEmpty)
return null;
var res = {};
if (this.url)
res["url"] = this.url;
if (this.path)
res["path"] = this.path;
if (this.valueName)
res["valueName"] = this.valueName;
if (this.titleName)
res["titleName"] = this.titleName;
if (this.imageLinkName)
res["imageLinkName"] = this.imageLinkName;
if (this.allowEmptyResponse)
res["allowEmptyResponse"] = this.allowEmptyResponse;
if (this.attachOriginalItems)
res["attachOriginalItems"] = this.attachOriginalItems;
var properties = this.getCustomPropertiesNames();
for (var i = 0; i < properties.length; i++) {
if (this[properties[i]])
res[properties[i]] = this[properties[i]];
}
return res;
};
Object.defineProperty(ChoicesRestfull.prototype, "url", {
get: function () {
return this.getPropertyValue("url", "");
},
set: function (val) {
this.setPropertyValue("url", val);
this.isUsingCacheFromUrl = undefined;
if (!val)
return;
if (val.indexOf(ChoicesRestfull.cacheText) > -1) {
this.isUsingCacheFromUrl = true;
}
else {
if (val.indexOf(ChoicesRestfull.noCacheText) > -1) {
this.isUsingCacheFromUrl = false;
}
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "path", {
get: function () {
return this.getPropertyValue("path", "");
},
set: function (val) {
this.setPropertyValue("path", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "valueName", {
get: function () {
return this.getPropertyValue("valueName", "");
},
set: function (val) {
this.setPropertyValue("valueName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "titleName", {
get: function () {
return this.getPropertyValue("titleName", "");
},
set: function (val) {
this.setPropertyValue("titleName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "imageLinkName", {
get: function () {
return this.getPropertyValue("imageLinkName", "");
},
set: function (val) {
this.setPropertyValue("imageLinkName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "allowEmptyResponse", {
get: function () {
return this.getPropertyValue("allowEmptyResponse", false);
},
set: function (val) {
this.setPropertyValue("allowEmptyResponse", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "attachOriginalItems", {
get: function () {
return this.getPropertyValue("attachOriginalItems", false);
},
set: function (val) {
this.setPropertyValue("attachOriginalItems", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ChoicesRestfull.prototype, "itemValueType", {
get: function () {
if (!this.owner)
return "itemvalue";
var prop = __WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].findProperty(this.owner.getType(), "choices");
if (!prop)
return "itemvalue";
if (prop.type == "itemvalue[]")
return "itemvalue";
return prop.type;
},
enumerable: true,
configurable: true
});
ChoicesRestfull.prototype.clear = function () {
this.url = "";
this.path = "";
this.valueName = "";
this.titleName = "";
this.imageLinkName = "";
var properties = this.getCustomPropertiesNames();
for (var i = 0; i < properties.length; i++) {
if (this[properties[i]])
this[properties[i]] = "";
}
};
ChoicesRestfull.prototype.beforeSendRequest = function () {
if (!!this.beforeSendRequestCallback) {
this.beforeSendRequestCallback();
}
};
ChoicesRestfull.prototype.onLoad = function (result, loadingObjHash) {
if (loadingObjHash === void 0) { loadingObjHash = null; }
if (!loadingObjHash) {
loadingObjHash = this.objHash;
}
var items = new Array();
var updatedResult = this.getResultAfterPath(result);
if (updatedResult && updatedResult["length"]) {
for (var i = 0; i < updatedResult.length; i++) {
var itemValue = updatedResult[i];
if (!itemValue)
continue;
var value = !!this.getItemValueCallback
? this.getItemValueCallback(itemValue)
: this.getValue(itemValue);
var title = this.getTitle(itemValue);
var item = new __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */](value, title);
this.setCustomProperties(item, itemValue);
if (this.attachOriginalItems) {
item.originalItem = itemValue;
}
var imageLink = this.getImageLink(itemValue);
if (!!imageLink) {
item.imageLink = imageLink;
}
items.push(item);
}
}
else {
if (!this.allowEmptyResponse) {
this.error = new __WEBPACK_IMPORTED_MODULE_4__error__["k" /* WebRequestEmptyError */](null, this.owner);
}
}
if (this.updateResultCallback) {
items = this.updateResultCallback(items, result);
}
if (this.isUsingCache) {
ChoicesRestfull.itemsResult[loadingObjHash] = items;
}
this.callResultCallback(items, loadingObjHash);
ChoicesRestfull.unregisterSameRequests(this, items);
};
ChoicesRestfull.prototype.callResultCallback = function (items, loadingObjHash) {
if (loadingObjHash != this.objHash)
return;
this.getResultCallback(items);
};
ChoicesRestfull.prototype.setCustomProperties = function (item, itemValue) {
var properties = this.getCustomProperties();
for (var i = 0; i < properties.length; i++) {
var prop = properties[i];
var val = this.getValueCore(itemValue, this.getPropertyBinding(prop.name));
if (!this.isValueEmpty(val)) {
item[prop.name] = val;
}
}
};
ChoicesRestfull.prototype.getPropertyBinding = function (propertyName) {
if (this[this.getCustomPropertyName(propertyName)])
return this[this.getCustomPropertyName(propertyName)];
if (this[propertyName])
return this[propertyName];
return propertyName;
};
ChoicesRestfull.prototype.onError = function (status, response) {
this.error = new __WEBPACK_IMPORTED_MODULE_4__error__["l" /* WebRequestError */](status, response, this.owner);
this.doEmptyResultCallback(response);
ChoicesRestfull.unregisterSameRequests(this, []);
};
ChoicesRestfull.prototype.getResultAfterPath = function (result) {
if (!result)
return result;
if (!this.processedPath)
return result;
var pathes = this.getPathes();
for (var i = 0; i < pathes.length; i++) {
result = result[pathes[i]];
if (!result)
return null;
}
return result;
};
ChoicesRestfull.prototype.getPathes = function () {
var pathes = [];
if (this.processedPath.indexOf(";") > -1) {
pathes = this.path.split(";");
}
else {
pathes = this.processedPath.split(",");
}
if (pathes.length == 0)
pathes.push(this.processedPath);
return pathes;
};
ChoicesRestfull.prototype.getValue = function (item) {
if (!item)
return null;
if (this.valueName)
return this.getValueCore(item, this.valueName);
if (!(item instanceof Object))
return item;
var len = Object.keys(item).length;
if (len < 1)
return null;
return item[Object.keys(item)[0]];
};
ChoicesRestfull.prototype.getTitle = function (item) {
var title = this.titleName ? this.titleName : "title";
return this.getValueCore(item, title);
};
ChoicesRestfull.prototype.getImageLink = function (item) {
var imageLink = this.imageLinkName ? this.imageLinkName : "imageLink";
return this.getValueCore(item, imageLink);
};
ChoicesRestfull.prototype.getValueCore = function (item, property) {
if (!item)
return null;
if (property.indexOf(".") < 0)
return item[property];
var properties = property.split(".");
for (var i = 0; i < properties.length; i++) {
item = item[properties[i]];
if (!item)
return null;
}
return item;
};
Object.defineProperty(ChoicesRestfull.prototype, "objHash", {
get: function () {
return (this.processedUrl +
";" +
this.processedPath +
";" +
this.valueName +
";" +
this.titleName +
";" +
this.imageLinkName);
},
enumerable: true,
configurable: true
});
ChoicesRestfull.cacheText = "{CACHE}";
ChoicesRestfull.noCacheText = "{NOCACHE}";
ChoicesRestfull.itemsResult = {};
ChoicesRestfull.sendingSameRequests = {};
return ChoicesRestfull;
}(__WEBPACK_IMPORTED_MODULE_1__base__["b" /* Base */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("choicesByUrl", [
"url",
"path",
"valueName",
"titleName",
{
name: "imageLinkName",
visibleIf: function (obj) {
return !!obj && !!obj.owner && obj.owner.getType() == "imagepicker";
},
},
{ name: "allowEmptyResponse:boolean", default: false },
{ name: "attachOriginalItems:boolean", default: false, visible: false },
], function () {
return new ChoicesRestfull();
});
/***/ }),
/* 44 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__expressions_expressionParser__ = __webpack_require__(85);
/* unused harmony export ConditionsParserError */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ConditionsParser; });
var ConditionsParserError = /** @class */ (function () {
function ConditionsParserError(at, code) {
this.at = at;
this.code = code;
}
return ConditionsParserError;
}());
var ConditionsParser = /** @class */ (function () {
function ConditionsParser() {
}
ConditionsParser.prototype.patchExpression = function (text) {
return text
.replace(/=>/g, ">=")
.replace(/=/g, "!=")
.replace(/==/g, "= ")
.replace(/equals/g, "equal ")
.replace(/notequals/g, "notequal ");
};
ConditionsParser.prototype.createCondition = function (text) {
return this.parseExpression(text);
};
ConditionsParser.prototype.parseExpression = function (text) {
try {
var result = ConditionsParser.parserCache[text];
if (result === undefined) {
result = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__expressions_expressionParser__["a" /* parse */])(this.patchExpression(text));
if (!result.hasAsyncFunction()) {
ConditionsParser.parserCache[text] = result;
}
}
return result;
}
catch (e) {
if (e instanceof __WEBPACK_IMPORTED_MODULE_0__expressions_expressionParser__["b" /* SyntaxError */]) {
this.conditionError = new ConditionsParserError(e.location.start.offset, e.message);
}
}
};
Object.defineProperty(ConditionsParser.prototype, "error", {
get: function () {
return this.conditionError;
},
enumerable: true,
configurable: true
});
ConditionsParser.parserCache = {};
return ConditionsParser;
}());
/***/ }),
/* 45 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return dxSurveyService; });
/**
* The class contains methods to work with api.surveyjs.io service.
*/
var dxSurveyService = /** @class */ (function () {
function dxSurveyService() {
}
Object.defineProperty(dxSurveyService, "serviceUrl", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_0__settings__["a" /* settings */].surveyServiceUrl;
},
set: function (val) {
__WEBPACK_IMPORTED_MODULE_0__settings__["a" /* settings */].surveyServiceUrl = val;
},
enumerable: true,
configurable: true
});
dxSurveyService.prototype.loadSurvey = function (surveyId, onLoad) {
var xhr = new XMLHttpRequest();
xhr.open("GET", dxSurveyService.serviceUrl + "/getSurvey?surveyId=" + surveyId);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = function () {
var result = JSON.parse(xhr.response);
onLoad(xhr.status == 200, result, xhr.response);
};
xhr.send();
};
dxSurveyService.prototype.getSurveyJsonAndIsCompleted = function (surveyId, clientId, onLoad) {
var xhr = new XMLHttpRequest();
xhr.open("GET", dxSurveyService.serviceUrl +
"/getSurveyAndIsCompleted?surveyId=" +
surveyId +
"&clientId=" +
clientId);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = function () {
var result = JSON.parse(xhr.response);
var surveyJson = result ? result.survey : null;
var isCompleted = result ? result.isCompleted : null;
onLoad(xhr.status == 200, surveyJson, isCompleted, xhr.response);
};
xhr.send();
};
dxSurveyService.prototype.sendResult = function (postId, result, onSendResult, clientId, isPartialCompleted) {
if (clientId === void 0) { clientId = null; }
if (isPartialCompleted === void 0) { isPartialCompleted = false; }
var xhr = new XMLHttpRequest();
xhr.open("POST", dxSurveyService.serviceUrl + "/post/");
xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8");
var data = { postId: postId, surveyResult: JSON.stringify(result) };
if (clientId)
data["clientId"] = clientId;
if (isPartialCompleted)
data["isPartialCompleted"] = true;
var dataStringify = JSON.stringify(data);
var self = this;
xhr.onload = xhr.onerror = function () {
if (!onSendResult)
return;
onSendResult(xhr.status === 200, xhr.response, xhr);
};
xhr.send(dataStringify);
};
dxSurveyService.prototype.sendFile = function (postId, file, onSendFile) {
var xhr = new XMLHttpRequest();
xhr.onload = xhr.onerror = function () {
if (!onSendFile)
return;
onSendFile(xhr.status == 200, JSON.parse(xhr.response));
};
xhr.open("POST", dxSurveyService.serviceUrl + "/upload/", true);
var formData = new FormData();
formData.append("file", file);
formData.append("postId", postId);
xhr.send(formData);
};
dxSurveyService.prototype.getResult = function (resultId, name, onGetResult) {
var xhr = new XMLHttpRequest();
var data = "resultId=" + resultId + "&name=" + name;
xhr.open("GET", dxSurveyService.serviceUrl + "/getResult?" + data);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var self = this;
xhr.onload = function () {
var result = null;
var list = null;
if (xhr.status == 200) {
result = JSON.parse(xhr.response);
list = [];
for (var key in result.QuestionResult) {
var el = { name: key, value: result.QuestionResult[key] };
list.push(el);
}
}
onGetResult(xhr.status == 200, result, list, xhr.response);
};
xhr.send();
};
dxSurveyService.prototype.isCompleted = function (resultId, clientId, onIsCompleted) {
var xhr = new XMLHttpRequest();
var data = "resultId=" + resultId + "&clientId=" + clientId;
xhr.open("GET", dxSurveyService.serviceUrl + "/isCompleted?" + data);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var self = this;
xhr.onload = function () {
var result = null;
if (xhr.status == 200) {
result = JSON.parse(xhr.response);
}
onIsCompleted(xhr.status == 200, result, xhr.response);
};
xhr.send();
};
return dxSurveyService;
}());
/***/ }),
/* 46 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return englishStrings; });
//Uncomment this line on creating a translation file
//import { surveyLocalization } from "../surveyStrings";
var englishStrings = {
pagePrevText: "Previous",
pageNextText: "Next",
completeText: "Complete",
previewText: "Preview",
editText: "Edit",
startSurveyText: "Start",
otherItemText: "Other (describe)",
noneItemText: "None",
selectAllItemText: "Select All",
progressText: "Page {0} of {1}",
panelDynamicProgressText: "Record {0} of {1}",
questionsProgressText: "Answered {0}/{1} questions",
emptySurvey: "There is no visible page or question in the survey.",
completingSurvey: "Thank you for completing the survey!",
completingSurveyBefore: "Our records show that you have already completed this survey.",
loadingSurvey: "Loading Survey...",
optionsCaption: "Choose...",
value: "value",
requiredError: "Please answer the question.",
requiredErrorInPanel: "Please answer at least one question.",
requiredInAllRowsError: "Please answer questions in all rows.",
numericError: "The value should be numeric.",
textMinLength: "Please enter at least {0} characters.",
textMaxLength: "Please enter less than {0} characters.",
textMinMaxLength: "Please enter more than {0} and less than {1} characters.",
minRowCountError: "Please fill in at least {0} rows.",
minSelectError: "Please select at least {0} variants.",
maxSelectError: "Please select no more than {0} variants.",
numericMinMax: "The '{0}' should be equal or more than {1} and equal or less than {2}",
numericMin: "The '{0}' should be equal or more than {1}",
numericMax: "The '{0}' should be equal or less than {1}",
invalidEmail: "Please enter a valid e-mail address.",
invalidExpression: "The expression: {0} should return 'true'.",
urlRequestError: "The request returned error '{0}'. {1}",
urlGetChoicesError: "The request returned empty data or the 'path' property is incorrect",
exceedMaxSize: "The file size should not exceed {0}.",
otherRequiredError: "Please enter the other value.",
uploadingFile: "Your file is uploading. Please wait several seconds and try again.",
loadingFile: "Loading...",
chooseFile: "Choose file(s)...",
noFileChosen: "No file chosen",
confirmDelete: "Do you want to delete the record?",
keyDuplicationError: "This value should be unique.",
addColumn: "Add column",
addRow: "Add row",
removeRow: "Remove",
addPanel: "Add new",
removePanel: "Remove",
choices_Item: "item",
matrix_column: "Column",
matrix_row: "Row",
savingData: "The results are saving on the server...",
savingDataError: "An error occurred and we could not save the results.",
savingDataSuccess: "The results were saved successfully!",
saveAgainButton: "Try again",
timerMin: "min",
timerSec: "sec",
timerSpentAll: "You have spent {0} on this page and {1} in total.",
timerSpentPage: "You have spent {0} on this page.",
timerSpentSurvey: "You have spent {0} in total.",
timerLimitAll: "You have spent {0} of {1} on this page and {2} of {3} in total.",
timerLimitPage: "You have spent {0} of {1} on this page.",
timerLimitSurvey: "You have spent {0} of {1} in total.",
cleanCaption: "Clean",
clearCaption: "Clear",
chooseFileCaption: "Choose file",
removeFileCaption: "Remove this file",
booleanCheckedLabel: "Yes",
booleanUncheckedLabel: "No",
confirmRemoveFile: "Are you sure that you want to remove this file: {0}?",
confirmRemoveAllFiles: "Are you sure that you want to remove all files?",
questionTitlePatternText: "Question Title",
};
//Uncomment these two lines on creating a translation file. You should replace "en" and enStrings with your locale ("fr", "de" and so on) and your variable.
//surveyLocalization.locales["en"] = englishStrings;
//surveyLocalization.localeNames["en"] = "English";
/***/ }),
/* 47 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionMatrixBaseModel; });
/**
* A Model for a matrix base question.
*/
var QuestionMatrixBaseModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixBaseModel, _super);
function QuestionMatrixBaseModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.generatedVisibleRows = null;
_this.generatedTotalRow = null;
_this.filteredRows = null;
_this.filteredColumns = null;
_this.columns = _this.createColumnValues();
_this.rows = _this.createItemValues("rows");
return _this;
}
QuestionMatrixBaseModel.prototype.createColumnValues = function () {
return this.createItemValues("columns");
};
QuestionMatrixBaseModel.prototype.getType = function () {
return "matrixbase";
};
Object.defineProperty(QuestionMatrixBaseModel.prototype, "isCompositeQuestion", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "isAllowTitleLeft", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "showHeader", {
/**
* Set this property to false, to hide table header. The default value is true.
*/
get: function () {
return this.getPropertyValue("showHeader");
},
set: function (val) {
this.setPropertyValue("showHeader", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "columns", {
/**
* The list of columns. A column has a value and an optional text
*/
get: function () {
return this.getPropertyValue("columns");
},
set: function (newValue) {
this.setPropertyValue("columns", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "visibleColumns", {
get: function () {
return !!this.filteredColumns ? this.filteredColumns : this.columns;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "rows", {
/**
* The list of rows. A row has a value and an optional text
*/
get: function () {
return this.getPropertyValue("rows");
},
set: function (newValue) {
var newRows = this.processRowsOnSet(newValue);
this.setPropertyValue("rows", newRows);
this.filterItems();
},
enumerable: true,
configurable: true
});
QuestionMatrixBaseModel.prototype.processRowsOnSet = function (newRows) {
return newRows;
};
QuestionMatrixBaseModel.prototype.getVisibleRows = function () {
return [];
};
Object.defineProperty(QuestionMatrixBaseModel.prototype, "visibleRows", {
/**
* Returns the list of visible rows as model objects.
* @see rowsVisibleIf
*/
get: function () {
return this.getVisibleRows();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "rowsVisibleIf", {
/**
* An expression that returns true or false. It runs against each row item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression.
* @see visibleIf
*/
get: function () {
return this.getPropertyValue("rowsVisibleIf", "");
},
set: function (val) {
this.setPropertyValue("rowsVisibleIf", val);
this.filterItems();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixBaseModel.prototype, "columnsVisibleIf", {
/**
* An expression that returns true or false. It runs against each column item and if for this item it returns true, then the item is visible otherwise the item becomes invisible. Please use {item} to get the current item value in the expression.
* @see rowsVisibleIf
*/
get: function () {
return this.getPropertyValue("columnsVisibleIf", "");
},
set: function (val) {
this.setPropertyValue("columnsVisibleIf", val);
this.filterItems();
},
enumerable: true,
configurable: true
});
QuestionMatrixBaseModel.prototype.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
this.runItemsCondition(values, properties);
};
QuestionMatrixBaseModel.prototype.filterItems = function () {
if (this.areInvisibleElementsShowing) {
this.onRowsChanged();
return false;
}
if (this.isLoadingFromJson || !this.data)
return false;
return this.runItemsCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());
};
QuestionMatrixBaseModel.prototype.onColumnsChanged = function () { };
QuestionMatrixBaseModel.prototype.onRowsChanged = function () {
this.fireCallback(this.visibleRowsChangedCallback);
};
QuestionMatrixBaseModel.prototype.shouldRunColumnExpression = function () {
return !this.survey || !this.survey.areInvisibleElementsShowing;
};
QuestionMatrixBaseModel.prototype.hasRowsAsItems = function () {
return true;
};
QuestionMatrixBaseModel.prototype.runItemsCondition = function (values, properties) {
var oldVisibleRows = null;
if (!!this.filteredRows && !__WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].isValueEmpty(this.defaultValue)) {
oldVisibleRows = [];
for (var i = 0; i < this.filteredRows.length; i++) {
oldVisibleRows.push(this.filteredRows[i]);
}
}
var hasChanges = this.hasRowsAsItems() && this.runConditionsForRows(values, properties);
var hasColumnsChanged = this.runConditionsForColumns(values, properties);
hasChanges = hasColumnsChanged || hasChanges;
if (hasChanges) {
if (!!this.survey &&
this.survey.isClearValueOnHidden &&
(!!this.filteredColumns || !!this.filteredRows)) {
this.clearIncorrectValues();
}
if (!!oldVisibleRows) {
this.restoreNewVisibleRowsValues(oldVisibleRows);
}
this.generatedVisibleRows = null;
if (hasColumnsChanged) {
this.onColumnsChanged();
}
this.onRowsChanged();
}
return hasChanges;
};
QuestionMatrixBaseModel.prototype.runConditionsForRows = function (values, properties) {
var showInvisibile = !!this.survey && this.survey.areInvisibleElementsShowing;
var runner = !showInvisibile && !!this.rowsVisibleIf
? new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](this.rowsVisibleIf)
: null;
this.filteredRows = [];
var hasChanged = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].runConditionsForItems(this.rows, this.filteredRows, runner, values, properties, !showInvisibile);
if (this.filteredRows.length === this.rows.length) {
this.filteredRows = null;
}
return hasChanged;
};
QuestionMatrixBaseModel.prototype.runConditionsForColumns = function (values, properties) {
var useColumnsExpression = !!this.survey && !this.survey.areInvisibleElementsShowing;
var runner = useColumnsExpression && !!this.columnsVisibleIf
? new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](this.columnsVisibleIf)
: null;
this.filteredColumns = [];
var hasChanged = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].runConditionsForItems(this.columns, this.filteredColumns, runner, values, properties, this.shouldRunColumnExpression());
if (this.filteredColumns.length === this.columns.length) {
this.filteredColumns = null;
}
return hasChanged;
};
QuestionMatrixBaseModel.prototype.clearIncorrectValues = function () {
var val = this.value;
if (!val)
return;
var newVal = null;
var isChanged = false;
var rows = !!this.filteredRows ? this.filteredRows : this.rows;
var columns = !!this.filteredColumns ? this.filteredColumns : this.columns;
for (var key in val) {
if (__WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getItemByValue(rows, key) &&
__WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getItemByValue(columns, val[key])) {
if (newVal == null)
newVal = {};
newVal[key] = val[key];
}
else {
isChanged = true;
}
}
if (isChanged) {
this.value = newVal;
}
_super.prototype.clearIncorrectValues.call(this);
};
QuestionMatrixBaseModel.prototype.clearInvisibleValuesInRows = function () {
if (this.isEmpty())
return;
var newData = __WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].getUnbindValue(this.value);
var rows = this.rows;
for (var i = 0; i < rows.length; i++) {
var key = rows[i].value;
if (!!newData[key] && !rows[i].isVisible) {
delete newData[key];
}
}
if (__WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].isTwoValueEquals(newData, this.value))
return;
this.value = newData;
};
QuestionMatrixBaseModel.prototype.restoreNewVisibleRowsValues = function (oldVisibleRows) {
var rows = !!this.filteredRows ? this.filteredRows : this.rows;
var val = this.defaultValue;
var newValue = __WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].getUnbindValue(this.value);
var isChanged = false;
for (var key in val) {
if (__WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getItemByValue(rows, key) &&
!__WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getItemByValue(oldVisibleRows, key)) {
if (newValue == null)
newValue = {};
newValue[key] = val[key];
isChanged = true;
}
}
if (isChanged) {
this.value = newValue;
}
};
return QuestionMatrixBaseModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("matrixbase", [
"columnsVisibleIf:condition",
"rowsVisibleIf:condition",
{ name: "showHeader:boolean", default: true },
], undefined, "question");
/***/ }),
/* 48 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__panel__ = __webpack_require__(22);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return PageModel; });
/**
* The page object. It has elements collection, that contains questions and panels.
*/
var PageModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(PageModel, _super);
function PageModel(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
_this.name = name;
_this.hasShownValue = false;
_this.isRandomizing = false;
/**
* Time in seconds end-user spent on this page
*/
_this.timeSpent = 0;
var self = _this;
_this.locTitle.onGetTextCallback = function (text) {
if (self.num > 0)
return self.num + ". " + text;
return text;
};
return _this;
}
PageModel.prototype.getType = function () {
return "page";
};
PageModel.prototype.toString = function () {
return this.name;
};
Object.defineProperty(PageModel.prototype, "isPage", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
PageModel.prototype.delete = function () {
if (!!this.survey) {
this.removeSelfFromList(this.survey.pages);
}
};
PageModel.prototype.onFirstRendering = function () {
if (this.wasShown)
return;
_super.prototype.onFirstRendering.call(this);
};
Object.defineProperty(PageModel.prototype, "visibleIndex", {
/**
* The visible index of the page. It has values from 0 to visible page count - 1.
* @see SurveyModel.visiblePages
* @see SurveyModel.pages
*/
get: function () {
return this.getPropertyValue("visibleIndex", -1);
},
set: function (val) {
this.setPropertyValue("visibleIndex", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "isStarted", {
/**
* Returns true, if the page is started page in the survey. It can be shown on the start only and the end-user could not comeback to it after it passed it.
*/
get: function () {
return this.survey && this.survey.isPageStarted(this);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "cssClasses", {
get: function () {
var css = this.css;
var classes = { page: {}, pageTitle: "", pageDescription: "", row: "" };
this.copyCssClasses(classes.page, css.page);
if (!!css.pageTitle) {
classes.pageTitle = css.pageTitle;
}
if (!!css.pageDescription) {
classes.pageDescription = css.pageDescription;
}
if (!!css.row) {
classes.row = css.row;
}
if (this.survey) {
this.survey.updatePageCssClasses(this, classes);
}
return classes;
},
enumerable: true,
configurable: true
});
PageModel.prototype.getIsPageVisible = function (exceptionQuestion) {
if (this.isStarted)
return false;
return _super.prototype.getIsPageVisible.call(this, exceptionQuestion);
};
Object.defineProperty(PageModel.prototype, "num", {
get: function () {
return this.getPropertyValue("num", -1);
},
set: function (val) {
if (this.num == val)
return;
this.setPropertyValue("num", val);
this.onNumChanged(val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "navigationButtonsVisibility", {
/**
* Set this property to "hide" to make "Prev", "Next" and "Complete" buttons are invisible for this page. Set this property to "show" to make these buttons visible, even if survey showNavigationButtons property is false.
* @see SurveyMode.showNavigationButtons
*/
get: function () {
return this.getPropertyValue("navigationButtonsVisibility");
},
set: function (val) {
this.setPropertyValue("navigationButtonsVisibility", val.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "wasShown", {
/**
* The property returns true, if the page has been shown to the end-user.
*/
get: function () {
return this.hasShownValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "hasShown", {
get: function () {
return this.wasShown;
},
enumerable: true,
configurable: true
});
PageModel.prototype.setWasShown = function (val) {
if (val == this.hasShownValue)
return;
this.hasShownValue = val;
if (this.isDesignMode)
return;
if (val == true && this.areQuestionsRandomized) {
this.randomizeElements();
}
};
PageModel.prototype.randomizeElements = function () {
if (this.isRandomizing)
return;
this.isRandomizing = true;
var oldElements = [];
var elements = this.elements;
for (var i = 0; i < elements.length; i++) {
oldElements.push(elements[i]);
}
var newElements = __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].randomizeArray(oldElements);
this.elements.splice(0, this.elements.length);
for (var i = 0; i < newElements.length; i++) {
this.elements.push(newElements[i]);
}
this.isRandomizing = false;
};
Object.defineProperty(PageModel.prototype, "areQuestionsRandomized", {
/**
* The property returns true, if the elements are randomized on the page
* @see hasShown
* @see questionsOrder
* @see SurveyModel.questionsOrder
*/
get: function () {
var order = this.questionsOrder == "default" && this.survey
? this.survey.questionsOrder
: this.questionsOrder;
return order == "random";
},
enumerable: true,
configurable: true
});
Object.defineProperty(PageModel.prototype, "questionsOrder", {
/**
* Use this property to randomize questions. Set it to 'random' to randomize questions, 'initial' to keep them in the same order or 'default' to use the Survey questionsOrder property
* @see SurveyModel.questionsOrder
* @see areQuestionsRandomized
*/
get: function () {
return this.getPropertyValue("questionsOrder");
},
set: function (val) {
this.setPropertyValue("questionsOrder", val);
},
enumerable: true,
configurable: true
});
/**
* Call it to scroll to the page top.
*/
PageModel.prototype.scrollToTop = function () {
if (!!this.survey) {
this.survey.scrollElementToTop(this, null, this, this.id);
}
};
// public get timeSpent(): number {
// return this.getPropertyValue("timeSpent", 0);
// }
// public set timeSpent(val: number) {
// this.setPropertyValue("timeSpent", val);
// }
/**
* Returns the list of all panels in the page
*/
PageModel.prototype.getPanels = function (visibleOnly, includingDesignTime) {
if (visibleOnly === void 0) { visibleOnly = false; }
if (includingDesignTime === void 0) { includingDesignTime = false; }
var result = new Array();
this.addPanelsIntoList(result, visibleOnly, includingDesignTime);
return result;
};
Object.defineProperty(PageModel.prototype, "maxTimeToFinish", {
/**
* The maximum time in seconds that end-user has to complete the page. If the value is 0 or less, the end-user has unlimited number of time to finish the page.
* @see startTimer
* @see SurveyModel.maxTimeToFinishPage
*/
get: function () {
return this.getPropertyValue("maxTimeToFinish", 0);
},
set: function (val) {
this.setPropertyValue("maxTimeToFinish", val);
},
enumerable: true,
configurable: true
});
PageModel.prototype.onNumChanged = function (value) { };
PageModel.prototype.onVisibleChanged = function () {
if (this.isRandomizing)
return;
_super.prototype.onVisibleChanged.call(this);
if (this.survey != null) {
this.survey.pageVisibilityChanged(this, this.isVisible);
}
};
PageModel.prototype.dragDropStart = function (src, target, nestedPanelDepth) {
if (nestedPanelDepth === void 0) { nestedPanelDepth = -1; }
this.dragDropInfo = new __WEBPACK_IMPORTED_MODULE_3__panel__["a" /* DragDropInfo */](src, target, nestedPanelDepth);
};
PageModel.prototype.dragDropMoveTo = function (destination, isBottom, isEdge) {
if (isBottom === void 0) { isBottom = false; }
if (isEdge === void 0) { isEdge = false; }
if (!this.dragDropInfo)
return false;
this.dragDropInfo.destination = destination;
this.dragDropInfo.isBottom = isBottom;
this.dragDropInfo.isEdge = isEdge;
this.correctDragDropInfo(this.dragDropInfo);
if (!this.dragDropCanDropTagert())
return false;
if (!this.dragDropCanDropSource() || !this.dragDropAllowFromSurvey()) {
if (!!this.dragDropInfo.source) {
var row = this.dragDropFindRow(this.dragDropInfo.target);
this.updateRowsRemoveElementFromRow(this.dragDropInfo.target, row);
}
return false;
}
this.dragDropAddTarget(this.dragDropInfo);
return true;
};
PageModel.prototype.correctDragDropInfo = function (dragDropInfo) {
if (!dragDropInfo.destination)
return;
var panel = dragDropInfo.destination.isPanel
? dragDropInfo.destination
: null;
if (!panel)
return;
if (!dragDropInfo.target.isLayoutTypeSupported(panel.getChildrenLayoutType())) {
dragDropInfo.isEdge = true;
}
};
PageModel.prototype.dragDropAllowFromSurvey = function () {
var dest = this.dragDropInfo.destination;
if (!dest || !this.survey)
return true;
var insertBefore = null;
var insertAfter = null;
var parent = dest.isPage || (!this.dragDropInfo.isEdge && dest.isPanel)
? dest
: dest.parent;
if (!dest.isPage) {
var container = dest.parent;
if (!!container) {
var elements = container.elements;
var index = elements.indexOf(dest);
if (index > -1) {
insertBefore = dest;
insertAfter = dest;
if (this.dragDropInfo.isBottom) {
insertBefore =
index < elements.length - 1 ? elements[index + 1] : null;
}
else {
insertAfter = index > 0 ? elements[index - 1] : null;
}
}
}
}
var options = {
target: this.dragDropInfo.target,
source: this.dragDropInfo.source,
parent: parent,
insertAfter: insertAfter,
insertBefore: insertBefore
};
return this.survey.dragAndDropAllow(options);
};
PageModel.prototype.dragDropFinish = function (isCancel) {
if (isCancel === void 0) { isCancel = false; }
if (!this.dragDropInfo)
return;
var target = this.dragDropInfo.target;
var row = this.dragDropFindRow(target);
var targetIndex = this.dragDropGetElementIndex(target, row);
this.updateRowsRemoveElementFromRow(target, row);
if (!isCancel && !!row) {
var src = this.dragDropInfo.source;
var isSamePanel = false;
if (!!src && !!src.parent) {
isSamePanel = row.panel == src.parent;
if (isSamePanel) {
row.panel.dragDropMoveElement(src, target, targetIndex);
targetIndex = -1;
}
else {
src.parent.removeElement(src);
}
}
if (targetIndex > -1) {
row.panel.addElement(target, targetIndex);
}
}
this.dragDropInfo = null;
return !isCancel ? target : null;
};
PageModel.prototype.dragDropGetElementIndex = function (target, row) {
if (!row)
return -1;
var index = row.elements.indexOf(target);
if (row.index == 0)
return index;
var prevRow = row.panel.rows[row.index - 1];
var prevElement = prevRow.elements[prevRow.elements.length - 1];
return index + row.panel.elements.indexOf(prevElement) + 1;
};
PageModel.prototype.dragDropCanDropTagert = function () {
var destination = this.dragDropInfo.destination;
if (!destination || destination.isPage)
return true;
return this.dragDropCanDropCore(this.dragDropInfo.target, destination);
};
PageModel.prototype.dragDropCanDropSource = function () {
var source = this.dragDropInfo.source;
if (!source)
return true;
var destination = this.dragDropInfo.destination;
if (!this.dragDropCanDropCore(source, destination))
return false;
return this.dragDropCanDropNotNext(source, destination, this.dragDropInfo.isEdge, this.dragDropInfo.isBottom);
};
PageModel.prototype.dragDropCanDropCore = function (target, destination) {
if (!destination)
return true;
if (this.dragDropIsSameElement(destination, target))
return false;
if (target.isPanel) {
var pnl = target;
if (pnl.containsElement(destination) ||
!!pnl.getElementByName(destination.name))
return false;
}
return true;
};
PageModel.prototype.dragDropCanDropNotNext = function (source, destination, isEdge, isBottom) {
if (!destination || (destination.isPanel && !isEdge))
return true;
if (source.parent !== destination.parent)
return true;
var pnl = source.parent;
var srcIndex = pnl.elements.indexOf(source);
var destIndex = pnl.elements.indexOf(destination);
if (destIndex < srcIndex && !isBottom)
destIndex--;
if (isBottom)
destIndex++;
return srcIndex < destIndex
? destIndex - srcIndex > 1
: srcIndex - destIndex > 0;
};
PageModel.prototype.dragDropIsSameElement = function (el1, el2) {
return el1 == el2 || el1.name == el2.name;
};
return PageModel;
}(__WEBPACK_IMPORTED_MODULE_3__panel__["b" /* PanelModelBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("page", [
{
name: "navigationButtonsVisibility",
default: "inherit",
choices: ["inherit", "show", "hide"]
},
{
name: "questionsOrder",
default: "default",
choices: ["default", "initial", "random"]
},
{ name: "maxTimeToFinish:number", default: 0, minValue: 0 }
], function () {
return new PageModel();
}, "panelbase");
/***/ }),
/* 49 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base__ = __webpack_require__(7);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionCustomWidget; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CustomWidgetCollection; });
var QuestionCustomWidget = /** @class */ (function () {
function QuestionCustomWidget(name, widgetJson) {
this.name = name;
this.widgetJson = widgetJson;
this.isFirstRender = true;
this.htmlTemplate = widgetJson.htmlTemplate ? widgetJson.htmlTemplate : "";
}
QuestionCustomWidget.prototype.afterRender = function (question, el) {
var _this = this;
if (this.isFirstRender) {
this.isFirstRender = false;
question.survey.onLocaleChangedEvent.add(function () {
_this.widgetJson.willUnmount(question, el);
_this.widgetJson.afterRender(question, el);
});
}
if (this.widgetJson.afterRender)
this.widgetJson.afterRender(question, el);
};
QuestionCustomWidget.prototype.willUnmount = function (question, el) {
if (this.widgetJson.willUnmount)
this.widgetJson.willUnmount(question, el);
};
QuestionCustomWidget.prototype.getDisplayValue = function (question, value) {
if (value === void 0) { value = undefined; }
if (this.widgetJson.getDisplayValue)
return this.widgetJson.getDisplayValue(question, value);
return null;
};
QuestionCustomWidget.prototype.isFit = function (question) {
if (this.isLibraryLoaded() && this.widgetJson.isFit)
return this.widgetJson.isFit(question);
return false;
};
QuestionCustomWidget.prototype.init = function () {
if (this.widgetJson.init) {
this.widgetJson.init();
}
};
QuestionCustomWidget.prototype.activatedByChanged = function (activatedBy) {
if (this.isLibraryLoaded() && this.widgetJson.activatedByChanged) {
this.widgetJson.activatedByChanged(activatedBy);
}
};
QuestionCustomWidget.prototype.isLibraryLoaded = function () {
if (this.widgetJson.widgetIsLoaded)
return this.widgetJson.widgetIsLoaded() == true;
return true;
};
Object.defineProperty(QuestionCustomWidget.prototype, "isDefaultRender", {
get: function () {
return this.widgetJson.isDefaultRender;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCustomWidget.prototype, "pdfQuestionType", {
get: function () {
return this.widgetJson.pdfQuestionType;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCustomWidget.prototype, "pdfRender", {
get: function () {
return this.widgetJson.pdfRender;
},
enumerable: true,
configurable: true
});
return QuestionCustomWidget;
}());
var CustomWidgetCollection = /** @class */ (function () {
function CustomWidgetCollection() {
this.widgetsValues = [];
this.widgetsActivatedBy = {};
this.onCustomWidgetAdded = new __WEBPACK_IMPORTED_MODULE_0__base__["c" /* Event */]();
}
Object.defineProperty(CustomWidgetCollection.prototype, "widgets", {
get: function () {
return this.widgetsValues;
},
enumerable: true,
configurable: true
});
CustomWidgetCollection.prototype.add = function (widgetJson, activatedBy) {
if (activatedBy === void 0) { activatedBy = "property"; }
this.addCustomWidget(widgetJson, activatedBy);
};
CustomWidgetCollection.prototype.addCustomWidget = function (widgetJson, activatedBy) {
if (activatedBy === void 0) { activatedBy = "property"; }
var name = widgetJson.name;
if (!name) {
name = "widget_" + this.widgets.length + 1;
}
var customWidget = new QuestionCustomWidget(name, widgetJson);
this.widgetsValues.push(customWidget);
customWidget.init();
this.widgetsActivatedBy[name] = activatedBy;
customWidget.activatedByChanged(activatedBy);
this.onCustomWidgetAdded.fire(customWidget, null);
};
/**
* Returns the way the custom wiget is activated. It can be activated by a property ("property"), question type ("type") or by new/custom question type ("customtype").
* @param widgetName the custom widget name
* @see setActivatedBy
*/
CustomWidgetCollection.prototype.getActivatedBy = function (widgetName) {
var res = this.widgetsActivatedBy[widgetName];
return res ? res : "property";
};
/**
* Sets the way the custom wiget is activated. The activation types are: property ("property"), question type ("type") or new/custom question type ("customtype"). A custom wiget may support all or only some of this activation types.
* @param widgetName
* @param activatedBy there are three possible variants: "property", "type" and "customtype"
*/
CustomWidgetCollection.prototype.setActivatedBy = function (widgetName, activatedBy) {
if (!widgetName || !activatedBy)
return;
var widget = this.getCustomWidgetByName(widgetName);
if (!widget)
return;
this.widgetsActivatedBy[widgetName] = activatedBy;
widget.activatedByChanged(activatedBy);
};
CustomWidgetCollection.prototype.clear = function () {
this.widgetsValues = [];
};
CustomWidgetCollection.prototype.getCustomWidgetByName = function (name) {
for (var i = 0; i < this.widgets.length; i++) {
if (this.widgets[i].name == name)
return this.widgets[i];
}
return null;
};
CustomWidgetCollection.prototype.getCustomWidget = function (question) {
for (var i = 0; i < this.widgetsValues.length; i++) {
if (this.widgetsValues[i].isFit(question))
return this.widgetsValues[i];
}
return null;
};
CustomWidgetCollection.Instance = new CustomWidgetCollection();
return CustomWidgetCollection;
}());
/***/ }),
/* 50 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(20);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__itemvalue__ = __webpack_require__(13);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionDropdownModel; });
/**
* A Model for a dropdown question
*/
var QuestionDropdownModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionDropdownModel, _super);
function QuestionDropdownModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.minMaxChoices = [];
_this.createLocalizableString("optionsCaption", _this);
var self = _this;
_this.registerFunctionOnPropertiesValueChanged(["choicesMin", "choicesMax", "choicesStep"], function () {
self.onVisibleChoicesChanged();
});
return _this;
}
Object.defineProperty(QuestionDropdownModel.prototype, "showOptionsCaption", {
/**
* This flag controls whether to show options caption item ('Choose...').
*/
get: function () {
return this.getPropertyValue("showOptionsCaption", true);
},
set: function (val) {
this.setPropertyValue("showOptionsCaption", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionDropdownModel.prototype, "optionsCaption", {
/**
* Use this property to set the options caption different from the default value. The default value is taken from localization strings.
*/
get: function () {
return this.getLocalizableStringText("optionsCaption", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("optionsCaption"));
},
set: function (val) {
this.setLocalizableStringText("optionsCaption", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionDropdownModel.prototype, "locOptionsCaption", {
get: function () {
return this.getLocalizableString("optionsCaption");
},
enumerable: true,
configurable: true
});
QuestionDropdownModel.prototype.getType = function () {
return "dropdown";
};
Object.defineProperty(QuestionDropdownModel.prototype, "selectedItem", {
get: function () {
if (this.isEmpty())
return null;
return __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */].getItemByValue(this.visibleChoices, this.value);
},
enumerable: true,
configurable: true
});
QuestionDropdownModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
QuestionDropdownModel.prototype.getChoices = function () {
var items = _super.prototype.getChoices.call(this);
if (this.choicesMax <= this.choicesMin)
return items;
var res = [];
for (var i = 0; i < items.length; i++) {
res.push(items[i]);
}
if (this.minMaxChoices.length === 0 ||
this.minMaxChoices.length !==
(this.choicesMax - this.choicesMin) / this.choicesStep + 1) {
this.minMaxChoices = [];
for (var i = this.choicesMin; i <= this.choicesMax; i += this.choicesStep) {
this.minMaxChoices.push(new __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */](i));
}
}
res = res.concat(this.minMaxChoices);
return res;
};
Object.defineProperty(QuestionDropdownModel.prototype, "choicesMin", {
/**
* Use this and choicesMax property to automatically add choices. For example choicesMin = 1 and choicesMax = 10 will generate ten additional choices from 1 to 10.
* @see choicesMax
* @see choicesStep
*/
get: function () {
return this.getPropertyValue("choicesMin", 0);
},
set: function (val) {
this.setPropertyValue("choicesMin", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionDropdownModel.prototype, "choicesMax", {
/**
* Use this and choicesMax property to automatically add choices. For example choicesMin = 1 and choicesMax = 10 will generate ten additional choices from 1 to 10.
* @see choicesMin
* @see choicesStep
*/
get: function () {
return this.getPropertyValue("choicesMax", 0);
},
set: function (val) {
this.setPropertyValue("choicesMax", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionDropdownModel.prototype, "choicesStep", {
/**
* The default value is 1. It tells the value of the iterator between choicesMin and choicesMax properties.
* If choicesMin = 10, choicesMax = 30 and choicesStep = 10 then you will have only three additional choices: [10, 20, 30].
* @see choicesMin
* @see choicesMax
*/
get: function () {
return this.getPropertyValue("choicesStep", 1);
},
set: function (val) {
if (val < 1)
val = 1;
this.setPropertyValue("choicesStep", val);
},
enumerable: true,
configurable: true
});
return QuestionDropdownModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["b" /* QuestionSelectBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("dropdown", [
{ name: "optionsCaption", serializationProperty: "locOptionsCaption" },
{ name: "showOptionsCaption:boolean", default: true },
{ name: "choicesMin:number", default: 0 },
{ name: "choicesMax:number", default: 0 },
{ name: "choicesStep:number", default: 1, minValue: 1 },
], function () {
return new QuestionDropdownModel("");
}, "selectbase");
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("dropdown", function (name) {
var q = new QuestionDropdownModel(name);
q.choices = __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 51 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__conditions__ = __webpack_require__(11);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionExpressionModel; });
/* harmony export (immutable) */ __webpack_exports__["b"] = getCurrecyCodes;
/**
* A Model for expression question. It is a read-only question. It calculates value based on epxression property.
*/
var QuestionExpressionModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionExpressionModel, _super);
function QuestionExpressionModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("format", _this);
var self = _this;
_this.registerFunctionOnPropertyValueChanged("expression", function () {
if (self.expressionRunner) {
self.expressionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["a" /* ExpressionRunner */](self.expression);
}
});
return _this;
}
QuestionExpressionModel.prototype.getType = function () {
return "expression";
};
Object.defineProperty(QuestionExpressionModel.prototype, "hasInput", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "format", {
/**
* Use this property to display the value in your own format. Make sure you have "{0}" substring in your string, to display the actual value.
*/
get: function () {
return this.getLocalizableStringText("format", "");
},
set: function (val) {
this.setLocalizableStringText("format", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "locFormat", {
get: function () {
return this.getLocalizableString("format");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "expression", {
/**
* The Expression that used to calculate the question value. You may use standard operators like +, -, * and /, squares (). Here is the example of accessing the question value {questionname}.
* Example: "({quantity} * {price}) * (100 - {discount}) / 100"
*/
get: function () {
return this.getPropertyValue("expression", "");
},
set: function (val) {
this.setPropertyValue("expression", val);
},
enumerable: true,
configurable: true
});
QuestionExpressionModel.prototype.locCalculation = function () {
this.expressionIsRunning = true;
};
QuestionExpressionModel.prototype.unlocCalculation = function () {
this.expressionIsRunning = false;
};
QuestionExpressionModel.prototype.runCondition = function (values, properties) {
var _this = this;
_super.prototype.runCondition.call(this, values, properties);
if (!this.expression || this.expressionIsRunning)
return;
this.locCalculation();
if (!this.expressionRunner) {
this.expressionRunner = new __WEBPACK_IMPORTED_MODULE_5__conditions__["a" /* ExpressionRunner */](this.expression);
}
this.expressionRunner.onRunComplete = function (newValue) {
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(newValue, _this.value)) {
_this.value = newValue;
}
_this.unlocCalculation();
};
this.expressionRunner.run(values, properties);
};
QuestionExpressionModel.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
return false;
};
QuestionExpressionModel.prototype.getAllErrors = function () {
return [];
};
Object.defineProperty(QuestionExpressionModel.prototype, "maximumFractionDigits", {
/**
* The maximum number of fraction digits to use if displayStyle is not "none". Possible values are from 0 to 20. The default value is -1 and it means that this property is not used.
*/
get: function () {
return this.getPropertyValue("maximumFractionDigits", -1);
},
set: function (val) {
if (val < -1 || val > 20)
return;
this.setPropertyValue("maximumFractionDigits", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "minimumFractionDigits", {
/**
* The minimum number of fraction digits to use if displayStyle is not "none". Possible values are from 0 to 20. The default value is -1 and it means that this property is not used.
*/
get: function () {
return this.getPropertyValue("minimumFractionDigits", -1);
},
set: function (val) {
if (val < -1 || val > 20)
return;
this.setPropertyValue("minimumFractionDigits", val);
},
enumerable: true,
configurable: true
});
QuestionExpressionModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var val = this.isValueEmpty(value) ? this.defaultValue : value;
if (this.isValueEmpty(val))
return "";
var str = this.getValueAsStr(val);
if (!this.format)
return str;
return this.format["format"](str);
};
Object.defineProperty(QuestionExpressionModel.prototype, "displayStyle", {
/**
* You may set this property to "decimal", "currency", "percent" or "date". If you set it to "currency", you may use the currency property to display the value in currency different from USD.
* @see currency
*/
get: function () {
return this.getPropertyValue("displayStyle");
},
set: function (val) {
this.setPropertyValue("displayStyle", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "currency", {
/**
* Use it to display the value in the currency differen from USD. The displayStype should be set to "currency".
* @see displayStyle
*/
get: function () {
return this.getPropertyValue("currency");
},
set: function (val) {
if (getCurrecyCodes().indexOf(val) < 0)
return;
this.setPropertyValue("currency", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "useGrouping", {
/**
* Determines whether to display grouping separators. The default value is true.
*/
get: function () {
return this.getPropertyValue("useGrouping", true);
},
set: function (val) {
this.setPropertyValue("useGrouping", val);
},
enumerable: true,
configurable: true
});
QuestionExpressionModel.prototype.getValueAsStr = function (val) {
if (this.displayStyle == "date") {
var d = new Date(val);
if (!!d && !!d.toLocaleDateString)
return d.toLocaleDateString();
}
if (this.displayStyle != "none" && __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isNumber(val)) {
var locale = this.getLocale();
if (!locale)
locale = "en";
var options = {
style: this.displayStyle,
currency: this.currency,
useGrouping: this.useGrouping,
};
if (this.maximumFractionDigits > -1) {
options["maximumFractionDigits"] = this.maximumFractionDigits;
}
if (this.minimumFractionDigits > -1) {
options["minimumFractionDigits"] = this.minimumFractionDigits;
}
return val.toLocaleString(locale, options);
}
return val.toString();
};
return QuestionExpressionModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
function getCurrecyCodes() {
return [
"AED",
"AFN",
"ALL",
"AMD",
"ANG",
"AOA",
"ARS",
"AUD",
"AWG",
"AZN",
"BAM",
"BBD",
"BDT",
"BGN",
"BHD",
"BIF",
"BMD",
"BND",
"BOB",
"BOV",
"BRL",
"BSD",
"BTN",
"BWP",
"BYN",
"BZD",
"CAD",
"CDF",
"CHE",
"CHF",
"CHW",
"CLF",
"CLP",
"CNY",
"COP",
"COU",
"CRC",
"CUC",
"CUP",
"CVE",
"CZK",
"DJF",
"DKK",
"DOP",
"DZD",
"EGP",
"ERN",
"ETB",
"EUR",
"FJD",
"FKP",
"GBP",
"GEL",
"GHS",
"GIP",
"GMD",
"GNF",
"GTQ",
"GYD",
"HKD",
"HNL",
"HRK",
"HTG",
"HUF",
"IDR",
"ILS",
"INR",
"IQD",
"IRR",
"ISK",
"JMD",
"JOD",
"JPY",
"KES",
"KGS",
"KHR",
"KMF",
"KPW",
"KRW",
"KWD",
"KYD",
"KZT",
"LAK",
"LBP",
"LKR",
"LRD",
"LSL",
"LYD",
"MAD",
"MDL",
"MGA",
"MKD",
"MMK",
"MNT",
"MOP",
"MRO",
"MUR",
"MVR",
"MWK",
"MXN",
"MXV",
"MYR",
"MZN",
"NAD",
"NGN",
"NIO",
"NOK",
"NPR",
"NZD",
"OMR",
"PAB",
"PEN",
"PGK",
"PHP",
"PKR",
"PLN",
"PYG",
"QAR",
"RON",
"RSD",
"RUB",
"RWF",
"SAR",
"SBD",
"SCR",
"SDG",
"SEK",
"SGD",
"SHP",
"SLL",
"SOS",
"SRD",
"SSP",
"STD",
"SVC",
"SYP",
"SZL",
"THB",
"TJS",
"TMT",
"TND",
"TOP",
"TRY",
"TTD",
"TWD",
"TZS",
"UAH",
"UGX",
"USD",
"USN",
"UYI",
"UYU",
"UZS",
"VEF",
"VND",
"VUV",
"WST",
"XAF",
"XAG",
"XAU",
"XBA",
"XBB",
"XBC",
"XBD",
"XCD",
"XDR",
"XOF",
"XPD",
"XPF",
"XPT",
"XSU",
"XTS",
"XUA",
"XXX",
"YER",
"ZAR",
"ZMW",
"ZWL",
];
}
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("expression", [
"expression:expression",
{ name: "format", serializationProperty: "locFormat" },
{
name: "displayStyle",
default: "none",
choices: ["none", "decimal", "currency", "percent", "date"],
},
{
name: "currency",
choices: function () {
return getCurrecyCodes();
},
default: "USD",
},
{ name: "maximumFractionDigits:number", default: -1 },
{ name: "minimumFractionDigits:number", default: -1 },
{ name: "useGrouping:boolean", default: true },
{ name: "enableIf", visible: false },
{ name: "isRequired", visible: false },
{ name: "readOnly", visible: false },
{ name: "requiredErrorText", visible: false },
{ name: "validators", visible: false },
{ name: "defaultValue", visible: false },
{ name: "correctAnswer", visible: false },
{ name: "requiredIf", visible: false },
], function () {
return new QuestionExpressionModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("expression", function (name) {
return new QuestionExpressionModel(name);
});
/***/ }),
/* 52 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__validator__ = __webpack_require__(34);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionTextModel; });
/**
* A Model for an input text question.
*/
var QuestionTextModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionTextModel, _super);
function QuestionTextModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("placeHolder", _this);
_this.registerFunctionOnPropertiesValueChanged(["min", "max", "inputType", "minValueExpression", "maxValueExpression"], function () {
_this.setRenderedMinMax();
});
return _this;
}
QuestionTextModel.prototype.isTextValue = function () {
return ["text", "number", "password"].indexOf(this.inputType) > -1;
};
QuestionTextModel.prototype.getType = function () {
return "text";
};
QuestionTextModel.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.setRenderedMinMax();
};
Object.defineProperty(QuestionTextModel.prototype, "inputType", {
/**
* Use this property to change the default input type.
*/
get: function () {
return this.getPropertyValue("inputType");
},
set: function (val) {
val = val.toLowerCase();
if (val == "datetime_local")
val = "datetime-local";
this.setPropertyValue("inputType", val.toLowerCase());
if (!this.isLoadingFromJson) {
this.min = undefined;
this.max = undefined;
this.step = undefined;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "textUpdateMode", {
/**
* Gets or sets a value that specifies how the question updates it's value.
*
* The following options are available:
* - `default` - get the value from survey.textUpdateMode
* - `onBlur` - the value is updated after an input loses the focus.
* - `onTyping` - update the value of text questions, "text" and "comment", on every key press.
*
* Note, that setting to "onTyping" may lead to a performance degradation, in case you have many expressions in the survey.
* @see survey.textUpdateMode
*/
get: function () {
return this.getPropertyValue("textUpdateMode");
},
set: function (val) {
this.setPropertyValue("textUpdateMode", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "isSurveyInputTextUpdate", {
get: function () {
if (this.textUpdateMode == "default")
return !!this.survey ? this.survey.isUpdateValueTextOnTyping : false;
return this.textUpdateMode == "onTyping";
},
enumerable: true,
configurable: true
});
QuestionTextModel.prototype.getValidators = function () {
var validators = _super.prototype.getValidators.call(this);
if (this.inputType === "email" &&
!this.validators.some(function (v) { return v.getType() === "emailvalidator"; })) {
validators.push(new __WEBPACK_IMPORTED_MODULE_5__validator__["c" /* EmailValidator */]());
}
return validators;
};
QuestionTextModel.prototype.isLayoutTypeSupported = function (layoutType) {
return true;
};
Object.defineProperty(QuestionTextModel.prototype, "maxLength", {
/**
* The maximum text length. If it is -1, defaul value, then the survey maxTextLength property will be used.
* If it is 0, then the value is unlimited
* @see SurveyModel.maxTextLength
*/
get: function () {
return this.getPropertyValue("maxLength");
},
set: function (val) {
this.setPropertyValue("maxLength", val);
},
enumerable: true,
configurable: true
});
QuestionTextModel.prototype.getMaxLength = function () {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].getMaxLength(this.maxLength, this.survey ? this.survey.maxTextLength : -1);
};
Object.defineProperty(QuestionTextModel.prototype, "size", {
/**
* The text input size
*/
get: function () {
return this.getPropertyValue("size");
},
set: function (val) {
this.setPropertyValue("size", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "autoComplete", {
get: function () {
return this.getPropertyValue("autoComplete", "");
},
set: function (val) {
this.setPropertyValue("autoComplete", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "min", {
/**
* The minimum value
*/
get: function () {
return this.getPropertyValue("min");
},
set: function (val) {
if (this.isValueExpression(val)) {
this.minValueExpression = val.substr(1);
return;
}
this.setPropertyValue("min", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "max", {
/**
* The maximum value
*/
get: function () {
return this.getPropertyValue("max");
},
set: function (val) {
if (this.isValueExpression(val)) {
this.maxValueExpression = val.substr(1);
return;
}
this.setPropertyValue("max", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "minValueExpression", {
get: function () {
return this.getPropertyValue("minValueExpression", "");
},
set: function (val) {
this.setPropertyValue("minValueExpression", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "maxValueExpression", {
get: function () {
return this.getPropertyValue("maxValueExpression", "");
},
set: function (val) {
this.setPropertyValue("maxValueExpression", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "renderedMin", {
get: function () {
return this.getPropertyValue("renderedMin");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "renderedMax", {
get: function () {
return this.getPropertyValue("renderedMax");
},
enumerable: true,
configurable: true
});
QuestionTextModel.prototype.setRenderedMinMax = function () {
this.setPropertyValue("renderedMin", this.getValueAndRunExpression(this.min, this.minValueExpression));
var val = this.getValueAndRunExpression(this.max, this.maxValueExpression);
if (!val &&
(this.inputType === "date" || this.inputType === "datetime-local")) {
val = "2999-12-31";
}
this.setPropertyValue("renderedMax", val);
};
Object.defineProperty(QuestionTextModel.prototype, "step", {
/**
* The step value
*/
get: function () {
return this.getPropertyValue("step");
},
set: function (val) {
this.setPropertyValue("step", val);
},
enumerable: true,
configurable: true
});
QuestionTextModel.prototype.isEmpty = function () {
return _super.prototype.isEmpty.call(this) || this.value === "";
};
QuestionTextModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
QuestionTextModel.prototype.supportGoNextPageError = function () {
return ["date", "datetime", "datetime-local"].indexOf(this.inputType) < 0;
};
Object.defineProperty(QuestionTextModel.prototype, "placeHolder", {
/**
* The input place holder.
*/
get: function () {
return this.getLocalizableStringText("placeHolder");
},
set: function (val) {
this.setLocalizableStringText("placeHolder", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionTextModel.prototype, "locPlaceHolder", {
get: function () {
return this.getLocalizableString("placeHolder");
},
enumerable: true,
configurable: true
});
QuestionTextModel.prototype.canRunValidators = function (isOnValueChanged) {
return (this.errors.length > 0 ||
!isOnValueChanged ||
this.supportGoNextPageError());
};
QuestionTextModel.prototype.setNewValue = function (newValue) {
newValue = this.correctValueType(newValue);
_super.prototype.setNewValue.call(this, newValue);
};
QuestionTextModel.prototype.correctValueType = function (newValue) {
if (!newValue)
return newValue;
if (this.inputType == "number" || this.inputType == "range") {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isNumber(newValue) ? parseFloat(newValue) : "";
}
return newValue;
};
QuestionTextModel.prototype.addSupportedValidators = function (supportedValidators) {
_super.prototype.addSupportedValidators.call(this, supportedValidators);
supportedValidators.push("numeric", "text", "regex", "email");
};
return QuestionTextModel;
}(__WEBPACK_IMPORTED_MODULE_3__question__["a" /* Question */]));
var minMaxTypes = [
"number",
"range",
"date",
"datetime-local",
"month",
"time",
"week",
];
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("text", [
{
name: "inputType",
default: "text",
choices: [
"color",
"date",
"datetime",
"datetime-local",
"email",
"month",
"number",
"password",
"range",
"tel",
"text",
"time",
"url",
"week",
],
},
{ name: "size:number", default: 25 },
{
name: "textUpdateMode",
default: "default",
choices: ["default", "onBlur", "onTyping"],
dependsOn: "inputType",
visibleIf: function (obj) {
if (!obj)
return false;
return obj.inputType == "text";
},
},
{
name: "autoComplete",
dataList: [
"name",
"honorific-prefix",
"given-name",
"additional-name",
"family-name",
"honorific-suffix",
"nickname",
"organization-title",
"username",
"new-password",
"current-password",
"organization",
"street-address",
"address-line1",
"address-line2",
"address-line3",
"address-level4",
"address-level3",
"address-level2",
"address-level1",
"country",
"country-name",
"postal-code",
"cc-name",
"cc-given-name",
"cc-additional-name",
"cc-family-name",
"cc-number",
"cc-exp",
"cc-exp-month",
"cc-exp-year",
"cc-csc",
"cc-type",
"transaction-currency",
"transaction-amount",
"language",
"bday",
"bday-day",
"bday-month",
"bday-year",
"sex",
"url",
"photo",
"tel",
"tel-country-code",
"tel-national",
"tel-area-code",
"tel-local",
"tel-local-prefix",
"tel-local-suffix",
"tel-extension",
"email",
"impp",
],
},
{
name: "min",
dependsOn: "inputType",
visibleIf: function (obj) {
if (!obj)
return false;
return minMaxTypes.indexOf(obj.inputType) !== -1;
},
onPropertyEditorUpdate: function (obj, propertyEditor) {
propertyEditor.inputType = obj.inputType;
},
},
{
name: "max",
dependsOn: "inputType",
visibleIf: function (obj) {
if (!obj)
return false;
return minMaxTypes.indexOf(obj.inputType) !== -1;
},
onPropertyEditorUpdate: function (obj, propertyEditor) {
propertyEditor.inputType = obj.inputType;
},
},
{
name: "minValueExpression:expression",
category: "logic",
dependsOn: "inputType",
visibleIf: function (obj) {
if (!obj)
return false;
return minMaxTypes.indexOf(obj.inputType) !== -1;
},
},
{
name: "maxValueExpression:expression",
category: "logic",
dependsOn: "inputType",
visibleIf: function (obj) {
if (!obj)
return false;
return minMaxTypes.indexOf(obj.inputType) !== -1;
},
},
{
name: "step:number",
dependsOn: "inputType",
visibleIf: function (obj) {
if (!obj)
return false;
return obj.inputType === "number";
},
},
{ name: "maxLength:number", default: -1 },
{ name: "placeHolder", serializationProperty: "locPlaceHolder" },
], function () {
return new QuestionTextModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_1__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("text", function (name) {
return new QuestionTextModel(name);
});
/***/ }),
/* 53 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__row__ = __webpack_require__(42);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyPanelBase; });
var SurveyPanelBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyPanelBase, _super);
function SurveyPanelBase(props) {
var _this = _super.call(this, props) || this;
_this.rootRef = __WEBPACK_IMPORTED_MODULE_1_react__["createRef"]();
return _this;
}
SurveyPanelBase.prototype.getStateElement = function () {
return this.panelBase;
};
Object.defineProperty(SurveyPanelBase.prototype, "survey", {
get: function () {
return this.getSurvey();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyPanelBase.prototype, "creator", {
get: function () {
return this.props.creator;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyPanelBase.prototype, "css", {
get: function () {
return this.getCss();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyPanelBase.prototype, "panelBase", {
get: function () {
return this.getPanelBase();
},
enumerable: true,
configurable: true
});
SurveyPanelBase.prototype.getPanelBase = function () {
return this.props.element;
};
SurveyPanelBase.prototype.getSurvey = function () {
return this.props.survey;
};
SurveyPanelBase.prototype.getCss = function () {
return this.props.css;
};
SurveyPanelBase.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
this.doAfterRender();
};
SurveyPanelBase.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
var el = this.rootRef.current;
if (!!el) {
el.removeAttribute("data-rendered");
}
};
SurveyPanelBase.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
if (!!prevProps.page &&
!!this.survey &&
!!this.survey.currentPage &&
prevProps.page.name === this.survey.currentPage.name)
return;
this.doAfterRender();
};
SurveyPanelBase.prototype.doAfterRender = function () {
var el = this.rootRef.current;
if (el && this.survey) {
if (this.panelBase.isPanel) {
this.survey.afterRenderPanel(this.panelBase, el);
}
else {
this.survey.afterRenderPage(el);
}
}
};
SurveyPanelBase.prototype.renderRows = function (css) {
var rows = [];
var questionRows = this.panelBase.rows;
for (var i = 0; i < questionRows.length; i++) {
rows.push(this.createRow(questionRows[i], i, css));
}
return rows;
};
SurveyPanelBase.prototype.createRow = function (row, index, css) {
var rowName = "row" + (index + 1);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__row__["a" /* SurveyRow */], { key: rowName, row: row, survey: this.survey, creator: this.creator, css: css }));
};
return SurveyPanelBase;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["a" /* SurveyElementBase */]));
/***/ }),
/* 54 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__survey__ = __webpack_require__(33);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyWindowModel; });
/**
* A Model for a survey running in the Window.
*/
var SurveyWindowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyWindowModel, _super);
function SurveyWindowModel(jsonObj, initialModel) {
if (initialModel === void 0) { initialModel = null; }
var _this = _super.call(this) || this;
/**
* Set this value to negative value, for example -1, to avoid closing the window on completing the survey. Leave it equals to 0 (default value) to close the window immediately, or set it to 3, 5, 10, ... to close the window in 3, 5, 10 seconds.
*/
_this.closeOnCompleteTimeout = 0;
if (initialModel) {
_this.surveyValue = initialModel;
}
else {
_this.surveyValue = _this.createSurvey(jsonObj);
}
_this.surveyValue.showTitle = false;
if ("undefined" !== typeof document) {
_this.windowElement = document.createElement("div");
}
var self = _this;
_this.survey.onComplete.add(function (survey, options) {
self.onSurveyComplete();
});
return _this;
}
SurveyWindowModel.prototype.getType = function () {
return "window";
};
Object.defineProperty(SurveyWindowModel.prototype, "survey", {
/**
* A survey object.
* @see SurveyModel
*/
get: function () {
return this.surveyValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "isShowing", {
/**
* Returns true if the window is currently showing. Set it to true to show the window and false to hide it.
* @see show
* @see hide
*/
get: function () {
return this.getPropertyValue("isShowing", false);
},
set: function (val) {
if (this.isShowing == val)
return;
this.setPropertyValue("isShowing", val);
if (this.showingChangedCallback)
this.showingChangedCallback();
},
enumerable: true,
configurable: true
});
/**
* Show the window
* @see hide
* @see isShowing
*/
SurveyWindowModel.prototype.show = function () {
this.isShowing = true;
};
/**
* Hide the window
* @see show
* @see isShowing
*/
SurveyWindowModel.prototype.hide = function () {
this.isShowing = false;
};
Object.defineProperty(SurveyWindowModel.prototype, "isExpanded", {
/**
* Returns true if the window is expanded. Set it to true to expand the window or false to collapse it.
* @see expand
* @see collapse
*/
get: function () {
return this.getPropertyValue("isExpanded", false);
},
set: function (val) {
this.setPropertyValue("isExpanded", val);
if (!this.isLoadingFromJson && this.expandedChangedCallback)
this.expandedChangedCallback();
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "title", {
/**
* The window and survey title.
*/
get: function () {
return this.survey.title;
},
set: function (value) {
this.survey.title = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyWindowModel.prototype, "locTitle", {
get: function () {
return this.survey.locTitle;
},
enumerable: true,
configurable: true
});
/**
* Expand the window to show the survey.
*/
SurveyWindowModel.prototype.expand = function () {
this.expandcollapse(true);
};
/**
* Collapse the window and show survey title only.
*/
SurveyWindowModel.prototype.collapse = function () {
this.expandcollapse(false);
};
SurveyWindowModel.prototype.createSurvey = function (jsonObj) {
return new __WEBPACK_IMPORTED_MODULE_2__survey__["a" /* SurveyModel */](jsonObj);
};
SurveyWindowModel.prototype.expandcollapse = function (value) {
this.isExpanded = value;
};
SurveyWindowModel.prototype.onSurveyComplete = function () {
if (this.closeOnCompleteTimeout < 0)
return;
if (this.closeOnCompleteTimeout == 0) {
this.closeWindowOnComplete();
}
else {
var self = this;
var timerId = null;
var func = function () {
self.closeWindowOnComplete();
if (typeof window !== "undefined") {
window.clearInterval(timerId);
}
};
timerId =
typeof window !== "undefined"
? window.setInterval(func, this.closeOnCompleteTimeout * 1000)
: 0;
}
};
SurveyWindowModel.prototype.closeWindowOnComplete = function () {
if (!!this.closeWindowOnCompleteCallback) {
this.closeWindowOnCompleteCallback();
}
};
SurveyWindowModel.surveyElementName = "windowSurveyJS";
return SurveyWindowModel;
}(__WEBPACK_IMPORTED_MODULE_1__base__["b" /* Base */]));
/***/ }),
/* 55 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base__ = __webpack_require__(7);
/* unused harmony export surveyTimerFunctions */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTimer; });
var surveyTimerFunctions = {
setTimeout: function (func) {
if (typeof window === "undefined")
return 0;
return window.setTimeout(func, 1000);
},
clearTimeout: function (timerId) {
if (typeof window === "undefined")
return;
window.clearTimeout(timerId);
},
};
var SurveyTimer = /** @class */ (function () {
function SurveyTimer() {
this.listenerCounter = 0;
this.timerId = -1;
this.onTimer = new __WEBPACK_IMPORTED_MODULE_0__base__["c" /* Event */]();
}
Object.defineProperty(SurveyTimer, "instance", {
get: function () {
if (!SurveyTimer.instanceValue) {
SurveyTimer.instanceValue = new SurveyTimer();
}
return SurveyTimer.instanceValue;
},
enumerable: true,
configurable: true
});
SurveyTimer.prototype.start = function (func) {
var _this = this;
if (func === void 0) { func = null; }
if (func) {
this.onTimer.add(func);
}
if (this.timerId < 0) {
this.timerId = surveyTimerFunctions.setTimeout(function () {
_this.doTimer();
});
}
this.listenerCounter++;
};
SurveyTimer.prototype.stop = function (func) {
if (func === void 0) { func = null; }
if (func) {
this.onTimer.remove(func);
}
this.listenerCounter--;
if (this.listenerCounter == 0 && this.timerId > -1) {
surveyTimerFunctions.clearTimeout(this.timerId);
this.timerId = -1;
}
};
SurveyTimer.prototype.doTimer = function () {
var _this = this;
if (this.timerId < 0)
return;
this.onTimer.fire(this, {});
this.timerId = surveyTimerFunctions.setTimeout(function () {
_this.doTimer();
});
};
SurveyTimer.instanceValue = null;
return SurveyTimer;
}());
/***/ }),
/* 56 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultBootstrapCss; });
var defaultBootstrapCss = {
root: "sv_main sv_bootstrap_css",
container: "sv_container",
header: "panel-heading card-header",
body: "panel-body card-block mt-4",
bodyEmpty: "panel-body card-block mt-4 sv_body_empty",
footer: "panel-footer card-footer",
title: "",
description: "",
logo: "sv_logo",
logoImage: "sv_logo__image",
headerText: "sv_header__text",
navigationButton: "",
completedPage: "",
navigation: {
complete: "btn sv_complete_btn",
prev: "btn sv_prev_btn",
next: "btn sv_next_btn",
start: "btn sv_start_btn",
preview: "btn sv_preview_btn",
edit: "btn sv_edit_btn",
},
progress: "progress center-block mx-auto mb-4",
progressBar: "progress-bar",
progressTextUnderBar: "sv-hidden",
page: {
root: "",
title: "",
description: "small",
},
pageTitle: "",
pageDescription: "small",
row: "sv_row",
question: {
mainRoot: "sv_qstn",
flowRoot: "sv_q_flow sv_qstn",
header: "",
headerLeft: "title-left",
content: "",
contentLeft: "content-left",
titleLeftRoot: "sv_qstn_left",
title: "",
number: "sv_q_num",
description: "small",
descriptionUnderInput: "small",
requiredText: "sv_q_required_text",
comment: "form-control",
required: "",
titleRequired: "",
hasError: "has-error",
indent: 20,
formGroup: "form-group",
},
panel: {
title: "sv_p_title",
titleExpandable: "sv_p_title_expandable",
titleOnError: "",
icon: "sv_panel_icon",
iconExpanded: "sv_expanded",
description: "small sv_p_description",
container: "sv_p_container",
footer: "sv_p_footer",
number: "sv_q_num",
requiredText: "sv_q_required_text",
},
error: {
root: "alert alert-danger",
icon: "glyphicon glyphicon-exclamation-sign",
item: "",
locationTop: "sv_qstn_error_top",
locationBottom: "sv_qstn_error_bottom",
},
boolean: {
root: "sv_qbln form-inline checkbox",
item: "sv-boolean",
control: "sv-visuallyhidden",
itemChecked: "sv-boolean--checked checked",
itemIndeterminate: "sv-boolean--indeterminate",
itemDisabled: "sv-boolean--disabled",
switch: "sv-boolean__switch",
slider: "sv-boolean__slider",
label: "sv-boolean__label ",
disabledLabel: "sv-boolean__label--disabled",
},
checkbox: {
root: "sv_qcbc sv_qcbx form-inline",
item: "checkbox",
itemChecked: "checked",
itemSelectAll: "sv_q_checkbox_selectall",
itemNone: "sv_q_checkbox_none",
itemInline: "sv_q_checkbox_inline",
itemControl: "",
itemDecorator: "sv-hidden",
label: "",
labelChecked: "",
controlLabel: "",
materialDecorator: "checkbox-material",
other: "sv_q_checkbox_other form-control",
column: "sv_q_select_column",
},
comment: "form-control",
dropdown: {
root: "",
control: "form-control",
other: "sv_q_dd_other form-control",
},
html: { root: "" },
image: { root: "sv_q_image", image: "sv_image_image" },
matrix: {
root: "table sv_q_matrix",
label: "sv_q_m_label",
itemChecked: "checked",
itemDecorator: "sv-hidden",
cellText: "sv_q_m_cell_text",
cellTextSelected: "sv_q_m_cell_selected bg-primary",
cellLabel: "sv_q_m_cell_label",
},
matrixdropdown: { root: "table" },
matrixdynamic: {
root: "table",
button: "button",
buttonAdd: "",
buttonRemove: "",
iconAdd: "",
iconRemove: "",
},
paneldynamic: {
root: "",
navigation: "sv-paneldynamic__navigation",
progressTop: "sv-paneldynamic__progress sv-paneldynamic__progress--top",
progressBottom: "sv-paneldynamic__progress sv-paneldynamic__progress--bottom",
title: "sv-title sv-question__title",
button: "button",
buttonAdd: "button sv-paneldynamic__add-btn",
buttonRemove: "button sv-paneldynamic__remove-btn",
buttonPrev: "sv-paneldynamic__prev-btn",
buttonNext: "sv-paneldynamic__next-btn",
progressContainer: "sv-paneldynamic__progress-container",
progress: "sv-progress",
progressBar: "sv-progress__bar",
progressText: "sv-paneldynamic__progress-text",
},
multipletext: {
root: "table",
itemTitle: "",
itemValue: "sv_q_mt_item_value form-control",
},
radiogroup: {
root: "sv_qcbc form-inline",
item: "radio",
itemChecked: "checked",
itemInline: "sv_q_radiogroup_inline",
label: "",
labelChecked: "",
itemControl: "",
itemDecorator: "sv-hidden",
controlLabel: "",
materialDecorator: "circle",
other: "sv_q_radiogroup_other form-control",
clearButton: "sv_q_radiogroup_clear button",
column: "sv_q_select_column",
},
imagepicker: {
root: "sv_imgsel",
item: "sv_q_imgsel",
itemChecked: "checked",
itemInline: "sv_q_imagepicker_inline",
label: "sv_q_imgsel_label",
itemControl: "sv_q_imgsel_control_item",
image: "sv_q_imgsel_image",
itemText: "sv_q_imgsel_text",
clearButton: "sv_q_radiogroup_clear",
},
rating: {
root: "btn-group",
item: "btn btn-default btn-secondary",
selected: "active",
minText: "sv_q_rating_min_text",
itemText: "sv_q_rating_item_text",
maxText: "sv_q_rating_max_text",
disabled: "",
},
text: "form-control",
expression: "form-control",
file: {
root: "sv_q_file",
placeholderInput: "sv_q_file_placeholder",
preview: "sv_q_file_preview",
removeButton: "sv_q_file_remove_button",
fileInput: "sv_q_file_input",
removeFile: "sv_q_file_remove",
removeFileSvg: "sv-hidden",
fileDecorator: "sv-hidden",
fileSignBottom: "sv-hidden",
removeButtonBottom: "sv-hidden",
},
signaturepad: {
root: "sv_q_signaturepad sjs_sp_container",
controls: "sjs_sp_controls",
clearButton: "sjs_sp_clear",
},
saveData: {
root: "",
saving: "alert alert-info",
error: "alert alert-danger",
success: "alert alert-success",
saveAgainButton: "",
},
window: {
root: "modal-content",
body: "modal-body",
header: {
root: "modal-header panel-title",
title: "pull-left",
button: "glyphicon pull-right",
buttonExpanded: "glyphicon pull-right glyphicon-chevron-up",
buttonCollapsed: "glyphicon pull-right glyphicon-chevron-down",
},
},
};
__WEBPACK_IMPORTED_MODULE_0__cssstandard__["b" /* surveyCss */]["bootstrap"] = defaultBootstrapCss;
/***/ }),
/* 57 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultBootstrapMaterialCss; });
var defaultBootstrapMaterialCss = {
root: "sv_main sv_bootstrapmaterial_css",
container: "sv_container",
header: "card-heading",
body: "card-body",
bodyEmpty: "card-body sv_body_empty",
footer: "card-footer",
title: "",
description: "",
logo: "sv_logo",
logoImage: "sv_logo__image",
headerText: "sv_header__text",
navigationButton: "",
completedPage: "",
navigation: {
complete: "btn sv_complete_btn btn-primary",
prev: "btn sv_prev_btn btn-primary",
next: "btn sv_next_btn btn-primary",
start: "btn sv_start_btn btn-primary",
preview: "btn sv_preview_btn btn-primary",
edit: "btn sv_edit_btn btn-primary",
},
progress: "progress center-block mx-auto mb-4",
progressBar: "progress-bar",
progressTextUnderBar: "sv-hidden",
page: {
root: "",
title: "",
description: "small",
},
pageTitle: "",
pageDescription: "small",
row: "sv_row",
question: {
mainRoot: "sv_qstn form-group bmd-form-group",
flowRoot: "sv_q_flow form-group bmd-form-group",
header: "",
headerLeft: "title-left",
content: "",
contentLeft: "content-left",
titleLeftRoot: "sv_qstn_left",
requiredText: "sv_q_required_text",
title: "",
number: "sv_q_num",
description: "small",
descriptionUnderInput: "small",
comment: "form-control",
required: "",
titleRequired: "",
hasError: "has-error",
indent: 20,
formGroup: "form-group bmd-form-group",
},
panel: {
title: "sv_p_title",
titleExpandable: "sv_p_title_expandable",
titleOnError: "",
icon: "sv_panel_icon",
iconExpanded: "sv_expanded",
description: "small sv_p_description",
container: "sv_p_container",
footer: "sv_p_footer",
number: "sv_q_num",
requiredText: "sv_q_required_text",
},
error: {
root: "alert alert-danger",
icon: "glyphicon glyphicon-exclamation-sign",
item: "",
locationTop: "sv_qstn_error_top",
locationBottom: "sv_qstn_error_bottom",
},
boolean: {
root: "sv_qbln checkbox",
item: "sv-boolean",
control: "sv-visuallyhidden",
itemChecked: "sv-boolean--checked checked",
itemIndeterminate: "sv-boolean--indeterminate",
itemDisabled: "sv-boolean--disabled",
switch: "sv-boolean__switch",
slider: "sv-boolean__slider",
label: "sv-boolean__label ",
disabledLabel: "sv-boolean__label--disabled",
},
checkbox: {
root: "sv_qcbx",
item: "checkbox",
itemChecked: "checked",
itemSelectAll: "sv_q_checkbox_selectall",
itemNone: "sv_q_checkbox_none",
itemInline: "sv_q_checkbox_inline",
itemDecorator: "sv-hidden",
itemControl: "",
label: "",
labelChecked: "",
controlLabel: "",
materialDecorator: "checkbox-decorator",
other: "sv_q_checkbox_other form-control",
column: "sv_q_select_column",
},
comment: "form-control",
dropdown: {
root: "",
control: "form-control",
other: "sv_q_dd_other form-control",
},
html: { root: "" },
image: { root: "sv_q_image", image: "sv_image_image" },
matrix: {
root: "table sv_q_matrix",
row: "form-group bmd-form-group",
label: "sv_q_m_label radio-inline",
cellText: "sv_q_m_cell_text",
cellTextSelected: "sv_q_m_cell_selected bg-primary",
cellLabel: "sv_q_m_cell_label",
itemValue: "form-control",
itemChecked: "checked",
itemDecorator: "sv-hidden",
materialDecorator: "bmd-radio",
},
matrixdropdown: { root: "table", itemValue: "form-group bmd-form-group" },
matrixdynamic: {
mainRoot: "sv_qstn",
flowRoot: "sv_q_flow",
root: "table",
button: "btn btn-primary",
itemValue: "form-group bmd-form-group",
buttonAdd: "",
buttonRemove: "",
iconAdd: "",
iconRemove: "",
},
paneldynamic: {
root: "",
navigation: "sv-paneldynamic__navigation",
progressTop: "sv-paneldynamic__progress sv-paneldynamic__progress--top",
progressBottom: "sv-paneldynamic__progress sv-paneldynamic__progress--bottom",
title: "sv-title sv-question__title",
button: "button",
buttonAdd: "button sv-paneldynamic__add-btn btn btn-primary",
buttonRemove: "button sv-paneldynamic__remove-btn btn btn-primary",
buttonPrev: "sv-paneldynamic__prev-btn",
buttonNext: "sv-paneldynamic__next-btn",
progressContainer: "sv-paneldynamic__progress-container",
progress: "sv-progress",
progressBar: "sv-progress__bar",
progressText: "sv-paneldynamic__progress-text",
},
multipletext: {
root: "table",
itemTitle: "",
row: "form-group bmd-form-group",
itemValue: "sv_q_mt_item_value form-control",
},
radiogroup: {
root: "",
item: "radio",
itemChecked: "checked",
itemInline: "sv_q_radiogroup_inline",
itemDecorator: "sv-hidden",
label: "",
labelChecked: "",
itemControl: "",
controlLabel: "sv_q_radiogroup_control_label",
materialDecorator: "bmd-radio",
other: "sv_q_radiogroup_other form-control",
clearButton: "sv_q_radiogroup_clear button btn btn-primary",
column: "sv_q_select_column",
},
imagepicker: {
root: "sv_imgsel",
item: "sv_q_imgsel",
itemChecked: "checked",
itemInline: "sv_q_imagepicker_inline",
label: "sv_q_imgsel_label",
itemControl: "sv_q_imgsel_control_item",
image: "sv_q_imgsel_image",
itemText: "sv_q_imgsel_text",
clearButton: "sv_q_radiogroup_clear",
},
rating: {
root: "btn-group",
item: "btn btn-default btn-secondary",
selected: "active",
minText: "sv_q_rating_min_text",
itemText: "sv_q_rating_item_text",
maxText: "sv_q_rating_max_text",
disabled: "",
},
text: "form-control",
expression: "form-control",
file: {
root: "form-group bmd-form-group is-fileinput sv_q_file",
placeholderInput: "",
preview: "sv_q_file_preview",
removeButton: "sv_q_file_remove_button",
fileInput: "sv_q_file_input",
removeFile: "sv_q_file_remove",
removeFileSvg: "sv-hidden",
fileDecorator: "sv-hidden",
fileSignBottom: "sv-hidden",
removeButtonBottom: "sv-hidden",
},
signaturepad: {
root: "sv_q_signaturepad sjs_sp_container",
controls: "sjs_sp_controls",
clearButton: "sjs_sp_clear",
},
saveData: {
root: "",
saving: "alert alert-info",
error: "alert alert-danger",
success: "alert alert-success",
saveAgainButton: "",
},
window: {
root: "modal-content",
body: "modal-body",
header: {
root: "modal-header card-title",
title: "pull-left",
button: "glyphicon pull-right",
buttonExpanded: "glyphicon pull-right glyphicon-chevron-up",
buttonCollapsed: "glyphicon pull-right glyphicon-chevron-down",
},
},
};
__WEBPACK_IMPORTED_MODULE_0__cssstandard__["b" /* surveyCss */]["bootstrapmaterial"] = defaultBootstrapMaterialCss;
/***/ }),
/* 58 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return modernCss; });
var modernCss = {
root: "sv-root-modern",
container: "sv-container-modern",
header: "sv-title sv-container-modern__title",
body: "sv-body",
bodyEmpty: "sv-body sv-body--empty",
footer: "sv-footer sv-body__footer sv-clearfix",
title: "",
description: "",
logo: "sv-logo",
logoImage: "sv-logo__image",
headerText: "sv-header__text",
navigationButton: "",
completedPage: "sv-completedpage",
navigation: {
complete: "sv-btn sv-footer__complete-btn",
prev: "sv-btn sv-footer__prev-btn",
next: "sv-btn sv-footer__next-btn",
start: "sv-btn sv-footer__start-btn",
preview: "sv-btn sv-footer__preview-btn",
edit: "sv-btn sv-footer__edit-btn",
},
panel: {
title: "sv-title sv-panel__title",
titleExpandable: "sv-panel__title--expandable",
titleOnError: "sv-panel__title--error",
description: "sv-description sv-panel__description",
container: "sv-panel sv-row__panel",
content: "sv-panel__content",
icon: "sv-panel__icon",
iconExpanded: "sv-panel__icon--expanded",
footer: "sv-panel__footer",
requiredText: "sv-panel__required-text",
number: "sv-question__num",
},
paneldynamic: {
root: "sv-paneldynamic",
navigation: "sv-paneldynamic__navigation",
title: "sv-title sv-question__title",
button: "sv-btn",
buttonRemove: "sv-paneldynamic__remove-btn",
buttonAdd: "sv-paneldynamic__add-btn",
progressTop: "sv-paneldynamic__progress sv-paneldynamic__progress--top",
progressBottom: "sv-paneldynamic__progress sv-paneldynamic__progress--bottom",
buttonPrev: "sv-paneldynamic__prev-btn",
buttonNext: "sv-paneldynamic__next-btn",
progressContainer: "sv-paneldynamic__progress-container",
progress: "sv-progress",
progressBar: "sv-progress__bar",
progressText: "sv-paneldynamic__progress-text",
separator: "sv-paneldynamic__separator",
},
progress: "sv-progress sv-body__progress",
progressBar: "sv-progress__bar",
progressText: "sv-progress__text",
progressTextInBar: "sv-hidden",
page: {
root: "sv-page sv-body__page",
title: "sv-title sv-page__title",
description: "sv-description sv-page__description",
},
pageTitle: "sv-title sv-page__title",
pageDescription: "sv-description sv-page__description",
row: "sv-row sv-clearfix",
question: {
mainRoot: "sv-question sv-row__question",
flowRoot: "sv-question sv-row__question sv-row__question--flow",
asCell: "sv-table__cell",
header: "sv-question__header",
headerLeft: "sv-question__header--location--left",
headerTop: "sv-question__header--location--top",
headerBottom: "sv-question__header--location--bottom",
content: "sv-question__content",
contentLeft: "sv-question__content--left",
titleLeftRoot: "",
titleOnAnswer: "sv-question__title--answer",
titleOnError: "sv-question__title--error",
title: "sv-title sv-question__title",
requiredText: "sv-question__required-text",
number: "sv-question__num",
description: "sv-description sv-question__description",
descriptionUnderInput: "sv-description sv-question__description",
comment: "sv-comment",
required: "sv-question--required",
titleRequired: "sv-question__title--required",
indent: 20,
footer: "sv-question__footer",
formGroup: "sv-question__form-group",
hasError: "",
disabled: "sv-question--disabled",
},
image: { root: "sv-image", image: "sv_image_image" },
error: {
root: "sv-question__erbox",
icon: "",
item: "",
locationTop: "sv-question__erbox--location--top",
locationBottom: "sv-question__erbox--location--bottom",
},
checkbox: {
root: "sv-selectbase",
item: "sv-item sv-checkbox sv-selectbase__item",
itemSelectAll: "sv-checkbox--selectall",
itemNone: "sv-checkbox--none",
itemDisabled: "sv-item--disabled sv-checkbox--disabled",
itemChecked: "sv-checkbox--checked",
itemHover: "sv-checkbox--allowhover",
itemInline: "sv-selectbase__item--inline",
label: "sv-selectbase__label",
labelChecked: "",
itemControl: "sv-visuallyhidden sv-item__control",
itemDecorator: "sv-item__svg sv-checkbox__svg",
controlLabel: "sv-item__control-label",
materialDecorator: "sv-item__decorator sv-checkbox__decorator",
other: "sv-comment sv-question__other",
column: "sv-selectbase__column",
},
radiogroup: {
root: "sv-selectbase",
item: "sv-item sv-radio sv-selectbase__item",
itemInline: "sv-selectbase__item--inline",
label: "sv-selectbase__label",
labelChecked: "",
itemDisabled: "sv-item--disabled sv-radio--disabled",
itemChecked: "sv-radio--checked",
itemHover: "sv-radio--allowhover",
itemControl: "sv-visuallyhidden sv-item__control",
itemDecorator: "sv-item__svg sv-radio__svg",
controlLabel: "sv-item__control-label",
materialDecorator: "sv-item__decorator sv-radio__decorator",
other: "sv-comment sv-question__other",
clearButton: "sv-btn sv-selectbase__clear-btn",
column: "sv-selectbase__column",
},
boolean: {
root: "",
small: "sv-row__question--small",
item: "sv-boolean sv-item",
control: "sv-visuallyhidden",
itemChecked: "sv-boolean--checked",
itemIndeterminate: "sv-boolean--indeterminate",
itemDisabled: "sv-item--disabled sv-boolean--disabled",
switch: "sv-boolean__switch",
slider: "sv-boolean__slider",
label: "sv-boolean__label ",
disabledLabel: "sv-boolean__label--disabled",
},
text: {
root: "sv-text",
small: "sv-row__question--small",
onError: "sv-text--error",
},
multipletext: {
root: "sv-multipletext",
item: "sv-multipletext__item",
itemTitle: "sv-multipletext__item-title",
row: "sv-multipletext__row",
cell: "sv-multipletext__cell",
},
dropdown: {
root: "",
small: "sv-row__question--small",
control: "sv-dropdown",
selectWrapper: "",
other: "sv-comment sv-question__other",
onError: "sv-dropdown--error",
},
imagepicker: {
root: "sv-imagepicker",
item: "sv-imagepicker__item",
itemInline: "sv-imagepicker__item--inline",
itemChecked: "sv-imagepicker__item--checked",
itemDisabled: "sv-imagepicker__item--disabled",
itemHover: "sv-imagepicker__item--allowhover",
label: "sv-imagepicker__label",
itemControl: "sv-imagepicker__control",
image: "sv-imagepicker__image",
itemText: "sv-imagepicker__text",
clearButton: "sv-btn",
other: "sv-comment sv-question__other",
},
matrix: {
tableWrapper: "sv-matrix",
root: "sv-table",
rowError: "sv-matrix__row--error",
cell: "sv-table__cell sv-matrix__cell",
headerCell: "sv-table__cell sv-table__cell--header",
label: "sv-item sv-radio sv-matrix__label",
itemValue: "sv-visuallyhidden sv-item__control sv-radio__control",
itemChecked: "sv-radio--checked",
itemDisabled: "sv-item--disabled sv-radio--disabled",
itemHover: "sv-radio--allowhover",
materialDecorator: "sv-item__decorator sv-radio__decorator",
itemDecorator: "sv-item__svg sv-radio__svg",
cellText: "sv-matrix__text",
cellTextSelected: "sv-matrix__text--checked",
cellTextDisabled: "sv-matrix__text--disabled",
},
matrixdropdown: {
root: "sv-table",
cell: "sv-table__cell",
headerCell: "sv-table__cell sv-table__cell--header",
},
matrixdynamic: {
root: "sv-table sv-matrixdynamic",
cell: "sv-table__cell",
headerCell: "sv-table__cell sv-table__cell--header",
button: "sv-btn",
buttonAdd: "sv-matrixdynamic__add-btn",
buttonRemove: "sv-matrixdynamic__remove-btn",
iconAdd: "",
iconRemove: "",
},
rating: {
root: "sv-rating",
item: "sv-rating__item",
selected: "sv-rating__item--selected",
minText: "sv-rating__min-text",
itemText: "sv-rating__item-text",
maxText: "sv-rating__max-text",
disabled: "sv-rating--disabled",
},
comment: {
root: "sv-comment",
small: "sv-row__question--small",
},
expression: "",
file: {
root: "sv-file",
other: "sv-comment sv-question__other",
placeholderInput: "sv-visuallyhidden",
preview: "sv-file__preview",
fileSign: "sv-hidden",
fileSignBottom: "sv-file__sign",
fileDecorator: "sv-file__decorator",
fileInput: "sv-visuallyhidden",
noFileChosen: "sv-description sv-file__no-file-chosen",
chooseFile: "sv-btn sv-file__choose-btn",
disabled: "sv-file__choose-btn--disabled",
removeButton: "sv-hidden",
removeButtonBottom: "sv-btn sv-file__clean-btn",
removeFile: "sv-hidden",
removeFileSvg: "sv-file__remove-svg",
wrapper: "sv-file__wrapper",
},
signaturepad: {
root: "sv-signaturepad sjs_sp_container",
small: "sv-row__question--small",
controls: "sjs_sp_controls",
clearButton: "sjs_sp_clear",
},
saveData: {
root: "",
saving: "",
error: "",
success: "",
saveAgainButton: "",
},
window: {
root: "sv_window",
body: "sv_window_content",
header: {
root: "sv_window_title",
title: "",
button: "",
buttonExpanded: "",
buttonCollapsed: "",
},
},
};
__WEBPACK_IMPORTED_MODULE_0__cssstandard__["b" /* surveyCss */]["modern"] = modernCss;
/***/ }),
/* 59 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__localization_arabic__ = __webpack_require__(87);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localization_bulgarian__ = __webpack_require__(88);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__localization_catalan__ = __webpack_require__(89);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__localization_czech__ = __webpack_require__(90);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__localization_danish__ = __webpack_require__(91);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__localization_dutch__ = __webpack_require__(92);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__localization_estonian__ = __webpack_require__(93);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__localization_finnish__ = __webpack_require__(94);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__localization_french__ = __webpack_require__(95);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__localization_georgian__ = __webpack_require__(96);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__localization_german__ = __webpack_require__(97);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__localization_greek__ = __webpack_require__(98);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__localization_hebrew__ = __webpack_require__(99);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__localization_hungarian__ = __webpack_require__(100);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__localization_icelandic__ = __webpack_require__(101);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__localization_indonesian__ = __webpack_require__(102);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__localization_italian__ = __webpack_require__(103);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__localization_japanese__ = __webpack_require__(104);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__localization_korean__ = __webpack_require__(105);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__localization_latvian__ = __webpack_require__(106);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__localization_lithuanian__ = __webpack_require__(107);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__localization_norwegian__ = __webpack_require__(108);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__localization_persian__ = __webpack_require__(109);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__localization_polish__ = __webpack_require__(110);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__localization_portuguese__ = __webpack_require__(111);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__localization_romanian__ = __webpack_require__(112);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__localization_russian__ = __webpack_require__(113);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__localization_simplified_chinese__ = __webpack_require__(114);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__localization_spanish__ = __webpack_require__(115);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__localization_swedish__ = __webpack_require__(117);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__localization_thai__ = __webpack_require__(119);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__localization_turkish__ = __webpack_require__(121);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__localization_traditional_chinese__ = __webpack_require__(120);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__localization_ukrainian__ = __webpack_require__(122);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__localization_tajik__ = __webpack_require__(118);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__localization_swahili__ = __webpack_require__(116);
/***/ }),
/* 60 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__main_scss__ = __webpack_require__(80);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__main_scss___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__main_scss__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__modern_scss__ = __webpack_require__(81);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__modern_scss___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1__modern_scss__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__settings__ = __webpack_require__(9);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_2__settings__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__helpers__ = __webpack_require__(4);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_3__helpers__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__validator__ = __webpack_require__(34);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["h"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["i"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return __WEBPACK_IMPORTED_MODULE_4__validator__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__itemvalue__ = __webpack_require__(13);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "m", function() { return __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__base__ = __webpack_require__(7);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "n", function() { return __WEBPACK_IMPORTED_MODULE_6__base__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "o", function() { return __WEBPACK_IMPORTED_MODULE_6__base__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "p", function() { return __WEBPACK_IMPORTED_MODULE_6__base__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "q", function() { return __WEBPACK_IMPORTED_MODULE_6__base__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__calculatedValue__ = __webpack_require__(83);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "r", function() { return __WEBPACK_IMPORTED_MODULE_7__calculatedValue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__error__ = __webpack_require__(12);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "s", function() { return __WEBPACK_IMPORTED_MODULE_8__error__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "t", function() { return __WEBPACK_IMPORTED_MODULE_8__error__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "u", function() { return __WEBPACK_IMPORTED_MODULE_8__error__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "v", function() { return __WEBPACK_IMPORTED_MODULE_8__error__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "w", function() { return __WEBPACK_IMPORTED_MODULE_8__error__["e"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__localizablestring__ = __webpack_require__(16);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return __WEBPACK_IMPORTED_MODULE_9__localizablestring__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__expressionItems__ = __webpack_require__(84);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return __WEBPACK_IMPORTED_MODULE_10__expressionItems__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "z", function() { return __WEBPACK_IMPORTED_MODULE_10__expressionItems__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__choicesRestfull__ = __webpack_require__(43);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "A", function() { return __WEBPACK_IMPORTED_MODULE_11__choicesRestfull__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__functionsfactory__ = __webpack_require__(29);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "B", function() { return __WEBPACK_IMPORTED_MODULE_12__functionsfactory__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "C", function() { return __WEBPACK_IMPORTED_MODULE_12__functionsfactory__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__conditions__ = __webpack_require__(11);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "D", function() { return __WEBPACK_IMPORTED_MODULE_13__conditions__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "E", function() { return __WEBPACK_IMPORTED_MODULE_13__conditions__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__ = __webpack_require__(28);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "F", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "G", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "H", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "I", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "J", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "K", function() { return __WEBPACK_IMPORTED_MODULE_14__expressions_expressions__["e"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__conditionsParser__ = __webpack_require__(44);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "L", function() { return __WEBPACK_IMPORTED_MODULE_15__conditionsParser__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__conditionProcessValue__ = __webpack_require__(15);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "M", function() { return __WEBPACK_IMPORTED_MODULE_16__conditionProcessValue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__jsonobject__ = __webpack_require__(2);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "N", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "O", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "P", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Q", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["h"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "R", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["i"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "S", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["j"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "T", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "U", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["k"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "V", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["l"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "W", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["m"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "X", function() { return __WEBPACK_IMPORTED_MODULE_17__jsonobject__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__ = __webpack_require__(30);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Y", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Z", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_0", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_1", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_2", function() { return __WEBPACK_IMPORTED_MODULE_18__question_matrixdropdownbase__["e"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__question_matrixdropdown__ = __webpack_require__(133);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_3", function() { return __WEBPACK_IMPORTED_MODULE_19__question_matrixdropdown__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_4", function() { return __WEBPACK_IMPORTED_MODULE_19__question_matrixdropdown__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__question_matrixdynamic__ = __webpack_require__(134);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_5", function() { return __WEBPACK_IMPORTED_MODULE_20__question_matrixdynamic__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_6", function() { return __WEBPACK_IMPORTED_MODULE_20__question_matrixdynamic__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__question_matrix__ = __webpack_require__(132);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_7", function() { return __WEBPACK_IMPORTED_MODULE_21__question_matrix__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_8", function() { return __WEBPACK_IMPORTED_MODULE_21__question_matrix__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_9", function() { return __WEBPACK_IMPORTED_MODULE_21__question_matrix__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__question_multipletext__ = __webpack_require__(135);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_10", function() { return __WEBPACK_IMPORTED_MODULE_22__question_multipletext__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_11", function() { return __WEBPACK_IMPORTED_MODULE_22__question_multipletext__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__panel__ = __webpack_require__(22);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_12", function() { return __WEBPACK_IMPORTED_MODULE_23__panel__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_13", function() { return __WEBPACK_IMPORTED_MODULE_23__panel__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_14", function() { return __WEBPACK_IMPORTED_MODULE_23__panel__["d"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__flowpanel__ = __webpack_require__(86);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_15", function() { return __WEBPACK_IMPORTED_MODULE_24__flowpanel__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__page__ = __webpack_require__(48);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_16", function() { return __WEBPACK_IMPORTED_MODULE_25__page__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__question__ = __webpack_require__(10);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_17", function() { return __WEBPACK_IMPORTED_MODULE_26__question__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__questionnonvalue__ = __webpack_require__(31);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_18", function() { return __WEBPACK_IMPORTED_MODULE_27__questionnonvalue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__question_empty__ = __webpack_require__(127);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_19", function() { return __WEBPACK_IMPORTED_MODULE_28__question_empty__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__question_baseselect__ = __webpack_require__(20);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_20", function() { return __WEBPACK_IMPORTED_MODULE_29__question_baseselect__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_21", function() { return __WEBPACK_IMPORTED_MODULE_29__question_baseselect__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__question_checkbox__ = __webpack_require__(124);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_22", function() { return __WEBPACK_IMPORTED_MODULE_30__question_checkbox__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__question_comment__ = __webpack_require__(125);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_23", function() { return __WEBPACK_IMPORTED_MODULE_31__question_comment__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__question_dropdown__ = __webpack_require__(50);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_24", function() { return __WEBPACK_IMPORTED_MODULE_32__question_dropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__questionfactory__ = __webpack_require__(8);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_25", function() { return __WEBPACK_IMPORTED_MODULE_33__questionfactory__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_26", function() { return __WEBPACK_IMPORTED_MODULE_33__questionfactory__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__question_file__ = __webpack_require__(128);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_27", function() { return __WEBPACK_IMPORTED_MODULE_34__question_file__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__question_html__ = __webpack_require__(129);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_28", function() { return __WEBPACK_IMPORTED_MODULE_35__question_html__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__question_radiogroup__ = __webpack_require__(137);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_29", function() { return __WEBPACK_IMPORTED_MODULE_36__question_radiogroup__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__question_rating__ = __webpack_require__(138);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_30", function() { return __WEBPACK_IMPORTED_MODULE_37__question_rating__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__question_expression__ = __webpack_require__(51);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_31", function() { return __WEBPACK_IMPORTED_MODULE_38__question_expression__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__question_text__ = __webpack_require__(52);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_32", function() { return __WEBPACK_IMPORTED_MODULE_39__question_text__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__question_boolean__ = __webpack_require__(123);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_33", function() { return __WEBPACK_IMPORTED_MODULE_40__question_boolean__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__question_imagepicker__ = __webpack_require__(131);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_34", function() { return __WEBPACK_IMPORTED_MODULE_41__question_imagepicker__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__question_image__ = __webpack_require__(130);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_35", function() { return __WEBPACK_IMPORTED_MODULE_42__question_image__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_43__question_signaturepad__ = __webpack_require__(139);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_36", function() { return __WEBPACK_IMPORTED_MODULE_43__question_signaturepad__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_44__question_paneldynamic__ = __webpack_require__(136);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_37", function() { return __WEBPACK_IMPORTED_MODULE_44__question_paneldynamic__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_38", function() { return __WEBPACK_IMPORTED_MODULE_44__question_paneldynamic__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_45__surveytimer__ = __webpack_require__(55);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_39", function() { return __WEBPACK_IMPORTED_MODULE_45__surveytimer__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_46__survey__ = __webpack_require__(33);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_40", function() { return __WEBPACK_IMPORTED_MODULE_46__survey__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_47__trigger__ = __webpack_require__(141);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_41", function() { return __WEBPACK_IMPORTED_MODULE_47__trigger__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_42", function() { return __WEBPACK_IMPORTED_MODULE_47__trigger__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_43", function() { return __WEBPACK_IMPORTED_MODULE_47__trigger__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_44", function() { return __WEBPACK_IMPORTED_MODULE_47__trigger__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_45", function() { return __WEBPACK_IMPORTED_MODULE_47__trigger__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_46", function() { return __WEBPACK_IMPORTED_MODULE_47__trigger__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_47", function() { return __WEBPACK_IMPORTED_MODULE_47__trigger__["g"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_48__surveyWindow__ = __webpack_require__(54);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_48", function() { return __WEBPACK_IMPORTED_MODULE_48__surveyWindow__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_49__textPreProcessor__ = __webpack_require__(23);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_49", function() { return __WEBPACK_IMPORTED_MODULE_49__textPreProcessor__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_50__dxSurveyService__ = __webpack_require__(45);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_50", function() { return __WEBPACK_IMPORTED_MODULE_50__dxSurveyService__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_51__localization_english__ = __webpack_require__(46);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_51", function() { return __WEBPACK_IMPORTED_MODULE_51__localization_english__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_52__surveyStrings__ = __webpack_require__(1);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_52", function() { return __WEBPACK_IMPORTED_MODULE_52__surveyStrings__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_53", function() { return __WEBPACK_IMPORTED_MODULE_52__surveyStrings__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_53__questionCustomWidgets__ = __webpack_require__(49);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_54", function() { return __WEBPACK_IMPORTED_MODULE_53__questionCustomWidgets__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_55", function() { return __WEBPACK_IMPORTED_MODULE_53__questionCustomWidgets__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_54__question_custom__ = __webpack_require__(126);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_56", function() { return __WEBPACK_IMPORTED_MODULE_54__question_custom__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_57", function() { return __WEBPACK_IMPORTED_MODULE_54__question_custom__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_58", function() { return __WEBPACK_IMPORTED_MODULE_54__question_custom__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_59", function() { return __WEBPACK_IMPORTED_MODULE_54__question_custom__["d"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_55__stylesmanager__ = __webpack_require__(32);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_60", function() { return __WEBPACK_IMPORTED_MODULE_55__stylesmanager__["a"]; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Version; });
// styles
var Version;
Version = "" + "1.8.12";
// export { cultureInfo } from "../../cultureInfo";
//Uncomment to include the "date" question type.
//export {default as QuestionDateModel} from "../../plugins/question_date";
/***/ }),
/* 61 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestion__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__element_factory__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__panel__ = __webpack_require__(21);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyFlowPanel; });
var SurveyFlowPanel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyFlowPanel, _super);
function SurveyFlowPanel(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyFlowPanel.prototype, "flowPanel", {
get: function () {
return this.panel;
},
enumerable: true,
configurable: true
});
SurveyFlowPanel.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
if (!!this.flowPanel) {
var self = this;
this.flowPanel.onCustomHtmlProducing = function () {
return "";
};
this.flowPanel.onGetHtmlForQuestion = self.renderQuestion;
}
};
SurveyFlowPanel.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (!!this.flowPanel) {
this.flowPanel.onCustomHtmlProducing = null;
this.flowPanel.onGetHtmlForQuestion = null;
}
};
SurveyFlowPanel.prototype.getQuestion = function (name) {
return this.flowPanel.getQuestionByName(name);
};
SurveyFlowPanel.prototype.renderQuestion = function (question) {
return "" + question.name + "";
};
SurveyFlowPanel.prototype.renderRows = function () {
return [this.renderHtml()];
};
SurveyFlowPanel.prototype.getNodeIndex = function () {
return this.renderedIndex++;
};
SurveyFlowPanel.prototype.renderHtml = function () {
if (!this.flowPanel)
return null;
var html = "" + this.flowPanel.produceHtml() + "";
if (!DOMParser) {
var htmlValue = { __html: html };
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { dangerouslySetInnerHTML: htmlValue });
}
var doc = new DOMParser().parseFromString(html, "text/xml");
this.renderedIndex = 0;
return this.renderParentNode(doc);
};
SurveyFlowPanel.prototype.renderNodes = function (domNodes) {
var nodes = [];
for (var i = 0; i < domNodes.length; i++) {
nodes.push(this.renderNode(domNodes[i]));
}
return nodes;
};
SurveyFlowPanel.prototype.getStyle = function (nodeType) {
var style = {};
if (nodeType.toLowerCase() === "b") {
style.fontWeight = "bold";
}
if (nodeType.toLowerCase() === "i") {
style.fontStyle = "italic";
}
if (nodeType.toLowerCase() === "u") {
style.textDecoration = "underline";
}
return style;
};
SurveyFlowPanel.prototype.renderParentNode = function (node) {
var nodeType = node.nodeName.toLowerCase();
var children = this.renderNodes(this.getChildDomNodes(node));
if (nodeType == "div")
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: this.getNodeIndex() }, children);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { key: this.getNodeIndex(), style: this.getStyle(nodeType) }, children));
};
SurveyFlowPanel.prototype.renderNode = function (node) {
if (!this.hasTextChildNodesOnly(node)) {
return this.renderParentNode(node);
}
var nodeType = node.nodeName.toLowerCase();
if (nodeType === "question") {
var question = this.flowPanel.getQuestionByName(node.textContent);
if (!question)
return null;
var questionBody = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_2__reactquestion__["a" /* SurveyQuestion */], { key: question.name, element: question, creator: this.creator, css: this.css }));
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { key: this.getNodeIndex() }, questionBody);
}
if (nodeType === "div") {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: this.getNodeIndex() }, node.textContent);
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { key: this.getNodeIndex(), style: this.getStyle(nodeType) }, node.textContent));
};
SurveyFlowPanel.prototype.getChildDomNodes = function (node) {
var domNodes = [];
for (var i = 0; i < node.childNodes.length; i++) {
domNodes.push(node.childNodes[i]);
}
return domNodes;
};
SurveyFlowPanel.prototype.hasTextChildNodesOnly = function (node) {
var nodes = node.childNodes;
for (var i = 0; i < nodes.length; i++) {
if (nodes[i].nodeName.toLowerCase() !== "#text")
return false;
}
return true;
};
SurveyFlowPanel.prototype.renderContent = function (style, rows) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("f-panel", { style: style }, rows);
};
return SurveyFlowPanel;
}(__WEBPACK_IMPORTED_MODULE_4__panel__["a" /* SurveyPanel */]));
__WEBPACK_IMPORTED_MODULE_3__element_factory__["a" /* ReactElementFactory */].Instance.registerElement("flowpanel", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyFlowPanel, props);
});
/***/ }),
/* 62 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionImage; });
var SurveyQuestionImage = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionImage, _super);
function SurveyQuestionImage(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionImage.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionImage.prototype.canRender = function () {
return _super.prototype.canRender.call(this) && !!this.question.imageLink;
};
SurveyQuestionImage.prototype.renderElement = function () {
var cssClasses = this.question.cssClasses;
var style = { objectFit: this.question.imageFit };
var control = null;
if (this.question.contentMode === "image") {
control = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("img", { className: cssClasses.image, src: this.question.imageLink, width: this.question.imageWidth
? this.question.imageWidth + "px"
: undefined, height: this.question.imageHeight
? this.question.imageHeight + "px"
: undefined,
//alt={item.text || item.value}
style: style }));
}
if (this.question.contentMode === "video") {
control = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("embed", { className: cssClasses.image, src: this.question.imageLink, width: this.question.imageWidth
? this.question.imageWidth + "px"
: undefined, height: this.question.imageHeight
? this.question.imageHeight + "px"
: undefined, style: style }));
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.root }, control);
};
return SurveyQuestionImage;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("image", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionImage, props);
});
/***/ }),
/* 63 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionImagePicker; });
var SurveyQuestionImagePicker = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionImagePicker, _super);
function SurveyQuestionImagePicker(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionImagePicker.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionImagePicker.prototype.handleOnChange = function (event) {
if (this.question.multiSelect) {
if (event.target.checked) {
this.question.value = this.question.value.concat(event.target.value);
}
else {
var currValue = this.question.value;
currValue.splice(this.question.value.indexOf(event.target.value), 1);
this.question.value = currValue;
}
}
else {
this.question.value = event.target.value;
}
this.setState({ value: this.question.value });
};
SurveyQuestionImagePicker.prototype.renderElement = function () {
var cssClasses = this.question.cssClasses;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("fieldset", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("legend", { "aria-label": this.question.locTitle.renderedHtml }),
this.getItems(cssClasses)));
};
SurveyQuestionImagePicker.prototype.getItems = function (cssClasses) {
var items = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
items.push(this.renderItem(key, item, cssClasses));
}
return items;
};
Object.defineProperty(SurveyQuestionImagePicker.prototype, "textStyle", {
get: function () {
return { marginLeft: "3px", display: "inline", position: "static" };
},
enumerable: true,
configurable: true
});
SurveyQuestionImagePicker.prototype.renderItem = function (key, item, cssClasses) {
var isChecked = this.question.isItemSelected(item);
var id = this.question.inputId + "_" + item.value;
var itemClass = this.question.getItemClass(item);
var text = null;
if (this.question.showLabel) {
text = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { title: item.text || item.value, className: this.question.cssClasses.itemText }, item.text || item.value));
}
var style = { objectFit: this.question.imageFit };
var control = null;
if (this.question.contentMode === "image") {
control = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("img", { className: cssClasses.image, src: item["imageLink"], width: this.question.imageWidth
? this.question.imageWidth + "px"
: undefined, height: this.question.imageHeight
? this.question.imageHeight + "px"
: undefined, alt: item.text || item.value, style: style }));
}
if (this.question.contentMode === "video") {
control = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("embed", { className: cssClasses.image, src: item["imageLink"], width: this.question.imageWidth
? this.question.imageWidth + "px"
: undefined, height: this.question.imageHeight
? this.question.imageHeight + "px"
: undefined, style: style }));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { key: key, className: itemClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: cssClasses.label },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { style: { display: "none" }, className: cssClasses.itemControl, id: id, type: this.question.multiSelect ? "checkbox" : "radio", name: this.question.name + "_" + this.questionBase.id, checked: isChecked, value: item.value, disabled: this.isDisplayMode || !item.isEnabled, onChange: this.handleOnChange, "aria-label": this.question.locTitle.renderedHtml, "aria-invalid": this.question.errors.length > 0, "aria-describedby": this.question.errors.length > 0
? this.question.id + "_errors"
: null }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
control,
text))));
};
return SurveyQuestionImagePicker;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("imagepicker", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionImagePicker, props);
});
/***/ }),
/* 64 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactSurvey__ = __webpack_require__(36);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactsurveymodel__ = __webpack_require__(27);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyWindow; });
var SurveyWindow = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyWindow, _super);
function SurveyWindow(props) {
var _this = _super.call(this, props) || this;
_this.handleOnExpanded = _this.handleOnExpanded.bind(_this);
return _this;
}
SurveyWindow.prototype.getStateElements = function () {
return [this.window, this.window.survey];
};
SurveyWindow.prototype.handleOnExpanded = function (event) {
this.window.isExpanded = !this.window.isExpanded;
};
SurveyWindow.prototype.canRender = function () {
return _super.prototype.canRender.call(this) && this.window.isShowing;
};
SurveyWindow.prototype.renderElement = function () {
var header = this.renderWindowHeader();
var body = this.window.isExpanded ? this.renderBody() : null;
var style = {
position: "fixed",
bottom: 3,
right: 10,
maxWidth: "60%",
};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.window.root, style: style },
header,
body));
};
SurveyWindow.prototype.renderWindowHeader = function () {
var styleA = { width: "100%", cursor: "pointer" };
var styleTitle = { paddingRight: "10px" };
var glyphClassName = this.window.isExpanded
? this.css.window.header.buttonCollapsed
: this.css.window.header.buttonExpanded;
glyphClassName = "glyphicon pull-right " + glyphClassName;
var title = __WEBPACK_IMPORTED_MODULE_4__reactquestionelement__["a" /* SurveyElementBase */].renderLocString(this.survey.locTitle);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.window.header.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { onClick: this.handleOnExpanded, style: styleA },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.css.window.header.title, style: styleTitle }, title),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: glyphClassName, "aria-hidden": "true" })),
this.window.isExpanded ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { onClick: this.handleOnExpanded, style: { float: "right", cursor: "pointer" } },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.css.window.header.title, style: styleTitle }, "X"))) : null));
};
SurveyWindow.prototype.renderBody = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.css.window.body }, this.doRender());
};
SurveyWindow.prototype.createSurvey = function (newProps) {
if (!newProps)
newProps = {};
_super.prototype.createSurvey.call(this, newProps);
this.window = new __WEBPACK_IMPORTED_MODULE_3__reactsurveymodel__["b" /* ReactWindowModel */](null, this.survey);
if (newProps.closeOnCompleteTimeout) {
this.window.closeOnCompleteTimeout = newProps.closeOnCompleteTimeout;
}
this.window.isShowing = true;
if (!this.window.isExpanded && (newProps.expanded || newProps.isExpanded))
this.window.expand();
var self = this;
this.window.closeWindowOnCompleteCallback = function () {
self.window.hide();
};
};
return SurveyWindow;
}(__WEBPACK_IMPORTED_MODULE_2__reactSurvey__["a" /* Survey */]));
/***/ }),
/* 65 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionBoolean; });
var SurveyQuestionBoolean = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionBoolean, _super);
function SurveyQuestionBoolean(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
_this.handleOnClick = _this.handleOnClick.bind(_this);
_this.handleOnLabelClick = _this.handleOnLabelClick.bind(_this);
_this.handleOnSwitchClick = _this.handleOnSwitchClick.bind(_this);
_this.checkRef = __WEBPACK_IMPORTED_MODULE_1_react__["createRef"]();
return _this;
}
Object.defineProperty(SurveyQuestionBoolean.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionBoolean.prototype.preventDefaults = function (event) {
event.preventDefault();
event.stopPropagation();
};
SurveyQuestionBoolean.prototype.doCheck = function (value) {
this.question.checkedValue = value;
this.setState({ value: this.question.checkedValue });
};
SurveyQuestionBoolean.prototype.handleOnChange = function (event) {
this.doCheck(event.target.checked);
};
SurveyQuestionBoolean.prototype.handleOnClick = function (event) {
if (this.question.isIndeterminate) {
this.preventDefaults(event);
this.question.checkedValue = true;
this.setState({ value: this.question.checkedValue });
}
};
SurveyQuestionBoolean.prototype.handleOnSwitchClick = function (event) {
if (this.question.isIndeterminate) {
this.preventDefaults(event);
var isRightClick = event.nativeEvent.offsetX / event.target.offsetWidth > 0.5;
var isRtl = document.defaultView.getComputedStyle(event.target).direction == "rtl";
var value = isRtl ? !isRightClick : isRightClick;
return this.doCheck(value);
}
};
SurveyQuestionBoolean.prototype.handleOnLabelClick = function (event, value) {
if (this.question.isIndeterminate) {
this.preventDefaults(event);
this.doCheck(value);
}
};
SurveyQuestionBoolean.prototype.updateDomElement = function () {
if (!this.question)
return;
var el = this.checkRef.current;
if (el) {
el.indeterminate = this.question.isIndeterminate;
}
this.control = el;
_super.prototype.updateDomElement.call(this);
};
SurveyQuestionBoolean.prototype.getItemClass = function () {
var cssClasses = this.question.cssClasses;
var isChecked = this.question.checkedValue;
var isDisabled = this.question.isReadOnly;
var itemClass = cssClasses.item;
if (isDisabled)
itemClass += " " + cssClasses.itemDisabled;
if (isChecked)
itemClass += " " + cssClasses.itemChecked;
else if (isChecked === null)
itemClass += " " + cssClasses.itemIndeterminate;
return itemClass;
};
SurveyQuestionBoolean.prototype.getLabelClass = function (checked) {
var question = this.question;
var cssClasses = this.question.cssClasses;
return (cssClasses.label +
" " +
(question.checkedValue === !checked || question.isReadOnly
? question.cssClasses.disabledLabel
: ""));
};
SurveyQuestionBoolean.prototype.renderElement = function () {
var _this = this;
var cssClasses = this.question.cssClasses;
var itemClass = this.getItemClass();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: itemClass, onClick: this.handleOnClick },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { ref: this.checkRef, type: "checkbox", value: this.question.checkedValue === null
? ""
: this.question.checkedValue, id: this.question.inputId, className: cssClasses.control, disabled: this.isDisplayMode, checked: this.question.checkedValue || false, onChange: this.handleOnChange, "aria-label": this.question.locTitle.renderedHtml, "aria-invalid": this.question.errors.length > 0, "aria-describedby": this.question.errors.length > 0
? this.question.id + "_errors"
: null }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.getLabelClass(false), onClick: function (event) { return _this.handleOnLabelClick(event, false); } }, this.question.locLabelFalse.renderedHtml),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.switch, onClick: this.handleOnSwitchClick },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.slider })),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.getLabelClass(true), onClick: function (event) { return _this.handleOnLabelClick(event, true); } }, this.question.locLabelTrue.renderedHtml))));
};
return SurveyQuestionBoolean;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("boolean", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionBoolean, props);
});
/***/ }),
/* 66 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestion__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__panel__ = __webpack_require__(21);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionCustom; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionComposite; });
var SurveyQuestionCustom = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionCustom, _super);
function SurveyQuestionCustom(props) {
return _super.call(this, props) || this;
}
SurveyQuestionCustom.prototype.renderElement = function () {
return __WEBPACK_IMPORTED_MODULE_3__reactquestion__["a" /* SurveyQuestion */].renderQuestionBody(this.creator, this.question.contentQuestion);
};
return SurveyQuestionCustom;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* SurveyQuestionUncontrolledElement */]));
var SurveyQuestionComposite = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionComposite, _super);
function SurveyQuestionComposite(props) {
return _super.call(this, props) || this;
}
SurveyQuestionComposite.prototype.canRender = function () {
return !!this.question.contentPanel;
};
SurveyQuestionComposite.prototype.renderElement = function () {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_5__panel__["a" /* SurveyPanel */], { element: this.question.contentPanel, creator: this.creator, survey: this.question.survey }));
};
return SurveyQuestionComposite;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* SurveyQuestionUncontrolledElement */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("custom", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionCustom, props);
});
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("composite", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionComposite, props);
});
/***/ }),
/* 67 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionDropdown; });
/* unused harmony export SurveyQuestionOptionItem */
var SurveyQuestionDropdown = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionDropdown, _super);
function SurveyQuestionDropdown(props) {
return _super.call(this, props) || this;
}
SurveyQuestionDropdown.prototype.renderElement = function () {
var cssClasses = this.question.cssClasses;
var comment = this.question.isOtherSelected
? this.renderOther(cssClasses)
: null;
var select = this.renderSelect(cssClasses);
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.root },
select,
comment));
};
SurveyQuestionDropdown.prototype.renderSelect = function (cssClasses) {
var _this = this;
if (this.isDisplayMode) {
var isOtherSelected = this.question.isOtherSelected;
return (
// @ts-ignore
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: this.question.inputId, className: cssClasses.control, disabled: true }, isOtherSelected
? this.question.otherText
: this.question.displayValue));
}
var options = [];
for (var i = 0; i < this.question.visibleChoices.length; i++) {
var item = this.question.visibleChoices[i];
var key = "item" + i;
var option = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionOptionItem, { key: key, item: item });
options.push(option);
}
var captionOption = this.question.showOptionsCaption ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("option", { value: "" }, this.question.optionsCaption)) : null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.selectWrapper },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("select", { id: this.question.inputId, className: cssClasses.control, ref: function (select) { return (_this.control = select); }, onChange: this.updateValueOnEvent, onInput: this.updateValueOnEvent, "aria-label": this.question.locTitle.renderedHtml, "aria-invalid": this.question.errors.length > 0, "aria-describedby": this.question.errors.length > 0
? this.question.id + "_errors"
: null },
captionOption,
options)));
};
SurveyQuestionDropdown.prototype.renderOther = function (cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: "form-group" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, otherCss: cssClasses.other, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode })));
};
return SurveyQuestionDropdown;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* SurveyQuestionUncontrolledElement */]));
var SurveyQuestionOptionItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionOptionItem, _super);
function SurveyQuestionOptionItem(props) {
return _super.call(this, props) || this;
}
SurveyQuestionOptionItem.prototype.getStateElement = function () {
return this.item;
};
Object.defineProperty(SurveyQuestionOptionItem.prototype, "item", {
get: function () {
return this.props.item;
},
enumerable: true,
configurable: true
});
SurveyQuestionOptionItem.prototype.canRender = function () {
return !!this.item;
};
SurveyQuestionOptionItem.prototype.renderElement = function () {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("option", { value: this.item.value, disabled: !this.item.isEnabled }, this.item.text));
};
return SurveyQuestionOptionItem;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["d" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("dropdown", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionDropdown, props);
});
/***/ }),
/* 68 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionEmpty; });
var SurveyQuestionEmpty = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionEmpty, _super);
function SurveyQuestionEmpty(props) {
var _this = _super.call(this, props) || this;
_this.state = { value: _this.question.value };
return _this;
}
Object.defineProperty(SurveyQuestionEmpty.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionEmpty.prototype.renderElement = function () {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null);
};
return SurveyQuestionEmpty;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("empty", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionEmpty, props);
});
/***/ }),
/* 69 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionExpression; });
var SurveyQuestionExpression = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionExpression, _super);
function SurveyQuestionExpression(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionExpression.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionExpression.prototype.renderElement = function () {
var _this = this;
var cssClasses = this.question.cssClasses;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { id: this.question.inputId, className: cssClasses.root, ref: function (div) { return (_this.control = div); } }, this.question.displayValue));
};
return SurveyQuestionExpression;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("expression", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionExpression, props);
});
/***/ }),
/* 70 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__utils_utils__ = __webpack_require__(24);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionFile; });
var SurveyQuestionFile = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionFile, _super);
function SurveyQuestionFile(props) {
var _this = _super.call(this, props) || this;
_this.handleOnDragOver = function (event) {
if (_this.question.isReadOnly) {
event.returnValue = false;
return false;
}
event.dataTransfer.dropEffect = "copy";
event.preventDefault();
};
_this.handleOnDrop = function (event) {
event.preventDefault();
var src = event.dataTransfer;
_this.onChange(src);
};
_this.handleOnChange = function (event) {
var src = event.target || event.srcElement;
_this.onChange(src);
};
_this.handleOnClean = function (event) {
var question = _this.question;
var src = event.target || event.srcElement;
if (question.needConfirmRemoveFile) {
var isConfirmed = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__utils_utils__["a" /* confirmAction */])(question.confirmRemoveAllMessage);
if (!isConfirmed)
return;
}
question.clear();
src.parentElement.querySelectorAll("input")[0].value = "";
_this.setState({ fileLoaded: _this.state.fileLoaded + 1 });
};
_this.handleOnRemoveFile = function (event) {
var question = _this.question;
if (question.needConfirmRemoveFile) {
var isConfirmed = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__utils_utils__["a" /* confirmAction */])(question.getConfirmRemoveMessage(event.name));
if (!isConfirmed)
return;
}
question.removeFile(event);
_this.setState({ fileLoaded: _this.state.fileLoaded + 1 });
};
_this.handleOnDownloadFile = function (event, data) {
if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__utils_utils__["b" /* detectIEOrEdge */])()) {
event.preventDefault();
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__utils_utils__["c" /* loadFileFromBase64 */])(data.content, data.name);
}
};
_this.onChange = function (src) {
if (!window["FileReader"])
return;
if (!src || !src.files || src.files.length < 1)
return;
var files = [];
var allowCount = _this.question.allowMultiple ? src.files.length : 1;
for (var i = 0; i < allowCount; i++) {
files.push(src.files[i]);
}
src.value = "";
_this.question.loadFiles(files);
_this.setState({ fileLoaded: _this.state.fileLoaded + 1 });
};
_this.state = {
fileLoaded: 0,
state: "empty",
rootClass: _this.question.cssClasses.root,
};
_this.handleOnChange = _this.handleOnChange.bind(_this);
_this.question.onStateChanged.add(function (state) {
return _this.setState({ fileLoaded: _this.state.fileLoaded + 1, state: state });
});
return _this;
}
Object.defineProperty(SurveyQuestionFile.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionFile.prototype.renderElement = function () {
var _this = this;
var preview = this.renderPreview();
var fileInput = null;
var fileDecorator = this.renderFileDecorator();
var clearButton = this.renderClearButton(this.question.cssClasses.removeButton);
var clearButtonBottom = this.renderClearButton(this.question.cssClasses.removeButtonBottom);
fileInput = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { disabled: this.isDisplayMode, className: this.question.cssClasses.fileInput, id: this.question.inputId, ref: function (input) { return (_this.control = input); }, type: "file", onChange: !this.isDisplayMode ? this.handleOnChange : null, "aria-required": this.question.isRequired, "aria-label": this.question.locTitle.renderedHtml, "aria-invalid": this.question.errors.length > 0, "aria-describedby": this.question.errors.length > 0 ? this.question.id + "_errors" : null, multiple: this.question.allowMultiple, title: this.question.inputTitle, accept: this.question.acceptedTypes }));
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.state.rootClass },
fileInput,
fileDecorator,
clearButton,
preview,
clearButtonBottom));
};
SurveyQuestionFile.prototype.renderFileDecorator = function () {
var noFileChosen = null;
var chooseFile = null;
var chooseFileCss = this.question.cssClasses.chooseFile +
(this.isDisplayMode ? " " + this.question.cssClasses.disabled : "");
chooseFile = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { role: "button", className: chooseFileCss, htmlFor: this.question.inputId, "aria-label": this.question.chooseButtonCaption }, this.question.chooseButtonCaption));
if (this.question.isEmpty()) {
noFileChosen = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.question.cssClasses.noFileChosen }, this.question.noFileChosenCaption));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.fileDecorator, onDrop: this.handleOnDrop, onDragOver: this.handleOnDragOver },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.wrapper },
chooseFile,
noFileChosen)));
};
SurveyQuestionFile.prototype.renderClearButton = function (className) {
return !this.question.isEmpty() && !this.isDisplayMode ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("button", { type: "button", onClick: this.handleOnClean, className: className }, this.question.cleanButtonCaption)) : null;
};
SurveyQuestionFile.prototype.renderPreview = function () {
var _this = this;
if (!this.question.previewValue)
return null;
var previews = this.question.previewValue.map(function (val, index) {
if (!val)
return null;
var fileSign = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("a", { href: val.content, onClick: function (event) {
_this.handleOnDownloadFile(event, val);
}, title: val.name, download: val.name, style: { width: _this.question.imageWidth + "px" } }, val.name));
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { key: _this.question.inputId + "_" + index, className: _this.question.cssClasses.preview },
val.name ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: _this.question.cssClasses.fileSign }, fileSign)) : null,
_this.question.canPreviewImage(val) ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("img", { src: val.content, height: _this.question.imageHeight, width: _this.question.imageWidth, alt: "File preview" })) : null,
val.name && !_this.question.isReadOnly ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: _this.question.cssClasses.removeFile, onClick: function (event) { return _this.handleOnRemoveFile(val); } }, _this.question.removeFileCaption),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { className: _this.question.cssClasses.removeFileSvg, onClick: function (event) { return _this.handleOnRemoveFile(val); }, viewBox: "0 0 16 16" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("path", { d: "M8,2C4.7,2,2,4.7,2,8s2.7,6,6,6s6-2.7,6-6S11.3,2,8,2z M11,10l-1,1L8,9l-2,2l-1-1l2-2L5,6l1-1l2,2l2-2l1,1L9,8 L11,10z" })))) : null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: _this.question.cssClasses.fileSignBottom }, fileSign)));
});
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null, previews);
};
return SurveyQuestionFile;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("file", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionFile, props);
});
/***/ }),
/* 71 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionHtml; });
var SurveyQuestionHtml = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionHtml, _super);
function SurveyQuestionHtml(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionHtml.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionHtml.prototype.canRender = function () {
return _super.prototype.canRender.call(this) && !!this.question.html;
};
SurveyQuestionHtml.prototype.renderElement = function () {
var htmlValue = { __html: this.question.locHtml.renderedHtml };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.root, dangerouslySetInnerHTML: htmlValue }));
};
return SurveyQuestionHtml;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("html", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionHtml, props);
});
/***/ }),
/* 72 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMatrix; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyQuestionMatrixRow; });
var SurveyQuestionMatrix = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrix, _super);
function SurveyQuestionMatrix(props) {
var _this = _super.call(this, props) || this;
_this.state = { rowsChanged: 0 };
return _this;
}
Object.defineProperty(SurveyQuestionMatrix.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrix.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
if (this.question) {
var self = this;
this.question.visibleRowsChangedCallback = function () {
self.setState({ rowsChanged: self.state.rowsChanged + 1 });
};
}
};
SurveyQuestionMatrix.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (this.question) {
this.question.visibleRowsChangedCallback = null;
}
};
SurveyQuestionMatrix.prototype.renderElement = function () {
var cssClasses = this.question.cssClasses;
var firstTH = this.question.hasRows ? __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", null) : null;
var headers = [];
for (var i = 0; i < this.question.visibleColumns.length; i++) {
var column = this.question.visibleColumns[i];
var key = "column" + i;
var columText = this.renderLocString(column.locText);
headers.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("th", { className: this.question.cssClasses.headerCell, key: key }, columText));
}
var rows = [];
var visibleRows = this.question.visibleRows;
for (var i = 0; i < visibleRows.length; i++) {
var row = visibleRows[i];
var key = "row" + i;
rows.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixRow, { key: key, question: this.question, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, row: row, isFirst: i == 0 }));
}
var header = !this.question.showHeader ? null : (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("thead", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", null,
firstTH,
headers)));
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.tableWrapper },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("fieldset", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("legend", { "aria-label": this.question.locTitle.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("table", { className: cssClasses.root },
header,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tbody", null, rows)))));
};
return SurveyQuestionMatrix;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionMatrixRow = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixRow, _super);
function SurveyQuestionMatrixRow(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionMatrixRow.prototype, "question", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionMatrixRow.prototype, "row", {
get: function () {
return this.props.row;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixRow.prototype.handleOnChange = function (event) {
this.row.value = event.target.value;
this.setState({ value: this.row.value });
};
SurveyQuestionMatrixRow.prototype.canRender = function () {
return !!this.row;
};
SurveyQuestionMatrixRow.prototype.renderElement = function () {
var firstTD = null;
if (this.question.hasRows) {
var rowText = this.renderLocString(this.row.locText);
firstTD = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { className: this.question.cssClasses.cell }, rowText);
}
var tds = this.generateTds();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", { className: this.row.rowClasses },
firstTD,
tds));
};
SurveyQuestionMatrixRow.prototype.generateTds = function () {
var _this = this;
var tds = [];
var row = this.row;
for (var i = 0; i < this.question.visibleColumns.length; i++) {
var td = null;
var column = this.question.visibleColumns[i];
var key = "value" + i;
var isChecked = row.value == column.value;
var itemClass = this.question.getItemClass(row, column);
var inputId = this.question.inputId + "_" + row.name + "_" + i;
if (this.question.hasCellText) {
var getHandler = !this.question.isReadOnly
? function (column) { return function () { return _this.cellClick(row, column); }; }
: null;
td = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { key: key, className: itemClass, onClick: getHandler ? getHandler(column) : null }, this.renderLocString(this.question.getCellDisplayLocText(row.name, column))));
}
else {
td = (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { key: key, headers: column.locText.renderedHtml, className: this.question.cssClasses.cell },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { className: itemClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { id: inputId, type: "radio", className: this.cssClasses.itemValue, name: row.fullName, value: column.value, disabled: this.isDisplayMode, checked: isChecked, onChange: this.handleOnChange, "aria-required": this.question.isRequired, "aria-label": this.question.locTitle.renderedHtml }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.question.cssClasses.materialDecorator },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { className: this.question.cssClasses.itemDecorator, viewBox: "-12 -12 24 24" },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("circle", { r: "6", cx: "0", cy: "0" }),
"s")),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "circle" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: "check" }),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { style: { display: "none" } }, this.question.locTitle.renderedHtml))));
}
tds.push(td);
}
return tds;
};
SurveyQuestionMatrixRow.prototype.cellClick = function (row, column) {
row.value = column.value;
};
return SurveyQuestionMatrixRow;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["d" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("matrix", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrix, props);
});
/***/ }),
/* 73 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionmatrixdropdownbase__ = __webpack_require__(26);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMatrixDropdown; });
var SurveyQuestionMatrixDropdown = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixDropdown, _super);
function SurveyQuestionMatrixDropdown(props) {
return _super.call(this, props) || this;
}
return SurveyQuestionMatrixDropdown;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionmatrixdropdownbase__["b" /* SurveyQuestionMatrixDropdownBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("matrixdropdown", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDropdown, props);
});
/***/ }),
/* 74 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionmatrixdropdownbase__ = __webpack_require__(26);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMatrixDynamic; });
/* unused harmony export SurveyQuestionMatrixDynamicRemoveButton */
var SurveyQuestionMatrixDynamic = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixDynamic, _super);
function SurveyQuestionMatrixDynamic(props) {
var _this = _super.call(this, props) || this;
_this.handleOnRowAddClick = _this.handleOnRowAddClick.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionMatrixDynamic.prototype, "matrix", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDynamic.prototype.handleOnRowAddClick = function (event) {
this.matrix.addRow();
};
SurveyQuestionMatrixDynamic.prototype.renderElement = function () {
var cssClasses = this.question.cssClasses;
var mainDiv = this.renderTableDiv();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
this.renderAddRowButtonOnTop(cssClasses),
mainDiv,
this.renderAddRowButtonOnBottom(cssClasses)));
};
SurveyQuestionMatrixDynamic.prototype.renderAddRowButtonOnTop = function (cssClasses) {
if (!this.matrix.isAddRowOnTop)
return null;
return this.renderAddRowButton(cssClasses);
};
SurveyQuestionMatrixDynamic.prototype.renderAddRowButtonOnBottom = function (cssClasses) {
if (!this.matrix.isAddRowOnBottom)
return null;
return this.renderAddRowButton(cssClasses);
};
SurveyQuestionMatrixDynamic.prototype.renderAddRowButton = function (cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.footer },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("button", { className: cssClasses.button + " " + cssClasses.buttonAdd, type: "button", onClick: this.handleOnRowAddClick },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, this.matrix.addRowText),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.iconAdd }))));
};
SurveyQuestionMatrixDynamic.prototype.renderRemoveButton = function (row) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDynamicRemoveButton, { question: this.question, row: row, cssClasses: this.question.cssClasses }));
};
return SurveyQuestionMatrixDynamic;
}(__WEBPACK_IMPORTED_MODULE_4__reactquestionmatrixdropdownbase__["b" /* SurveyQuestionMatrixDropdownBase */]));
var SurveyQuestionMatrixDynamicRemoveButton = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMatrixDynamicRemoveButton, _super);
function SurveyQuestionMatrixDynamicRemoveButton(props) {
var _this = _super.call(this, props) || this;
_this.handleOnRowRemoveClick = _this.handleOnRowRemoveClick.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionMatrixDynamicRemoveButton.prototype, "question", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionMatrixDynamicRemoveButton.prototype, "row", {
get: function () {
return this.props.row;
},
enumerable: true,
configurable: true
});
SurveyQuestionMatrixDynamicRemoveButton.prototype.handleOnRowRemoveClick = function (event) {
this.question.removeRowUI(this.row);
};
SurveyQuestionMatrixDynamicRemoveButton.prototype.renderElement = function () {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("button", { className: this.cssClasses.button + " " + this.cssClasses.buttonRemove, type: "button", onClick: this.handleOnRowRemoveClick },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, this.question.removeRowText),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: this.cssClasses.iconRemove })));
};
return SurveyQuestionMatrixDynamicRemoveButton;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["d" /* ReactSurveyElement */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("matrixdynamic", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMatrixDynamic, props);
});
/***/ }),
/* 75 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestion__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionMultipleText; });
var SurveyQuestionMultipleText = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionMultipleText, _super);
function SurveyQuestionMultipleText(props) {
return _super.call(this, props) || this;
}
Object.defineProperty(SurveyQuestionMultipleText.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionMultipleText.prototype.renderElement = function () {
var cssClasses = this.question.cssClasses;
var tableRows = this.question.getRows();
var rows = [];
for (var i = 0; i < tableRows.length; i++) {
rows.push(this.renderRow(i, tableRows[i], cssClasses));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("table", { className: cssClasses.root },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tbody", null, rows)));
};
SurveyQuestionMultipleText.prototype.renderRow = function (rowIndex, items, cssClasses) {
var key = "item" + rowIndex;
var tds = [];
for (var i = 0; i < items.length; i++) {
var item = items[i];
var itemTitle = this.renderLocString(item.locTitle);
var spaceSpan = __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", null, "\u00A0");
var spans = [];
var ed = item.editor;
if (!!ed.isRequireTextOnStart || ed.isRequireTextBeforeTitle) {
spans.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.requiredText }, ed.requiredText));
spans.push(spaceSpan);
}
spans.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.itemTitle }, itemTitle));
if (!!ed.isRequireTextAfterTitle) {
spans.push(spaceSpan);
spans.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.requiredText }, ed.requiredText));
}
tds.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", { key: "label" + i, className: cssClasses.cell }, spans));
tds.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestion__["c" /* SurveyQuestionAndErrorsCell */], { key: "value" + i, cssClasses: cssClasses, question: item.editor, creator: this.creator }));
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("tr", { key: key, className: cssClasses.row }, tds));
};
return SurveyQuestionMultipleText;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("multipletext", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionMultipleText, props);
});
/***/ }),
/* 76 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__panel__ = __webpack_require__(21);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionPanelDynamic; });
/* unused harmony export SurveyQuestionPanelDynamicItem */
var SurveyQuestionPanelDynamic = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionPanelDynamic, _super);
function SurveyQuestionPanelDynamic(props) {
var _this = _super.call(this, props) || this;
_this.handleOnPanelAddClick = _this.handleOnPanelAddClick.bind(_this);
_this.handleOnPanelPrevClick = _this.handleOnPanelPrevClick.bind(_this);
_this.handleOnPanelNextClick = _this.handleOnPanelNextClick.bind(_this);
_this.handleOnRangeChange = _this.handleOnRangeChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionPanelDynamic.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionPanelDynamic.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
this.setState({ panelCounter: 0 });
var self = this;
this.question.panelCountChangedCallback = function () {
self.updateQuestionRendering();
};
this.question.currentIndexChangedCallback = function () {
self.updateQuestionRendering();
};
this.question.renderModeChangedCallback = function () {
self.updateQuestionRendering();
};
};
SurveyQuestionPanelDynamic.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
this.question.panelCountChangedCallback = null;
this.question.currentIndexChangedCallback = null;
this.question.renderModeChangedCallback = null;
};
SurveyQuestionPanelDynamic.prototype.updateQuestionRendering = function () {
this.setState({
panelCounter: this.state ? this.state.panelCounter + 1 : 1,
});
};
SurveyQuestionPanelDynamic.prototype.handleOnPanelAddClick = function (event) {
this.question.addPanelUI();
};
SurveyQuestionPanelDynamic.prototype.handleOnPanelPrevClick = function (event) {
this.question.goToPrevPanel();
};
SurveyQuestionPanelDynamic.prototype.handleOnPanelNextClick = function (event) {
this.question.goToNextPanel();
};
SurveyQuestionPanelDynamic.prototype.handleOnRangeChange = function (event) {
this.question.currentIndex = event.target.value;
};
SurveyQuestionPanelDynamic.prototype.renderElement = function () {
var cssClasses = this.question.cssClasses;
var panels = [];
if (this.question.isRenderModeList) {
for (var i = 0; i < this.question.panels.length; i++) {
var panel = this.question.panels[i];
panels.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionPanelDynamicItem, { key: panel.id, element: panel, question: this.question, index: i, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, creator: this.creator }));
}
}
else {
if (this.question.currentPanel != null) {
var panel = this.question.currentPanel;
panels.push(__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionPanelDynamicItem, { key: this.question.currentIndex, element: panel, question: this.question, index: this.question.currentIndex, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode, creator: this.creator }));
}
}
var btnDeleteTD = !this.isDisplayMode ? __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("td", null) : null;
var btnAdd = this.question.isRenderModeList
? this.renderAddRowButton()
: null;
var navTop = this.question.isProgressTopShowing
? this.renderNavigator(cssClasses)
: null;
var navBottom = this.question.isProgressBottomShowing
? this.renderNavigator(cssClasses)
: null;
var style = {};
if (this.question.horizontalScroll) {
style["overflowX"] = "scroll";
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.root },
navTop,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: style }, panels),
navBottom,
btnAdd));
};
SurveyQuestionPanelDynamic.prototype.renderNavigator = function (cssClasses) {
var range = this.question.isRangeShowing ? this.renderRange() : null;
var btnPrev = this.rendrerPrevButton();
var btnNext = this.rendrerNextButton();
var btnAdd = this.renderAddRowButton();
var progressClass = this.question.isProgressTopShowing
? this.question.cssClasses.progressTop
: this.question.cssClasses.progressBottom;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { style: { clear: "both" }, className: progressClass },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.progressContainer },
btnPrev,
range,
btnNext),
btnAdd,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.progressText }, this.question.progressText)));
};
SurveyQuestionPanelDynamic.prototype.rendrerPrevButton = function () {
var getButtonPrevCss = function (question) {
var btnClasses = question.cssClasses.buttonPrev;
if (!question.isPrevButtonShowing) {
btnClasses += " " + question.cssClasses.buttonPrev + "--disabled";
}
return btnClasses;
};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { title: this.question.panelPrevText },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { viewBox: "0 0 10 10", className: getButtonPrevCss(this.question), onClick: this.handleOnPanelPrevClick },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("polygon", { points: "2,2 0,4 5,9 10,4 8,2 5,5 " }))));
};
SurveyQuestionPanelDynamic.prototype.rendrerNextButton = function () {
var getButtonNextCss = function (question) {
var btnClasses = question.cssClasses.buttonNext;
if (!question.isNextButtonShowing) {
btnClasses += " " + question.cssClasses.buttonNext + "--disabled";
}
return btnClasses;
};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { title: this.question.panelNextText },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("svg", { viewBox: "0 0 10 10", className: getButtonNextCss(this.question), onClick: this.handleOnPanelNextClick },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("polygon", { points: "2,2 0,4 5,9 10,4 8,2 5,5 " }))));
};
SurveyQuestionPanelDynamic.prototype.renderRange = function () {
var _this = this;
var getProgress = function () {
var rangeMax = _this.question.panelCount - 1;
return (_this.question.currentIndex / rangeMax) * 100 + "%";
};
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.progress },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: this.question.cssClasses.progressBar, style: { width: getProgress() }, role: "progressbar" })));
};
SurveyQuestionPanelDynamic.prototype.renderAddRowButton = function () {
if (!this.question.canAddPanel)
return null;
var classes = this.question.cssClasses.button +
" " +
this.question.cssClasses.buttonAdd;
if (this.question.renderMode === "list") {
classes += " " + this.question.cssClasses.buttonAdd + "--list-mode";
}
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: classes, type: "button", onClick: this.handleOnPanelAddClick, value: this.question.panelAddText }));
};
return SurveyQuestionPanelDynamic;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
var SurveyQuestionPanelDynamicItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionPanelDynamicItem, _super);
function SurveyQuestionPanelDynamicItem(props) {
var _this = _super.call(this, props) || this;
_this.handleOnPanelRemoveClick = _this.handleOnPanelRemoveClick.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionPanelDynamicItem.prototype, "question", {
get: function () {
return this.props.question;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyQuestionPanelDynamicItem.prototype, "index", {
get: function () {
return this.props.index;
},
enumerable: true,
configurable: true
});
SurveyQuestionPanelDynamicItem.prototype.getSurvey = function () {
return !!this.question ? this.question.survey : null;
};
SurveyQuestionPanelDynamicItem.prototype.getCss = function () {
var survey = this.getSurvey();
return !!survey ? survey.getCss() : {};
};
SurveyQuestionPanelDynamicItem.prototype.handleOnPanelRemoveClick = function (event) {
this.question.removePanelUI(this.index);
};
SurveyQuestionPanelDynamicItem.prototype.renderBottom = function () {
if (!this.question)
return null;
var hr = this.question.isRenderModeList &&
this.index < this.question.panelCount - 1 ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("hr", { className: this.question.cssClasses.separator })) : null;
var removeButton = this.renderButton();
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
removeButton,
hr));
};
SurveyQuestionPanelDynamicItem.prototype.renderButton = function () {
if (!this.question.canRemovePanel ||
(this.question.isRenderModeList && this.panel.isCollapsed))
return null;
var style = { marginTop: "5px" };
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { className: this.question.cssClasses.button +
" " +
this.question.cssClasses.buttonRemove, style: style, type: "button", onClick: this.handleOnPanelRemoveClick, value: this.question.panelRemoveText }));
};
return SurveyQuestionPanelDynamicItem;
}(__WEBPACK_IMPORTED_MODULE_3__panel__["a" /* SurveyPanel */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("paneldynamic", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionPanelDynamic, props);
});
/***/ }),
/* 77 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__ = __webpack_require__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionRating; });
var SurveyQuestionRating = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionRating, _super);
function SurveyQuestionRating(props) {
var _this = _super.call(this, props) || this;
_this.handleOnChange = _this.handleOnChange.bind(_this);
return _this;
}
Object.defineProperty(SurveyQuestionRating.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionRating.prototype.handleOnChange = function (event) {
this.question.value = event.target.value;
this.setState({ value: this.question.value });
};
SurveyQuestionRating.prototype.renderElement = function () {
var _this = this;
var cssClasses = this.question.cssClasses;
var values = [];
var minText = this.question.minRateDescription
? this.renderLocString(this.question.locMinRateDescription)
: null;
var maxText = this.question.maxRateDescription
? this.renderLocString(this.question.locMaxRateDescription)
: null;
for (var i = 0; i < this.question.visibleRateValues.length; i++) {
var minTextValue = i == 0 ? minText : null;
var maxTextValue = i == this.question.visibleRateValues.length - 1 ? maxText : null;
values.push(this.renderItem("value" + i, this.question.visibleRateValues[i], minTextValue, maxTextValue, cssClasses));
}
var comment = this.question.hasOther ? this.renderOther(cssClasses) : null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.root, ref: function (div) { return (_this.control = div); } },
values,
comment));
};
SurveyQuestionRating.prototype.renderItem = function (key, item, minText, maxText, cssClasses) {
var isChecked = this.question.value == item.value;
var className = cssClasses.item;
if (isChecked)
className += " " + cssClasses.selected;
if (this.isDisplayMode)
className += " " + cssClasses.disabled;
var itemText = this.renderLocString(item.locText);
var minTextBlock = !!minText ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.minText }, minText)) : null;
var maxTextBlock = !!maxText ? (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.maxText }, maxText)) : null;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("label", { key: key, className: className },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { type: "radio", className: "sv-visuallyhidden", name: this.question.name, value: item.value, disabled: this.isDisplayMode, checked: this.question.value == item.value, onChange: this.handleOnChange, "aria-required": this.question.isRequired, "aria-label": item.locText.text, "aria-invalid": this.question.errors.length > 0, "aria-describedby": this.question.errors.length > 0
? this.question.id + "_errors"
: null }),
minTextBlock,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("span", { className: cssClasses.itemText }, itemText),
maxTextBlock));
};
SurveyQuestionRating.prototype.renderOther = function (cssClasses) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.other },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"](__WEBPACK_IMPORTED_MODULE_3__reactquestioncomment__["a" /* SurveyQuestionCommentItem */], { question: this.question, cssClasses: cssClasses, isDisplayMode: this.isDisplayMode })));
};
return SurveyQuestionRating;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_4__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("rating", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionRating, props);
});
/***/ }),
/* 78 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionText; });
var SurveyQuestionText = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionText, _super);
function SurveyQuestionText(props) {
return _super.call(this, props) || this;
}
SurveyQuestionText.prototype.renderElement = function () {
var _this = this;
var cssClasses = this.question.cssClasses;
var onBlur = !this.question.isInputTextUpdate
? this.updateValueOnEvent
: null;
var onInput = this.question.isInputTextUpdate
? this.updateValueOnEvent
: null;
var placeHolder = this.question.inputType === "range" || this.question.isReadOnly
? ""
: this.question.placeHolder;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("input", { id: this.question.inputId, disabled: this.isDisplayMode, className: cssClasses.root, type: this.question.inputType, ref: function (input) { return (_this.control = input); }, maxLength: this.question.getMaxLength(), min: this.question.renderedMin, max: this.question.renderedMax, step: this.question.step, size: this.question.size, placeholder: placeHolder, autoComplete: this.question.autoComplete, onBlur: onBlur, onInput: onInput, "aria-required": this.question.isRequired, "aria-label": this.question.locTitle.renderedHtml, "aria-invalid": this.question.errors.length > 0, "aria-describedby": this.question.errors.length > 0 ? this.question.id + "_errors" : null }));
};
return SurveyQuestionText;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["c" /* SurveyQuestionUncontrolledElement */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("text", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionText, props);
});
/***/ }),
/* 79 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyQuestionSignaturePad; });
var SurveyQuestionSignaturePad = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyQuestionSignaturePad, _super);
function SurveyQuestionSignaturePad(props) {
var _this = _super.call(this, props) || this;
_this.state = { value: _this.question.value };
return _this;
}
Object.defineProperty(SurveyQuestionSignaturePad.prototype, "question", {
get: function () {
return this.questionBase;
},
enumerable: true,
configurable: true
});
SurveyQuestionSignaturePad.prototype.renderElement = function () {
var _this = this;
var cssClasses = this.question.cssClasses;
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.root, ref: function (root) { return (_this.control = root); } },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", null,
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("canvas", { tabIndex: 0 })),
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { className: cssClasses.controls },
__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("button", { type: "button", className: cssClasses.clearButton, title: this.question.clearButtonCaption }, "\u2716"))));
};
return SurveyQuestionSignaturePad;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
__WEBPACK_IMPORTED_MODULE_3__reactquestionfactory__["a" /* ReactQuestionFactory */].Instance.registerQuestion("signaturepad", function (props) {
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"](SurveyQuestionSignaturePad, props);
});
/***/ }),
/* 80 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/* 81 */
/***/ (function(module, exports) {
// removed by extract-text-webpack-plugin
/***/ }),
/* 82 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/*!
* Signature Pad v2.3.2
* https://github.com/szimek/signature_pad
*
* Copyright 2017 Szymon Nowak
* Released under the MIT license
*
* The main idea and some parts of the code (e.g. drawing variable width Bézier curve) are taken from:
* http://corner.squareup.com/2012/07/smoother-signatures.html
*
* Implementation of interpolation using cubic Bézier curves is taken from:
* http://benknowscode.wordpress.com/2012/09/14/path-interpolation-using-cubic-bezier-and-control-point-estimation-in-javascript
*
* Algorithm for approximated length of a Bézier curve is taken from:
* http://www.lemoda.net/maths/bezier-length/index.html
*
*/
function Point(x, y, time) {
this.x = x;
this.y = y;
this.time = time || new Date().getTime();
}
Point.prototype.velocityFrom = function (start) {
return this.time !== start.time ? this.distanceTo(start) / (this.time - start.time) : 1;
};
Point.prototype.distanceTo = function (start) {
return Math.sqrt(Math.pow(this.x - start.x, 2) + Math.pow(this.y - start.y, 2));
};
Point.prototype.equals = function (other) {
return this.x === other.x && this.y === other.y && this.time === other.time;
};
function Bezier(startPoint, control1, control2, endPoint) {
this.startPoint = startPoint;
this.control1 = control1;
this.control2 = control2;
this.endPoint = endPoint;
}
// Returns approximated length.
Bezier.prototype.length = function () {
var steps = 10;
var length = 0;
var px = void 0;
var py = void 0;
for (var i = 0; i <= steps; i += 1) {
var t = i / steps;
var cx = this._point(t, this.startPoint.x, this.control1.x, this.control2.x, this.endPoint.x);
var cy = this._point(t, this.startPoint.y, this.control1.y, this.control2.y, this.endPoint.y);
if (i > 0) {
var xdiff = cx - px;
var ydiff = cy - py;
length += Math.sqrt(xdiff * xdiff + ydiff * ydiff);
}
px = cx;
py = cy;
}
return length;
};
/* eslint-disable no-multi-spaces, space-in-parens */
Bezier.prototype._point = function (t, start, c1, c2, end) {
return start * (1.0 - t) * (1.0 - t) * (1.0 - t) + 3.0 * c1 * (1.0 - t) * (1.0 - t) * t + 3.0 * c2 * (1.0 - t) * t * t + end * t * t * t;
};
/* eslint-disable */
// http://stackoverflow.com/a/27078401/815507
function throttle(func, wait, options) {
var context, args, result;
var timeout = null;
var previous = 0;
if (!options) options = {};
var later = function later() {
previous = options.leading === false ? 0 : Date.now();
timeout = null;
result = func.apply(context, args);
if (!timeout) context = args = null;
};
return function () {
var now = Date.now();
if (!previous && options.leading === false) previous = now;
var remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0 || remaining > wait) {
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
previous = now;
result = func.apply(context, args);
if (!timeout) context = args = null;
} else if (!timeout && options.trailing !== false) {
timeout = setTimeout(later, remaining);
}
return result;
};
}
function SignaturePad(canvas, options) {
var self = this;
var opts = options || {};
this.velocityFilterWeight = opts.velocityFilterWeight || 0.7;
this.minWidth = opts.minWidth || 0.5;
this.maxWidth = opts.maxWidth || 2.5;
this.throttle = 'throttle' in opts ? opts.throttle : 16; // in miliseconds
this.minDistance = 'minDistance' in opts ? opts.minDistance : 5;
if (this.throttle) {
this._strokeMoveUpdate = throttle(SignaturePad.prototype._strokeUpdate, this.throttle);
} else {
this._strokeMoveUpdate = SignaturePad.prototype._strokeUpdate;
}
this.dotSize = opts.dotSize || function () {
return (this.minWidth + this.maxWidth) / 2;
};
this.penColor = opts.penColor || 'black';
this.backgroundColor = opts.backgroundColor || 'rgba(0,0,0,0)';
this.onBegin = opts.onBegin;
this.onEnd = opts.onEnd;
this._canvas = canvas;
this._ctx = canvas.getContext('2d');
this.clear();
// We need add these inline so they are available to unbind while still having
// access to 'self' we could use _.bind but it's not worth adding a dependency.
this._handleMouseDown = function (event) {
if (event.which === 1) {
self._mouseButtonDown = true;
self._strokeBegin(event);
}
};
this._handleMouseMove = function (event) {
if (self._mouseButtonDown) {
self._strokeMoveUpdate(event);
}
};
this._handleMouseUp = function (event) {
if (event.which === 1 && self._mouseButtonDown) {
self._mouseButtonDown = false;
self._strokeEnd(event);
}
};
this._handleTouchStart = function (event) {
if (event.targetTouches.length === 1) {
var touch = event.changedTouches[0];
self._strokeBegin(touch);
}
};
this._handleTouchMove = function (event) {
// Prevent scrolling.
event.preventDefault();
var touch = event.targetTouches[0];
self._strokeMoveUpdate(touch);
};
this._handleTouchEnd = function (event) {
var wasCanvasTouched = event.target === self._canvas;
if (wasCanvasTouched) {
event.preventDefault();
self._strokeEnd(event);
}
};
// Enable mouse and touch event handlers
this.on();
}
// Public methods
SignaturePad.prototype.clear = function () {
var ctx = this._ctx;
var canvas = this._canvas;
ctx.fillStyle = this.backgroundColor;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillRect(0, 0, canvas.width, canvas.height);
this._data = [];
this._reset();
this._isEmpty = true;
};
SignaturePad.prototype.fromDataURL = function (dataUrl) {
var _this = this;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var image = new Image();
var ratio = options.ratio || window.devicePixelRatio || 1;
var width = options.width || this._canvas.width / ratio;
var height = options.height || this._canvas.height / ratio;
this._reset();
image.src = dataUrl;
image.onload = function () {
_this._ctx.drawImage(image, 0, 0, width, height);
};
this._isEmpty = false;
};
SignaturePad.prototype.toDataURL = function (type) {
var _canvas;
switch (type) {
case 'image/svg+xml':
return this._toSVG();
default:
for (var _len = arguments.length, options = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
options[_key - 1] = arguments[_key];
}
return (_canvas = this._canvas).toDataURL.apply(_canvas, [type].concat(options));
}
};
SignaturePad.prototype.on = function () {
this._handleMouseEvents();
this._handleTouchEvents();
};
SignaturePad.prototype.off = function () {
this._canvas.removeEventListener('mousedown', this._handleMouseDown);
this._canvas.removeEventListener('mousemove', this._handleMouseMove);
document.removeEventListener('mouseup', this._handleMouseUp);
this._canvas.removeEventListener('touchstart', this._handleTouchStart);
this._canvas.removeEventListener('touchmove', this._handleTouchMove);
this._canvas.removeEventListener('touchend', this._handleTouchEnd);
};
SignaturePad.prototype.isEmpty = function () {
return this._isEmpty;
};
// Private methods
SignaturePad.prototype._strokeBegin = function (event) {
this._data.push([]);
this._reset();
this._strokeUpdate(event);
if (typeof this.onBegin === 'function') {
this.onBegin(event);
}
};
SignaturePad.prototype._strokeUpdate = function (event) {
var x = event.clientX;
var y = event.clientY;
var point = this._createPoint(x, y);
var lastPointGroup = this._data[this._data.length - 1];
var lastPoint = lastPointGroup && lastPointGroup[lastPointGroup.length - 1];
var isLastPointTooClose = lastPoint && point.distanceTo(lastPoint) < this.minDistance;
// Skip this point if it's too close to the previous one
if (!(lastPoint && isLastPointTooClose)) {
var _addPoint = this._addPoint(point),
curve = _addPoint.curve,
widths = _addPoint.widths;
if (curve && widths) {
this._drawCurve(curve, widths.start, widths.end);
}
this._data[this._data.length - 1].push({
x: point.x,
y: point.y,
time: point.time,
color: this.penColor
});
}
};
SignaturePad.prototype._strokeEnd = function (event) {
var canDrawCurve = this.points.length > 2;
var point = this.points[0]; // Point instance
if (!canDrawCurve && point) {
this._drawDot(point);
}
if (point) {
var lastPointGroup = this._data[this._data.length - 1];
var lastPoint = lastPointGroup[lastPointGroup.length - 1]; // plain object
// When drawing a dot, there's only one point in a group, so without this check
// such group would end up with exactly the same 2 points.
if (!point.equals(lastPoint)) {
lastPointGroup.push({
x: point.x,
y: point.y,
time: point.time,
color: this.penColor
});
}
}
if (typeof this.onEnd === 'function') {
this.onEnd(event);
}
};
SignaturePad.prototype._handleMouseEvents = function () {
this._mouseButtonDown = false;
this._canvas.addEventListener('mousedown', this._handleMouseDown);
this._canvas.addEventListener('mousemove', this._handleMouseMove);
document.addEventListener('mouseup', this._handleMouseUp);
};
SignaturePad.prototype._handleTouchEvents = function () {
// Pass touch events to canvas element on mobile IE11 and Edge.
this._canvas.style.msTouchAction = 'none';
this._canvas.style.touchAction = 'none';
this._canvas.addEventListener('touchstart', this._handleTouchStart);
this._canvas.addEventListener('touchmove', this._handleTouchMove);
this._canvas.addEventListener('touchend', this._handleTouchEnd);
};
SignaturePad.prototype._reset = function () {
this.points = [];
this._lastVelocity = 0;
this._lastWidth = (this.minWidth + this.maxWidth) / 2;
this._ctx.fillStyle = this.penColor;
};
SignaturePad.prototype._createPoint = function (x, y, time) {
var rect = this._canvas.getBoundingClientRect();
return new Point(x - rect.left, y - rect.top, time || new Date().getTime());
};
SignaturePad.prototype._addPoint = function (point) {
var points = this.points;
var tmp = void 0;
points.push(point);
if (points.length > 2) {
// To reduce the initial lag make it work with 3 points
// by copying the first point to the beginning.
if (points.length === 3) points.unshift(points[0]);
tmp = this._calculateCurveControlPoints(points[0], points[1], points[2]);
var c2 = tmp.c2;
tmp = this._calculateCurveControlPoints(points[1], points[2], points[3]);
var c3 = tmp.c1;
var curve = new Bezier(points[1], c2, c3, points[2]);
var widths = this._calculateCurveWidths(curve);
// Remove the first element from the list,
// so that we always have no more than 4 points in points array.
points.shift();
return { curve: curve, widths: widths };
}
return {};
};
SignaturePad.prototype._calculateCurveControlPoints = function (s1, s2, s3) {
var dx1 = s1.x - s2.x;
var dy1 = s1.y - s2.y;
var dx2 = s2.x - s3.x;
var dy2 = s2.y - s3.y;
var m1 = { x: (s1.x + s2.x) / 2.0, y: (s1.y + s2.y) / 2.0 };
var m2 = { x: (s2.x + s3.x) / 2.0, y: (s2.y + s3.y) / 2.0 };
var l1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);
var l2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);
var dxm = m1.x - m2.x;
var dym = m1.y - m2.y;
var k = l2 / (l1 + l2);
var cm = { x: m2.x + dxm * k, y: m2.y + dym * k };
var tx = s2.x - cm.x;
var ty = s2.y - cm.y;
return {
c1: new Point(m1.x + tx, m1.y + ty),
c2: new Point(m2.x + tx, m2.y + ty)
};
};
SignaturePad.prototype._calculateCurveWidths = function (curve) {
var startPoint = curve.startPoint;
var endPoint = curve.endPoint;
var widths = { start: null, end: null };
var velocity = this.velocityFilterWeight * endPoint.velocityFrom(startPoint) + (1 - this.velocityFilterWeight) * this._lastVelocity;
var newWidth = this._strokeWidth(velocity);
widths.start = this._lastWidth;
widths.end = newWidth;
this._lastVelocity = velocity;
this._lastWidth = newWidth;
return widths;
};
SignaturePad.prototype._strokeWidth = function (velocity) {
return Math.max(this.maxWidth / (velocity + 1), this.minWidth);
};
SignaturePad.prototype._drawPoint = function (x, y, size) {
var ctx = this._ctx;
ctx.moveTo(x, y);
ctx.arc(x, y, size, 0, 2 * Math.PI, false);
this._isEmpty = false;
};
SignaturePad.prototype._drawCurve = function (curve, startWidth, endWidth) {
var ctx = this._ctx;
var widthDelta = endWidth - startWidth;
var drawSteps = Math.floor(curve.length());
ctx.beginPath();
for (var i = 0; i < drawSteps; i += 1) {
// Calculate the Bezier (x, y) coordinate for this step.
var t = i / drawSteps;
var tt = t * t;
var ttt = tt * t;
var u = 1 - t;
var uu = u * u;
var uuu = uu * u;
var x = uuu * curve.startPoint.x;
x += 3 * uu * t * curve.control1.x;
x += 3 * u * tt * curve.control2.x;
x += ttt * curve.endPoint.x;
var y = uuu * curve.startPoint.y;
y += 3 * uu * t * curve.control1.y;
y += 3 * u * tt * curve.control2.y;
y += ttt * curve.endPoint.y;
var width = startWidth + ttt * widthDelta;
this._drawPoint(x, y, width);
}
ctx.closePath();
ctx.fill();
};
SignaturePad.prototype._drawDot = function (point) {
var ctx = this._ctx;
var width = typeof this.dotSize === 'function' ? this.dotSize() : this.dotSize;
ctx.beginPath();
this._drawPoint(point.x, point.y, width);
ctx.closePath();
ctx.fill();
};
SignaturePad.prototype._fromData = function (pointGroups, drawCurve, drawDot) {
for (var i = 0; i < pointGroups.length; i += 1) {
var group = pointGroups[i];
if (group.length > 1) {
for (var j = 0; j < group.length; j += 1) {
var rawPoint = group[j];
var point = new Point(rawPoint.x, rawPoint.y, rawPoint.time);
var color = rawPoint.color;
if (j === 0) {
// First point in a group. Nothing to draw yet.
// All points in the group have the same color, so it's enough to set
// penColor just at the beginning.
this.penColor = color;
this._reset();
this._addPoint(point);
} else if (j !== group.length - 1) {
// Middle point in a group.
var _addPoint2 = this._addPoint(point),
curve = _addPoint2.curve,
widths = _addPoint2.widths;
if (curve && widths) {
drawCurve(curve, widths, color);
}
} else {
// Last point in a group. Do nothing.
}
}
} else {
this._reset();
var _rawPoint = group[0];
drawDot(_rawPoint);
}
}
};
SignaturePad.prototype._toSVG = function () {
var _this2 = this;
var pointGroups = this._data;
var canvas = this._canvas;
var ratio = Math.max(window.devicePixelRatio || 1, 1);
var minX = 0;
var minY = 0;
var maxX = canvas.width / ratio;
var maxY = canvas.height / ratio;
var svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.setAttributeNS(null, 'width', canvas.width);
svg.setAttributeNS(null, 'height', canvas.height);
this._fromData(pointGroups, function (curve, widths, color) {
var path = document.createElement('path');
// Need to check curve for NaN values, these pop up when drawing
// lines on the canvas that are not continuous. E.g. Sharp corners
// or stopping mid-stroke and than continuing without lifting mouse.
if (!isNaN(curve.control1.x) && !isNaN(curve.control1.y) && !isNaN(curve.control2.x) && !isNaN(curve.control2.y)) {
var attr = 'M ' + curve.startPoint.x.toFixed(3) + ',' + curve.startPoint.y.toFixed(3) + ' ' + ('C ' + curve.control1.x.toFixed(3) + ',' + curve.control1.y.toFixed(3) + ' ') + (curve.control2.x.toFixed(3) + ',' + curve.control2.y.toFixed(3) + ' ') + (curve.endPoint.x.toFixed(3) + ',' + curve.endPoint.y.toFixed(3));
path.setAttribute('d', attr);
path.setAttribute('stroke-width', (widths.end * 2.25).toFixed(3));
path.setAttribute('stroke', color);
path.setAttribute('fill', 'none');
path.setAttribute('stroke-linecap', 'round');
svg.appendChild(path);
}
}, function (rawPoint) {
var circle = document.createElement('circle');
var dotSize = typeof _this2.dotSize === 'function' ? _this2.dotSize() : _this2.dotSize;
circle.setAttribute('r', dotSize);
circle.setAttribute('cx', rawPoint.x);
circle.setAttribute('cy', rawPoint.y);
circle.setAttribute('fill', rawPoint.color);
svg.appendChild(circle);
});
var prefix = 'data:image/svg+xml;base64,';
var header = '';
var data = header + body + footer;
return prefix + btoa(data);
};
SignaturePad.prototype.fromData = function (pointGroups) {
var _this3 = this;
this.clear();
this._fromData(pointGroups, function (curve, widths) {
return _this3._drawCurve(curve, widths.start, widths.end);
}, function (rawPoint) {
return _this3._drawDot(rawPoint);
});
this._data = pointGroups;
};
SignaturePad.prototype.toData = function () {
return this._data;
};
/* harmony default export */ __webpack_exports__["a"] = SignaturePad;
/***/ }),
/* 83 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return CalculatedValue; });
/**
* The calculated value is a way to define the variable in Survey Creator.
* It has two main properties: name and expression. Based on expression the value read-only property is automatically calculated.
* The name property should be unique though all calculated values.
* It uses survey.getVariable/seruvey.setVariable functions to get/set its value. The class do not store its value internally.
* You may set includeIntoResult property to true to store this calculated value into survey result.
*/
var CalculatedValue = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(CalculatedValue, _super);
function CalculatedValue(name, expression) {
if (name === void 0) { name = null; }
if (expression === void 0) { expression = null; }
var _this = _super.call(this) || this;
_this.expressionIsRunning = false;
_this.isCalculated = false;
if (!!name) {
_this.name = name;
}
if (!!expression) {
_this.expression = expression;
}
return _this;
}
CalculatedValue.prototype.setOwner = function (data) {
this.data = data;
this.rerunExpression();
};
CalculatedValue.prototype.getType = function () {
return "calculatedvalue";
};
Object.defineProperty(CalculatedValue.prototype, "name", {
/**
* The calculated value name. It should be non empty and unique.
*/
get: function () {
return this.getPropertyValue("name", "");
},
set: function (val) {
this.setPropertyValue("name", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(CalculatedValue.prototype, "includeIntoResult", {
/**
* Set this property to true to include the non-empty calculated value into survey result, survey.data property.
*/
get: function () {
return this.getPropertyValue("includeIntoResult", false);
},
set: function (val) {
this.setPropertyValue("includeIntoResult", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(CalculatedValue.prototype, "expression", {
/**
* The Expression that used to calculate the value. You may use standard operators like +, -, * and /, squares (). Here is the example of accessing the question value {questionname}.
* Example: "({quantity} * {price}) * (100 - {discount}) / 100"
*/
get: function () {
return this.getPropertyValue("expression", "");
},
set: function (val) {
this.setPropertyValue("expression", val);
this.rerunExpression();
},
enumerable: true,
configurable: true
});
CalculatedValue.prototype.locCalculation = function () {
this.expressionIsRunning = true;
};
CalculatedValue.prototype.unlocCalculation = function () {
this.expressionIsRunning = false;
};
CalculatedValue.prototype.resetCalculation = function () {
this.isCalculated = false;
};
CalculatedValue.prototype.doCalculation = function (calculatedValues, values, properties) {
if (this.isCalculated)
return;
this.runExpressionCore(calculatedValues, values, properties);
this.isCalculated = true;
};
CalculatedValue.prototype.runExpression = function (values, properties) {
this.runExpressionCore(null, values, properties);
};
Object.defineProperty(CalculatedValue.prototype, "value", {
get: function () {
if (!this.data)
return undefined;
return this.data.getVariable(this.name);
},
enumerable: true,
configurable: true
});
CalculatedValue.prototype.setValue = function (val) {
if (!this.data)
return;
this.data.setVariable(this.name, val);
};
Object.defineProperty(CalculatedValue.prototype, "canRunExpression", {
get: function () {
return (!!this.data &&
!this.isLoadingFromJson &&
!!this.expression &&
!this.expressionIsRunning &&
!!this.name);
},
enumerable: true,
configurable: true
});
CalculatedValue.prototype.rerunExpression = function () {
if (!this.canRunExpression)
return;
this.runExpression(this.data.getFilteredValues(), this.data.getFilteredProperties());
};
CalculatedValue.prototype.runExpressionCore = function (calculatedValues, values, properties) {
if (!this.canRunExpression)
return;
this.ensureExpression(values);
this.locCalculation();
if (!!calculatedValues) {
this.runDependentExpressions(calculatedValues, values, properties);
}
this.expressionRunner.run(values, properties);
};
CalculatedValue.prototype.runDependentExpressions = function (calculatedValues, values, properties) {
var variables = this.expressionRunner.getVariables();
if (!variables)
return;
for (var i = 0; i < calculatedValues.length; i++) {
var calcItem = calculatedValues[i];
if (calcItem === this || variables.indexOf(calcItem.name) < 0)
continue;
calcItem.doCalculation(calculatedValues, values, properties);
values[calcItem.name] = calcItem.value;
}
};
CalculatedValue.prototype.ensureExpression = function (values) {
var _this = this;
if (!!this.expressionRunner)
return;
this.expressionRunner = new __WEBPACK_IMPORTED_MODULE_3__conditions__["a" /* ExpressionRunner */](this.expression);
this.expressionRunner.onRunComplete = function (newValue) {
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(newValue, _this.value)) {
_this.setValue(newValue);
}
_this.unlocCalculation();
};
};
return CalculatedValue;
}(__WEBPACK_IMPORTED_MODULE_2__base__["b" /* Base */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("calculatedvalue", [{ name: "!name", isUnique: true }, "expression:expression", "includeIntoResult:boolean"], function () {
return new CalculatedValue();
}, "base");
/***/ }),
/* 84 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__conditions__ = __webpack_require__(11);
/* unused harmony export ExpressionItem */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return HtmlConditionItem; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return UrlConditionItem; });
var ExpressionItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ExpressionItem, _super);
function ExpressionItem(expression) {
if (expression === void 0) { expression = null; }
var _this = _super.call(this) || this;
_this.createLocalizableString("html", _this);
_this.expression = expression;
return _this;
}
ExpressionItem.prototype.getType = function () {
return "expressionitem";
};
ExpressionItem.prototype.runCondition = function (values, properties) {
if (!this.expression)
return false;
return new __WEBPACK_IMPORTED_MODULE_3__conditions__["b" /* ConditionRunner */](this.expression).run(values, properties);
};
Object.defineProperty(ExpressionItem.prototype, "expression", {
/**
* The expression property. If this expression returns true, then survey will use html property to show on complete page.
*/
get: function () {
return this.getPropertyValue("expression", "");
},
set: function (val) {
this.setPropertyValue("expression", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ExpressionItem.prototype, "locHtml", {
get: function () {
return this.getLocalizableString("html");
},
enumerable: true,
configurable: true
});
ExpressionItem.prototype.getLocale = function () {
return !!this.locOwner ? this.locOwner.getLocale() : "";
};
ExpressionItem.prototype.getMarkdownHtml = function (text) {
return !!this.locOwner ? this.locOwner.getMarkdownHtml(text) : null;
};
ExpressionItem.prototype.getProcessedText = function (text) {
return this.locOwner ? this.locOwner.getProcessedText(text) : text;
};
return ExpressionItem;
}(__WEBPACK_IMPORTED_MODULE_2__base__["b" /* Base */]));
/**
* A class that contains expression and html propeties. It uses in survey.completedHtmlOnCondition array.
* If the expression returns true then html of this item uses instead of survey.completedHtml property
* @see SurveyModel.completedHtmlOnCondition
* @see SurveyModel.completedHtml
*/
var HtmlConditionItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(HtmlConditionItem, _super);
function HtmlConditionItem(expression, html) {
if (expression === void 0) { expression = null; }
if (html === void 0) { html = null; }
var _this = _super.call(this, expression) || this;
_this.createLocalizableString("html", _this);
_this.html = html;
return _this;
}
HtmlConditionItem.prototype.getType = function () {
return "htmlconditionitem";
};
Object.defineProperty(HtmlConditionItem.prototype, "html", {
/**
* The html that shows on completed ('Thank you') page. The expression should return true
* @see expression
*/
get: function () {
return this.getLocalizableStringText("html");
},
set: function (value) {
this.setLocalizableStringText("html", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(HtmlConditionItem.prototype, "locHtml", {
get: function () {
return this.getLocalizableString("html");
},
enumerable: true,
configurable: true
});
return HtmlConditionItem;
}(ExpressionItem));
/**
* A class that contains expression and url propeties. It uses in survey.navigateToUrlOnCondition array.
* If the expression returns true then url of this item uses instead of survey.navigateToUrl property
* @see SurveyModel.navigateToUrl
*/
var UrlConditionItem = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(UrlConditionItem, _super);
function UrlConditionItem(expression, url) {
if (expression === void 0) { expression = null; }
if (url === void 0) { url = null; }
var _this = _super.call(this, expression) || this;
_this.createLocalizableString("url", _this);
_this.url = url;
return _this;
}
UrlConditionItem.prototype.getType = function () {
return "urlconditionitem";
};
Object.defineProperty(UrlConditionItem.prototype, "url", {
/**
* The url that survey navigates to on completing the survey. The expression should return true
* @see expression
*/
get: function () {
return this.getLocalizableStringText("url");
},
set: function (value) {
this.setLocalizableStringText("url", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(UrlConditionItem.prototype, "locUrl", {
get: function () {
return this.getLocalizableString("url");
},
enumerable: true,
configurable: true
});
return UrlConditionItem;
}(ExpressionItem));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("expressionitem", ["expression:condition"], function () {
return new ExpressionItem();
}, "base");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("htmlconditionitem", [{ name: "html:html", serializationProperty: "locHtml" }], function () {
return new HtmlConditionItem();
}, "expressionitem");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("urlconditionitem", [{ name: "url:string", serializationProperty: "locUrl" }], function () {
return new UrlConditionItem();
}, "expressionitem");
/***/ }),
/* 85 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__expressions__ = __webpack_require__(28);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SyntaxError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return parse; });
// tslint:disable:only-arrow-functions
// tslint:disable:object-literal-shorthand
// tslint:disable:trailing-comma
// tslint:disable:object-literal-sort-keys
// tslint:disable:one-variable-per-declaration
// tslint:disable:max-line-length
// tslint:disable:no-consecutive-blank-lines
// tslint:disable:align
// Generated by PEG.js v. 0.10.0 (ts-pegjs plugin v. 0.2.6 )
//
// https://pegjs.org/ https://github.com/metadevpro/ts-pegjs
var SyntaxError = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SyntaxError, _super);
function SyntaxError(message, expected, found, location) {
var _this = _super.call(this) || this;
_this.message = message;
_this.expected = expected;
_this.found = found;
_this.location = location;
_this.name = "SyntaxError";
if (typeof Error.captureStackTrace === "function") {
Error.captureStackTrace(_this, SyntaxError);
}
return _this;
}
SyntaxError.buildMessage = function (expected, found) {
function hex(ch) {
return ch.charCodeAt(0).toString(16).toUpperCase();
}
function literalEscape(s) {
return s
.replace(/\\/g, "\\\\")
.replace(/"/g, "\\\"")
.replace(/\0/g, "\\0")
.replace(/\t/g, "\\t")
.replace(/\n/g, "\\n")
.replace(/\r/g, "\\r")
.replace(/[\x00-\x0F]/g, function (ch) { return "\\x0" + hex(ch); })
.replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return "\\x" + hex(ch); });
}
function classEscape(s) {
return s
.replace(/\\/g, "\\\\")
.replace(/\]/g, "\\]")
.replace(/\^/g, "\\^")
.replace(/-/g, "\\-")
.replace(/\0/g, "\\0")
.replace(/\t/g, "\\t")
.replace(/\n/g, "\\n")
.replace(/\r/g, "\\r")
.replace(/[\x00-\x0F]/g, function (ch) { return "\\x0" + hex(ch); })
.replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return "\\x" + hex(ch); });
}
function describeExpectation(expectation) {
switch (expectation.type) {
case "literal":
return "\"" + literalEscape(expectation.text) + "\"";
case "class":
var escapedParts = expectation.parts.map(function (part) {
return Array.isArray(part)
? classEscape(part[0]) + "-" + classEscape(part[1])
: classEscape(part);
});
return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
case "any":
return "any character";
case "end":
return "end of input";
case "other":
return expectation.description;
}
}
function describeExpected(expected1) {
var descriptions = expected1.map(describeExpectation);
var i;
var j;
descriptions.sort();
if (descriptions.length > 0) {
for (i = 1, j = 1; i < descriptions.length; i++) {
if (descriptions[i - 1] !== descriptions[i]) {
descriptions[j] = descriptions[i];
j++;
}
}
descriptions.length = j;
}
switch (descriptions.length) {
case 1:
return descriptions[0];
case 2:
return descriptions[0] + " or " + descriptions[1];
default:
return descriptions.slice(0, -1).join(", ")
+ ", or "
+ descriptions[descriptions.length - 1];
}
}
function describeFound(found1) {
return found1 ? "\"" + literalEscape(found1) + "\"" : "end of input";
}
return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
};
return SyntaxError;
}(Error));
function peg$parse(input, options) {
options = options !== undefined ? options : {};
var peg$FAILED = {};
var peg$startRuleFunctions = { Expression: peg$parseExpression };
var peg$startRuleFunction = peg$parseExpression;
var peg$c0 = function (head, tail) {
return buildBinaryOperand(head, tail, true);
};
var peg$c1 = "||";
var peg$c2 = peg$literalExpectation("||", false);
var peg$c3 = "or";
var peg$c4 = peg$literalExpectation("or", true);
var peg$c5 = function () { return "or"; };
var peg$c6 = "&&";
var peg$c7 = peg$literalExpectation("&&", false);
var peg$c8 = "and";
var peg$c9 = peg$literalExpectation("and", true);
var peg$c10 = function () { return "and"; };
var peg$c11 = function (head, tail) {
return buildBinaryOperand(head, tail);
};
var peg$c12 = "<=";
var peg$c13 = peg$literalExpectation("<=", false);
var peg$c14 = "lessorequal";
var peg$c15 = peg$literalExpectation("lessorequal", true);
var peg$c16 = function () { return "lessorequal"; };
var peg$c17 = ">=";
var peg$c18 = peg$literalExpectation(">=", false);
var peg$c19 = "greaterorequal";
var peg$c20 = peg$literalExpectation("greaterorequal", true);
var peg$c21 = function () { return "greaterorequal"; };
var peg$c22 = "=";
var peg$c23 = peg$literalExpectation("=", false);
var peg$c24 = "equal";
var peg$c25 = peg$literalExpectation("equal", true);
var peg$c26 = function () { return "equal"; };
var peg$c27 = "!=";
var peg$c28 = peg$literalExpectation("!=", false);
var peg$c29 = "notequal";
var peg$c30 = peg$literalExpectation("notequal", true);
var peg$c31 = function () { return "notequal"; };
var peg$c32 = "<";
var peg$c33 = peg$literalExpectation("<", false);
var peg$c34 = "less";
var peg$c35 = peg$literalExpectation("less", true);
var peg$c36 = function () { return "less"; };
var peg$c37 = ">";
var peg$c38 = peg$literalExpectation(">", false);
var peg$c39 = "greater";
var peg$c40 = peg$literalExpectation("greater", true);
var peg$c41 = function () { return "greater"; };
var peg$c42 = "+";
var peg$c43 = peg$literalExpectation("+", false);
var peg$c44 = function () { return "plus"; };
var peg$c45 = "-";
var peg$c46 = peg$literalExpectation("-", false);
var peg$c47 = function () { return "minus"; };
var peg$c48 = "*";
var peg$c49 = peg$literalExpectation("*", false);
var peg$c50 = function () { return "mul"; };
var peg$c51 = "/";
var peg$c52 = peg$literalExpectation("/", false);
var peg$c53 = function () { return "div"; };
var peg$c54 = "%";
var peg$c55 = peg$literalExpectation("%", false);
var peg$c56 = function () { return "mod"; };
var peg$c57 = "^";
var peg$c58 = peg$literalExpectation("^", false);
var peg$c59 = "power";
var peg$c60 = peg$literalExpectation("power", true);
var peg$c61 = function () { return "power"; };
var peg$c62 = "*=";
var peg$c63 = peg$literalExpectation("*=", false);
var peg$c64 = "contains";
var peg$c65 = peg$literalExpectation("contains", true);
var peg$c66 = "contain";
var peg$c67 = peg$literalExpectation("contain", true);
var peg$c68 = function () { return "contains"; };
var peg$c69 = "notcontains";
var peg$c70 = peg$literalExpectation("notcontains", true);
var peg$c71 = "notcontain";
var peg$c72 = peg$literalExpectation("notcontain", true);
var peg$c73 = function () { return "notcontains"; };
var peg$c74 = "anyof";
var peg$c75 = peg$literalExpectation("anyof", true);
var peg$c76 = function () { return "anyof"; };
var peg$c77 = "allof";
var peg$c78 = peg$literalExpectation("allof", true);
var peg$c79 = function () { return "allof"; };
var peg$c80 = "(";
var peg$c81 = peg$literalExpectation("(", false);
var peg$c82 = ")";
var peg$c83 = peg$literalExpectation(")", false);
var peg$c84 = function (expr) { return expr; };
var peg$c85 = function (name, params) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["a" /* FunctionOperand */](name, params); };
var peg$c86 = "!";
var peg$c87 = peg$literalExpectation("!", false);
var peg$c88 = "negate";
var peg$c89 = peg$literalExpectation("negate", true);
var peg$c90 = function (expr) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["b" /* UnaryOperand */](expr, "negate"); };
var peg$c91 = function (expr, op) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["b" /* UnaryOperand */](expr, op); };
var peg$c92 = "empty";
var peg$c93 = peg$literalExpectation("empty", true);
var peg$c94 = function () { return "empty"; };
var peg$c95 = "notempty";
var peg$c96 = peg$literalExpectation("notempty", true);
var peg$c97 = function () { return "notempty"; };
var peg$c98 = "undefined";
var peg$c99 = peg$literalExpectation("undefined", false);
var peg$c100 = "null";
var peg$c101 = peg$literalExpectation("null", false);
var peg$c102 = function () { return null; };
var peg$c103 = function (value) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["c" /* Const */](value); };
var peg$c104 = "{";
var peg$c105 = peg$literalExpectation("{", false);
var peg$c106 = "}";
var peg$c107 = peg$literalExpectation("}", false);
var peg$c108 = function (value) { return new __WEBPACK_IMPORTED_MODULE_1__expressions__["d" /* Variable */](value); };
var peg$c109 = function (value) { return value; };
var peg$c110 = "'";
var peg$c111 = peg$literalExpectation("'", false);
var peg$c112 = function (value) { return "'" + value + "'"; };
var peg$c113 = "\"";
var peg$c114 = peg$literalExpectation("\"", false);
var peg$c115 = "[";
var peg$c116 = peg$literalExpectation("[", false);
var peg$c117 = "]";
var peg$c118 = peg$literalExpectation("]", false);
var peg$c119 = function (sequence) { return sequence; };
var peg$c120 = ",";
var peg$c121 = peg$literalExpectation(",", false);
var peg$c122 = function (expr, tail) {
if (expr == null)
return new __WEBPACK_IMPORTED_MODULE_1__expressions__["e" /* ArrayOperand */]([]);
var array = [expr];
if (Array.isArray(tail)) {
var flatten = flattenArray(tail);
for (var i = 3; i < flatten.length; i += 4) {
array.push(flatten[i]);
}
}
return new __WEBPACK_IMPORTED_MODULE_1__expressions__["e" /* ArrayOperand */](array);
};
var peg$c123 = "true";
var peg$c124 = peg$literalExpectation("true", true);
var peg$c125 = function () { return true; };
var peg$c126 = "false";
var peg$c127 = peg$literalExpectation("false", true);
var peg$c128 = function () { return false; };
var peg$c129 = "0x";
var peg$c130 = peg$literalExpectation("0x", false);
var peg$c131 = function () { return parseInt(text(), 16); };
var peg$c132 = /^[\-]/;
var peg$c133 = peg$classExpectation(["-"], false, false);
var peg$c134 = function (sign, num) { return sign == null ? num : -num; };
var peg$c135 = ".";
var peg$c136 = peg$literalExpectation(".", false);
var peg$c137 = function () { return parseFloat(text()); };
var peg$c138 = function () { return parseInt(text(), 10); };
var peg$c139 = "0";
var peg$c140 = peg$literalExpectation("0", false);
var peg$c141 = function () { return 0; };
var peg$c142 = function (chars) { return chars.join(""); };
var peg$c143 = "\\'";
var peg$c144 = peg$literalExpectation("\\'", false);
var peg$c145 = function () { return "'"; };
var peg$c146 = "\\\"";
var peg$c147 = peg$literalExpectation("\\\"", false);
var peg$c148 = function () { return "\""; };
var peg$c149 = /^[^"']/;
var peg$c150 = peg$classExpectation(["\"", "'"], true, false);
var peg$c151 = function () { return text(); };
var peg$c152 = /^[^{}]/;
var peg$c153 = peg$classExpectation(["{", "}"], true, false);
var peg$c154 = /^[0-9]/;
var peg$c155 = peg$classExpectation([["0", "9"]], false, false);
var peg$c156 = /^[1-9]/;
var peg$c157 = peg$classExpectation([["1", "9"]], false, false);
var peg$c158 = /^[a-zA-Z]/;
var peg$c159 = peg$classExpectation([["a", "z"], ["A", "Z"]], false, false);
var peg$c160 = peg$otherExpectation("whitespace");
var peg$c161 = /^[ \t\n\r]/;
var peg$c162 = peg$classExpectation([" ", "\t", "\n", "\r"], false, false);
var peg$currPos = 0;
var peg$savedPos = 0;
var peg$posDetailsCache = [{ line: 1, column: 1 }];
var peg$maxFailPos = 0;
var peg$maxFailExpected = [];
var peg$silentFails = 0;
var peg$resultsCache = {};
var peg$result;
if (options.startRule !== undefined) {
if (!(options.startRule in peg$startRuleFunctions)) {
throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
}
peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
}
function text() {
return input.substring(peg$savedPos, peg$currPos);
}
function location() {
return peg$computeLocation(peg$savedPos, peg$currPos);
}
function expected(description, location1) {
location1 = location1 !== undefined
? location1
: peg$computeLocation(peg$savedPos, peg$currPos);
throw peg$buildStructuredError([peg$otherExpectation(description)], input.substring(peg$savedPos, peg$currPos), location1);
}
function error(message, location1) {
location1 = location1 !== undefined
? location1
: peg$computeLocation(peg$savedPos, peg$currPos);
throw peg$buildSimpleError(message, location1);
}
function peg$literalExpectation(text1, ignoreCase) {
return { type: "literal", text: text1, ignoreCase: ignoreCase };
}
function peg$classExpectation(parts, inverted, ignoreCase) {
return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
}
function peg$anyExpectation() {
return { type: "any" };
}
function peg$endExpectation() {
return { type: "end" };
}
function peg$otherExpectation(description) {
return { type: "other", description: description };
}
function peg$computePosDetails(pos) {
var details = peg$posDetailsCache[pos];
var p;
if (details) {
return details;
}
else {
p = pos - 1;
while (!peg$posDetailsCache[p]) {
p--;
}
details = peg$posDetailsCache[p];
details = {
line: details.line,
column: details.column
};
while (p < pos) {
if (input.charCodeAt(p) === 10) {
details.line++;
details.column = 1;
}
else {
details.column++;
}
p++;
}
peg$posDetailsCache[pos] = details;
return details;
}
}
function peg$computeLocation(startPos, endPos) {
var startPosDetails = peg$computePosDetails(startPos);
var endPosDetails = peg$computePosDetails(endPos);
return {
start: {
offset: startPos,
line: startPosDetails.line,
column: startPosDetails.column
},
end: {
offset: endPos,
line: endPosDetails.line,
column: endPosDetails.column
}
};
}
function peg$fail(expected1) {
if (peg$currPos < peg$maxFailPos) {
return;
}
if (peg$currPos > peg$maxFailPos) {
peg$maxFailPos = peg$currPos;
peg$maxFailExpected = [];
}
peg$maxFailExpected.push(expected1);
}
function peg$buildSimpleError(message, location1) {
return new SyntaxError(message, [], "", location1);
}
function peg$buildStructuredError(expected1, found, location1) {
return new SyntaxError(SyntaxError.buildMessage(expected1, found), expected1, found, location1);
}
function peg$parseExpression() {
var s0, s1, s2, s3, s4, s5, s6, s7, s8;
var key = peg$currPos * 34 + 0;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parse_();
if (s1 !== peg$FAILED) {
s2 = peg$parseLogicOr();
if (s2 !== peg$FAILED) {
s3 = [];
s4 = peg$currPos;
s5 = peg$parse_();
if (s5 !== peg$FAILED) {
s6 = peg$parseOrSign();
if (s6 !== peg$FAILED) {
s7 = peg$parse_();
if (s7 !== peg$FAILED) {
s8 = peg$parseLogicOr();
if (s8 !== peg$FAILED) {
s5 = [s5, s6, s7, s8];
s4 = s5;
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
while (s4 !== peg$FAILED) {
s3.push(s4);
s4 = peg$currPos;
s5 = peg$parse_();
if (s5 !== peg$FAILED) {
s6 = peg$parseOrSign();
if (s6 !== peg$FAILED) {
s7 = peg$parse_();
if (s7 !== peg$FAILED) {
s8 = peg$parseLogicOr();
if (s8 !== peg$FAILED) {
s5 = [s5, s6, s7, s8];
s4 = s5;
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
else {
peg$currPos = s4;
s4 = peg$FAILED;
}
}
if (s3 !== peg$FAILED) {
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c0(s2, s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseOrSign() {
var s0, s1;
var key = peg$currPos * 34 + 1;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c1) {
s1 = peg$c1;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c2);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 2).toLowerCase() === peg$c3) {
s1 = input.substr(peg$currPos, 2);
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c4);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c5();
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseLogicOr() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 2;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseLogicAnd();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseAndSign();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseLogicAnd();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseAndSign();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseLogicAnd();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c0(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseAndSign() {
var s0, s1;
var key = peg$currPos * 34 + 3;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c6) {
s1 = peg$c6;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c7);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 3).toLowerCase() === peg$c8) {
s1 = input.substr(peg$currPos, 3);
peg$currPos += 3;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c9);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c10();
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseLogicAnd() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 4;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseCompOps();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseComparableOperators();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseCompOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseComparableOperators();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseCompOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c11(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseComparableOperators() {
var s0, s1;
var key = peg$currPos * 34 + 5;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c12) {
s1 = peg$c12;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c13);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 11).toLowerCase() === peg$c14) {
s1 = input.substr(peg$currPos, 11);
peg$currPos += 11;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c15);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c16();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c17) {
s1 = peg$c17;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c18);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 14).toLowerCase() === peg$c19) {
s1 = input.substr(peg$currPos, 14);
peg$currPos += 14;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c20);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c21();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 61) {
s1 = peg$c22;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c23);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c24) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c25);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c26();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c27) {
s1 = peg$c27;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c28);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 8).toLowerCase() === peg$c29) {
s1 = input.substr(peg$currPos, 8);
peg$currPos += 8;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c30);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c31();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 60) {
s1 = peg$c32;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c33);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 4).toLowerCase() === peg$c34) {
s1 = input.substr(peg$currPos, 4);
peg$currPos += 4;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c35);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c36();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 62) {
s1 = peg$c37;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c38);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 7).toLowerCase() === peg$c39) {
s1 = input.substr(peg$currPos, 7);
peg$currPos += 7;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c40);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c41();
}
s0 = s1;
}
}
}
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseCompOps() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 6;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parsePlusMinusOps();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parsePlusMinusSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parsePlusMinusOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parsePlusMinusSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parsePlusMinusOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c0(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parsePlusMinusSigns() {
var s0, s1;
var key = peg$currPos * 34 + 7;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 43) {
s1 = peg$c42;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c43);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c44();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 45) {
s1 = peg$c45;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c46);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c47();
}
s0 = s1;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parsePlusMinusOps() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 8;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseMulDivOps();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseMulDivSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseMulDivOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseMulDivSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseMulDivOps();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c0(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseMulDivSigns() {
var s0, s1;
var key = peg$currPos * 34 + 9;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 42) {
s1 = peg$c48;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c49);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c50();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 47) {
s1 = peg$c51;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c52);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c53();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 37) {
s1 = peg$c54;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c55);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c56();
}
s0 = s1;
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseMulDivOps() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 10;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseBinaryFuncOp();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parsePowerSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseBinaryFuncOp();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parsePowerSigns();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseBinaryFuncOp();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c0(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parsePowerSigns() {
var s0, s1;
var key = peg$currPos * 34 + 11;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 94) {
s1 = peg$c57;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c58);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c59) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c60);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c61();
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseBinaryFuncOp() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 12;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseFactor();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseBinFunctions();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseFactor();
if (s7 === peg$FAILED) {
s7 = null;
}
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
s5 = peg$parseBinFunctions();
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseFactor();
if (s7 === peg$FAILED) {
s7 = null;
}
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c11(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseBinFunctions() {
var s0, s1;
var key = peg$currPos * 34 + 13;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c62) {
s1 = peg$c62;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c63);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 8).toLowerCase() === peg$c64) {
s1 = input.substr(peg$currPos, 8);
peg$currPos += 8;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c65);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 7).toLowerCase() === peg$c66) {
s1 = input.substr(peg$currPos, 7);
peg$currPos += 7;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c67);
}
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c68();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 11).toLowerCase() === peg$c69) {
s1 = input.substr(peg$currPos, 11);
peg$currPos += 11;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c70);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 10).toLowerCase() === peg$c71) {
s1 = input.substr(peg$currPos, 10);
peg$currPos += 10;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c72);
}
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c73();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c74) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c75);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c76();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c77) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c78);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c79();
}
s0 = s1;
}
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseFactor() {
var s0, s1, s2, s3, s4, s5;
var key = peg$currPos * 34 + 14;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 40) {
s1 = peg$c80;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c81);
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parse_();
if (s2 !== peg$FAILED) {
s3 = peg$parseExpression();
if (s3 !== peg$FAILED) {
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 41) {
s5 = peg$c82;
peg$currPos++;
}
else {
s5 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c83);
}
}
if (s5 === peg$FAILED) {
s5 = null;
}
if (s5 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c84(s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$parseFunctionOp();
if (s0 === peg$FAILED) {
s0 = peg$parseUnaryFunctionOp();
if (s0 === peg$FAILED) {
s0 = peg$parseAtom();
if (s0 === peg$FAILED) {
s0 = peg$parseArrayOp();
}
}
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseFunctionOp() {
var s0, s1, s2, s3, s4;
var key = peg$currPos * 34 + 15;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseLettersAndDigits();
if (s1 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 40) {
s2 = peg$c80;
peg$currPos++;
}
else {
s2 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c81);
}
}
if (s2 !== peg$FAILED) {
s3 = peg$parseSequence();
if (s3 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 41) {
s4 = peg$c82;
peg$currPos++;
}
else {
s4 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c83);
}
}
if (s4 === peg$FAILED) {
s4 = null;
}
if (s4 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c85(s1, s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseUnaryFunctionOp() {
var s0, s1, s2, s3;
var key = peg$currPos * 34 + 16;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 33) {
s1 = peg$c86;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c87);
}
}
if (s1 === peg$FAILED) {
if (input.substr(peg$currPos, 6).toLowerCase() === peg$c88) {
s1 = input.substr(peg$currPos, 6);
peg$currPos += 6;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c89);
}
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parse_();
if (s2 !== peg$FAILED) {
s3 = peg$parseExpression();
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c90(s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parseAtom();
if (s1 !== peg$FAILED) {
s2 = peg$parse_();
if (s2 !== peg$FAILED) {
s3 = peg$parseUnFunctions();
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c91(s1, s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseUnFunctions() {
var s0, s1;
var key = peg$currPos * 34 + 17;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c92) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c93);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c94();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 8).toLowerCase() === peg$c95) {
s1 = input.substr(peg$currPos, 8);
peg$currPos += 8;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c96);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c97();
}
s0 = s1;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseAtom() {
var s0, s1, s2, s3, s4;
var key = peg$currPos * 34 + 18;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parse_();
if (s1 !== peg$FAILED) {
if (input.substr(peg$currPos, 9) === peg$c98) {
s2 = peg$c98;
peg$currPos += 9;
}
else {
s2 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c99);
}
}
if (s2 === peg$FAILED) {
if (input.substr(peg$currPos, 4) === peg$c100) {
s2 = peg$c100;
peg$currPos += 4;
}
else {
s2 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c101);
}
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c102();
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parse_();
if (s1 !== peg$FAILED) {
s2 = peg$parseConstValue();
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c103(s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parse_();
if (s1 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 123) {
s2 = peg$c104;
peg$currPos++;
}
else {
s2 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c105);
}
}
if (s2 !== peg$FAILED) {
s3 = peg$parseValueInput();
if (s3 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 125) {
s4 = peg$c106;
peg$currPos++;
}
else {
s4 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c107);
}
}
if (s4 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c108(s3);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseConstValue() {
var s0, s1, s2, s3;
var key = peg$currPos * 34 + 19;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseLogicValue();
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c109(s1);
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parseArithmeticValue();
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c109(s1);
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parseLettersAndDigits();
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c109(s1);
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 39) {
s1 = peg$c110;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c111);
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parseAnyInput();
if (s2 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 39) {
s3 = peg$c110;
peg$currPos++;
}
else {
s3 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c111);
}
}
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c112(s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 34) {
s1 = peg$c113;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c114);
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parseAnyInput();
if (s2 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 34) {
s3 = peg$c113;
peg$currPos++;
}
else {
s3 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c114);
}
}
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c112(s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
}
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseArrayOp() {
var s0, s1, s2, s3;
var key = peg$currPos * 34 + 20;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 91) {
s1 = peg$c115;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c116);
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parseSequence();
if (s2 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 93) {
s3 = peg$c117;
peg$currPos++;
}
else {
s3 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c118);
}
}
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c119(s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseSequence() {
var s0, s1, s2, s3, s4, s5, s6, s7;
var key = peg$currPos * 34 + 21;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseExpression();
if (s1 === peg$FAILED) {
s1 = null;
}
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 44) {
s5 = peg$c120;
peg$currPos++;
}
else {
s5 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c121);
}
}
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parse_();
if (s4 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 44) {
s5 = peg$c120;
peg$currPos++;
}
else {
s5 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c121);
}
}
if (s5 !== peg$FAILED) {
s6 = peg$parse_();
if (s6 !== peg$FAILED) {
s7 = peg$parseExpression();
if (s7 !== peg$FAILED) {
s4 = [s4, s5, s6, s7];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c122(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseLogicValue() {
var s0, s1;
var key = peg$currPos * 34 + 22;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 4).toLowerCase() === peg$c123) {
s1 = input.substr(peg$currPos, 4);
peg$currPos += 4;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c124);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c125();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 5).toLowerCase() === peg$c126) {
s1 = input.substr(peg$currPos, 5);
peg$currPos += 5;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c127);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c128();
}
s0 = s1;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseArithmeticValue() {
var s0, s1, s2;
var key = peg$currPos * 34 + 23;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c129) {
s1 = peg$c129;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c130);
}
}
if (s1 !== peg$FAILED) {
s2 = peg$parseDigits();
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c131();
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (peg$c132.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c133);
}
}
if (s1 === peg$FAILED) {
s1 = null;
}
if (s1 !== peg$FAILED) {
s2 = peg$parseNumber();
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c134(s1, s2);
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseNumber() {
var s0, s1, s2, s3;
var key = peg$currPos * 34 + 24;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseDigits();
if (s1 !== peg$FAILED) {
if (input.charCodeAt(peg$currPos) === 46) {
s2 = peg$c135;
peg$currPos++;
}
else {
s2 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c136);
}
}
if (s2 !== peg$FAILED) {
s3 = peg$parseDigits();
if (s3 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c137();
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
s1 = peg$parseNonZeroDigits();
if (s1 !== peg$FAILED) {
s2 = peg$parseDigits();
if (s2 === peg$FAILED) {
s2 = null;
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c138();
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.charCodeAt(peg$currPos) === 48) {
s1 = peg$c139;
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c140);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c141();
}
s0 = s1;
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseValueInput() {
var s0, s1, s2;
var key = peg$currPos * 34 + 25;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = [];
s2 = peg$parseValueCharacters();
if (s2 !== peg$FAILED) {
while (s2 !== peg$FAILED) {
s1.push(s2);
s2 = peg$parseValueCharacters();
}
}
else {
s1 = peg$FAILED;
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c142(s1);
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseAnyInput() {
var s0, s1, s2;
var key = peg$currPos * 34 + 26;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = [];
s2 = peg$parseAnyCharacters();
if (s2 !== peg$FAILED) {
while (s2 !== peg$FAILED) {
s1.push(s2);
s2 = peg$parseAnyCharacters();
}
}
else {
s1 = peg$FAILED;
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c142(s1);
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseAnyCharacters() {
var s0, s1;
var key = peg$currPos * 34 + 27;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c143) {
s1 = peg$c143;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c144);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c145();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (input.substr(peg$currPos, 2) === peg$c146) {
s1 = peg$c146;
peg$currPos += 2;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c147);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c148();
}
s0 = s1;
if (s0 === peg$FAILED) {
s0 = peg$currPos;
if (peg$c149.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c150);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c151();
}
s0 = s1;
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseValueCharacters() {
var s0, s1;
var key = peg$currPos * 34 + 28;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
if (peg$c152.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c153);
}
}
if (s1 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c151();
}
s0 = s1;
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseLettersAndDigits() {
var s0, s1, s2, s3, s4, s5, s6;
var key = peg$currPos * 34 + 29;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = peg$currPos;
s1 = peg$parseLetters();
if (s1 !== peg$FAILED) {
s2 = [];
s3 = peg$currPos;
s4 = peg$parseDigits();
if (s4 !== peg$FAILED) {
s5 = [];
s6 = peg$parseLetters();
while (s6 !== peg$FAILED) {
s5.push(s6);
s6 = peg$parseLetters();
}
if (s5 !== peg$FAILED) {
s4 = [s4, s5];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
while (s3 !== peg$FAILED) {
s2.push(s3);
s3 = peg$currPos;
s4 = peg$parseDigits();
if (s4 !== peg$FAILED) {
s5 = [];
s6 = peg$parseLetters();
while (s6 !== peg$FAILED) {
s5.push(s6);
s6 = peg$parseLetters();
}
if (s5 !== peg$FAILED) {
s4 = [s4, s5];
s3 = s4;
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
else {
peg$currPos = s3;
s3 = peg$FAILED;
}
}
if (s2 !== peg$FAILED) {
peg$savedPos = s0;
s1 = peg$c151();
s0 = s1;
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
}
else {
peg$currPos = s0;
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseDigits() {
var s0, s1;
var key = peg$currPos * 34 + 30;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = [];
if (peg$c154.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c155);
}
}
if (s1 !== peg$FAILED) {
while (s1 !== peg$FAILED) {
s0.push(s1);
if (peg$c154.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c155);
}
}
}
}
else {
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseNonZeroDigits() {
var s0, s1;
var key = peg$currPos * 34 + 31;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = [];
if (peg$c156.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c157);
}
}
if (s1 !== peg$FAILED) {
while (s1 !== peg$FAILED) {
s0.push(s1);
if (peg$c156.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c157);
}
}
}
}
else {
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parseLetters() {
var s0, s1;
var key = peg$currPos * 34 + 32;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
s0 = [];
if (peg$c158.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c159);
}
}
if (s1 !== peg$FAILED) {
while (s1 !== peg$FAILED) {
s0.push(s1);
if (peg$c158.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c159);
}
}
}
}
else {
s0 = peg$FAILED;
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function peg$parse_() {
var s0, s1;
var key = peg$currPos * 34 + 33;
var cached = peg$resultsCache[key];
if (cached) {
peg$currPos = cached.nextPos;
return cached.result;
}
peg$silentFails++;
s0 = [];
if (peg$c161.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c162);
}
}
while (s1 !== peg$FAILED) {
s0.push(s1);
if (peg$c161.test(input.charAt(peg$currPos))) {
s1 = input.charAt(peg$currPos);
peg$currPos++;
}
else {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c162);
}
}
}
peg$silentFails--;
if (s0 === peg$FAILED) {
s1 = peg$FAILED;
if (peg$silentFails === 0) {
peg$fail(peg$c160);
}
}
peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
return s0;
}
function buildBinaryOperand(head, tail, isArithmeticOp) {
if (isArithmeticOp === void 0) { isArithmeticOp = false; }
return tail.reduce(function (result, elements) {
return new __WEBPACK_IMPORTED_MODULE_1__expressions__["f" /* BinaryOperand */](elements[1], result, elements[3], isArithmeticOp);
}, head);
}
function flattenArray(array) {
return [].concat.apply([], array);
}
peg$result = peg$startRuleFunction();
if (peg$result !== peg$FAILED && peg$currPos === input.length) {
return peg$result;
}
else {
if (peg$result !== peg$FAILED && peg$currPos < input.length) {
peg$fail(peg$endExpectation());
}
throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length
? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
: peg$computeLocation(peg$maxFailPos, peg$maxFailPos));
}
}
var parse = peg$parse;
/***/ }),
/* 86 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__panel__ = __webpack_require__(22);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FlowPanelModel; });
/**
* The flow panel object. It is a container with flow layout where you can mix questions with mardown text.
*
*/
var FlowPanelModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(FlowPanelModel, _super);
function FlowPanelModel(name) {
if (name === void 0) { name = ""; }
var _this = _super.call(this, name) || this;
_this.createLocalizableString("content", _this, true);
var self = _this;
_this.registerFunctionOnPropertyValueChanged("content", function () {
self.onContentChanged();
});
return _this;
}
FlowPanelModel.prototype.getType = function () {
return "flowpanel";
};
FlowPanelModel.prototype.getChildrenLayoutType = function () {
return "flow";
};
FlowPanelModel.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.onContentChanged();
};
Object.defineProperty(FlowPanelModel.prototype, "content", {
get: function () {
return this.getLocalizableStringText("content");
},
set: function (val) {
this.setLocalizableStringText("content", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(FlowPanelModel.prototype, "locContent", {
get: function () {
return this.getLocalizableString("content");
},
enumerable: true,
configurable: true
});
Object.defineProperty(FlowPanelModel.prototype, "html", {
get: function () {
return this.getPropertyValue("html", "");
},
set: function (val) {
this.setPropertyValue("html", val);
},
enumerable: true,
configurable: true
});
FlowPanelModel.prototype.onContentChanged = function () {
var html = "";
if (!!this.onCustomHtmlProducing) {
html = this.onCustomHtmlProducing();
}
else {
html = this.produceHtml();
}
this.html = html;
if (!!this.contentChangedCallback)
this.contentChangedCallback();
};
FlowPanelModel.prototype.produceHtml = function () {
var html = [];
//contentElementNamePrefix
var regEx = /{(.*?(element:)[^$].*?)}/g;
var str = this.content;
var startIndex = 0;
var res = null;
while ((res = regEx.exec(str)) !== null) {
if (res.index > startIndex) {
html.push(str.substr(startIndex, res.index - startIndex));
startIndex = res.index;
}
var question = this.getQuestionFromText(res[0]);
if (!!question) {
html.push(this.getHtmlForQuestion(question));
}
else {
html.push(str.substr(startIndex, res.index + res[0].length - startIndex));
}
startIndex = res.index + res[0].length;
}
if (startIndex < str.length) {
html.push(str.substr(startIndex, str.length - startIndex));
}
return html.join("").replace(new RegExp(" ", "g"), " ");
};
FlowPanelModel.prototype.getQuestionFromText = function (str) {
str = str.substr(1, str.length - 2);
str = str.replace(FlowPanelModel.contentElementNamePrefix, "").trim();
return this.getQuestionByName(str);
};
FlowPanelModel.prototype.getHtmlForQuestion = function (question) {
if (!!this.onGetHtmlForQuestion)
return this.onGetHtmlForQuestion(question);
return "";
};
FlowPanelModel.prototype.getQuestionHtmlId = function (question) {
return this.name + "_" + question.id;
};
FlowPanelModel.prototype.onAddElement = function (element, index) {
_super.prototype.onAddElement.call(this, element, index);
this.addElementToContent(element);
element.renderWidth = "";
};
FlowPanelModel.prototype.onRemoveElement = function (element) {
var searchStr = this.getElementContentText(element);
this.content = this.content.replace(searchStr, "");
_super.prototype.onRemoveElement.call(this, element);
};
FlowPanelModel.prototype.dragDropMoveElement = function (src, target, targetIndex) { };
FlowPanelModel.prototype.addElementToContent = function (element) {
if (this.isLoadingFromJson)
return;
var text = this.getElementContentText(element);
if (!this.insertTextAtCursor(text)) {
this.content = this.content + text;
}
};
FlowPanelModel.prototype.insertTextAtCursor = function (text, prevName) {
if (prevName === void 0) { prevName = null; }
if (!this.isDesignMode ||
typeof document === "undefined" ||
!window.getSelection)
return false;
var sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
var range = sel.getRangeAt(0);
range.deleteContents();
range.insertNode(document.createTextNode(text));
var self = this;
if (self.getContent) {
var str = self.getContent(prevName);
this.content = str;
}
return true;
}
return false;
};
FlowPanelModel.prototype.getElementContentText = function (element) {
return "{" + FlowPanelModel.contentElementNamePrefix + element.name + "}";
};
FlowPanelModel.contentElementNamePrefix = "element:";
return FlowPanelModel;
}(__WEBPACK_IMPORTED_MODULE_2__panel__["c" /* PanelModel */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("flowpanel", [{ name: "content:html", serializationProperty: "locContent" }], function () {
return new FlowPanelModel();
}, "panel");
/***/ }),
/* 87 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export arabicSurveyStrings */
var arabicSurveyStrings = {
pagePrevText: "السابق",
pageNextText: "التالي",
completeText: "إرسال البيانات",
previewText: "معاينة",
editText: "تعديل",
startSurveyText: "بداية",
otherItemText: "نص آخر",
noneItemText: "لا شيء",
selectAllItemText: "اختر الكل",
progressText: "{1} صفحة {0} من",
panelDynamicProgressText: "سجل {0} من {1}",
questionsProgressText: "تمت الإجابة على أسئلة {0} / {1}",
emptySurvey: "لا توجد صفحة مرئية أو سؤال في النموذج",
completingSurvey: "شكرا لكم لاستكمال النموذج!",
completingSurveyBefore: "تظهر سجلاتنا أنك قد أكملت هذا الاستطلاع بالفعل.",
loadingSurvey: "...يتم تحميل النموذج",
optionsCaption: "...اختر",
value: "القيمة",
requiredError: ".يرجى الإجابة على السؤال",
requiredErrorInPanel: "الرجاء الإجابة على سؤال واحد على الأقل.",
requiredInAllRowsError: "يرجى الإجابة على الأسئلة في جميع الصفوف",
numericError: "يجب أن تكون القيمة رقمية.",
textMinLength: "الرجاء إدخال ما لا يقل عن {0} حروف",
textMaxLength: "الرجاء إدخال أقل من {0} حروف",
textMinMaxLength: "يرجى إدخال أكثر من {0} وأقل من {1} حروف",
minRowCountError: "يرجى ملء ما لا يقل عن {0} الصفوف",
minSelectError: "يرجى تحديد ما لا يقل عن {0} المتغيرات",
maxSelectError: "يرجى تحديد ما لا يزيد عن {0} المتغيرات",
numericMinMax: "و'{0}' يجب أن تكون مساوية أو أكثر من {1} وتساوي أو أقل من {2}ا",
numericMin: "و'{0}' يجب أن تكون مساوية أو أكثر من {1}ا",
numericMax: "و'{0}' يجب أن تكون مساوية أو أقل من {1}ا",
invalidEmail: "الرجاء إدخال بريد الكتروني صحيح",
invalidExpression: "يجب أن يعرض التعبير: {0} 'صواب'.",
urlRequestError: "طلب إرجاع خطأ '{0}'. {1}ا",
urlGetChoicesError: "عاد طلب البيانات فارغ أو 'المسار' غير صحيح ",
exceedMaxSize: "ينبغي ألا يتجاوز حجم الملف {0}ا",
otherRequiredError: "الرجاء إدخال قيمة أخرى",
uploadingFile: "تحميل الملف الخاص بك. يرجى الانتظار عدة ثوان والمحاولة لاحقًا",
loadingFile: "جار التحميل...",
chooseFile: "اختر الملفات...",
noFileChosen: "لم تقم باختيار ملف",
confirmDelete: "هل تريد حذف السجل؟",
keyDuplicationError: "يجب أن تكون هذه القيمة فريدة.",
addColumn: "أضف العمود",
addRow: "اضافة صف",
removeRow: "إزالة صف",
addPanel: "اضف جديد",
removePanel: "إزالة",
choices_Item: "بند",
matrix_column: "عمود",
matrix_row: "صف",
savingData: "يتم حفظ النتائج على الخادم ...",
savingDataError: "حدث خطأ ولم نتمكن من حفظ النتائج.",
savingDataSuccess: "تم حفظ النتائج بنجاح!",
saveAgainButton: "حاول مجددا",
timerMin: "دقيقة",
timerSec: "ثانية",
timerSpentAll: "لقد أنفقت {0} على هذه الصفحة و {1} إجمالاً.",
timerSpentPage: "لقد أنفقت {0} على هذه الصفحة.",
timerSpentSurvey: "لقد أنفقت {0} إجمالاً.",
timerLimitAll: "لقد أنفقت {0} من {1} في هذه الصفحة و {2} من إجمالي {3}.",
timerLimitPage: "لقد أنفقت {0} من {1} في هذه الصفحة.",
timerLimitSurvey: "لقد أنفقت {0} من إجمالي {1}.",
cleanCaption: "نظيف",
clearCaption: "واضح",
chooseFileCaption: "اختر ملف",
removeFileCaption: "قم بإزالة هذا الملف",
booleanCheckedLabel: "نعم",
booleanUncheckedLabel: "لا",
confirmRemoveFile: "هل أنت متأكد أنك تريد إزالة هذا الملف: {0}؟",
confirmRemoveAllFiles: "هل أنت متأكد أنك تريد إزالة كافة الملفات؟",
questionTitlePatternText: "عنوان السؤال",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ar"] = arabicSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ar"] = "العربية";
/***/ }),
/* 88 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export bulgarianStrings */
var bulgarianStrings = {
pagePrevText: "Назад",
pageNextText: "Напред",
completeText: "Край",
previewText: "Визуализация",
editText: "редактиране",
startSurveyText: "Начало",
otherItemText: "Друго (опишете)",
noneItemText: "Нито един",
selectAllItemText: "Всички",
progressText: "стр. {0}, общо стр. {1}",
panelDynamicProgressText: "Запис {0} от {1}",
questionsProgressText: "Отговорени на {0} / {1} въпроса",
emptySurvey: "Анкетата не съдържа видими страници или въпроси.",
completingSurvey: "Благодарим ви за участието в анкетата!",
completingSurveyBefore: "Изглежда, че вие вече сте попълнили анкетата.",
loadingSurvey: "Зареждане на анкетата...",
optionsCaption: "Изберете...",
value: "value",
requiredError: "Моля, отговорете на следния въпрос.",
requiredErrorInPanel: "Моля, отговорете поне на един от въпросите.",
requiredInAllRowsError: "Моля, отговорете на въпросите на всички редове.",
numericError: "Стойността следва да бъде число.",
textMinLength: "Моля, използвайте поне {0} символа.",
textMaxLength: "Моля, използвайте не повече от {0} символа.",
textMinMaxLength: "Моля, използвайте повече от {0} и по-малко от {1} символа.",
minRowCountError: "Моля, попълнете поне {0} реда.",
minSelectError: "Моля, изберете поне {0} варианта.",
maxSelectError: "Моля, изберете не повече от {0} варианта.",
numericMinMax: "Стойността '{0}' следва да бъде равна или по-голяма от {1} и равна или по-малка от {2}",
numericMin: "Стойността '{0}' следва да бъде равна или по-голяма от {1}",
numericMax: "Стойността '{0}' следва да бъде равна или по-малка от {1}",
invalidEmail: "Моля, въведете валиден адрес на електронна поща.",
invalidExpression: "Изразът: {0} трябва да дава резултат 'true' (истина).",
urlRequestError: "Заявката води до грешка '{0}'. {1}",
urlGetChoicesError: "Заявката не връща данни или частта 'path' (път до търсения ресурс на сървъра) е неправилно зададена",
exceedMaxSize: "Размерът на файла следва да не превишава {0}.",
otherRequiredError: "Моля, въведете другата стойност.",
uploadingFile: "Вашит файл се зарежда на сървъра. Моля, изчакайте няколко секунди и тогава опитвайте отново.",
loadingFile: "Зареждане...",
chooseFile: "Изберете файл(ове)...",
noFileChosen: "Няма избран файл",
confirmDelete: "Желаете ли да изтриете записа?",
keyDuplicationError: "Стойността следва да бъде уникална.",
addColumn: "Добавяне на колона",
addRow: "Добавяне на ред",
removeRow: "Премахване на ред",
addPanel: "Добавяне на панел",
removePanel: "Премахване на панел",
choices_Item: "елемент",
matrix_column: "Колона",
matrix_row: "Ред",
savingData: "Резултатите се запазват на сървъра...",
savingDataError: "Поради възникнала грешка резултатите не можаха да бъдат запазени.",
savingDataSuccess: "Резултатите бяха запазени успешно!",
saveAgainButton: "Нов опит",
timerMin: "мин",
timerSec: "сек",
timerSpentAll: "Вие използвахте {0} на тази страница и общо {1}.",
timerSpentPage: "Вие използвахте {0} на тази страница.",
timerSpentSurvey: "Вие използвахте общо {0}.",
timerLimitAll: "Вие изпозвахте {0} от {1} на тази страница и общо {2} от {3}.",
timerLimitPage: "Вие използвахте {0} от {1} на тази страница.",
timerLimitSurvey: "Вие използвахте общо {0} от {1}.",
cleanCaption: "Изчистване",
clearCaption: "Начално състояние",
chooseFileCaption: "Изберете файл",
removeFileCaption: "Премахване на файла",
booleanCheckedLabel: "Да",
booleanUncheckedLabel: "Не",
confirmRemoveFile: "Наистина ли искате да премахнете този файл: {0}?",
confirmRemoveAllFiles: "Наистина ли искате да премахнете всички файлове?",
questionTitlePatternText: "Заглавие на въпроса",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["bg"] = bulgarianStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["bg"] = "Bulgarian";
/***/ }),
/* 89 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export catalanSurveyStrings */
var catalanSurveyStrings = {
pagePrevText: "Anterior",
pageNextText: "Següent",
completeText: "Complet",
otherItemText: "Un altre (descrigui)",
progressText: "Pàgina {0} de {1}",
emptySurvey: "No hi ha cap pàgina visible o pregunta a l'enquesta.",
completingSurvey: "Gràcies per completar l'enquesta!",
loadingSurvey: "L'enquesta s'està carregant ...",
optionsCaption: "Selecciona ...",
requiredError: "Si us plau contesti la pregunta.",
requiredInAllRowsError: "Si us plau contesti les preguntes de cada filera.",
numericError: "L'estimació ha de ser numèrica.",
textMinLength: "Si us plau entre almenys {0} símbols.",
textMaxLength: "Si us plau entre menys de {0} símbols.",
textMinMaxLength: "Si us plau entre més de {0} i menys de {1} símbols.",
minRowCountError: "Si us plau ompli almenys {0} fileres.",
minSelectError: "Si us plau seleccioni almenys {0} variants.",
maxSelectError: "Si us plau seleccioni no més de {0} variants.",
numericMinMax: "El '{0}' deu ser igual o més de {1} i igual o menys de {2}",
numericMin: "El '{0}' ha de ser igual o més de {1}",
numericMax: "El '{0}' ha de ser igual o menys de {1}",
invalidEmail: "Si us plau afegiu un correu electrònic vàlid.",
urlRequestError: "La sol·licitud va tornar error '{0}'. {1}",
urlGetChoicesError: "La sol·licitud va tornar buida de dates o la propietat 'trajectòria' no és correcta",
exceedMaxSize: "La mida de l'arxiu no pot excedir {0}.",
otherRequiredError: "Si us plau afegiu l'altra estimació.",
uploadingFile: "El seu arxiu s'està pujant. Si us plau esperi uns segons i intenteu-ho de nou.",
addRow: "Afegiu una filera",
removeRow: "Eliminar una filera",
choices_firstItem: "primer article",
choices_secondItem: "segon article",
choices_thirdItem: "tercer article",
matrix_column: "Columna",
matrix_row: "Filera"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ca"] = catalanSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ca"] = "català";
/***/ }),
/* 90 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export czechSurveyStrings */
var czechSurveyStrings = {
pagePrevText: "Předchozí",
pageNextText: "Další",
completeText: "Hotovo",
previewText: "Náhled",
editText: "Upravit",
startSurveyText: "Start",
otherItemText: "Jiná odpověď (napište)",
noneItemText: "Žádný",
selectAllItemText: "Vybrat vše",
progressText: "Strana {0} z {1}",
panelDynamicProgressText: "Záznam {0} z {1}",
questionsProgressText: "Zodpovězené otázky: {0} / {1}",
emptySurvey: "Průzkumu neobsahuje žádné otázky.",
completingSurvey: "Děkujeme za vyplnění průzkumu!",
completingSurveyBefore: "Naše záznamy ukazují, že jste tento průzkum již dokončili.",
loadingSurvey: "Probíhá načítání průzkumu...",
optionsCaption: "Vyber...",
value: "hodnota",
requiredError: "Odpovězte prosím na otázku.",
requiredErrorInPanel: "Please answer at least one question.",
requiredInAllRowsError: "Odpovězte prosím na všechny otázky.",
numericError: "V tomto poli lze zadat pouze čísla.",
textMinLength: "Zadejte prosím alespoň {0} znaků.",
textMaxLength: "Zadejte prosím méně než {0} znaků.",
textMinMaxLength: "Zadejte prosím více než {0} a méně než {1} znaků.",
minRowCountError: "Vyplňte prosím alespoň {0} řádků.",
minSelectError: "Vyberte prosím alespoň {0} varianty.",
maxSelectError: "Nevybírejte prosím více než {0} variant.",
numericMinMax: "Odpověď '{0}' by mělo být větší nebo rovno {1} a menší nebo rovno {2}",
numericMin: "Odpověď '{0}' by mělo být větší nebo rovno {1}",
numericMax: "Odpověď '{0}' by mělo být menší nebo rovno {1}",
invalidEmail: "Zadejte prosím platnou e-mailovou adresu.",
invalidExpression: "Výraz: {0} by měl vrátit hodnotu „true“.",
urlRequestError: "Požadavek vrátil chybu '{0}'. {1}",
urlGetChoicesError: "Požadavek nevrátil data nebo cesta je neplatná",
exceedMaxSize: "Velikost souboru by neměla být větší než {0}.",
otherRequiredError: "Zadejte prosím jinou hodnotu.",
uploadingFile: "Váš soubor se nahrává. Zkuste to prosím za několik sekund.",
loadingFile: "Načítání...",
chooseFile: "Vyberte soubory ...",
noFileChosen: "Není zvolený žádný soubor",
confirmDelete: "Chcete smazat záznam?",
keyDuplicationError: "Tato hodnota by měla být jedinečná.",
addColumn: "Přidat sloupec",
addRow: "Přidat řádek",
removeRow: "Odstranit",
addPanel: "Přidat nový",
removePanel: "Odstranit",
choices_Item: "položka",
matrix_column: "Sloupec",
matrix_row: "Řádek",
savingData: "Výsledky se ukládají na server ...",
savingDataError: "Došlo k chybě a výsledky jsme nemohli uložit.",
savingDataSuccess: "Výsledky byly úspěšně uloženy!",
saveAgainButton: "Zkus to znovu",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Na této stránce jste utratili celkem {0} a celkem {1}.",
timerSpentPage: "Na této stránce jste utratili {0}.",
timerSpentSurvey: "Celkem jste utratili {0}.",
timerLimitAll: "Na této stránce jste utratili {0} z {1} a celkem {2} z {3}.",
timerLimitPage: "Na této stránce jste strávili {0} z {1}.",
timerLimitSurvey: "Celkově jste utratili {0} z {1}.",
cleanCaption: "Čistý",
clearCaption: "Průhledná",
chooseFileCaption: "Vyberte soubor",
removeFileCaption: "Odeberte tento soubor",
booleanCheckedLabel: "Ano",
booleanUncheckedLabel: "Ne",
confirmRemoveFile: "Opravdu chcete odebrat tento soubor: {0}?",
confirmRemoveAllFiles: "Opravdu chcete odstranit všechny soubory?",
questionTitlePatternText: "Název otázky",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["cs"] = czechSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["cs"] = "čeština";
/***/ }),
/* 91 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export danishSurveyStrings */
var danishSurveyStrings = {
pagePrevText: "Tilbage",
pageNextText: "Videre",
completeText: "Færdig",
previewText: "Forpremiere",
editText: "Redigér",
startSurveyText: "Start",
otherItemText: "Valgfrit svar...",
noneItemText: "Ingen",
selectAllItemText: "Vælg alle",
progressText: "Side {0} af {1}",
panelDynamicProgressText: "Optag {0} af {1}",
questionsProgressText: "Besvarede {0} / {1} spørgsmål",
emptySurvey: "Der er ingen synlige spørgsmål.",
completingSurvey: "Mange tak for din besvarelse!",
completingSurveyBefore: "Vores data viser at du allerede har gennemført dette spørgeskema.",
loadingSurvey: "Spørgeskemaet hentes fra serveren...",
optionsCaption: "Vælg...",
value: "værdi",
requiredError: "Besvar venligst spørgsmålet.",
requiredErrorInPanel: "Besvar venligst mindst ét spørgsmål.",
requiredInAllRowsError: "Besvar venligst spørgsmål i alle rækker.",
numericError: "Angiv et tal.",
textMinLength: "Angiv mindst {0} tegn.",
textMaxLength: "Please enter less than {0} characters.",
textMinMaxLength: "Angiv mere end {0} og mindre end {1} tegn.",
minRowCountError: "Udfyld mindst {0} rækker.",
minSelectError: "Vælg venligst mindst {0} svarmulighed(er).",
maxSelectError: "Vælg venligst færre {0} svarmuligheder(er).",
numericMinMax: "'{0}' skal være lig med eller større end {1} og lig med eller mindre end {2}",
numericMin: "'{0}' skal være lig med eller større end {1}",
numericMax: "'{0}' skal være lig med eller mindre end {1}",
invalidEmail: "Angiv venligst en gyldig e-mail adresse.",
invalidExpression: "Udtrykket: {0} skal returnere 'true'.",
urlRequestError: "Forespørgslen returnerede fejlen '{0}'. {1}",
urlGetChoicesError: "Forespørgslen returnerede ingen data eller 'path' parameteren er forkert",
exceedMaxSize: "Filstørrelsen må ikke overstige {0}.",
otherRequiredError: "Angiv en værdi for dit valgfrie svar.",
uploadingFile: "Din fil bliver uploadet. Vent nogle sekunder og prøv eventuelt igen.",
loadingFile: "Indlæser...",
chooseFile: "Vælg fil(er)...",
noFileChosen: "Ingen fil er valgt",
confirmDelete: "Vil du fjerne den?",
keyDuplicationError: "Denne værdi skal være unik.",
addColumn: "Tilføj kolonne",
addRow: "Tilføj række",
removeRow: "Fjern",
addPanel: "Tilføj ny",
removePanel: "Fjern",
choices_Item: "valg",
matrix_column: "Kolonne",
matrix_row: "Række",
savingData: "Resultaterne bliver gemt på serveren...",
savingDataError: "Der opstod en fejl og vi kunne ikke gemme resultatet.",
savingDataSuccess: "Resultatet blev gemt!",
saveAgainButton: "Prøv igen",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Du har brugt {0} på denne side og {1} i alt.",
timerSpentPage: "Du har brugt {0} på denne side.",
timerSpentSurvey: "Du har brugt {0} i alt.",
timerLimitAll: "Du har brugt {0} af {1} på denne side og {2} af {3} i alt.",
timerLimitPage: "Du har brugt {0} af {1} på denne side.",
timerLimitSurvey: "Du har brugt {0} af {1} i alt.",
cleanCaption: "Rens",
clearCaption: "Fjern",
chooseFileCaption: "Vælg fil",
removeFileCaption: "Fjern denne fil",
booleanCheckedLabel: "Ja",
booleanUncheckedLabel: "Ingen",
confirmRemoveFile: "Er du sikker på, at du vil fjerne denne fil: {0}?",
confirmRemoveAllFiles: "Er du sikker på, at du vil fjerne alle filer?",
questionTitlePatternText: "Spørgsmåls titel",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["da"] = danishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["da"] = "dansk";
/***/ }),
/* 92 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export dutchSurveyStrings */
//Created on behalf https://github.com/Frank13
//Modified on behalf Roeland Verbakel
var dutchSurveyStrings = {
pagePrevText: "Vorige",
pageNextText: "Volgende",
completeText: "Verzenden",
previewText: "Voorbeeld",
editText: "Bewerk",
startSurveyText: "Begin met",
otherItemText: "Anders, nl.",
noneItemText: "Geen",
selectAllItemText: "Selecteer Alles",
progressText: "Pagina {0} van {1}",
panelDynamicProgressText: "Record {0} of {1}",
questionsProgressText: "Geantwoord {0}/{1} vragen",
emptySurvey: "Er is geen zichtbare pagina of vraag in deze vragenlijst",
completingSurvey: "Bedankt voor het invullen van de vragenlijst",
completingSurveyBefore: "Onze gegevens tonen aan dat je deze vragenlijst reeds beantwoord hebt.",
loadingSurvey: "De vragenlijst is aan het laden...",
optionsCaption: "Kies...",
value: "waarde",
requiredError: "Dit is een vereiste vraag",
requiredErrorInPanel: "Gelieve ten minste een vraag te beantwoorden.",
requiredInAllRowsError: "Deze vraag vereist één antwoord per rij",
numericError: "Het antwoord moet een getal zijn",
textMinLength: "Vul minstens {0} karakters in",
textMaxLength: "Gelieve minder dan {0} karakters in te vullen.",
textMinMaxLength: "Gelieve meer dan {0} en minder dan {1} karakters in te vullen.",
minRowCountError: "Gelieve ten minste {0} rijen in te vullen.",
minSelectError: "Selecteer minimum {0} antwoorden",
maxSelectError: "Selecteer niet meer dan {0} antwoorden",
numericMinMax: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1} en kleiner of gelijk aan {2}",
numericMin: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1}",
numericMax: "Uw antwoord '{0}' moet groter of gelijk zijn aan {1}",
invalidEmail: "Vul een geldig e-mailadres in",
invalidExpression: "De uitdrukking: {0} moet 'waar' teruggeven.",
urlRequestError: "De vraag keerde een fout terug '{0}'. {1}",
urlGetChoicesError: "De vraag gaf een leeg antwoord terug of de 'pad' eigenschap is niet correct",
exceedMaxSize: "De grootte van het bestand mag niet groter zijn dan {0}",
otherRequiredError: "Vul het veld 'Anders, nl.' in",
uploadingFile: "Uw bestand wordt opgeladen. Gelieve enkele seconden te wachten en opnieuw te proberen.",
loadingFile: "Opladen...",
chooseFile: "Kies uw bestand(en)...",
noFileChosen: "Geen bestand gekozen",
confirmDelete: "Wil je deze gegevens verwijderen?",
keyDuplicationError: "Deze waarde moet uniek zijn.",
addColumn: "Voeg kolom toe",
addRow: "Voeg rij toe",
removeRow: "Verwijder",
addPanel: "Nieuwe toevoegen",
removePanel: "Verwijder",
choices_Item: "onderwerp",
matrix_column: "Kolom",
matrix_row: "Rij",
savingData: "De resultaten worden bewaard op de server...",
savingDataError: "Er was een probleem en we konden de resultaten niet bewaren.",
savingDataSuccess: "De resultaten werden succesvol bewaard!",
saveAgainButton: "Probeer opnieuw",
timerMin: "minimum",
timerSec: "sec",
timerSpentAll: "U heeft {0} gespendeerd op deze pagina en {1} in totaal.",
timerSpentPage: "U heeft {0} op deze pagina gespendeerd.",
timerSpentSurvey: "U heeft in totaal {0} gespendeerd.",
timerLimitAll: "U heeft {0} van {1} op deze pagina gespendeerd en {2} van {3} in totaal.",
timerLimitPage: "U heeft {0} van {1} gespendeerd op deze pagina.",
timerLimitSurvey: "U heeft {0} van {1} in het totaal.",
cleanCaption: "Kuis op",
clearCaption: "Kuis op",
chooseFileCaption: "Gekozen bestand",
removeFileCaption: "Verwijder deze file",
booleanCheckedLabel: "Ja",
booleanUncheckedLabel: "Neen",
confirmRemoveFile: "Bent u zeker dat u deze file wilt verwijderen: {0}?",
confirmRemoveAllFiles: "Bent u zeker dat u al deze files wilt verwijderen?",
questionTitlePatternText: "Titel van de vraag",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["nl"] = dutchSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["nl"] = "nederlands";
/***/ }),
/* 93 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export estonianSurveyStrings */
var estonianSurveyStrings = {
pagePrevText: "Tagasi",
pageNextText: "Edasi",
completeText: "Lõpeta",
previewText: "Eelvaade",
editText: "Muuda",
startSurveyText: "Alusta",
otherItemText: "Muu (täpsusta)",
noneItemText: "Mitte midagi",
selectAllItemText: "Vali kõik",
progressText: "Lehekülg {0}/{1}",
panelDynamicProgressText: "Kirje {0}/{1}",
questionsProgressText: "Vastatud {0} küsimust {1}-st",
emptySurvey: "Selles uuringus ei ole ühtki nähtavat lehekülge või küsimust.",
completingSurvey: "Aitäh, et vastasid ankeedile!",
completingSurveyBefore: "Meie andmetel oled sa sellele ankeedile juba vastanud.",
loadingSurvey: "Laen ankeeti...",
optionsCaption: "Vali...",
value: "väärtus",
requiredError: "Palun vasta küsimusele.",
requiredErrorInPanel: "Palun vasta vähemalt ühele küsimusele.",
requiredInAllRowsError: "Palun anna vastus igal real.",
numericError: "See peaks olema numbriline väärtus.",
textMinLength: "Palun sisesta vähemalt {0} tähemärki.",
textMaxLength: "Palun ära sisesta rohkem kui {0} tähemärki.",
textMinMaxLength: "Sisesta palun {0} - {1} tähemärki.",
minRowCountError: "Sisesta plaun vähemalt {0} rida.",
minSelectError: "Palun vali vähemalt {0} varianti.",
maxSelectError: "Palun vali kõige rohkem {0} varianti.",
numericMinMax: "'{0}' peaks olema võrdne või suurem kui {1} ja võrdne või väiksem kui {2}",
numericMin: "'{0}' peaks olema võrdne või suurem kui {1}",
numericMax: "'{0}' peaks olema võrnde või väiksem kui {1}",
invalidEmail: "Sisesta palun korrektne e-posti aadress.",
invalidExpression: "Avaldis: {0} peaks tagastama tõese.",
urlRequestError: "Taotlus tagastas vea „{0}”. {1}",
urlGetChoicesError: "Taotlus tagastas tühjad andmed või atribuut 'path' on vale",
exceedMaxSize: "Faili suurus ei tohi ületada {0}.",
otherRequiredError: "Sisesta palun muu vastus.",
uploadingFile: "Sinu fail laeb üles. Palun oota mõned sekundid ning proovi seejärel uuesti.",
loadingFile: "Laen...",
chooseFile: "Vali fail(id)...",
noFileChosen: "Faili pole valitud",
confirmDelete: "Kas tahad kirje kustutada?",
keyDuplicationError: "See väärtus peab olema unikaalne.",
addColumn: "Lisa veerg",
addRow: "Lisa rida",
removeRow: "Eemalda",
addPanel: "Lisa uus",
removePanel: "Eemalda",
choices_Item: "üksus",
matrix_column: "Veerg",
matrix_row: "Rida",
savingData: "Salvestan andmed serveris...",
savingDataError: "Tekkis viga ning me ei saanud vastuseid salvestada.",
savingDataSuccess: "Vastuste salvestamine õnnestus!",
saveAgainButton: "Proovi uuesti",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Oled veetnud {0} sellel lehel ning kokku {1}.",
timerSpentPage: "Oled veetnud {0} sellel lehel.",
timerSpentSurvey: "Oled veetnud {0} kokku.",
timerLimitAll: "Oled kulutanud {0} võimalikust {1} sellel lehel ning {2} võimalikust {3} kokku.",
timerLimitPage: "Oled kulutanud {0} võimalikust {1} sellel lehel.",
timerLimitSurvey: "Oled kulutanud {0} võimalikust {1} koguajast.",
cleanCaption: "Puhasta",
clearCaption: "Puhasta",
chooseFileCaption: "Vali fail",
removeFileCaption: "Eemalda see fail",
booleanCheckedLabel: "Jah",
booleanUncheckedLabel: "Ei",
confirmRemoveFile: "Oled sa kindel, et soovid selle faili eemaldada: {0}?",
confirmRemoveAllFiles: "Oled sa kindel, et soovid eemaldada kõik failid?",
questionTitlePatternText: "Küsimuse pealkiri",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["et"] = estonianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["et"] = "eesti keel";
/***/ }),
/* 94 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export finnishSurveyStrings */
var finnishSurveyStrings = {
pagePrevText: "Edellinen",
pageNextText: "Seuraava",
completeText: "Valmis",
previewText: "Esikatselu",
editText: "Muokata",
startSurveyText: "alkaa",
otherItemText: "Muu (kuvaile)",
noneItemText: "Ei mitään",
selectAllItemText: "Valitse kaikki",
progressText: "Sivu {0}/{1}",
panelDynamicProgressText: "Nauhoita {0} / {1}",
questionsProgressText: "Vastasi kysymyksiin {0} / {1}",
emptySurvey: "Tässä kyselyssä ei ole yhtäkään näkyvillä olevaa sivua tai kysymystä.",
completingSurvey: "Kiitos kyselyyn vastaamisesta!",
completingSurveyBefore: "Tietojemme mukaan olet jo suorittanut tämän kyselyn.",
loadingSurvey: "Kyselyä ladataan palvelimelta...",
optionsCaption: "Valitse...",
value: "arvo",
requiredError: "Vastaa kysymykseen, kiitos.",
requiredErrorInPanel: "Vastaa ainakin yhteen kysymykseen.",
requiredInAllRowsError: "Vastaa kysymyksiin kaikilla riveillä.",
numericError: "Arvon tulee olla numeerinen.",
textMinLength: "Ole hyvä ja syötä vähintään {0} merkkiä.",
textMaxLength: "Anna alle {0} merkkiä.",
textMinMaxLength: "Anna yli {0} ja alle {1} merkkiä.",
minRowCountError: "Täytä vähintään {0} riviä.",
minSelectError: "Ole hyvä ja valitse vähintään {0} vaihtoehtoa.",
maxSelectError: "Ole hyvä ja valitse enintään {0} vaihtoehtoa.",
numericMinMax: "'{0}' täytyy olla enemmän tai yhtä suuri kuin {1} ja vähemmän tai yhtä suuri kuin {2}",
numericMin: "'{0}' täytyy olla enemmän tai yhtä suuri kuin {1}",
numericMax: "'{0}' täytyy olla vähemmän tai yhtä suuri kuin {1}",
invalidEmail: "Syötä validi sähköpostiosoite.",
invalidExpression: "Lausekkeen: {0} pitäisi palauttaa 'true'.",
urlRequestError: "Pyyntö palautti virheen {0}. {1}",
urlGetChoicesError: "Pyyntö palautti tyhjät tiedot tai polku-ominaisuus on väärä",
exceedMaxSize: "Tiedoston koko ei saa olla suurempi kuin {0}.",
otherRequiredError: "Anna toinen arvo.",
uploadingFile: "Tiedostoa ladataan. Odota muutama sekunti ja yritä uudelleen.",
loadingFile: "Ladataan...",
chooseFile: "Valitse tiedosto (t) ...",
noFileChosen: "Ei tiedostoa valittuna",
confirmDelete: "Haluatko poistaa tietueen?",
keyDuplicationError: "Tämän arvon tulisi olla ainutlaatuinen.",
addColumn: "Lisää sarake",
addRow: "Lisää rivi",
removeRow: "Poista",
addPanel: "Lisää uusi",
removePanel: "Poista",
choices_Item: "kohde",
matrix_column: "Sarake",
matrix_row: "Rivi",
savingData: "Tulokset tallennetaan palvelimelle ...",
savingDataError: "Tapahtui virhe, emmekä voineet tallentaa tuloksia.",
savingDataSuccess: "Tulokset tallennettiin onnistuneesti!",
saveAgainButton: "Yritä uudelleen",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Olet käyttänyt {0} tällä sivulla ja yhteensä {1}.",
timerSpentPage: "Olet viettänyt {0} tällä sivulla.",
timerSpentSurvey: "Olet käyttänyt yhteensä {0}.",
timerLimitAll: "Olet käyttänyt tällä sivulla {0} / {1} ja yhteensä {2} / {3}.",
timerLimitPage: "Olet käyttänyt {0} / {1} tällä sivulla.",
timerLimitSurvey: "Olet käyttänyt yhteensä {0} / {1}.",
cleanCaption: "Puhdas",
clearCaption: "Asia selvä",
chooseFileCaption: "Valitse tiedosto",
removeFileCaption: "Poista tämä tiedosto",
booleanCheckedLabel: "Joo",
booleanUncheckedLabel: "Ei",
confirmRemoveFile: "Haluatko varmasti poistaa tämän tiedoston: {0}?",
confirmRemoveAllFiles: "Haluatko varmasti poistaa kaikki tiedostot?",
questionTitlePatternText: "Kysymyksen otsikko",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fi"] = finnishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["fi"] = "suomalainen";
/***/ }),
/* 95 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export frenchSurveyStrings */
var frenchSurveyStrings = {
pagePrevText: "Précédent",
pageNextText: "Suivant",
completeText: "Terminer",
previewText: "Aperçu",
editText: "Éditer",
startSurveyText: "Commencer",
otherItemText: "Autre (préciser)",
noneItemText: "Aucun",
selectAllItemText: "Tout sélectionner",
progressText: "Page {0} sur {1}",
panelDynamicProgressText: "Enregistrement {0} sur {1}",
questionsProgressText: "{0}/{1} question(s) répondue(s)",
emptySurvey: "Il n'y a ni page visible ni question visible dans ce questionnaire",
completingSurvey: "Merci d'avoir répondu au questionnaire !",
completingSurveyBefore: "Nos données indiquent que vous avez déjà rempli ce questionnaire.",
loadingSurvey: "Le questionnaire est en cours de chargement...",
optionsCaption: "Choisissez...",
value: "valeur",
requiredError: "La réponse à cette question est obligatoire.",
requiredErrorInPanel: "Merci de répondre au moins à une question.",
requiredInAllRowsError: "Toutes les lignes sont obligatoires",
numericError: "La réponse doit être un nombre.",
textMinLength: "Merci de saisir au moins {0} caractères.",
textMaxLength: "Merci de saisir moins de {0} caractères.",
textMinMaxLength: "Merci de saisir entre {0} et {1} caractères.",
minRowCountError: "Merci de compléter au moins {0} lignes.",
minSelectError: "Merci de sélectionner au minimum {0} réponses.",
maxSelectError: "Merci de sélectionner au maximum {0} réponses.",
numericMinMax: "Votre réponse '{0}' doit être supérieure ou égale à {1} et inférieure ou égale à {2}",
numericMin: "Votre réponse '{0}' doit être supérieure ou égale à {1}",
numericMax: "Votre réponse '{0}' doit être inférieure ou égale à {1}",
invalidEmail: "Merci d'entrer une adresse mail valide.",
invalidExpression: "L'expression: {0} doit retourner 'true'.",
urlRequestError: "La requête a renvoyé une erreur '{0}'. {1}",
urlGetChoicesError: "La requête a renvoyé des données vides ou la propriété 'path' est incorrecte",
exceedMaxSize: "La taille du fichier ne doit pas excéder {0}.",
otherRequiredError: "Merci de préciser le champ 'Autre'.",
uploadingFile: "Votre fichier est en cours de chargement. Merci d'attendre quelques secondes et de réessayer.",
loadingFile: "Chargement...",
chooseFile: "Ajouter des fichiers...",
noFileChosen: "Aucun fichier ajouté",
confirmDelete: "Voulez-vous supprimer cet enregistrement ?",
keyDuplicationError: "Cette valeur doit être unique.",
addColumn: "Ajouter une colonne",
addRow: "Ajouter une ligne",
removeRow: "Supprimer",
addPanel: "Ajouter",
removePanel: "Supprimer",
choices_Item: "item",
matrix_column: "Colonne",
matrix_row: "Ligne",
savingData: "Les résultats sont en cours de sauvegarde sur le serveur...",
savingDataError: "Une erreur est survenue et a empêché la sauvegarde des résultats.",
savingDataSuccess: "Les résultats ont bien été enregistrés !",
saveAgainButton: "Réessayer",
timerMin: "min",
timerSec: "sec",
timerSpentAll: "Vous avez passé {0} sur cette page et {1} au total.",
timerSpentPage: "Vous avez passé {0} sur cette page.",
timerSpentSurvey: "Vous avez passé {0} au total.",
timerLimitAll: "Vous avez passé {0} sur {1} sur cette page et {2} sur {3} au total.",
timerLimitPage: "Vous avez passé {0} sur {1} sur cette page.",
timerLimitSurvey: "Vous avez passé {0} sur {1} au total.",
cleanCaption: "Nettoyer",
clearCaption: "Vider",
chooseFileCaption: "Ajouter un fichier",
removeFileCaption: "Enlever ce fichier",
booleanCheckedLabel: "Oui",
booleanUncheckedLabel: "Non",
confirmRemoveFile: "Êtes-vous certains de vouloir supprimer ce fichier : {0}?",
confirmRemoveAllFiles: "Êtes-vous certains de vouloir supprimer tous les fichiers?",
questionTitlePatternText: "Titre de la question",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fr"] = frenchSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["fr"] = "français";
/***/ }),
/* 96 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export georgianSurveyStrings */
var georgianSurveyStrings = {
pagePrevText: "უკან",
pageNextText: "შემდეგ",
completeText: "დასრულება",
progressText: "გვერდი {0} / {1}",
emptySurvey: "არცერთი კითხვა არ არის.",
completingSurvey: "გმადლობთ კითხვარის შევსებისთვის!",
loadingSurvey: "ჩატვირთვა სერვერიდან...",
otherItemText: "სხვა (გთხოვთ მიუთითეთ)",
optionsCaption: "არჩევა...",
requiredError: "გთხოვთ უპასუხეთ კითხვას.",
numericError: "პასუხი უნდა იყოს რიცხვი.",
textMinLength: "გთხოვთ შეიყვანეთ არანაკლებ {0} სიმბოლო.",
minSelectError: "გთხოვთ აირჩიეთ არანაკლებ {0} ვარიანტი.",
maxSelectError: "გთხოვთ აირჩიეთ არაუმეტეს {0} ვარიანტი.",
numericMinMax: "'{0}' უნდა იყოს მეტი ან ტოლი, ვიდრე {1}, და ნაკლები ან ტოლი ვიდრე {2}",
numericMin: "'{0}' უნდა იყოს მეტი ან ტოლი ვიდრე {1}",
numericMax: "'{0}' უნდა იყოს ნაკლები ან ტოლი ვიდრე {1}",
invalidEmail: "გთხოვთ შეიყვანოთ ელ. ფოსტის რეალური მისამართი.",
otherRequiredEror: "გთხოვთ შეავსეთ ველი 'სხვა'"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ka"] = georgianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ka"] = "ქართული";
/***/ }),
/* 97 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export germanSurveyStrings */
var germanSurveyStrings = {
pagePrevText: "Zurück",
pageNextText: "Weiter",
completeText: "Abschließen",
previewText: "Vorschau",
editText: "Bearbeiten",
startSurveyText: "Start",
otherItemText: "Sonstiges (Bitte angeben)",
noneItemText: "Nichts trifft zu",
selectAllItemText: "Alles auswählen",
progressText: "Seite {0} von {1}",
panelDynamicProgressText: "Eintrag {0} von {1}",
questionsProgressText: "{0}/{1} Fragen beantwortet",
emptySurvey: "Es sind keine Fragen vorhanden.",
completingSurvey: "Vielen Dank, dass Sie die Umfrage abgeschlossen haben!",
completingSurveyBefore: "Wir haben festgestellt, dass Sie diese Umfrage bereits abgeschlossen haben.",
loadingSurvey: "Umfrage wird geladen...",
optionsCaption: "Bitte auswählen...",
value: "Wert",
requiredError: "Bitte beantworten Sie diese Frage.",
requiredErrorInPanel: "Bitte beantworten Sie mindestens eine Frage.",
requiredInAllRowsError: "Bitte beantworten Sie alle Fragen.",
numericError: "Der Wert muss eine Zahl sein.",
textMinLength: "Bitte geben Sie mindestens {0} Zeichen ein.",
textMaxLength: "Bitte geben Sie nicht mehr als {0} Zeichen ein.",
textMinMaxLength: "Bitte geben Sie mindestens {0} und maximal {1} Zeichen ein.",
minRowCountError: "Bitte machen Sie in mindestens {0} Zeilen eine Eingabe.",
minSelectError: "Bitte wählen Sie mindestens {0} Antwort(en) aus.",
maxSelectError: "Bitte wählen Sie nicht mehr als {0} Antwort(en) aus.",
numericMinMax: "'{0}' muss größer oder gleich {1} und kleiner oder gleich {2} sein",
numericMin: "'{0}' muss größer oder gleich {1} sein",
numericMax: "'{0}' muss kleiner oder gleich {1} sein",
invalidEmail: "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
invalidExpression: "Der Ausdruck: {0} muss den Wert 'wahr' zurückgeben.",
urlRequestError: "Ein Netzwerkdienst hat folgenden Fehler zurückgegeben '{0}'. {1}",
urlGetChoicesError: "Eine Netzwerkdienst hat ungültige Daten zurückgegeben",
exceedMaxSize: "Die Datei darf nicht größer als {0} sein.",
otherRequiredError: "Bitte geben Sie einen Wert an.",
uploadingFile: "Bitte warten Sie bis der Upload Ihrer Dateien abgeschlossen ist.",
loadingFile: "Wird hochgeladen...",
chooseFile: "Datei(en) auswählen...",
noFileChosen: "Keine Datei ausgewählt",
confirmDelete: "Wollen Sie den Eintrag löschen?",
keyDuplicationError: "Dieser Wert muss einmalig sein.",
addColumn: "Spalte hinzufügen",
addRow: "Zeile hinzufügen",
removeRow: "Entfernen",
addPanel: "Neu hinzufügen",
removePanel: "Entfernen",
choices_Item: "Element",
matrix_column: "Spalte",
matrix_row: "Zeile",
savingData: "Die Ergebnisse werden auf dem Server gespeichert...",
savingDataError: "Es ist ein Fehler aufgetreten. Die Ergebnisse konnten nicht gespeichert werden.",
savingDataSuccess: "Die Ergebnisse wurden gespeichert!",
saveAgainButton: "Erneut absenden",
timerMin: "Min.",
timerSec: "Sek.",
timerSpentAll: "Sie waren {0} auf dieser Seite und brauchten insgesamt {1}.",
timerSpentPage: "Sie waren {0} auf dieser Seite.",
timerSpentSurvey: "Sie haben insgesamt {0} gebraucht.",
timerLimitAll: "Sie waren {0} von {1} auf dieser Seite und brauchten insgesamt {2} von {3}.",
timerLimitPage: "Sie waren {0} von {1} auf dieser Seite.",
timerLimitSurvey: "Sie haben insgesamt {0} von {1} gebraucht.",
cleanCaption: "Alles löschen",
clearCaption: "Auswahl entfernen",
chooseFileCaption: "Datei auswählen",
removeFileCaption: "Datei löschen",
booleanCheckedLabel: "Ja",
booleanUncheckedLabel: "Nein",
confirmRemoveFile: "Sind Sie sicher, dass Sie diese Datei löschen möchten: {0}?",
confirmRemoveAllFiles: "Sind Sie sicher, dass Sie alle Dateien löschen möchten?",
questionTitlePatternText: "Fragentitel",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["de"] = germanSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["de"] = "deutsch";
/***/ }),
/* 98 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export greekSurveyStrings */
//Created by https://github.com/agelospanagiotakis
var greekSurveyStrings = {
pagePrevText: "Προηγούμενο",
pageNextText: "Επόμενο",
completeText: "Ολοκλήρωση",
previewText: "Προεπισκόπηση",
editText: "Επεξεργασία",
startSurveyText: "Αρχή",
otherItemText: "Άλλο (παρακαλώ διευκρινίστε)",
noneItemText: "Κανένας",
selectAllItemText: "Επιλογή όλων",
progressText: "Σελίδα {0} από {1}",
panelDynamicProgressText: "Εγγραφή {0} από {1}",
questionsProgressText: "Απαντήθηκαν {0} / {1} ερωτήσεις",
emptySurvey: "Δεν υπάρχει καμία ορατή σελίδα ή ορατή ερώτηση σε αυτό το ερωτηματολόγιο.",
completingSurvey: "Ευχαριστούμε για την συμπλήρωση αυτού του ερωτηματολογίου!",
completingSurveyBefore: "Τα αρχεία μας δείχνουν ότι έχετε ήδη ολοκληρώσει αυτήν την έρευνα.",
loadingSurvey: "Το ερωτηματολόγιο φορτώνεται απο το διακομιστή...",
optionsCaption: "Επιλέξτε...",
value: "αξία",
requiredError: "Παρακαλώ απαντήστε στην ερώτηση.",
requiredErrorInPanel: "Απαντήστε σε τουλάχιστον μία ερώτηση.",
requiredInAllRowsError: "Παρακαλώ απαντήστε στις ερωτήσεις σε όλες τις γραμμές.",
numericError: "Η τιμή πρέπει να είναι αριθμητική.",
textMinLength: "Παρακαλώ συμπληρώστε τουλάχιστον {0} σύμβολα.",
textMaxLength: "Εισαγάγετε λιγότερους από {0} χαρακτήρες.",
textMinMaxLength: "Εισαγάγετε περισσότερους από {0} και λιγότερους από {1} χαρακτήρες.",
minRowCountError: "Παρακαλώ συμπληρώστε τουλάχιστον {0} γραμμές.",
minSelectError: "Παρακαλώ επιλέξτε τουλάχιστον {0} παραλλαγές.",
maxSelectError: "Παρακαλώ επιλέξτε όχι παραπάνω απο {0} παραλλαγές.",
numericMinMax: "Το '{0}' θα πρέπει να είναι ίσο ή μεγαλύτερο απο το {1} και ίσο ή μικρότερο απο το {2}",
numericMin: "Το '{0}' πρέπει να είναι μεγαλύτερο ή ισο με το {1}",
numericMax: "Το '{0}' πρέπει να είναι μικρότερο ή ίσο απο το {1}",
invalidEmail: "Παρακαλώ δώστε μια αποδεκτή διεύθυνση e-mail.",
invalidExpression: "Η έκφραση: {0} θα πρέπει να επιστρέψει 'true'.",
urlRequestError: "Η αίτηση επέστρεψε σφάλμα '{0}'. {1}",
urlGetChoicesError: "Η αίτηση επέστρεψε κενά δεδομένα ή η ιδιότητα 'μονοπάτι/path' είναι εσφαλμένη",
exceedMaxSize: "Το μέγεθος δεν μπορεί να υπερβαίνει τα {0}.",
otherRequiredError: "Παρακαλώ συμπληρώστε την τιμή για το πεδίο 'άλλο'.",
uploadingFile: "Το αρχείο σας ανεβαίνει. Παρακαλώ περιμένετε καποια δευτερόλεπτα και δοκιμάστε ξανά.",
loadingFile: "Φόρτωση...",
chooseFile: "Επιλογή αρχείων ...",
noFileChosen: "Δεν έχει επιλεγεί αρχείο",
confirmDelete: "Θέλετε να διαγράψετε την εγγραφή;",
keyDuplicationError: "Αυτή η τιμή πρέπει να είναι μοναδική.",
addColumn: "Προσθήκη στήλης",
addRow: "Προσθήκη γραμμής",
removeRow: "Αφαίρεση",
addPanel: "Προσθεσε νεο",
removePanel: "Αφαιρώ",
choices_Item: "είδος",
matrix_column: "Στήλη",
matrix_row: "Σειρά",
savingData: "Τα αποτελέσματα αποθηκεύονται στον διακομιστή ...",
savingDataError: "Παρουσιάστηκε σφάλμα και δεν ήταν δυνατή η αποθήκευση των αποτελεσμάτων.",
savingDataSuccess: "Τα αποτελέσματα αποθηκεύτηκαν με επιτυχία!",
saveAgainButton: "Προσπάθησε ξανά",
timerMin: "ελάχ",
timerSec: "δευτ",
timerSpentAll: "Έχετε δαπανήσει {0} σε αυτήν τη σελίδα και {1} συνολικά.",
timerSpentPage: "Έχετε ξοδέψει {0} σε αυτήν τη σελίδα.",
timerSpentSurvey: "Έχετε ξοδέψει συνολικά {0}.",
timerLimitAll: "Έχετε δαπανήσει {0} από {1} σε αυτήν τη σελίδα και {2} από {3} συνολικά.",
timerLimitPage: "Έχετε ξοδέψει {0} από {1} σε αυτήν τη σελίδα.",
timerLimitSurvey: "Έχετε ξοδέψει {0} από {1} συνολικά.",
cleanCaption: "ΚΑΘΑΡΗ",
clearCaption: "Σαφή",
chooseFileCaption: "Επιλέξτε το αρχείο",
removeFileCaption: "Καταργήστε αυτό το αρχείο",
booleanCheckedLabel: "Ναί",
booleanUncheckedLabel: "Οχι",
confirmRemoveFile: "Είστε βέβαιοι ότι θέλετε να καταργήσετε αυτό το αρχείο: {0};",
confirmRemoveAllFiles: "Είστε βέβαιοι ότι θέλετε να καταργήσετε όλα τα αρχεία;",
questionTitlePatternText: "Τίτλος ερώτησης",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["gr"] = greekSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["gr"] = "ελληνικά";
/***/ }),
/* 99 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export hebrewSurveyStrings */
var hebrewSurveyStrings = {
pagePrevText: "אחורה",
pageNextText: "קדימה",
completeText: "סיום",
previewText: "תצוגה מקדימה",
editText: "לַעֲרוֹך",
startSurveyText: "הַתחָלָה",
otherItemText: "אחר (נא לתאר)",
noneItemText: "אף אחד",
selectAllItemText: "בחר הכל",
progressText: "דף {1} מתוך {0}",
panelDynamicProgressText: "הקלטה {0} מתוך {1}",
questionsProgressText: "ענה על שאלות",
emptySurvey: "אין שאלות",
completingSurvey: "תודה על מילוי השאלון!",
completingSurveyBefore: "הרשומות שלנו מראות שכבר סיימת את הסקר הזה.",
loadingSurvey: "טעינה מהשרת...",
optionsCaption: "בחר...",
value: "ערך",
requiredError: "אנא השב על השאלה",
requiredErrorInPanel: "אנא ענה לפחות על שאלה אחת.",
requiredInAllRowsError: "אנא ענה על שאלות בכל השורות.",
numericError: "התשובה צריכה להיות מספר.",
textMinLength: "הזן לפחות {0} תווים.",
textMaxLength: "הזן פחות מ- {0} תווים.",
textMinMaxLength: "הזן יותר מ- {0} ופחות מ- {1} תווים.",
minRowCountError: "אנא מלא לפחות {0} שורות.",
minSelectError: "בחר לפחות {0} אפשרויות.",
maxSelectError: "בחר עד {0} אפשרויות.",
numericMinMax: "'{0}' חייב להיות שווה או גדול מ {1}, ושווה ל- {2} או פחות מ- {}}",
numericMin: "'{0}' חייב להיות שווה או גדול מ {1}",
numericMax: "'{0}' חייב להיות שווה או קטן מ {1}",
invalidEmail: 'הזן כתובת דוא"ל חוקית.',
invalidExpression: "הביטוי: {0} צריך להחזיר 'אמת'.",
urlRequestError: "הבקשה החזירה את השגיאה '{0}'. {1}",
urlGetChoicesError: "הבקשה החזירה נתונים ריקים או שהמאפיין 'נתיב' שגוי",
exceedMaxSize: "גודל הקובץ לא יעלה על {0}.",
otherRequiredError: 'נא להזין נתונים בשדה "אחר"',
uploadingFile: "הקובץ שלך נטען. המתן מספר שניות ונסה שוב.",
loadingFile: "טוען...",
chooseFile: "לבחור קבצים...",
noFileChosen: "לא נבחר קובץ",
confirmDelete: "האם אתה רוצה למחוק את הרשומה?",
keyDuplicationError: "ערך זה צריך להיות ייחודי.",
addColumn: "הוסף עמודה",
addRow: "להוסיף שורה",
removeRow: "לְהַסִיר",
addPanel: "הוסף חדש",
removePanel: "לְהַסִיר",
choices_Item: "פריט",
matrix_column: "טור",
matrix_row: "שׁוּרָה",
savingData: "התוצאות נשמרות בשרת ...",
savingDataError: "אירעה שגיאה ולא הצלחנו לשמור את התוצאות.",
savingDataSuccess: "התוצאות נשמרו בהצלחה!",
saveAgainButton: "נסה שוב",
timerMin: "דקה",
timerSec: "שניות",
timerSpentAll: "הוצאת {0} בדף זה ובסך הכל {1}.",
timerSpentPage: "הוצאת {0} בדף זה.",
timerSpentSurvey: "הוצאת סכום כולל של {0}.",
timerLimitAll: "הוצאת {0} מתוך {1} בדף זה ו- {2} מתוך {3} בסך הכל.",
timerLimitPage: "הוצאת {0} מתוך {1} בדף זה.",
timerLimitSurvey: "הוצאת סכום כולל של {0} מתוך {1}.",
cleanCaption: "לְנַקוֹת",
clearCaption: "ברור",
chooseFileCaption: "בחר קובץ",
removeFileCaption: "הסר קובץ זה",
booleanCheckedLabel: "כן",
booleanUncheckedLabel: "לא",
confirmRemoveFile: "האם אתה בטוח שברצונך להסיר קובץ זה: {0}?",
confirmRemoveAllFiles: "האם אתה בטוח שברצונך להסיר את כל הקבצים?",
questionTitlePatternText: "כותרת שאלה",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["he"] = hebrewSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["he"] = "עברית";
/***/ }),
/* 100 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export hungarianSurveyStrings */
var hungarianSurveyStrings = {
pagePrevText: "Vissza",
pageNextText: "Tovább",
completeText: "Kész",
previewText: "Előnézet",
editText: "Szerkesztés",
startSurveyText: "Rajt",
otherItemText: "Egyéb (adja meg)",
noneItemText: "Egyik sem",
selectAllItemText: "Mindet kiválaszt",
progressText: "{0}./{1} oldal",
panelDynamicProgressText: "{0} / {1} rekord",
questionsProgressText: "Válaszolt kérdések: {0} / {1}",
emptySurvey: "There is no visible page or question in the survey.",
completingSurvey: "Köszönjük, hogy kitöltötte felmérésünket!",
completingSurveyBefore: "Már kitöltötte a felmérést.",
loadingSurvey: "Felmérés betöltése...",
optionsCaption: "Válasszon...",
value: "érték",
requiredError: "Kérjük, válaszolja meg ezt a kérdést!",
requiredErrorInPanel: "Kérjük, válaszoljon legalább egy kérdésre.",
requiredInAllRowsError: "Kérjük adjon választ minden sorban!",
numericError: "Az érték szám kell, hogy legyen!",
textMinLength: "Adjon meg legalább {0} karaktert!",
textMaxLength: "Legfeljebb {0} karaktert adjon meg!",
textMinMaxLength: "Adjon meg legalább {0}, de legfeljebb {1} karaktert!",
minRowCountError: "Töltsön ki minimum {0} sort!",
minSelectError: "Válasszon ki legalább {0} lehetőséget!",
maxSelectError: "Ne válasszon többet, mint {0} lehetőség!",
numericMinMax: "'{0}' legyen nagyobb, vagy egyenlő, mint {1} és kisebb, vagy egyenlő, mint {2}!",
numericMin: "'{0}' legyen legalább {1}!",
numericMax: "The '{0}' ne legyen nagyobb, mint {1}!",
invalidEmail: "Adjon meg egy valós email címet!",
invalidExpression: "A következő kifejezés: {0} vissza kell adnia az „igaz” értéket.",
urlRequestError: "A lekérdezés hibával tért vissza: '{0}'. {1}",
urlGetChoicesError: "A lekérdezés üres adattal tért vissza, vagy a 'path' paraméter helytelen.",
exceedMaxSize: "A méret nem lehet nagyobb, mint {0}.",
otherRequiredError: "Adja meg az egyéb értéket!",
uploadingFile: "Feltöltés folyamatban. Várjon pár másodpercet, majd próbálja újra.",
loadingFile: "Betöltés...",
chooseFile: "Fájlok kiválasztása ...",
noFileChosen: "Nincs kiválasztva fájl",
confirmDelete: "Törli ezt a rekordot?",
keyDuplicationError: "Az értéknek egyedinek kell lennie.",
addColumn: "Oszlop hozzáadása",
addRow: "Sor hozzáadása",
removeRow: "Eltávolítás",
addPanel: "Új hozzáadása",
removePanel: "Eltávolítás",
choices_Item: "elem",
matrix_column: "Oszlop",
matrix_row: "Sor",
savingData: "Eredmény mentése a szerverre...",
savingDataError: "Egy hiba folytán nem tudtuk elmenteni az eredményt.",
savingDataSuccess: "Eredmény sikeresen mentve!",
saveAgainButton: "Próbálja újra",
timerMin: "min",
timerSec: "sec",
timerSpentAll: "Ön {0} összeget költött ezen az oldalon, és összesen {1}.",
timerSpentPage: "{0} összeget költött ezen az oldalon.",
timerSpentSurvey: "Összesen {0} költött.",
timerLimitAll: "Ön {0} / {1} összeget költött ezen az oldalon, és összesen {2} / {3}.",
timerLimitPage: "Ön {0} / {1} összeget költött ezen az oldalon.",
timerLimitSurvey: "Összesen {0} / {1} összeget költött el.",
cleanCaption: "Tiszta",
clearCaption: "Egyértelmű",
chooseFileCaption: "Válassz fájlt",
removeFileCaption: "Távolítsa el ezt a fájlt",
booleanCheckedLabel: "Igen",
booleanUncheckedLabel: "Nem",
confirmRemoveFile: "Biztosan eltávolítja ezt a fájlt: {0}?",
confirmRemoveAllFiles: "Biztosan el akarja távolítani az összes fájlt?",
questionTitlePatternText: "Kérdés címe",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["hu"] = hungarianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["hu"] = "magyar";
/***/ }),
/* 101 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export icelandicSurveyStrings */
var icelandicSurveyStrings = {
pagePrevText: "Tilbaka",
pageNextText: "Áfram",
completeText: "Lokið",
previewText: "Forskoða",
editText: "Breyta",
startSurveyText: "Byrjaðu",
otherItemText: "Hinn (skýring)",
noneItemText: "Enginn",
selectAllItemText: "Velja allt",
progressText: "Síða {0} of {1}",
panelDynamicProgressText: "Taka upp {0} af {1}",
questionsProgressText: "Svarað {0} / {1} spurningum",
emptySurvey: "Það er enginn síða eða spurningar í þessari könnun.",
completingSurvey: "Takk fyrir að fyllja út þessa könnun!",
completingSurveyBefore: "Skrár okkar sýna að þú hefur þegar lokið þessari könnun.",
loadingSurvey: "Könnunin er að hlaða...",
optionsCaption: "Veldu...",
value: "gildi",
requiredError: "Vinsamlegast svarið spurningunni.",
requiredErrorInPanel: "Vinsamlegast svaraðu að minnsta kosti einni spurningu.",
requiredInAllRowsError: "Vinsamlegast svarið spurningum í öllum röðum.",
numericError: "Þetta gildi verður að vera tala.",
textMinLength: "Það ætti að vera minnst {0} tákn.",
textMaxLength: "Það ætti að vera mest {0} tákn.",
textMinMaxLength: "Það ætti að vera fleiri en {0} og færri en {1} tákn.",
minRowCountError: "Vinsamlegast fyllið úr að minnsta kosti {0} raðir.",
minSelectError: "Vinsamlegast veljið að minnsta kosti {0} möguleika.",
maxSelectError: "Vinsamlegast veljið ekki fleiri en {0} möguleika.",
numericMinMax: "'{0}' ætti að vera meira en eða jafnt og {1} minna en eða jafnt og {2}",
numericMin: "{0}' ætti að vera meira en eða jafnt og {1}",
numericMax: "'{0}' ætti að vera minna en eða jafnt og {1}",
invalidEmail: "Vinsamlegast sláið inn gilt netfang.",
invalidExpression: "Tjáningin: {0} ætti að skila 'satt'.",
urlRequestError: "Beiðninn skilaði eftirfaranadi villu '{0}'. {1}",
urlGetChoicesError: "Beiðninng skilaði engum gögnum eða slóðinn var röng",
exceedMaxSize: "Skráinn skal ekki vera stærri en {0}.",
otherRequiredError: "Vinamlegast fyllið út hitt gildið.",
uploadingFile: "Skráinn þín var send. Vinsamlegast bíðið í nokkrar sekúndur og reynið aftur.",
loadingFile: "Hleður ...",
chooseFile: "Veldu skrár ...",
noFileChosen: "Engin skrá valin",
confirmDelete: "Viltu eyða skránni?",
keyDuplicationError: "Þetta gildi ætti að vera einstakt.",
addColumn: "Bæta við dálki",
addRow: "Bæta við röð",
removeRow: "Fjarlægja",
addPanel: "Bæta við nýju",
removePanel: "Fjarlægðu",
choices_Item: "hlutur",
matrix_column: "Dálkur",
matrix_row: "Röð",
savingData: "Niðurstöðurnar eru að spara á netþjóninum ... ",
savingDataError: "Villa kom upp og við gátum ekki vistað niðurstöðurnar.",
savingDataSuccess: "Árangurinn var vistaður með góðum árangri!",
saveAgainButton: "Reyndu aftur",
timerMin: "mín",
timerSec: "sek",
timerSpentAll: "Þú hefur eytt {0} á þessari síðu og {1} samtals.",
timerSpentPage: "Þú hefur eytt {0} á þessari síðu.",
timerSpentSurvey: "Þú hefur eytt {0} samtals.",
timerLimitAll: "Þú hefur eytt {0} af {1} á þessari síðu og {2} af {3} samtals.",
timerLimitPage: "Þú hefur eytt {0} af {1} á þessari síðu.",
timerLimitSurvey: "Þú hefur eytt {0} af {1} samtals.",
cleanCaption: "Hreint",
clearCaption: "Hreinsa",
chooseFileCaption: "Veldu skrá",
removeFileCaption: "Fjarlægðu þessa skrá",
booleanCheckedLabel: "Já",
booleanUncheckedLabel: "Nei",
confirmRemoveFile: "Ertu viss um að þú viljir fjarlægja þessa skrá: {0}?",
confirmRemoveAllFiles: "Ertu viss um að þú viljir fjarlægja allar skrár?",
questionTitlePatternText: "Spurningartitill",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["is"] = icelandicSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["is"] = "íslenska";
/***/ }),
/* 102 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export indonesianStrings */
var indonesianStrings = {
pagePrevText: "Sebelumnya",
pageNextText: "Selanjutnya",
completeText: "Selesai",
previewText: "Pratinjau",
editText: "Sunting",
startSurveyText: "Mulai",
otherItemText: "Lainnya (jelaskan)",
noneItemText: "Tidak Ada",
selectAllItemText: "Pilih Semua",
progressText: "Halaman {0} dari {1}",
panelDynamicProgressText: "Rekam {0} dari {1}",
questionsProgressText: "Menjawab pertanyaan {0} / {1}",
emptySurvey: "Tidak ada halaman atau pertanyaan dalam survei.",
completingSurvey: "Terima kasih telah menyelesaikan survei!",
completingSurveyBefore: "Catatan kami menunjukkan bahwa Anda telah menyelesaikan survei ini.",
loadingSurvey: "Memuat survei...",
optionsCaption: "Pilih...",
value: "nilai",
requiredError: "Silahkan jawab pertanyaan berikut.",
requiredErrorInPanel: "Silahkan jawab setidaknya satu petanyaan.",
requiredInAllRowsError: "Silahkan jawab pertanyaan pada semua baris.",
numericError: "Nilai harus berupa angka.",
textMinLength: "Silahkan masukkan setidaknya {0} karakter.",
textMaxLength: "Silahkan masukkan kurang {0} karakter.",
textMinMaxLength: "PSilahkan masukkan lebih dari {0} dan kurang dari {1} karakter.",
minRowCountError: "Silahkan isi setidaknya {0} baris.",
minSelectError: "Silahkan pilih setidaknya {0} varian.",
maxSelectError: "Silahkan pilih tidak lebih dari {0} varian.",
numericMinMax: "'{0}' harus sama dengan atau lebih dari {1} dan harus sama dengan atau kurang dari {2}",
numericMin: "'{0}' harus sama dengan atau lebih dari {1}",
numericMax: "'{0}' harus sama dengan atau kurang dari {1}",
invalidEmail: "Silahkan masukkan e-mail yang benar.",
invalidExpression: "Ekspresi: {0} harus mengembalikan 'benar'.",
urlRequestError: "Permintaan mengembalikan kesalahan '{0}'. {1}",
urlGetChoicesError: "Permintaan mengembalikan data kosong atau properti 'path' salah.",
exceedMaxSize: "Ukuran berkas tidak boleh melebihi {0}.",
otherRequiredError: "Silahkan masukkan nilai lainnnya.",
uploadingFile: "Berkas Anda sedang diunggah. Silahkan tunggu beberapa saat atau coba lagi.",
loadingFile: "Memuat...",
chooseFile: "Pilih berkas...",
noFileChosen: "Tidak ada file yang dipilih",
confirmDelete: "Apakah Anda ingin menghapus catatan?",
keyDuplicationError: "Nilai harus unik.",
addColumn: "Tambah kolom",
addRow: "Tambah baris",
removeRow: "Hapus",
addPanel: "Tambah baru",
removePanel: "Hapus",
choices_Item: "item",
matrix_column: "Kolom",
matrix_row: "Baris",
savingData: "Hasil sedang disimpan pada server...",
savingDataError: "Kesalahan terjadi dan kami tidak dapat menyimpan hasil.",
savingDataSuccess: "Hasil telah sukses disimpan!",
saveAgainButton: "Coba lagi",
timerMin: "menit",
timerSec: "detik",
timerSpentAll: "Anda telah menghabiskan {0} pada halaman ini dan {1} secara keseluruhan.",
timerSpentPage: "YAnda telah menghabiskan {0} pada halaman ini.",
timerSpentSurvey: "Anda telah menghabiskan {0} secara keseluruhan.",
timerLimitAll: "Anda telah menghabiskan {0} dari {1} pada halaman ini dan {2} dari {3} secara keseluruhan.",
timerLimitPage: "Anda telah menghabiskan {0} dari {1} pada halaman ini.",
timerLimitSurvey: "Anda telah menghabiskan {0} dari {1} secara keseluruhan.",
cleanCaption: "Bersihkan",
clearCaption: "Bersihkan",
chooseFileCaption: "Pilih File",
removeFileCaption: "Hapus berkas ini",
booleanCheckedLabel: "Iya",
booleanUncheckedLabel: "Tidak",
confirmRemoveFile: "Anda yakin ingin menghapus file ini: {0}?",
confirmRemoveAllFiles: "Anda yakin ingin menghapus semua file?",
questionTitlePatternText: "Judul pertanyaan",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["id"] = indonesianStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["id"] = "Bahasa Indonesia";
/***/ }),
/* 103 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export italianSurveyStrings */
var italianSurveyStrings = {
pagePrevText: "Precedente",
pageNextText: "Successivo",
completeText: "Salva",
previewText: "Anteprima",
editText: "Modifica",
startSurveyText: "Inizio",
otherItemText: "Altro (descrivi)",
noneItemText: "Nessuno",
selectAllItemText: "Seleziona tutti",
progressText: "Pagina {0} di {1}",
panelDynamicProgressText: "Record di {0} di {1}",
questionsProgressText: "Risposte a {0}/{1} domande",
emptySurvey: "Non ci sono pagine o domande visibili nel questionario.",
completingSurvey: "Grazie per aver completato il questionario!",
completingSurveyBefore: "I nostri records mostrano che hai già completato questo questionario.",
loadingSurvey: "Caricamento del questionario in corso...",
optionsCaption: "Scegli...",
value: "valore",
requiredError: "Campo obbligatorio",
requiredErrorInPanel: "Per Favore, rispondi ad almeno una domanda.",
requiredInAllRowsError: "Completare tutte le righe",
numericError: "Il valore deve essere numerico",
textMinLength: "Inserire almeno {0} caratteri",
textMaxLength: "Lunghezza massima consentita {0} caratteri",
textMinMaxLength: "Inserire una stringa con minimo {0} e massimo {1} caratteri",
minRowCountError: "Completare almeno {0} righe.",
minSelectError: "Selezionare almeno {0} varianti.",
maxSelectError: "Selezionare massimo {0} varianti.",
numericMinMax: "'{0}' deve essere uguale o superiore a {1} e uguale o inferiore a {2}",
numericMin: "'{0}' deve essere uguale o superiore a {1}",
numericMax: "'{0}' deve essere uguale o inferiore a {1}",
invalidEmail: "Inserire indirizzo mail valido",
invalidExpression: "L'espressione: {0} dovrebbe tornare 'vero'.",
urlRequestError: "La richiesta ha risposto con un errore '{0}'. {1}",
urlGetChoicesError: "La richiesta ha risposto null oppure il percorso non è corretto",
exceedMaxSize: "Il file non può eccedere {0}",
otherRequiredError: "Inserire il valore 'altro'",
uploadingFile: "File in caricamento. Attendi alcuni secondi e riprova",
loadingFile: "Caricamento...",
chooseFile: "Selezionare file(s)...",
noFileChosen: "Nessun file selezionato",
confirmDelete: "Sei sicuro di voler elminare il record?",
keyDuplicationError: "Questo valore deve essere univoco.",
addColumn: "Aggiungi colonna",
addRow: "Aggiungi riga",
removeRow: "Rimuovi riga",
addPanel: "Aggiungi riga",
removePanel: "Elimina",
choices_Item: "Elemento",
matrix_column: "Colonna",
matrix_row: "Riga",
savingData: "Salvataggio dati sul server...",
savingDataError: "Si è verificato un errore e non è stato possibile salvare i risultati.",
savingDataSuccess: "I risultati sono stati salvati con successo!",
saveAgainButton: "Riprova",
timerMin: "min",
timerSec: "sec",
timerSpentAll: "Hai impiegato {0} su questa pagina e {1} in totale.",
timerSpentPage: "Hai impiegato {0} su questa pagina.",
timerSpentSurvey: "Hai impiegato {0} in totale.",
timerLimitAll: "Hai impiegato {0} di {1} su questa pagina e {2} di {3} in totale.",
timerLimitPage: "Hai impiegato {0} di {1} su questa pagina.",
timerLimitSurvey: "Hai impiegato {0} di {1} in totale.",
cleanCaption: "Pulisci",
clearCaption: "Cancella",
chooseFileCaption: "Scegliere il file",
removeFileCaption: "Rimuovere questo file",
booleanCheckedLabel: "Sì",
booleanUncheckedLabel: "No",
confirmRemoveFile: "Sei sicuro di voler elminare questo file: {0}?",
confirmRemoveAllFiles: "Sei sicuro di voler elminare tutti i files?",
questionTitlePatternText: "Titolo della domanda",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["it"] = italianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["it"] = "italiano";
/***/ }),
/* 104 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export japaneseSurveyStrings */
var japaneseSurveyStrings = {
pagePrevText: "前へ",
pageNextText: "次へ",
completeText: "完了",
previewText: "プレビュー",
editText: "編集",
startSurveyText: "スタート",
otherItemText: "その他(説明)",
noneItemText: "なし",
selectAllItemText: "すべて選択",
progressText: "{0}/{1}頁",
panelDynamicProgressText: "{1}の{0}を記録する",
questionsProgressText: "{0}/{1}の質問に回答しました。",
emptySurvey: "この調査に表示できるページや質問はありません",
completingSurvey: "調査を完了してくれてありがとうございました",
completingSurveyBefore: "当社の記録によると、この調査はすでに完了しています。",
loadingSurvey: "調査をダウンロード中",
optionsCaption: "選択",
value: "値打ち",
requiredError: "質問にお答え下さい",
requiredErrorInPanel: "最低でも1つの質問に答えてください。",
requiredInAllRowsError: "質問には全列で回答してください。",
numericError: "数字でご記入下さい",
textMinLength: "{0} 文字以上で入力して下さい",
textMaxLength: "{0}文字以下で入力してください。",
textMinMaxLength: "{0}以上{1}未満の文字を入力してください。",
minRowCountError: "{0}行以上で入力して下さい",
minSelectError: "{0}種類以上を選択して下さい",
maxSelectError: "{0}以上のバリアントを選択しないでください。",
numericMinMax: "{0}は{1}以上であり、{2}以下であることが望ましい。",
numericMin: "'{0}' は同等か{1}より大きくなければなりません",
numericMax: "'{0}' は同等か{1}より小さくなければなりません",
invalidEmail: "有効なメールアドレスをご記入下さい",
invalidExpression: "式は {0}は'true'を返すべきです。",
urlRequestError: "リクエストはエラー '{0}' を返しました。{1}",
urlGetChoicesError: "リクエストが空のデータを返したか、'path' プロパティが正しくありません。",
exceedMaxSize: "ファイルのサイズは{0}を超えてはいけません",
otherRequiredError: "その他の値を入力してください。",
uploadingFile: "ファイルをアップロード中です。しばらくしてから再度お試し下さい",
loadingFile: "読み込み中",
chooseFile: "ファイルを選択",
noFileChosen: "選択されたファイルはありません",
confirmDelete: "レコードを削除しますか?",
keyDuplicationError: "この値は一意でなければなりません。",
addColumn: "列の追加",
addRow: "追加行",
removeRow: "除去",
addPanel: "新規追加",
removePanel: "除去",
choices_Item: "品目",
matrix_column: "コラム",
matrix_row: "行",
savingData: "結果はサーバーに保存されています...。",
savingDataError: "エラーが発生し、結果を保存できませんでした。",
savingDataSuccess: "結果は無事に保存されました",
saveAgainButton: "もう一度試してみてください。",
timerMin: "僅少",
timerSec: "セック",
timerSpentAll: "あなたはこのページに{0}を費やし、合計で{1}を費やしました。",
timerSpentPage: "あなたはこのページに{0}を費やしました。",
timerSpentSurvey: "合計で{0}を使ったことになります。",
timerLimitAll: "このページに{1}のうち{0}を費やし、{3}のうち{2}を合計で費やしました。",
timerLimitPage: "このページで{1}の{0}を使ったことがあります。",
timerLimitSurvey: "合計で{1}の{0}を使ったことがあります。",
cleanCaption: "削除",
clearCaption: "空白",
chooseFileCaption: "ファイルを選択",
removeFileCaption: "このファイルを削除",
booleanCheckedLabel: "噫",
booleanUncheckedLabel: "否",
confirmRemoveFile: "このファイルを削除してもよろしいですか?{0}?",
confirmRemoveAllFiles: "すべてのファイルを削除してもよろしいですか?",
questionTitlePatternText: "質問名",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ja"] = japaneseSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ja"] = "日本語";
/***/ }),
/* 105 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export koreanStrings */
var koreanStrings = {
pagePrevText: "이전",
pageNextText: "다음",
completeText: "완료",
previewText: "시사",
editText: "편집하다",
startSurveyText: "시작",
otherItemText: "기타(설명)",
noneItemText: "없음",
selectAllItemText: "모두 선택",
progressText: "페이지 {1} 중 {0}",
panelDynamicProgressText: "{0} / {1} 기록",
questionsProgressText: "{0} / {1} 개의 질문에 답변 함",
emptySurvey: "설문지에 보여지는 페이지나 질문이 없습니다",
completingSurvey: "설문 조사를 완료해 주셔서 감사합니다!",
completingSurveyBefore: "기록에 따르면 이미 설문 조사를 마치셨습니다.",
loadingSurvey: "설문조사가 로드중입니다...",
optionsCaption: "선택하십시오...",
value: "값",
requiredError: "질문에 답하시오.",
requiredErrorInPanel: "하나 이상의 질문에 답하십시오.",
requiredInAllRowsError: "모든 행에 있는 질문에 답하십시오.",
numericError: "값은 숫자여야 합니다.",
textMinLength: "답변의 길이는 최소 {0}자여야 입니다.",
textMaxLength: "답변의 길이는 {0}자를 초과 할 수 없습니다.",
textMinMaxLength: "답변의 길이는 {0} - {1}자 사이여야 합니다.",
minRowCountError: "최소 {0}개의 행을 채우십시오",
minSelectError: "최소 {0}개의 변수를 선택하십시오.",
maxSelectError: "최대 {0}개의 변수를 선택하십시오.",
numericMinMax: "'{0}'은 {1}보다 크거나 같고 {2}보다 작거나 같아야합니다.",
numericMin: "'{0}'은 {1}보다 크거나 같아야합니다.",
numericMax: "'{0}'은 {1}보다 작거나 같아야합니다.",
invalidEmail: "올바른 이메일 주소를 입력하십시오.",
invalidExpression: "표현식: {0}은 '참'이어야 합니다.",
urlRequestError: "'{0}'으로 잘못된 요청입니다. {1}",
urlGetChoicesError: "비어있는 데이터를 요청했거나 잘못된 속성의 경로입니다.",
exceedMaxSize: "파일 크기가 {0}을 초과 할 수 없습니다.",
otherRequiredError: "다른 질문을 작성하십시오.",
uploadingFile: "파일 업로드 중입니다. 잠시 후 다시 시도하십시오.",
loadingFile: "로드 중...",
chooseFile: "파일 선택...",
noFileChosen: "선택된 파일이 없습니다",
confirmDelete: "기록을 삭제하시겠습니까?",
keyDuplicationError: " 이 값은 고유해야합니다.",
addColumn: "열 추가",
addRow: "행 추가",
removeRow: "제거",
addPanel: "새롭게 추가",
removePanel: "제거",
choices_Item: "항목",
matrix_column: "열",
matrix_row: "행",
savingData: "결과가 서버에 저장 중입니다...",
savingDataError: "오류가 발생하여 결과를 저장할 수 없습니다.",
savingDataSuccess: "결과가 성공적으로 저장되었습니다!",
saveAgainButton: "다시 시도하십시오",
timerMin: "분",
timerSec: "초",
timerSpentAll: "현재 페이지에서 {0}을 소요해 총 {1}이 걸렸습니다.",
timerSpentPage: "현재 페이지에서 {0]이 걸렸습니다",
timerSpentSurvey: "총 {0}이 걸렸습니다.",
timerLimitAll: "현재 페이지에서 {0}/{1}을 소요해 총 {2}/{3}이 걸렸습니다.",
timerLimitPage: "현재 페이지에서 {0}/{1}이 걸렸습니다.",
timerLimitSurvey: "총 {0}/{1}이 걸렸습니다.",
cleanCaption: "닦기",
clearCaption: "지우기",
chooseFileCaption: "파일을 선택",
removeFileCaption: "이 파일 제거",
booleanCheckedLabel: "예",
booleanUncheckedLabel: "아니",
confirmRemoveFile: "{0} 파일을 제거 하시겠습니까?",
confirmRemoveAllFiles: "모든 파일을 제거 하시겠습니까?",
questionTitlePatternText: "질문 제목",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ko"] = koreanStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ko"] = "한국어";
/***/ }),
/* 106 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export latvianSurveyStrings */
var latvianSurveyStrings = {
pagePrevText: "Atpakaļ",
pageNextText: "Tālāk",
completeText: "Pabeigt",
previewText: "Priekšskatījums",
editText: "Rediģēt",
startSurveyText: "Sākt",
otherItemText: "Cits (lūdzu, aprakstiet!)",
noneItemText: "Nav",
selectAllItemText: "Izvēlēties visus",
progressText: "Lappuse {0} no {1}",
panelDynamicProgressText: "Ierakstīt {0} no {1}",
questionsProgressText: "Atbildēja uz jautājumiem {0} / {1}",
emptySurvey: "Nav neviena jautājuma.",
completingSurvey: "Pateicamies Jums par anketas aizpildīšanu!",
completingSurveyBefore: "Mūsu ieraksti liecina, ka jūs jau esat aizpildījis šo aptauju.",
loadingSurvey: "Ielāde no servera...",
optionsCaption: "Izvēlēties...",
value: "value",
requiredError: "Lūdzu, atbildiet uz jautājumu!",
requiredErrorInPanel: "Lūdzu, atbildiet uz vismaz vienu jautājumu.",
requiredInAllRowsError: "Lūdzu, atbildiet uz jautājumiem visās rindās.",
numericError: "Atbildei ir jābūt skaitlim.",
textMinLength: "Lūdzu, ievadiet vismaz {0} simbolus.",
textMaxLength: "Lūdzu, ievadiet mazāk nekā {0} rakstzīmes.",
textMinMaxLength: "Lūdzu, ievadiet vairāk nekā {0} rakstzīmes un mazāk nekā {1} rakstzīmes.",
minRowCountError: "Lūdzu, aizpildiet vismaz {0} rindas.",
minSelectError: "Lūdzu, izvēlieties vismaz {0} variantu.",
maxSelectError: "Lūdzu, izvēlieties ne vairak par {0} variantiem.",
numericMinMax: "'{0}' jābūt vienādam vai lielākam nekā {1}, un vienādam vai mazākam, nekā {2}",
numericMin: "'{0}' jābūt vienādam vai lielākam {1}",
numericMax: "'{0}' jābūt vienādam vai lielākam {1}",
invalidEmail: "Lūdzu, ievadiet patiesu e-pasta adresi!",
invalidExpression: "Izteicienam: {0} jāatgriež “true”.",
urlRequestError: "Pieprasījumā tika atgriezta kļūda “{0}”. {1}",
urlGetChoicesError: "Pieprasījums atgrieza tukšus datus vai rekvizīts “path” ir nepareizs",
exceedMaxSize: "Faila lielums nedrīkst pārsniegt {0}.",
otherRequiredError: "Lūdzu, ievadiet datus laukā 'Cits'",
uploadingFile: "Jūsu fails tiek augšupielādēts. Lūdzu, uzgaidiet vairākas sekundes un mēģiniet vēlreiz.",
loadingFile: "Notiek ielāde ...",
chooseFile: "Izvēlieties failus ...",
noFileChosen: "Nav izvēlēts neviens fails",
confirmDelete: "Vai vēlaties izdzēst ierakstu?",
keyDuplicationError: "Šai vērtībai jābūt unikālai.",
addColumn: "Pievienot kolonnu",
addRow: "Pievienot rindu",
removeRow: "Noņemt",
addPanel: "Pievieno jaunu",
removePanel: "Noņemt",
choices_Item: "lieta",
matrix_column: "Sleja",
matrix_row: "Rinda",
savingData: "Rezultāti tiek saglabāti serverī ...",
savingDataError: "Radās kļūda, un mēs nevarējām saglabāt rezultātus.",
savingDataSuccess: "Rezultāti tika veiksmīgi saglabāti!",
saveAgainButton: "Mēģini vēlreiz",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Šajā lapā esat iztērējis {0} un kopā {1}.",
timerSpentPage: "Šajā lapā esat iztērējis {0}.",
timerSpentSurvey: "Kopā esat iztērējis {0}.",
timerLimitAll: "Šajā lapā esat iztērējis {0} no {1} un kopā {2} no {3}.",
timerLimitPage: "Šajā lapā esat iztērējis {0} no {1}.",
timerLimitSurvey: "Kopā esat iztērējis {0} no {1}.",
cleanCaption: "Tīrs",
clearCaption: "Skaidrs",
chooseFileCaption: "Izvēlēties failu",
removeFileCaption: "Noņemiet šo failu",
booleanCheckedLabel: "Jā",
booleanUncheckedLabel: "Nē",
confirmRemoveFile: "Vai tiešām vēlaties noņemt šo failu: {0}?",
confirmRemoveAllFiles: "Vai tiešām vēlaties noņemt visus failus?",
questionTitlePatternText: "Jautājuma nosaukums",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["lv"] = latvianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["lv"] = "latviešu";
/***/ }),
/* 107 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export lithuaniaSurveyStrings */
var lithuaniaSurveyStrings = {
pagePrevText: "Atgal",
pageNextText: "Toliau",
completeText: "Baigti",
previewText: "Peržiūra",
editText: "Redaguoti",
startSurveyText: "Pradėti",
otherItemText: "Kita (įvesti)",
noneItemText: "Nėra",
selectAllItemText: "Pasirinkti visus",
progressText: "Puslapis {0} iš {1}",
panelDynamicProgressText: "Įrašyti {0} iš {1}",
questionsProgressText: "Atsakė į {0} / {1} klausimus",
emptySurvey: "Apklausoje nėra matomo puslapio ar klausimo.",
completingSurvey: "Dėkojame už dalyvavimą apklausoje!",
completingSurveyBefore: "Mūsų įrašai rodo, kad jau atlikote šią apklausą.",
loadingSurvey: "Prašome palaukti...",
optionsCaption: "Pasirinkti...",
value: "reikšmė",
requiredError: "Būtina atsakyti į šį klausimą.",
requiredErrorInPanel: "Būtina atsakyti bent į vieną klausimą.",
requiredInAllRowsError: "Prašome atsakyti į klausimus visose eilutėse.",
numericError: "Turi būti skaičiai.",
textMinLength: "Prašome suvesti bent {0} simbolius.",
textMaxLength: "Prašome suvesti mažiau nei {0} simbolių.",
textMinMaxLength: "Prašome suvesti daugiau nei {0} ir mažiau nei {1} simbolių.",
minRowCountError: "Prašome suvesti ne mažiau nei {0} eilučių.",
minSelectError: "Prašome pasirinkti bent {0} variantų.",
maxSelectError: "Pasirinkite ne daugiau kaip {0} variantus.",
numericMinMax: "'{0}' turi būti lygus arba didesnis nei {1} ir lygus arba mažesnis nei {2}",
numericMin: "'{0}' turėtų būti lygus arba didesnis nei {1}",
numericMax: "'{0}' turėtų būti lygus ar mažesnis už {1}",
invalidEmail: "Prašome įvesti galiojantį elektroninio pašto adresą.",
invalidExpression: "Reikšmė: {0} turi grąžinti 'true'.",
urlRequestError: "Užklausa grąžino klaidą'{0}'. {1}",
urlGetChoicesError: "Užklausa grąžino tuščius duomenis arba 'path' savybė yra neteisinga",
exceedMaxSize: "Failo dydis neturi viršyti {0}.",
otherRequiredError: "Įveskite kitą reikšmę.",
uploadingFile: "Jūsų failas yra keliamas. Palaukite keletą sekundžių ir bandykite dar kartą.",
loadingFile: "Prašome palaukti...",
chooseFile: "Pasirinkti failą(us)...",
noFileChosen: "Nepasirinktas joks failas",
confirmDelete: "Ar norite ištrinti įrašą?",
keyDuplicationError: "Ši reikšmė turėtų būti unikali.",
addColumn: "Pridėti stulpelį",
addRow: "Pridėti eilutę",
removeRow: "Ištrinti",
addPanel: "Pridėti naują",
removePanel: "Ištrinti",
choices_Item: "elementas",
matrix_column: "Stulpelis",
matrix_row: "Eilutė",
savingData: "Rezultatai saugomi serveryje...",
savingDataError: "Įvyko klaida ir mes negalėjome išsaugoti rezultatų.",
savingDataSuccess: "Rezultatai buvo išsaugoti sėkmingai!",
saveAgainButton: "Bandyti dar kartą",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Praleidote {0} šiame puslapyje ir {1} iš viso.",
timerSpentPage: "Praleidote {0} šiame puslapyje.",
timerSpentSurvey: "Praleidote {0} iš viso.",
timerLimitAll: "Praleidote {0} iš {1} šiame puslapyje ir {2} iš {3} iš viso.",
timerLimitPage: "Praleidote {0} iš {1} šiame puslapyje.",
timerLimitSurvey: "Praleidote {0} iš {1} iš viso.",
cleanCaption: "Išvalyti",
clearCaption: "Valyti",
chooseFileCaption: "Pasirinkti failą",
removeFileCaption: "Ištrinti šį failą",
booleanCheckedLabel: "Taip",
booleanUncheckedLabel: "Ne",
confirmRemoveFile: "Ar tikrai norite pašalinti šį failą: {0}?",
confirmRemoveAllFiles: "Ar tikrai norite pašalinti visus failus?",
questionTitlePatternText: "Klausimo pavadinimas",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["lt"] = lithuaniaSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["lt"] = "Lietuvių";
/***/ }),
/* 108 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export norwegianSurveyStrings */
var norwegianSurveyStrings = {
pagePrevText: "Forrige",
pageNextText: "Neste",
completeText: "Fullfør",
previewText: "Forhåndsvisning",
editText: "Redigere",
startSurveyText: "Start",
otherItemText: "Annet (beskriv)",
noneItemText: "Ingen",
selectAllItemText: "Velg alle",
progressText: "Side {0} av {1}",
panelDynamicProgressText: "Ta opp {0} av {1}",
questionsProgressText: "Besvarte {0} / {1} spørsmål",
emptySurvey: "Det er ingen synlig side eller spørsmål i undersøkelsen.",
completingSurvey: "Takk for at du fullførte undersøkelsen!",
completingSurveyBefore: "Våre data viser at du allerede har gjennomført denne undersøkelsen.",
loadingSurvey: "Undersøkelsen laster...",
optionsCaption: "Velg...",
value: "verdi",
requiredError: "Vennligst svar på spørsmålet.",
requiredErrorInPanel: "Vennligst svar på minst ett spørsmål.",
requiredInAllRowsError: "Vennligst svar på spørsmål i alle rader.",
numericError: "Verdien skal være numerisk.",
textMinLength: "Vennligst skriv inn minst {0} tegn.",
textMaxLength: "Vennligst skriv inn mindre enn {0} tegn.",
textMinMaxLength: "Vennligst skriv inn mer enn {0} og mindre enn {1} tegn.",
minRowCountError: "Vennligst fyll inn minst {0} rader.",
minSelectError: "Vennligst velg minst {0} varianter.",
maxSelectError: "Vennligst ikke velg mer enn {0} varianter.",
numericMinMax: "'{0}' bør være lik eller mer enn {1} og lik eller mindre enn {2}",
numericMin: "'{0}' bør være lik eller mer enn {1}",
numericMax: "'{0}' bør være lik eller mindre enn {1}",
invalidEmail: "Vennligst skriv inn en gyldig e-post adresse.",
invalidExpression: "Uttrykket: {0} skal returnere 'sant'.",
urlRequestError: "Forespørselen returnerte feilen '{0}'. {1}",
urlGetChoicesError: "Forespørselen returnerte tomme data, eller 'sti' -egenskapen er feil",
exceedMaxSize: "Filstørrelsen bør ikke overstige {0}.",
otherRequiredError: "Vennligst skriv inn den andre verdien.",
uploadingFile: "Filen din lastes opp. Vennligst vent noen sekunder og prøv igjen.",
loadingFile: "Laster inn ...",
chooseFile: "Velg fil (er) ...",
noFileChosen: "Ingen fil valgt",
confirmDelete: "Ønsker du å slette posten?",
keyDuplicationError: "Denne verdien skal være unik.",
addColumn: "Legg til kolonne",
addRow: "Legg til rad",
removeRow: "Fjern",
addPanel: "Legg til ny",
removePanel: "Fjerne",
choices_Item: "element",
matrix_column: "Kolonne",
matrix_row: "Rad",
savingData: "Resultatene lagres på serveren ...",
savingDataError: "Det oppsto en feil, og vi kunne ikke lagre resultatene.",
savingDataSuccess: "Resultatene ble lagret!",
saveAgainButton: "Prøv igjen",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Du har tilbrakt {0} på denne siden og {1} totalt.",
timerSpentPage: "Du har tilbrakt {0} på denne siden.",
timerSpentSurvey: "Du har tilbrakt {0} totalt.",
timerLimitAll: "Du har tilbrakt {0} av {1} på denne siden og totalt {2} av {3}.",
timerLimitPage: "Du har tilbrakt {0} av {1} på denne siden.",
timerLimitSurvey: "Du har tilbrakt {0} av {1} totalt.",
cleanCaption: "Rens",
clearCaption: "Klar",
chooseFileCaption: "Velg Fil",
removeFileCaption: "Fjern denne filen",
booleanCheckedLabel: "Ja",
booleanUncheckedLabel: "Nei",
confirmRemoveFile: "Er du sikker på at du vil fjerne denne filen: {0}?",
confirmRemoveAllFiles: "Er du sikker på at du vil fjerne alle filene?",
questionTitlePatternText: "Spørsmålstittel",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["no"] = norwegianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["no"] = "norsk";
/***/ }),
/* 109 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export persianSurveyStrings */
var persianSurveyStrings = {
pagePrevText: "قبلی",
pageNextText: "بعدی",
completeText: "تکمیل",
previewText: "پیش نمایش",
editText: "ویرایش",
startSurveyText: "شروع",
otherItemText: "دیگر(توضیح)",
noneItemText: "هیچ",
selectAllItemText: "انتخاب همه",
progressText: "صفحه {0} از {1}",
panelDynamicProgressText: "مورد {0} از {1}",
questionsProgressText: "تعداد پاسخ {0}/{1} سوال",
emptySurvey: "صفحه ای یا گزینه ای برای این پرسشنامه موجود نیست.",
completingSurvey: "از شما بابت تکمیل این پرسشنامه متشکریم",
completingSurveyBefore: "به نظر می رسد هم هم اکنون پرسشنامه را تکمیل کرده اید.",
loadingSurvey: "درحال ایجاد پرسشنامه",
optionsCaption: "انتخاب کنید...",
value: "مقدار",
requiredError: "لطفا به سوال پاسخ دهید",
requiredErrorInPanel: "لطفا حداقل به یک سوال پاسخ دهید.",
requiredInAllRowsError: "لطفا سوالات تمام سطرها را پاسخ دهید.",
numericError: "مقدار باید عددی باشد",
textMinLength: "لطفا حداقل {0} حرف وارد کنید",
textMaxLength: "لطفا کمتر از {0} حرف وارد کنید.",
textMinMaxLength: "لطفا بیشتر از {0} حرف و کمتر از {1} حرف وارد کنید.",
minRowCountError: "لطفا حداقل {0} سطر وارد کنید.",
minSelectError: "حداقل {0} انتخاب کنید.",
maxSelectError: "لطفا بیشتر از {0} انتخاب کنید.",
numericMinMax: "'{0}' باید بین {1} و {2} باشد",
numericMin: "'{0}' بزرگتر مساوی {1} باشد",
numericMax: "'{0}' باید کوچکتر یا مساوی {1} باشد",
invalidEmail: "لطفا ایمیل صحیح درج کنید",
invalidExpression: "عبارت: {0} پاسخ باید 'true' باشد.",
urlRequestError: "درخواست با خطا روبرو شد: '{0}'. {1}",
urlGetChoicesError: "درخواست مسیری خالی بازگشت داده یا مسیر درست تنظیم نشده",
exceedMaxSize: "بیشترین حجم مجاز فایل: {0}",
otherRequiredError: "مقدار 'دیگر' را وارد کنید",
uploadingFile: "فایل در حال آیلود است. لطفا صبر کنید.",
loadingFile: "بارگیری...",
chooseFile: "انتخاب فایل(ها)...",
noFileChosen: "هیچ فایلی انتخاب نشده",
confirmDelete: "آیا مایل به حذف این ردیف هستید؟",
keyDuplicationError: "این مقدار باید غیر تکراری باشد",
addColumn: "ستون جدید",
addRow: "سطر جدید",
removeRow: "حذف",
addPanel: "جدید",
removePanel: "حذف",
choices_Item: "آیتم",
matrix_column: "ستون",
matrix_row: "سطر",
savingData: "نتایج در حال ذخیره سازی در سرور است",
savingDataError: "خطایی در ذخیره سازی نتایج رخ داده است",
savingDataSuccess: "نتایج با موفقیت ذخیره شد",
saveAgainButton: "مجدد تلاش کنید",
timerMin: "دقیقه",
timerSec: "ثانیه",
timerSpentAll: "شما مدت {0} در این صفحه و مدت {1} را در مجموع سپری کرده اید.",
timerSpentPage: "شما مدت {0} را در این صفحه سپری کرده اید.",
timerSpentSurvey: "شما مدت {0} را در مجموع سپری کرده اید.",
timerLimitAll: "شما مدت {0} از {1} در این صفحه و مدت {2} از {3} را در مجموع سپری کرده اید.",
timerLimitPage: "شما مدت {0} از {1} را در این صفحه سپری کرده اید.",
timerLimitSurvey: "شما مدت {0} از {1} را در مجموع سپری کرده اید.",
cleanCaption: "پاکسازی",
clearCaption: "خالی کردن",
chooseFileCaption: "انتخاب فایل",
removeFileCaption: "حذف این فایل",
booleanCheckedLabel: "بله",
booleanUncheckedLabel: "خیر",
confirmRemoveFile: "آیا میخواهید این فایل را پاک کنید: {0}?",
confirmRemoveAllFiles: "آیا میخواهید تمام فایل ها را پاک کنید?",
questionTitlePatternText: "عنوان سوال",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fa"] = persianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["fa"] = "فارْسِى";
/***/ }),
/* 110 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export polishSurveyStrings */
var polishSurveyStrings = {
pagePrevText: "Wstecz",
pageNextText: "Dalej",
completeText: "Gotowe",
previewText: "Premiera",
editText: "Edycja",
startSurveyText: "Start",
otherItemText: "Inna odpowiedź (wpisz)",
noneItemText: "Brak",
selectAllItemText: "Wybierz wszystkie",
progressText: "Strona {0} z {1}",
panelDynamicProgressText: "Zapis {0} z {1}",
questionsProgressText: "Odpowiedzi na {0}/{1} pytania",
emptySurvey: "Nie ma widocznych pytań.",
completingSurvey: "Dziękujemy za wypełnienie ankiety!",
completingSurveyBefore: "Z naszych zapisów wynika, że wypełniłeś już tę ankietę.",
loadingSurvey: "Trwa wczytywanie ankiety...",
optionsCaption: "Wybierz...",
value: "Wartość",
requiredError: "Proszę odpowiedzieć na to pytanie.",
requiredErrorInPanel: "Proszę odpowiedzieć na co najmniej jedno pytanie.",
requiredInAllRowsError: "Proszę odpowiedzieć na wszystkie pytania.",
numericError: "W tym polu można wpisać tylko liczby.",
textMinLength: "Proszę wpisać co najmniej {0} znaków.",
textMaxLength: "Proszę wpisać mniej niż {0} znaków.",
textMinMaxLength: "Proszę wpisać więcej niż {0} i mniej niż {1} znaków.",
minRowCountError: "Proszę uzupełnić przynajmniej {0} wierszy.",
minSelectError: "Proszę wybrać co najmniej {0} pozycji.",
maxSelectError: "Proszę wybrać nie więcej niż {0} pozycji.",
numericMinMax: "Odpowiedź '{0}' powinna być większa lub równa {1} oraz mniejsza lub równa {2}",
numericMin: "Odpowiedź '{0}' powinna być większa lub równa {1}",
numericMax: "Odpowiedź '{0}' powinna być mniejsza lub równa {1}",
invalidEmail: "Proszę podać prawidłowy adres email.",
invalidExpression: "Wyrażenie: {0} powinno wracać 'prawdziwe'.",
urlRequestError: "Żądanie zwróciło błąd '{0}'. {1}",
urlGetChoicesError: "Żądanie nie zwróciło danych albo ścieżka jest nieprawidłowa",
exceedMaxSize: "Rozmiar przesłanego pliku nie może przekraczać {0}.",
otherRequiredError: "Proszę podać inną odpowiedź.",
uploadingFile: "Trwa przenoszenie Twojego pliku, proszę spróbować ponownie za kilka sekund.",
loadingFile: "Ładowanie...",
chooseFile: "Wybierz plik(i)...",
noFileChosen: "Nie wybrano żadnego pliku",
confirmDelete: "Chcesz skasować nagranie?",
keyDuplicationError: "Ta wartość powinna być wyjątkowa.",
addColumn: "Dodaj kolumnę",
addRow: "Dodaj wiersz",
removeRow: "Usuń",
addPanel: "Dodaj panel",
removePanel: "Usuń",
choices_Item: "element",
matrix_column: "Kolumna",
matrix_row: "Wiersz",
savingData: "Zapisuję wyniki ankiety na serwerze...",
savingDataError: "Wystąpił błąd i wyniki nie mogły zostać zapisane.",
savingDataSuccess: "Wyniki zostały poprawnie zapisane!",
saveAgainButton: "Spróbuj ponownie",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Spędziłeś {0} na tej stronie a w sumie {1}.",
timerSpentPage: "Spędziłeś {0} na tej stronie.",
timerSpentSurvey: "Spędziłeś w sumie {0}.",
timerLimitAll: "Spędziłeś {0} z {1} na tej stronie a w sumie {2} z {3}.",
timerLimitPage: "Spędziłeś {0} z {1} na tej stronie",
timerLimitSurvey: "Spędziłeś {0} z {1}.",
cleanCaption: "Wyczyść",
clearCaption: "Jasne",
chooseFileCaption: "Wybierz plik",
removeFileCaption: "Usuń ten plik",
booleanCheckedLabel: "Tak",
booleanUncheckedLabel: "Nie",
confirmRemoveFile: "Jesteś pewien, że chcesz usunąć ten plik: {0}?",
confirmRemoveAllFiles: "Jesteś pewien, że chcesz usunąć wszystkie pliki?",
questionTitlePatternText: "Tytuł pytania",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["pl"] = polishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["pl"] = "polski";
/***/ }),
/* 111 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export portugueseSurveyStrings */
var portugueseSurveyStrings = {
pagePrevText: "Anterior",
pageNextText: "Próximo",
completeText: "Finalizar",
previewText: "Pré-visualização",
editText: "Editar",
startSurveyText: "Começar",
otherItemText: "Outros (descrever)",
noneItemText: "Nenhum",
selectAllItemText: "Selecionar Todos",
progressText: "Página {0} de {1}",
panelDynamicProgressText: "Registo {0} de {1}",
questionsProgressText: "Respostas {0}/{1} perguntas",
emptySurvey: "Não há página visível ou pergunta na pesquisa.",
completingSurvey: "Obrigado por finalizar a pesquisa!",
completingSurveyBefore: "Nossos registros mostram que você já finalizou a pesquisa.",
loadingSurvey: "A pesquisa está carregando...",
optionsCaption: "Selecione...",
value: "valor",
requiredError: "Por favor, responda a pergunta.",
requiredErrorInPanel: "Por favor, responda pelo menos uma pergunta.",
requiredInAllRowsError: "Por favor, responda as perguntas em todas as linhas.",
numericError: "O valor deve ser numérico.",
textMinLength: "Por favor, insira pelo menos {0} caracteres.",
textMaxLength: "Por favor, insira menos de {0} caracteres.",
textMinMaxLength: "Por favor, insira mais de {0} e menos de {1} caracteres.",
minRowCountError: "Preencha pelo menos {0} linhas.",
minSelectError: "Selecione pelo menos {0} opções.",
maxSelectError: "Por favor, selecione não mais do que {0} opções.",
numericMinMax: "O '{0}' deve ser igual ou superior a {1} e igual ou menor que {2}",
numericMin: "O '{0}' deve ser igual ou superior a {1}",
numericMax: "O '{0}' deve ser igual ou inferior a {1}",
invalidEmail: "Por favor, informe um e-mail válido.",
invalidExpression: "A expressão: {0} deve retornar 'verdadeiro'.",
urlRequestError: "A requisição retornou o erro '{0}'. {1}",
urlGetChoicesError: "A requisição não retornou dados ou o 'caminho' da requisição não está correto",
exceedMaxSize: "O tamanho do arquivo não deve exceder {0}.",
otherRequiredError: "Por favor, informe o outro valor.",
uploadingFile: "Seu arquivo está sendo carregado. Por favor, aguarde alguns segundos e tente novamente.",
loadingFile: "Carregando...",
chooseFile: "Selecione o(s) arquivo(s)...",
noFileChosen: "Nenhum ficheiro escolhido",
confirmDelete: "Tem certeza que deseja deletar?",
keyDuplicationError: "Esse valor deve ser único.",
addColumn: "Adicionar coluna",
addRow: "Adicionar linha",
removeRow: "Remover linha",
addPanel: "Adicionar novo",
removePanel: "Remover",
choices_Item: "item",
matrix_column: "Coluna",
matrix_row: "Linha",
savingData: "Os resultados esto sendo salvos no servidor...",
savingDataError: "Ocorreu um erro e não foi possível salvar os resultados.",
savingDataSuccess: "Os resultados foram salvos com sucesso!",
saveAgainButton: "Tente novamente",
timerMin: "min",
timerSec: "seg",
timerSpentAll: "Você gastou {0} nesta página e {1} no total.",
timerSpentPage: "Você gastou {0} nesta página.",
timerSpentSurvey: "Você gastou {0} no total.",
timerLimitAll: "Você gastou {0} de {1} nesta página e {2} de {3} no total.",
timerLimitPage: "Você gastou {0} de {1} nesta página.",
timerLimitSurvey: "Você gastou {0} de {1} no total.",
cleanCaption: "Limpar",
clearCaption: "Limpar",
chooseFileCaption: "Escolher ficheiro",
removeFileCaption: "Remover este arquivo",
booleanCheckedLabel: "Sim",
booleanUncheckedLabel: "Não",
confirmRemoveFile: "Tem certeza que deseja remover este arquivo: {0}?",
confirmRemoveAllFiles: "Tem certeza que deseja remover todos os arquivos?",
questionTitlePatternText: "Título da questão",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["pt"] = portugueseSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["pt"] = "português";
/***/ }),
/* 112 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export romanianSurveyStrings */
var romanianSurveyStrings = {
pagePrevText: "Precedent",
pageNextText: "Următor",
completeText: "Finalizare",
previewText: "previzualizare",
editText: "Editați",
startSurveyText: "start",
otherItemText: "Altul(precizaţi)",
noneItemText: "Nici unul",
selectAllItemText: "Selectează tot",
progressText: "Pagina {0} din {1}",
panelDynamicProgressText: "Înregistrare {0} din {1}",
questionsProgressText: "Răspunsuri la {0} / {1} întrebări",
emptySurvey: "Nu sunt întrebări pentru acest chestionar",
completingSurvey: "Vă mulţumim pentru timpul acordat!",
completingSurveyBefore: "Din înregistrările noastre reiese că ați completat deja acest chestionar.",
loadingSurvey: "Chestionarul se încarcă...",
optionsCaption: "Alegeţi...",
value: "valoare",
requiredError: "Răspunsul la această întrebare este obligatoriu.",
requiredErrorInPanel: "Vă rugăm să răspundeți la cel puțin o întrebare.",
requiredInAllRowsError: "Toate răspunsurile sunt obligatorii",
numericError: "Răspunsul trebuie să fie numeric.",
textMinLength: "Trebuie să introduceți minim {0} caractere.",
textMaxLength: "Trebuie să introduceți maxim {0} caractere.",
textMinMaxLength: "Trebuie să introduceți mai mult de {0} și mai puțin de {1} caractere.",
minRowCountError: "Trebuie să completați minim {0} rânduri.",
minSelectError: "Trebuie să selectați minim {0} opţiuni.",
maxSelectError: "Trebuie să selectați maxim {0} opţiuni.",
numericMinMax: "Răspunsul '{0}' trebuie să fie mai mare sau egal ca {1} şî mai mic sau egal cu {2}",
numericMin: "Răspunsul '{0}' trebuie să fie mai mare sau egal ca {1}",
numericMax: "Răspunsul '{0}' trebuie să fie mai mic sau egal ca {1}",
invalidEmail: "Trebuie să introduceţi o adresa de email validă.",
invalidExpression: "Expresia: {0} ar trebui să returneze „adevărat”.",
urlRequestError: "Request-ul a returnat eroarea '{0}'. {1}",
urlGetChoicesError: "Request-ul nu a returnat date sau proprietatea 'path' este incorectă",
exceedMaxSize: "Dimensiunea fişierului nu trebuie să depăşească {0}.",
otherRequiredError: "Trebuie să completați câmpul 'Altul'.",
uploadingFile: "Fișierul dumneavoastră este în curs de încărcare. Vă rugăm așteptați câteva secunde și reveniți apoi.",
loadingFile: "Se încarcă...",
chooseFile: "Alege fisierele...",
noFileChosen: "Niciun fișier ales",
confirmDelete: "Sunteți sigur că doriți să ștergeți înregistrarea?",
keyDuplicationError: "Valoarea trebuie să fie unică.",
addColumn: "Adăugați coloană",
addRow: "Adăugare rând",
removeRow: "Ștergere",
addPanel: "Adăugare",
removePanel: "Ștergere",
choices_Item: "opțiune",
matrix_column: "Coloană",
matrix_row: "Rând",
savingData: "Rezultatele sunt în curs de salvare...",
savingDataError: "A intervenit o eroare, rezultatele nu au putut fi salvate.",
savingDataSuccess: "Rezultatele au fost salvate cu succes!",
saveAgainButton: "Încercați din nou",
timerMin: "min",
timerSec: "sec",
timerSpentAll: "Ați petrecut {0} pe această pagină și {1} în total.",
timerSpentPage: "Ați petrecut {0} pe această pagină.",
timerSpentSurvey: "Ați petrecut {0} în total.",
timerLimitAll: "Ați petrecut {0} din {1} pe această pagină și {2} din {3} în total.",
timerLimitPage: "Ați petrecut {0} din {1} pe această pagină.",
timerLimitSurvey: "Ați petrecut {0} din {1} în total.",
cleanCaption: "Curat",
clearCaption: "clar",
chooseFileCaption: "Alege fișierul",
removeFileCaption: "Eliminați acest fișier",
booleanCheckedLabel: "da",
booleanUncheckedLabel: "Nu",
confirmRemoveFile: "Sigur doriți să eliminați acest fișier: {0}?",
confirmRemoveAllFiles: "Sigur doriți să eliminați toate fișierele?",
questionTitlePatternText: "Titlul intrebarii",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ro"] = romanianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ro"] = "română";
/***/ }),
/* 113 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export russianSurveyStrings */
var russianSurveyStrings = {
pagePrevText: "Назад",
pageNextText: "Далее",
completeText: "Готово",
previewText: "Предварительный просмотр",
editText: "Редактирование",
startSurveyText: "Начать",
otherItemText: "Другое (пожалуйста, опишите)",
noneItemText: "Нет",
selectAllItemText: "Выбрать всё",
progressText: "Страница {0} из {1}",
panelDynamicProgressText: "Запись {0} из {1}",
questionsProgressText: "Ответы на {0}/{1}вопросы",
emptySurvey: "Нет ни одного вопроса.",
completingSurvey: "Благодарим Вас за заполнение анкеты!",
completingSurveyBefore: "Вы уже проходили этот опрос.",
loadingSurvey: "Загрузка с сервера...",
optionsCaption: "Выбрать...",
value: "значение",
requiredError: "Пожалуйста, ответьте на вопрос.",
requiredErrorInPanel: "Пожалуйста, ответьте по крайней мере на один вопрос.",
requiredInAllRowsError: "Пожалуйста, ответьте на вопросы в каждой строке.",
numericError: "Ответ должен быть числом.",
textMinLength: "Пожалуйста введите больше {0} символов.",
textMaxLength: "Пожалуйста введите меньше {0} символов.",
textMinMaxLength: "Пожалуйста введите больше {0} и меньше {1} символов.",
minRowCountError: "Пожалуйста, заполните не меньше {0} строк.",
minSelectError: "Пожалуйста, выберите хотя бы {0} вариантов.",
maxSelectError: "Пожалуйста, выберите не более {0} вариантов.",
numericMinMax: "'{0}' должно быть не меньше чем {1}, и не больше чем {2}",
numericMin: "'{0}' должно быть не меньше чем {1}",
numericMax: "'{0}' должно быть не больше чем {1}",
invalidEmail: "Пожалуйста, введите действительный адрес электронной почты.",
invalidExpression: "Выражение {0} должно возвращать 'true'.",
urlRequestError: "Запрос вернул ошибку '{0}'. {1}",
urlGetChoicesError: "Ответ на запрос пришел пустой или свойство 'path' указано неверно",
exceedMaxSize: "Размер файла не должен превышать {0}.",
otherRequiredError: "Пожалуйста, введите данные в поле 'Другое'",
uploadingFile: "Ваш файл загружается. Подождите несколько секунд и попробуйте снова.",
loadingFile: "Загрузка...",
chooseFile: "Выберите файл(ы)...",
noFileChosen: "Файл не выбран",
confirmDelete: "Вы точно хотите удалить запись?",
keyDuplicationError: "Это значение должно быть уникальным.",
addColumn: "Добавить колонку",
addRow: "Добавить строку",
removeRow: "Удалить",
addPanel: "Добавить новую",
removePanel: "Удалить",
choices_Item: "Вариант",
matrix_column: "Колонка",
matrix_row: "Строка",
savingData: "Результаты сохраняются на сервер...",
savingDataError: "Произошла ошибка, результат не был сохранён.",
savingDataSuccess: "Результат успешно сохранён!",
saveAgainButton: "Попробовать снова",
timerMin: "мин",
timerSec: "сек",
timerSpentAll: "Вы потратили {0} на этой странице и {1} всего.",
timerSpentPage: "Вы потратили {0} на этой странице.",
timerSpentSurvey: "Вы потратили {0} в течение теста.",
timerLimitAll: "Вы потратили {0} из {1} на этой странице и {2} из {3} для всего теста.",
timerLimitPage: "Вы потратили {0} из {1} на этой странице.",
timerLimitSurvey: "Вы потратили {0} из {1} для всего теста.",
cleanCaption: "Очистить",
clearCaption: "Очистить",
chooseFileCaption: "Выберите файл",
removeFileCaption: "Удалить файл",
booleanCheckedLabel: "Да",
booleanUncheckedLabel: "Нет",
confirmRemoveFile: "Вы уверены, что хотите удалить этот файл: {0}?",
confirmRemoveAllFiles: "Вы уверены, что хотите удалить все файлы?",
questionTitlePatternText: "Название вопроса",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ru"] = russianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ru"] = "русский";
/***/ }),
/* 114 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export simplifiedChineseSurveyStrings */
var simplifiedChineseSurveyStrings = {
pagePrevText: "上一页",
pageNextText: "下一页",
completeText: "提交问卷",
previewText: "预览",
editText: "编辑",
startSurveyText: "开始问卷",
otherItemText: "填写其他答案",
noneItemText: "无",
selectAllItemText: "选择全部",
progressText: "第 {0} 页, 共 {1} 页",
panelDynamicProgressText: "{0} of {1}",
questionsProgressText: "第 {0}/{1} 题",
emptySurvey: "问卷中没有问题或页面",
completingSurvey: "感谢您的参与!",
completingSurveyBefore: "你已完成问卷.",
loadingSurvey: "问卷正在加载中...",
optionsCaption: "请选择...",
value: "值",
requiredError: "请填写此问题",
requiredErrorInPanel: "至少回答一题.",
requiredInAllRowsError: "请填写所有行中问题",
numericError: "答案必须是个数字",
textMinLength: "答案长度至少 {0} 个字符",
textMaxLength: "答案长度不能超过 {0} 个字符",
textMinMaxLength: "答案长度必须在 {0} - {1} 个字符之间",
minRowCountError: "最少需要填写 {0} 行答案",
minSelectError: "最少需要选择 {0} 项答案",
maxSelectError: "最多只能选择 {0} 项答案",
numericMinMax: "答案 '{0}' 必须大于等于 {1} 且小于等于 {2}",
numericMin: "答案 '{0}' 必须大于等于 {1}",
numericMax: "答案 '{0}' 必须小于等于 {1}",
invalidEmail: "请输入有效的 Email 地址",
invalidExpression: "公式: {0} 无效.",
urlRequestError: "载入选项时发生错误 '{0}': {1}",
urlGetChoicesError: "未能载入有效的选项或请求参数路径有误",
exceedMaxSize: "文件大小不能超过 {0}",
otherRequiredError: "请完成其他问题",
uploadingFile: "文件上传中... 请耐心等待几秒后重试",
loadingFile: "加载...",
chooseFile: "选择文件...",
noFileChosen: "未选择文件",
confirmDelete: "删除记录?",
keyDuplicationError: "主键不能重复",
addColumn: "添加列",
addRow: "添加行",
removeRow: "删除答案",
addPanel: "新添",
removePanel: "删除",
choices_Item: "选项",
matrix_column: "列",
matrix_row: "行",
savingData: "正在将结果保存到服务器...",
savingDataError: "在保存结果过程中发生了错误,结果未能保存",
savingDataSuccess: "结果保存成功!",
saveAgainButton: "请重试",
timerMin: "分",
timerSec: "秒",
timerSpentAll: "本页用时 {0} 总计用时{1} .",
timerSpentPage: "本页用时{0} .",
timerSpentSurvey: "总计用时 {0} .",
timerLimitAll: "本页用时 {0} 共 {1}, 总计用时 {2} 共 {3} .",
timerLimitPage: "本页用时 {0} 共 {1} .",
timerLimitSurvey: "总计用时 {0} 共 {1}.",
cleanCaption: "清理",
clearCaption: "清除",
chooseFileCaption: "选择文件",
removeFileCaption: "移除文件",
booleanCheckedLabel: "是",
booleanUncheckedLabel: "否",
confirmRemoveFile: "删除文件: {0}?",
confirmRemoveAllFiles: "删除所有文件?",
questionTitlePatternText: "标题",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["zh-cn"] = simplifiedChineseSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["zh-cn"] = "简体中文";
/***/ }),
/* 115 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export spanishSurveyStrings */
var spanishSurveyStrings = {
pagePrevText: "Anterior",
pageNextText: "Siguiente",
completeText: "Completar",
previewText: "Vista previa",
editText: "Edita",
startSurveyText: "Comienza",
otherItemText: "Otro (describa)",
noneItemText: "Ninguno",
selectAllItemText: "Seleccionar todo",
progressText: "Página {0} de {1}",
panelDynamicProgressText: "Registro {0} de {1}",
questionsProgressText: "Respondió a {0}/{1} preguntas",
emptySurvey: "No hay página visible o pregunta en la encuesta.",
completingSurvey: "Gracias por completar la encuesta!",
completingSurveyBefore: "Nuestros registros muestran que ya ha completado esta encuesta.",
loadingSurvey: "La encuesta está cargando...",
optionsCaption: "Seleccione...",
value: "valor",
requiredError: "Por favor conteste la pregunta.",
requiredErrorInPanel: "Por favor, responda al menos una pregunta.",
requiredInAllRowsError: "Por favor conteste las preguntas en cada hilera.",
numericError: "La estimación debe ser numérica.",
textMinLength: "Por favor entre por lo menos {0} símbolos.",
textMaxLength: "Por favor entre menos de {0} símbolos.",
textMinMaxLength: "Por favor entre más de {0} y menos de {1} símbolos.",
minRowCountError: "Por favor llene por lo menos {0} hileras.",
minSelectError: "Por favor seleccione por lo menos {0} variantes.",
maxSelectError: "Por favor seleccione no más de {0} variantes.",
numericMinMax: "El '{0}' debe de ser igual o más de {1} y igual o menos de {2}",
numericMin: "El '{0}' debe ser igual o más de {1}",
numericMax: "El '{0}' debe ser igual o menos de {1}",
invalidEmail: "Por favor agregue un correo electrónico válido.",
invalidExpression: "La expresión: {0} debería devolver 'verdadero'.",
urlRequestError: "La solicitud regresó error '{0}'. {1}",
urlGetChoicesError: "La solicitud regresó vacío de data o la propiedad 'trayectoria' no es correcta",
exceedMaxSize: "El tamaño del archivo no debe de exceder {0}.",
otherRequiredError: "Por favor agregue la otra estimación.",
uploadingFile: "Su archivo se está subiendo. Por favor espere unos segundos e intente de nuevo.",
loadingFile: "Cargando...",
chooseFile: "Elija archivo(s)...",
noFileChosen: "No se ha elegido ningún archivo",
confirmDelete: "¿Quieres borrar el registro?",
keyDuplicationError: "Este valor debe ser único.",
addColumn: "Añadir columna",
addRow: "Agregue una hilera",
removeRow: "Eliminar una hilera",
addPanel: "Añadir nuevo",
removePanel: "Retire",
choices_Item: "artículo",
matrix_column: "Columna",
matrix_row: "Hilera",
savingData: "Los resultados se están guardando en el servidor...",
savingDataError: "Los resultados se están guardando en el servidor...",
savingDataSuccess: "¡Los resultados se guardaron con éxito!",
saveAgainButton: "Inténtalo de nuevo.",
timerMin: "min",
timerSec: "sec",
timerSpentAll: "Has gastado {0} en esta página y {1} en total.",
timerSpentPage: "Usted ha pasado {0} en esta página.",
timerSpentSurvey: "Has gastado en total.",
timerLimitAll: "Has gastado {0} de {1} en esta página y {2} de {3} en total.",
timerLimitPage: "Has gastado {0} de {1} en esta página.",
timerLimitSurvey: "Usted ha gastado {0} de {1} en total.",
cleanCaption: "Limpia",
clearCaption: "Despejen",
chooseFileCaption: "Elija el archivo",
removeFileCaption: "Elimina este archivo",
booleanCheckedLabel: "Sí",
booleanUncheckedLabel: "No",
confirmRemoveFile: "¿Estás seguro de que quieres eliminar este archivo: {0}?",
confirmRemoveAllFiles: "¿Estás seguro de que quieres eliminar todos los archivos?",
questionTitlePatternText: "Título de la pregunta",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["es"] = spanishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["es"] = "español";
/***/ }),
/* 116 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export swahiliStrings */
var swahiliStrings = {
pagePrevText: "Iliyotangulia",
pageNextText: "Ifuatayo",
completeText: "Kamili",
previewText: "Hakiki",
editText: "Hariri",
startSurveyText: "Anza",
otherItemText: "Nyingine (eleza)",
noneItemText: "Hakuna",
selectAllItemText: "Chagua Zote",
progressText: "Ukurasa {0} wa {1}",
panelDynamicProgressText: "Rekodi {0} ya {1}",
questionsProgressText: "Yaliyojibiwa {0}/{1} maswali",
emptySurvey: "Hakuna ukurasa unaoonekana au swali katika utafiti.",
completingSurvey: "Asanti kwa kukamilisha utafiti!",
completingSurveyBefore: "Recodi zetu zinatuonyesha tayari umekamilisha utafiti.",
loadingSurvey: "Tunaandaa utafiti...",
optionsCaption: "Chagua...",
value: "thamani",
requiredError: "Tafadhali jibu hili swali.",
requiredErrorInPanel: "Tafadhali jibu swali angalau moja.",
requiredInAllRowsError: "Tafadhali jibu maswali katika safu zote.",
numericError: "Thamani inapaswa kuwa ya nambari.",
textMinLength: "Tafadhali ingiza angalau{0} husika.",
textMaxLength: "Tafadhali ingiza isiozidi {0} husika.",
textMinMaxLength: "Tafadhali ingiza kiwango zaidi ya {0} na kisichopungua {1} husika.",
minRowCountError: "Tafadhali jaza isiopungua {0} safu.",
minSelectError: "Tafadhali chagua angalau {0} lahaja.",
maxSelectError: "Tafadhali changua isiozidi {0} lahaja.",
numericMinMax: " '{0}' inapaswa kuwa sawa au zaidi ya {1} na sawa au chini ya {2}",
numericMin: " '{0}'inapaswa kuwa sawa au zaidi ya {1}",
numericMax: " '{0}'inapaswa kuwa sawa au chini ya {1}",
invalidEmail: "Tafadhali ingiza anwani halali ya barua-pepe.",
invalidExpression: "Usemi:{0} inapaswa kurudi 'kweli'.",
urlRequestError: "Ombi lina kosa '{0}'. {1}",
urlGetChoicesError: "Ombi lilirudisha data tupu au the 'path' mali ya njia sio sahihi",
exceedMaxSize: "Saizi ya faili haipaswi kuzidi {0}.",
otherRequiredError: "Tafadhali ingiza thamani nyingine.",
uploadingFile: "Faili yako inapakia.Tafadhali subiri sekunde kadhaa na ujaribu tena.",
loadingFile: "Inapakia...",
chooseFile: "Chagua faili...",
noFileChosen: "Hujachagua faili",
confirmDelete: "Je! Unataka kufuta rekodi?",
keyDuplicationError: "Thamani hii inapaswa kuwa ya kipekee.",
addColumn: "Ongeza Kolamu",
addRow: "Ongeza safu",
removeRow: "Toa",
addPanel: "Ongeza mpya",
removePanel: "Toa",
choices_Item: "kitu",
matrix_column: "Kolamu",
matrix_row: "Safu",
savingData: "Matokeo yamehifadhiwa kwa seva...",
savingDataError: "Kosa limetokea na hatukuweza kuhifadhi matokeo.",
savingDataSuccess: "Matokeo yamehifadhiwa!",
saveAgainButton: "Jaribu tena",
timerMin: "dakika",
timerSec: "sekunde",
timerSpentAll: "Umetumia {0} kwenye ukurasa huu na {1} kwa jumla.",
timerSpentPage: "Umetumia {0} kwenye ukurasa huu.",
timerSpentSurvey: "Umetumia {0} kwa jumla.",
timerLimitAll: "Umetumia {0} ya {1} kwenye ukurasa huu {2} wa {3} kwa jumla.",
timerLimitPage: "Umetumia {0} ya {1} kwenye ukurasa huu.",
timerLimitSurvey: "Umetumia {0} ya {1} kwa jumla.",
cleanCaption: "Safisha",
clearCaption: "Ondoa",
chooseFileCaption: "Chagua faili",
removeFileCaption: "Ondoa faili",
booleanCheckedLabel: "Ndio",
booleanUncheckedLabel: "Hapana",
confirmRemoveFile: "Je! Una uhakika kuwa unataka kuondoa faili hii: {0}?",
confirmRemoveAllFiles: "Je! Una uhakika kuwa unataka kuondoa faili zote?",
questionTitlePatternText: "Kichwa cha Swali",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["sw"] = swahiliStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["sw"] = "Swahili";
/***/ }),
/* 117 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export swedishSurveyStrings */
//Create by Mattias Asplund
var swedishSurveyStrings = {
pagePrevText: "Föregående",
pageNextText: "Nästa",
completeText: "Färdig",
previewText: "Förhandsvisning",
editText: "Redigera",
startSurveyText: "Start",
otherItemText: "Annat (beskriv)",
noneItemText: "Ingen",
selectAllItemText: "Välj alla",
progressText: "Sida {0} av {1}",
panelDynamicProgressText: "Spela in {0} av {1}",
questionsProgressText: "Besvarade {0} / {1} frågor",
emptySurvey: "Det finns ingen synlig sida eller fråga i enkäten.",
completingSurvey: "Tack för att du genomfört enkäten!!",
completingSurveyBefore: "Våra register visar att du redan har slutfört denna undersökning.",
loadingSurvey: "Enkäten laddas...",
optionsCaption: "Välj...",
value: "värde",
requiredError: "Var vänlig besvara frågan.",
requiredErrorInPanel: "Vänligen svara på minst en fråga.",
requiredInAllRowsError: "Var vänlig besvara frågorna på alla rader.",
numericError: "Värdet ska vara numeriskt.",
textMinLength: "Var vänlig ange minst {0} tecken.",
textMaxLength: "Ange färre än {0} tecken.",
textMinMaxLength: "Ange mer än {0} och färre än {1} tecken.",
minRowCountError: "Var vänlig fyll i minst {0} rader.",
minSelectError: "Var vänlig välj åtminstone {0} varianter.",
maxSelectError: "Var vänlig välj inte fler än {0} varianter.",
numericMinMax: "'{0}' ska vara lika med eller mer än {1} samt lika med eller mindre än {2}",
numericMin: "'{0}' ska vara lika med eller mer än {1}",
numericMax: "'{0}' ska vara lika med eller mindre än {1}",
invalidEmail: "Var vänlig ange en korrekt e-postadress.",
invalidExpression: "Uttrycket: {0} ska returnera 'true'.",
urlRequestError: "Förfrågan returnerade felet '{0}'. {1}",
urlGetChoicesError: "Antingen returnerade förfrågan ingen data eller så är egenskapen 'path' inte korrekt",
exceedMaxSize: "Filstorleken får ej överstiga {0}.",
otherRequiredError: "Var vänlig ange det andra värdet.",
uploadingFile: "Din fil laddas upp. Var vänlig vänta några sekunder och försök sedan igen.",
loadingFile: "Läser in...",
chooseFile: "Välj fil (er) ...",
noFileChosen: "Ingen fil vald",
confirmDelete: "Vill du radera posten?",
keyDuplicationError: "Detta värde ska vara unikt.",
addColumn: "Lägg till kolumn",
addRow: "Lägg till rad",
removeRow: "Ta bort",
addPanel: "Lägg till ny",
removePanel: "Ta bort",
choices_Item: "Artikel",
matrix_column: "Kolumn",
matrix_row: "Rad",
savingData: "Resultaten sparas på servern ...",
savingDataError: "Ett fel inträffade och vi kunde inte spara resultaten.",
savingDataSuccess: "Resultaten sparades framgångsrikt!",
saveAgainButton: "Försök igen",
timerMin: "min",
timerSec: "sek",
timerSpentAll: "Du har spenderat {0} på den här sidan och {1} totalt.",
timerSpentPage: "Du har spenderat {0} på den här sidan.",
timerSpentSurvey: "Du har spenderat {0} totalt.",
timerLimitAll: "Du har spenderat {0} av {1} på den här sidan och {2} av {3} totalt.",
timerLimitPage: "Du har spenderat {0} av {1} på den här sidan.",
timerLimitSurvey: "Du har spenderat {0} av {1} totalt.",
cleanCaption: "Rena",
clearCaption: "Klar",
chooseFileCaption: "Välj FIL",
removeFileCaption: "Ta bort den här filen",
booleanCheckedLabel: "Ja",
booleanUncheckedLabel: "Nej",
confirmRemoveFile: "Är du säker på att du vill ta bort den här filen: {0}?",
confirmRemoveAllFiles: "Är du säker på att du vill ta bort alla filer?",
questionTitlePatternText: "Frågetitel",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["sv"] = swedishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["sv"] = "svenska";
/***/ }),
/* 118 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export tajikSurveyStrings */
var tajikSurveyStrings = {
pagePrevText: "Бозгашт",
pageNextText: "Оянда",
completeText: "Иҷро шуд",
startSurveyText: "Оғоз",
otherItemText: "Дигар (лутфан тавсиф кунед)",
noneItemText: "Не",
selectAllItemText: "Ҳамаро интихоб кардан",
progressText: "Саҳифаи {0} аз {1}",
emptySurvey: "Ягон савол вуҷуд надорад.",
completingSurvey: "Ташаккур барои пур кардани саволнома!",
completingSurveyBefore: "Шумо аллакай ин пурсишро анҷом додаед.",
loadingSurvey: "Боргирӣ аз сервер...",
optionsCaption: "Интихоб кардан...",
value: "қиммат",
requiredError: "Илтимос, ба савол ҷавоб диҳед.",
requiredErrorInPanel: "Илтимос, ақалан ба як савол ҷавоб диҳед.",
requiredInAllRowsError: "Илтимос, ба ҳамаи саволҳо дар ҳамаи сатрҳо ҷавоб диҳед.",
numericError: "Ҷавоб бояд рақам бошад.",
textMinLength: "Илтимос, аз {0} зиёдтар рамз ворид кунед.",
textMaxLength: "Илтимос, аз {0} камтар рамз ворид кунед.",
textMinMaxLength: "Илтимос, аз {0} зиёдтар ва аз {1} камтар рамз ворид кунед.",
minRowCountError: "Илтимос, на камтар аз {0} сатр пур кунед.",
minSelectError: "Илтимос, ақалан {0} вариант интихоб кунед.",
maxSelectError: "Илтимос, на зиёдтар аз {0} вариант интихоб кунед.",
numericMinMax: "'{0}' бояд на кам аз {1} ва на бисёр аз {2} бошад",
numericMin: "'{0}' бояд на кам аз {1} бошад",
numericMax: "'{0}' бояд на зиёд аз {1} бошад",
invalidEmail: "Илтимос, почтаи электронии воқеиро ворид кунед.",
invalidExpression: "Ифодаи {0} бояд 'true' баргардонад.",
urlRequestError: "Дархост хатогӣ бозгардонд '{0}'. {1}",
urlGetChoicesError: "Ҷавоб ба дархост холӣ омад ё хосияти 'path' нодуруст муайян карда шудааст",
exceedMaxSize: "Андозаи файл бояд на калон аз {0} бошад.",
otherRequiredError: "Илтимос, ба майдони 'Дигар' додаҳоро ворид кунед",
uploadingFile: "Файли шумо бор шуда истодааст. Якчанд сония интизор шавед ва бори дигар кӯшиш кунед.",
loadingFile: "Боркунӣ...",
chooseFile: "Файл(ҳо)-ро интихоб кунед...",
confirmDelete: "Шумо мутмаин ҳастед, ки мехоҳед воридро тоза кунед?",
keyDuplicationError: "Ин арзиш бояд беназир бошад.",
addColumn: "Иловаи сутун",
addRow: "Иловаи сатр",
removeRow: "Нест кардан",
addPanel: "Илова кардан",
removePanel: "Нест кардан",
choices_Item: "Вариант",
matrix_column: "Сутун",
matrix_row: "Сатр",
savingData: "Натиҷа ба сервер сабт шуда истодаанд...",
savingDataError: "Хатогӣ ба амал омад, натиҷа сабт нашуд.",
savingDataSuccess: "Натиҷа бомуваффакият сабт шуд!",
saveAgainButton: "Бори дигар кӯшиш карданд",
timerMin: "дақ",
timerSec: "сон",
timerSpentAll: "Шумо {0} дар ин саҳифа ва {1} дар умум сарф кардед.",
timerSpentPage: "Шумо {0} дар ин саҳифа сарф кардед.",
timerSpentSurvey: "Шумо {0} дар ин тест сарф намудед.",
timerLimitAll: "Шумо {0} аз {1} дар ин саҳифа ва {2} аз {3} дар умум сарф кардед дар дохили ин тест.",
timerLimitPage: "Шумо {0} аз {1} дар ин саҳифа сарф кардед.",
timerLimitSurvey: "Шумо {0} аз {1} дар ҳамаи тест сарф кардед.",
cleanCaption: "Тоза кардан",
clearCaption: "Тоза кардан",
removeFileCaption: "Файлро нест кардан"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["tg"] = tajikSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["tg"] = "тоҷикӣ";
/***/ }),
/* 119 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export thaiStrings */
//Created by Padet Taweekunkan
var thaiStrings = {
pagePrevText: "ก่อนหน้า",
pageNextText: "ถัดไป",
completeText: "สำเร็จ",
previewText: "ดูตัวอย่าง",
editText: "แก้ไข",
startSurveyText: "เริ่ม",
otherItemText: "อื่นๆ (โปรดระบุ)",
noneItemText: "ไม่มี",
selectAllItemText: "เลือกทั้งหมด",
progressText: "หน้าที่ {0} จาก {1}",
panelDynamicProgressText: "รายการที่ {0} จาก {1}",
questionsProgressText: "คำตอบที่ {0}/{1} จำนวนคำถาม",
emptySurvey: "ไม่มีหน้าเพจที่มองเห็น หรือ คำถามใน survey นี้",
completingSurvey: "ขอบคุณที่ทำ survey จนเสร็จ",
completingSurveyBefore: "รายการของเราแสดงว่าคุณได้ทำ survey เสร็จเรียบร้อยแล้ว",
loadingSurvey: "กำลังโหลด Survey...",
optionsCaption: "เลือก...",
value: "ข้อมูล",
requiredError: "กรุณาตอบคำถาม",
requiredErrorInPanel: "กรุณาตอบขั้นต่ำหนึ่งคำถาม",
requiredInAllRowsError: "กรุณาตอบคำถามในทุกๆแถว",
numericError: "ข้อมูลที่ใส่ต้องเป็นตัวเลข",
textMinLength: "กรุณาใส่ขั้นต่ำจำนวน {0} ตัวอักษร",
textMaxLength: "กรุณาใส่ไม่เกินจำนวน {0} ตัวอักษร",
textMinMaxLength: "กรุณาใส่ขั้นต่ำจำนวน {0} และไม่เกินจำนวน {1} ตัวอักษร",
minRowCountError: "กรุณาใส่ขั้นต่ำจำนวน {0} แถว",
minSelectError: "กรุณาเลือกอย่างน้อย {0} รายการ",
maxSelectError: "กรุณาเลือกไม่เกิน {0} รายการ",
numericMinMax: "'{0}' ต้องมากกว่าหรือเท่ากับ {1} และน้อยกว่าหรือเท่ากับ {2}",
numericMin: "'{0}' ต้องมากกว่าหรือเท่ากับ {1}",
numericMax: "'{0}' น้อยกว่าหรือเท่ากับ {1}",
invalidEmail: "กรุณาใส่อีเมล์แอดเดรสที่ถูกต้อง",
invalidExpression: "The expression: {0} ต้องรีเทิร์น 'true'.",
urlRequestError: "รีเควสรีเทิร์น error '{0}'. {1}",
urlGetChoicesError: "รีเควสรีเทิร์นข้อมูลว่างเปล่า หรือ 'path' property ไม่ถูกต้อง",
exceedMaxSize: "ขนาดไฟล์ต้องไม่เกิน {0}.",
otherRequiredError: "กรุณาใส่ค่าอื่น",
uploadingFile: "ไฟล์ของคุณกำลังอัพโหลดอยู่. กรุณารอสักครู่แล้วทำการลองอีกครั้ง",
loadingFile: "กำลังโหลด...",
chooseFile: "เลือกไฟล์...",
noFileChosen: "ไม่ไฟล์ที่เลือก",
confirmDelete: "คุณต้องการลบรายการนี้จริงหรือไม่?",
keyDuplicationError: "ข้อมูลนี้ต้องเป็น unique.",
addColumn: "เพิ่มคอลัมน์",
addRow: "เพิ่มแถว",
removeRow: "ลบ",
addPanel: "เพิ่ม",
removePanel: "ลบ",
choices_Item: "ชิ้น",
matrix_column: "คอลัมน์",
matrix_row: "แถว",
savingData: "ผลลัพท์กำลังบันทึกลงที่เซิร์ฟเวอร์...",
savingDataError: "มีความผิดพลาดเกิดขึ้นส่งผลให้ไม่สามารถบันทึกผลได้",
savingDataSuccess: "บันทึกสำเร็จแล้ว",
saveAgainButton: "รบกวนลองอีกครั้ง",
timerMin: "นาที",
timerSec: "วินาที",
timerSpentAll: "คุณใช้เวลา {0} บนหน้านี้และ {1} รวมทั้งหมด",
timerSpentPage: "คุณใช้เวลา {0} บนหน้านี้",
timerSpentSurvey: "คุณใช้เวลา {0} รวมทั้งหมด",
timerLimitAll: "คุณใช้เวลา {0} ของ {1} บนหน้านี้และ {2} ของ {3} รวมทั้งหมด",
timerLimitPage: "คุณใช้เวลา {0} ของ {1} บนหน้านี้",
timerLimitSurvey: "คุณใช้เวลา {0} ของ {1} รวมทั้งหมด",
cleanCaption: "คลีน",
clearCaption: "เคลียร์",
chooseFileCaption: "เลือกไฟล์",
removeFileCaption: "นำไฟล์นี้ออก",
booleanCheckedLabel: "ใช่",
booleanUncheckedLabel: "ไม่ใช่",
confirmRemoveFile: "คุณแน่ใจที่จะนำไฟล์นี้ออกใช่หรือไม่: {0}?",
confirmRemoveAllFiles: "คุณแน่ใจที่จะนำไฟล์ทั้งหมดออกใช่หรือไม่",
questionTitlePatternText: "ชื่อคำถาม",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["th"] = thaiStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["th"] = "ไทย";
/***/ }),
/* 120 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export traditionalChineseSurveyStrings */
var traditionalChineseSurveyStrings = {
pagePrevText: "上一頁",
pageNextText: "下一頁",
completeText: "提交問卷",
otherItemText: "填寫其他答案",
progressText: "第 {0} 頁, 共 {1} 頁",
emptySurvey: "問卷中沒有問題或頁面",
completingSurvey: "感謝您的參與!",
loadingSurvey: "問卷載入中...",
optionsCaption: "請選擇...",
requiredError: "請填寫此問題",
requiredInAllRowsError: "請填寫所有行中問題",
numericError: "答案必須是個數字",
textMinLength: "答案長度至少 {0} 個字元",
textMaxLength: "答案長度不能超過 {0} 個字元",
textMinMaxLength: "答案長度必須在 {0} - {1} 個字元之間",
minRowCountError: "最少需要填寫 {0} 行答案",
minSelectError: "最少需要選擇 {0} 項答案",
maxSelectError: "最多只能選擇 {0} 項答案",
numericMinMax: "答案 '{0}' 必須大於等於 {1} 且小於等於 {2}",
numericMin: "答案 '{0}' 必須大於等於 {1}",
numericMax: "答案 '{0}' 必須小於等於 {1}",
invalidEmail: "請輸入有效的 Email 地址",
urlRequestError: "載入選項時發生錯誤 '{0}': {1}",
urlGetChoicesError: "未能載入有效的選項或請求參數路徑有誤",
exceedMaxSize: "文件大小不能超過 {0}",
otherRequiredError: "請完成其他問題",
uploadingFile: "文件上傳中... 請耐心等待幾秒後重試",
addRow: "添加答案",
removeRow: "刪除答案",
choices_Item: "選項",
matrix_column: "列",
matrix_row: "行",
savingData: "正在將結果保存到服務器...",
savingDataError: "在保存結果過程中發生了錯誤,結果未能保存",
savingDataSuccess: "結果保存成功!",
saveAgainButton: "請重試"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["zh-tw"] = traditionalChineseSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["zh-tw"] = "繁體中文";
/***/ }),
/* 121 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export turkishSurveyStrings */
var turkishSurveyStrings = {
pagePrevText: "Geri",
pageNextText: "İleri",
completeText: "Anketi Tamamla",
previewText: "Ön izleme",
editText: "Düzenle",
startSurveyText: "Başlat",
otherItemText: "Diğer (açıklayınız)",
noneItemText: "Yok",
selectAllItemText: "Hepsini seç",
progressText: "Sayfa {0} / {1}",
panelDynamicProgressText: "Kayıt {0} / {1}",
questionsProgressText: "Soruları cevapladı {0} / {1}",
emptySurvey: "Ankette görüntülenecek sayfa ya da soru mevcut değil.",
completingSurvey: "Anketimizi tamamladığınız için teşekkür ederiz.",
completingSurveyBefore: "Kayıtlarımız, bu anketi zaten tamamladığınızı gösteriyor.",
loadingSurvey: "Anket sunucudan yükleniyor ...",
optionsCaption: "Seçiniz ...",
value: "değer",
requiredError: "Lütfen soruya cevap veriniz",
requiredErrorInPanel: "Lütfen en az bir soruyu yanıtlayın.",
requiredInAllRowsError: "Lütfen tüm satırlardaki soruları cevaplayınız.",
numericError: "Girilen değer numerik olmalıdır",
textMinLength: "En az {0} sembol giriniz.",
textMaxLength: "Lütfen {0} karakterden az girin.",
textMinMaxLength: "Lütfen {0} ’den fazla ve {1} ’den az karakter girin.",
minRowCountError: "Lütfen en az {0} satırı doldurun.",
minSelectError: "Lütfen en az {0} seçeneği seçiniz.",
maxSelectError: "Lütfen {0} adetten fazla seçmeyiniz.",
numericMinMax: "The '{0}' should be equal or more than {1} and equal or less than {2}",
numericMin: "'{0}' değeri {1} değerine eşit veya büyük olmalıdır",
numericMax: "'{0}' değeri {1} değerine eşit ya da küçük olmalıdır.",
invalidEmail: "Lütfen geçerli bir eposta adresi giriniz.",
invalidExpression: "İfade: {0} 'true' döndürmelidir.",
urlRequestError: "Talebi şu hatayı döndü '{0}'. {1}",
urlGetChoicesError: "Talep herhangi bir veri dönmedi ya da 'path' özelliği hatalı.",
exceedMaxSize: "Dosya boyutu {0} değerini geçemez.",
otherRequiredError: "Lütfen diğer değerleri giriniz.",
uploadingFile: "Dosyanız yükleniyor. LÜtfen birkaç saniye bekleyin ve tekrar deneyin.",
loadingFile: "Yükleniyor...",
chooseFile: "Dosyaları seçin ...",
noFileChosen: "Dosya seçili değil",
confirmDelete: "Kaydı silmek istiyor musunuz?",
keyDuplicationError: "Bu değer benzersiz olmalıdır.",
addColumn: "Sütun ekleyin",
addRow: "Satır Ekle",
removeRow: "Kaldır",
addPanel: "Yeni ekle",
removePanel: "Kaldırmak",
choices_Item: "eşya",
matrix_column: "Sütun",
matrix_row: "Kürek çekmek",
savingData: "Sonuçlar sunucuya kaydediliyor ...",
savingDataError: "Bir hata oluştu ve sonuçları kaydedemedik.",
savingDataSuccess: "Sonuçlar başarıyla kaydedildi!",
saveAgainButton: "Tekrar deneyin",
timerMin: "min",
timerSec: "saniye",
timerSpentAll: "Bu sayfada {0} ve toplamda {1} harcadınız.",
timerSpentPage: "Bu sayfaya {0} harcadınız.",
timerSpentSurvey: "Toplamda {0} harcadınız.",
timerLimitAll: "Bu sayfaya {0} / {1} ve toplamda {2} / {3} harcadınız.",
timerLimitPage: "Bu sayfaya {0} / {1} harcadınız.",
timerLimitSurvey: "Toplamda {0} / {1} harcadınız.",
cleanCaption: "Temiz",
clearCaption: "Açık",
chooseFileCaption: "Dosya seçin",
removeFileCaption: "Bu dosyayı kaldır",
booleanCheckedLabel: "Evet",
booleanUncheckedLabel: "Hayır",
confirmRemoveFile: "Bu dosyayı kaldırmak istediğinizden emin misiniz: {0}?",
confirmRemoveAllFiles: "Tüm dosyaları kaldırmak istediğinizden emin misiniz?",
questionTitlePatternText: "Soru başlığı",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["tr"] = turkishSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["tr"] = "türkçe";
/***/ }),
/* 122 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(1);
/* unused harmony export ukrainianSurveyStrings */
var ukrainianSurveyStrings = {
pagePrevText: "Назад",
pageNextText: "Далі",
completeText: "Завершити",
previewText: "Попередній перегляд",
editText: "Редагувати",
startSurveyText: "Почати",
otherItemText: "Інше (будь ласка, опишіть)",
noneItemText: "Жоден",
selectAllItemText: "Вибрати все",
progressText: "Сторінка {0} з {1}",
panelDynamicProgressText: "Запис {0} із {1}",
questionsProgressText: "Відповіли на {0}/{1} питань",
emptySurvey: "Немає жодного питання.",
completingSurvey: "Дякуємо Вам за заповнення анкети!",
completingSurveyBefore: "Ви вже проходили це опитування.",
loadingSurvey: "Завантаження опитування...",
optionsCaption: "Вибрати...",
value: "значення",
requiredError: "Будь ласка, дайте відповідь.",
requiredErrorInPanel: "Будь ласка, дайте відповідь хоча б на одне питання.",
requiredInAllRowsError: "Будь ласка, дайте відповідь на питання в кожному рядку.",
numericError: "Відповідь повинна бути числом.",
textMinLength: "Будь ласка введіть більше {0} символів.",
textMaxLength: "Будь ласка введіть менше {0} символів.",
textMinMaxLength: "Будь ласка введіть більше {0} и менше {1} символів.",
minRowCountError: "Будь ласка, заповніть не менше {0} рядків.",
minSelectError: "Будь ласка, виберіть хоча б {0} варіантів.",
maxSelectError: "Будь ласка, виберіть не більше {0} варіантів.",
numericMinMax: "'{0}' повинно бути не менше ніж {1}, і не більше ніж {2}",
numericMin: "'{0}' повинно бути не менше ніж {1}",
numericMax: "'{0}' повинно бути не більше ніж {1}",
invalidEmail: "Будь ласка, введіть дійсну адресу електронної пошти.",
invalidExpression: "Вираз {0} повинен повертати 'true'.",
urlRequestError: "Запит повернув помилку '{0}'. {1}",
urlGetChoicesError: "Відповідь на запит повернулась порожньою або властивіть 'path' вказано невірно",
exceedMaxSize: "Розмір файлу не повинен перевищувати {0}.",
otherRequiredError: "Будь ласка, введіть дані в поле 'Інше'",
uploadingFile: "Ваш файл завантажується. Зачекайте декілька секунд і спробуйте знову.",
loadingFile: "Завантаження...",
chooseFile: "Виберіть файл(и)...",
noFileChosen: "Файл не вибрано",
confirmDelete: "Ви хочете видалити запис?",
keyDuplicationError: "Це значення повинно бути унікальним.",
addColumn: "Додати колонку",
addRow: "Додати рядок",
removeRow: "Видалити",
addPanel: "Додати нову",
removePanel: "Видалити",
choices_Item: "Варіант",
matrix_column: "Колонка",
matrix_row: "Рядок",
savingData: "Результати зберігаються на сервер...",
savingDataError: "Відбулася помилка, результат не був збережений.",
savingDataSuccess: "Резвультат успішно збережений!",
saveAgainButton: "Спробувати знову",
timerMin: "хв",
timerSec: "сек",
timerSpentAll: "Ви витратили {0} на цій сторінці і {1} загалом.",
timerSpentPage: "Ви витратили {0} на цій сторінці.",
timerSpentSurvey: "Ви витратили {0} протягом тесту.",
timerLimitAll: "Ви витратили {0} з {1} на цій сторінці і {2} з {3} для всього тесту.",
timerLimitPage: "Ви витратили {0} з {1} на цій сторінці.",
timerLimitSurvey: "Ви витратили {0} з {1} для всього тесту.",
cleanCaption: "Очистити",
clearCaption: "Очистити",
chooseFileCaption: "Виберіть файл",
removeFileCaption: "Видалити файл",
booleanCheckedLabel: "Так",
booleanUncheckedLabel: "Ні",
confirmRemoveFile: "Ви впевнені, що хочете видалити цей файл: {0}?",
confirmRemoveAllFiles: "Ви впевнені, що хочете видалити всі файли?",
questionTitlePatternText: "Назва запитання",
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ua"] = ukrainianSurveyStrings;
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].localeNames["ua"] = "українська";
/***/ }),
/* 123 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionBooleanModel; });
/**
* A Model for a boolean question.
*/
var QuestionBooleanModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionBooleanModel, _super);
function QuestionBooleanModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("labelFalse", _this, true);
_this.createLocalizableString("labelTrue", _this, true);
_this.locLabelFalse.onGetTextCallback = function (text) {
return !!text
? text
: __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("booleanUncheckedLabel");
};
_this.locLabelTrue.onGetTextCallback = function (text) {
return !!text
? text
: __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("booleanCheckedLabel");
};
return _this;
}
QuestionBooleanModel.prototype.getType = function () {
return "boolean";
};
QuestionBooleanModel.prototype.isLayoutTypeSupported = function (layoutType) {
return true;
};
Object.defineProperty(QuestionBooleanModel.prototype, "isIndeterminate", {
/**
* Returns true if the question check will be rendered in indeterminate mode. value is empty.
*/
get: function () {
return this.isEmpty();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "hasTitle", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "checkedValue", {
/**
* Get/set question value in 3 modes: indeterminate (value is empty), true (check is set) and false (check is unset).
* @see valueTrue
* @see valueFalse
*/
get: function () {
if (this.isEmpty())
return null;
return this.value == this.getValueTrue();
},
set: function (val) {
if (this.isReadOnly) {
return;
}
if (this.isValueEmpty(val)) {
this.value = null;
}
else {
this.value = val == true ? this.getValueTrue() : this.getValueFalse();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "defaultValue", {
/**
* Set the default state of the check: "indeterminate" - default (value is empty/null), "true" - value equals valueTrue or true, "false" - value equals valueFalse or false.
*/
get: function () {
return this.getPropertyValue("defaultValue");
},
set: function (val) {
if (val === true)
val = "true";
if (val === false)
val = "false";
this.setPropertyValue("defaultValue", val);
this.updateValueWithDefaults();
},
enumerable: true,
configurable: true
});
QuestionBooleanModel.prototype.getDefaultValue = function () {
if (this.defaultValue == "indeterminate")
return null;
return this.defaultValue == "true"
? this.getValueTrue()
: this.getValueFalse();
};
Object.defineProperty(QuestionBooleanModel.prototype, "locTitle", {
get: function () {
return this.showTitle || this.isValueEmpty(this.locLabel.text)
? this.getLocalizableString("title")
: this.locLabel;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "locDisplayLabel", {
get: function () {
if (this.locLabel.text)
return this.locLabel;
return this.showTitle ? this.locLabel : this.locTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "labelTrue", {
/**
* Set this property, if you want to have a different label for state when check is set.
*/
get: function () {
return this.getLocalizableStringText("labelTrue");
},
set: function (val) {
this.setLocalizableStringText("labelTrue", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "locLabelTrue", {
get: function () {
return this.getLocalizableString("labelTrue");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "labelFalse", {
/**
* Set this property, if you want to have a different label for state when check is unset.
*/
get: function () {
return this.getLocalizableStringText("labelFalse");
},
set: function (val) {
this.setLocalizableStringText("labelFalse", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "locLabelFalse", {
get: function () {
return this.getLocalizableString("labelFalse");
},
enumerable: true,
configurable: true
});
QuestionBooleanModel.prototype.getValueTrue = function () {
return this.valueTrue ? this.valueTrue : true;
};
QuestionBooleanModel.prototype.getValueFalse = function () {
return this.valueFalse ? this.valueFalse : false;
};
QuestionBooleanModel.prototype.setDefaultValue = function () {
if (this.defaultValue == "true")
this.checkedValue = true;
if (this.defaultValue == "false")
this.checkedValue = false;
if (this.defaultValue == "indeterminate")
this.value = null;
};
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["c" /* __decorate */])([
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__jsonobject__["d" /* property */])({ localizable: true })
], QuestionBooleanModel.prototype, "label", void 0);
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["c" /* __decorate */])([
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__jsonobject__["d" /* property */])()
], QuestionBooleanModel.prototype, "showTitle", void 0);
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["c" /* __decorate */])([
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__jsonobject__["d" /* property */])()
], QuestionBooleanModel.prototype, "valueTrue", void 0);
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["c" /* __decorate */])([
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__jsonobject__["d" /* property */])()
], QuestionBooleanModel.prototype, "valueFalse", void 0);
return QuestionBooleanModel;
}(__WEBPACK_IMPORTED_MODULE_3__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("boolean", [
{
name: "defaultValue:dropdown",
alternativeName: "booleanDefaultValue",
default: "indeterminate",
choices: ["indeterminate", "false", "true"],
},
{ name: "label:text", serializationProperty: "locLabel" },
{
name: "labelTrue:text",
serializationProperty: "locLabelTrue",
},
{
name: "labelFalse:text",
serializationProperty: "locLabelFalse",
},
"showTitle:boolean",
"valueTrue",
"valueFalse",
], function () {
return new QuestionBooleanModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_1__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("boolean", function (name) {
return new QuestionBooleanModel(name);
});
/***/ }),
/* 124 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(20);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__surveyStrings__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCheckboxModel; });
/**
* A Model for a checkbox question
*/
var QuestionCheckboxModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionCheckboxModel, _super);
function QuestionCheckboxModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.noneItemValue = new __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */]("none");
_this.selectAllItemValue = new __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */]("selectall");
_this.invisibleOldValues = {};
_this.isChangingValueOnClearIncorrect = false;
var noneItemText = _this.createLocalizableString("noneText", _this, true);
noneItemText.onGetTextCallback = function (text) {
return !!text ? text : __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("noneItemText");
};
_this.noneItemValue.locOwner = _this;
_this.noneItemValue.setLocText(noneItemText);
var selectAllItemText = _this.createLocalizableString("selectAllText", _this, true);
selectAllItemText.onGetTextCallback = function (text) {
return !!text ? text : __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("selectAllItemText");
};
_this.selectAllItem.locOwner = _this;
_this.selectAllItem.setLocText(selectAllItemText);
var self = _this;
_this.registerFunctionOnPropertiesValueChanged(["hasNone", "noneText", "hasSelectAll", "selectAllText"], function () {
self.onVisibleChoicesChanged();
});
return _this;
}
Object.defineProperty(QuestionCheckboxModel.prototype, "ariaRole", {
get: function () {
return "group";
},
enumerable: true,
configurable: true
});
QuestionCheckboxModel.prototype.getType = function () {
return "checkbox";
};
QuestionCheckboxModel.prototype.onCreating = function () {
_super.prototype.onCreating.call(this);
this.createNewArray("renderedValue");
this.createNewArray("value");
};
QuestionCheckboxModel.prototype.getFirstInputElementId = function () {
return this.inputId + "_0";
};
Object.defineProperty(QuestionCheckboxModel.prototype, "selectAllItem", {
/**
* Returns the select all item. By using this property, you may change programmatically it's value and text.
* @see hasSelectAll
*/
get: function () {
return this.selectAllItemValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "noneItem", {
/**
* Returns the none item. By using this property, you may change programmatically it's value and text.
* @see hasNone
*/
get: function () {
return this.noneItemValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "noneText", {
/**
* Use this property to set the different text for none item.
*/
get: function () {
return this.getLocalizableStringText("noneText", __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("noneItemText"));
},
set: function (val) {
this.setLocalizableStringText("noneText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "locNoneText", {
get: function () {
return this.getLocalizableString("noneText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "selectAllText", {
/**
* Use this property to set the different text for Select All item.
*/
get: function () {
return this.getLocalizableStringText("selectAllText", __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("selectAllItemText"));
},
set: function (val) {
this.setLocalizableStringText("selectAllText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "locSelectAllText", {
get: function () {
return this.getLocalizableString("selectAllText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "hasSelectAll", {
/**
* Set this property to true, to show the "Select All" item on the top. If end-user checks this item, then all items are checked.
*/
get: function () {
return this.getPropertyValue("hasSelectAll", false);
},
set: function (val) {
this.setPropertyValue("hasSelectAll", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCheckboxModel.prototype, "isAllSelected", {
/**
* Returns true if all items are selected
* @see toggleSelectAll
*/
get: function () {
var val = this.value;
if (!val || !Array.isArray(val))
return false;
if (this.isItemSelected(this.noneItem))
return false;
var allItemCount = this.visibleChoices.length;
if (this.hasOther)
allItemCount--;
if (this.hasNone)
allItemCount--;
if (this.hasSelectAll)
allItemCount--;
var selectedCount = val.length;
if (this.isItemSelected(this.otherItem))
selectedCount--;
return selectedCount === allItemCount;
},
set: function (val) {
if (val) {
this.selectAll();
}
else {
this.clearValue();
}
},
enumerable: true,
configurable: true
});
/**
* It will select all items, except other and none. If all items have been already selected then it will clear the value
* @see isAllSelected
* @see selectAll
*/
QuestionCheckboxModel.prototype.toggleSelectAll = function () {
this.isAllSelected = !this.isAllSelected;
};
/**
* Select all items, except other and none.
*/
QuestionCheckboxModel.prototype.selectAll = function () {
var val = [];
for (var i = 0; i < this.visibleChoices.length; i++) {
var item = this.visibleChoices[i];
if (item === this.noneItem ||
item === this.otherItem ||
item === this.selectAllItem)
continue;
val.push(item.value);
}
this.value = val;
};
Object.defineProperty(QuestionCheckboxModel.prototype, "hasNone", {
/**
* Set this property to true, to show the "None" item on the bottom. If end-user checks this item, all other items would be unchecked.
*/
get: function () {
return this.getPropertyValue("hasNone", false);
},
set: function (val) {
this.setPropertyValue("hasNone", val);
},
enumerable: true,
configurable: true
});
/**
* Returns true if item is checked
* @param item checkbox item value
*/
QuestionCheckboxModel.prototype.isItemSelected = function (item) {
if (item === this.selectAllItem)
return this.isAllSelected;
var val = this.renderedValue;
if (!val || !Array.isArray(val))
return false;
for (var i = 0; i < val.length; i++) {
if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(val[i], item.value))
return true;
}
return false;
};
QuestionCheckboxModel.prototype.getItemClass = function (item) {
var val = this.value; //trigger dependencies from koValue for knockout
var isChecked = this.isItemSelected(item);
var isDisabled = this.isReadOnly || !item.isEnabled;
var allowHover = !isChecked && !isDisabled;
var isSelectAll = item === this.selectAllItem;
var isNone = item === this.noneItem;
var itemClass = this.cssClasses.item;
if (!this.hasColumns) {
itemClass +=
this.colCount === 0
? " " + this.cssClasses.itemInline
: " sv-q-col-" + this.colCount;
}
if (isDisabled && !!this.cssClasses.itemDisabled)
itemClass += " " + this.cssClasses.itemDisabled;
if (isChecked && !!this.cssClasses.itemChecked)
itemClass += " " + this.cssClasses.itemChecked;
if (allowHover && !!this.cssClasses.itemHover)
itemClass += " " + this.cssClasses.itemHover;
if (isSelectAll && !!this.cssClasses.itemSelectAll)
itemClass += " " + this.cssClasses.itemSelectAll;
if (isNone && !!this.cssClasses.itemNone)
itemClass += " " + this.cssClasses.itemNone;
return itemClass;
};
QuestionCheckboxModel.prototype.setNewValue = function (newValue) {
if (!this.isChangingValueOnClearIncorrect) {
this.invisibleOldValues = [];
}
newValue = this.valueFromData(newValue);
var value = this.value;
if (!newValue)
newValue = [];
if (!value)
value = [];
if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isTwoValueEquals(value, newValue))
return;
if (this.hasNone) {
var prevNoneIndex = this.noneIndexInArray(value);
var newNoneIndex = this.noneIndexInArray(newValue);
if (prevNoneIndex > -1) {
if (newNoneIndex > -1 && newValue.length > 1) {
newValue.splice(newNoneIndex, 1);
}
}
else {
if (newNoneIndex > -1) {
newValue.splice(0, newValue.length);
newValue.push(this.noneItem.value);
}
}
}
_super.prototype.setNewValue.call(this, this.rendredValueToData(newValue));
};
QuestionCheckboxModel.prototype.getIsMultipleValue = function () {
return true;
};
QuestionCheckboxModel.prototype.getCommentFromValue = function (newValue) {
var ind = this.getFirstUnknownIndex(newValue);
if (ind < 0)
return "";
return newValue[ind];
};
QuestionCheckboxModel.prototype.setOtherValueIntoValue = function (newValue) {
var ind = this.getFirstUnknownIndex(newValue);
if (ind < 0)
return newValue;
newValue.splice(ind, 1, this.otherItem.value);
return newValue;
};
QuestionCheckboxModel.prototype.getFirstUnknownIndex = function (newValue) {
if (!Array.isArray(newValue))
return -1;
for (var i = 0; i < newValue.length; i++) {
if (this.hasUnknownValue(newValue[i]))
return i;
}
return -1;
};
QuestionCheckboxModel.prototype.noneIndexInArray = function (val) {
if (!val || !Array.isArray(val))
return -1;
var noneValue = this.noneItem.value;
for (var i = 0; i < val.length; i++) {
if (val[i] == noneValue)
return i;
}
return -1;
};
QuestionCheckboxModel.prototype.canUseFilteredChoices = function () {
return !this.hasNone && !this.hasSelectAll && _super.prototype.canUseFilteredChoices.call(this);
};
QuestionCheckboxModel.prototype.addToVisibleChoices = function (items) {
if (this.hasSelectAll) {
items.unshift(this.selectAllItem);
}
_super.prototype.addToVisibleChoices.call(this, items);
if (this.hasNone) {
items.push(this.noneItem);
}
};
QuestionCheckboxModel.prototype.getDisplayValueCore = function (keysAsText, value) {
if (!Array.isArray(value))
return _super.prototype.getDisplayValueCore.call(this, keysAsText, value);
var items = this.visibleChoices;
var str = "";
for (var i = 0; i < value.length; i++) {
var valStr = this.getChoicesDisplayValue(items, value[i]);
if (valStr) {
if (str)
str += ", ";
str += valStr;
}
}
return str;
};
QuestionCheckboxModel.prototype.clearIncorrectValuesCore = function () {
this.clearIncorrectAndDisabledValues(false);
};
QuestionCheckboxModel.prototype.clearDisabledValuesCore = function () {
this.clearIncorrectAndDisabledValues(true);
};
QuestionCheckboxModel.prototype.clearIncorrectAndDisabledValues = function (clearDisabled) {
var val = this.value;
var hasChanged = false;
var restoredValues = this.restoreValuesFromInvisible();
if (!val && restoredValues.length == 0)
return;
if (!Array.isArray(val) || val.length == 0) {
this.isChangingValueOnClearIncorrect = true;
if (!clearDisabled) {
if (this.hasComment) {
this.value = null;
}
else {
this.clearValue();
}
}
this.isChangingValueOnClearIncorrect = false;
if (restoredValues.length == 0)
return;
val = [];
}
var newValue = [];
for (var i = 0; i < val.length; i++) {
var isUnkown = this.canClearValueAnUnknow(val[i]);
if ((!clearDisabled && !isUnkown) ||
(clearDisabled && !this.isValueDisabled(val[i]))) {
newValue.push(val[i]);
}
else {
hasChanged = true;
if (isUnkown) {
this.invisibleOldValues[val[i]] = true;
}
}
}
for (var i = 0; i < restoredValues.length; i++) {
newValue.push(restoredValues[i]);
hasChanged = true;
}
if (!hasChanged)
return;
this.isChangingValueOnClearIncorrect = true;
if (newValue.length == 0) {
this.clearValue();
}
else {
this.value = newValue;
}
this.isChangingValueOnClearIncorrect = false;
};
QuestionCheckboxModel.prototype.restoreValuesFromInvisible = function () {
var res = [];
var visItems = this.visibleChoices;
for (var i = 0; i < visItems.length; i++) {
var val = visItems[i].value;
if (this.invisibleOldValues[val]) {
res.push(val);
delete this.invisibleOldValues[val];
}
}
return res;
};
QuestionCheckboxModel.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
var json = _super.prototype.getConditionJson.call(this);
if (operator == "contains" || operator == "notcontains") {
json["type"] = "radiogroup";
}
return json;
};
QuestionCheckboxModel.prototype.isAnswerCorrect = function () {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isArrayContainsEqual(this.value, this.correctAnswer);
};
QuestionCheckboxModel.prototype.setDefaultValueWithOthers = function () {
this.value = this.renderedValueFromDataCore(this.defaultValue);
};
QuestionCheckboxModel.prototype.getHasOther = function (val) {
if (!val || !Array.isArray(val))
return false;
return val.indexOf(this.otherItem.value) >= 0;
};
QuestionCheckboxModel.prototype.valueFromData = function (val) {
if (!val)
return val;
if (!Array.isArray(val))
return [_super.prototype.valueFromData.call(this, val)];
var value = [];
for (var i = 0; i < val.length; i++) {
var choiceitem = __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */].getItemByValue(this.activeChoices, val[i]);
if (!!choiceitem) {
value.push(choiceitem.value);
}
else {
value.push(val[i]);
}
}
return value;
};
QuestionCheckboxModel.prototype.renderedValueFromDataCore = function (val) {
if (!val || !Array.isArray(val))
val = [];
for (var i = 0; i < val.length; i++) {
if (val[i] == this.otherItem.value)
return val;
if (this.hasUnknownValue(val[i])) {
this.comment = val[i];
var newVal = val.slice();
newVal[i] = this.otherItem.value;
return newVal;
}
}
return val;
};
QuestionCheckboxModel.prototype.rendredValueToDataCore = function (val) {
if (!val || !val.length)
return val;
for (var i = 0; i < val.length; i++) {
if (val[i] == this.otherItem.value) {
if (this.getQuestionComment()) {
var newVal = val.slice();
newVal[i] = this.getQuestionComment();
return newVal;
}
}
}
return val;
};
QuestionCheckboxModel.prototype.hasUnknownValue = function (val, includeOther) {
if (includeOther === void 0) { includeOther = false; }
if (this.hasNone && val == this.noneItemValue.value)
return false;
return _super.prototype.hasUnknownValue.call(this, val, includeOther);
};
QuestionCheckboxModel.prototype.addSupportedValidators = function (supportedValidators) {
_super.prototype.addSupportedValidators.call(this, supportedValidators);
supportedValidators.push("answercount");
};
return QuestionCheckboxModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("checkbox", [
"hasSelectAll:boolean",
"hasNone:boolean",
{ name: "noneText", serializationProperty: "locNoneText" },
{ name: "selectAllText", serializationProperty: "locSelectAllText" },
], function () {
return new QuestionCheckboxModel("");
}, "checkboxbase");
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("checkbox", function (name) {
var q = new QuestionCheckboxModel(name);
q.choices = __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 125 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCommentModel; });
/**
* A Model for a comment question
*/
var QuestionCommentModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionCommentModel, _super);
function QuestionCommentModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("placeHolder", _this);
return _this;
}
QuestionCommentModel.prototype.isTextValue = function () {
return true;
};
Object.defineProperty(QuestionCommentModel.prototype, "maxLength", {
/**
* The maximum text length. If it is -1, defaul value, then the survey maxTextLength property will be used.
* If it is 0, then the value is unlimited
* @see SurveyModel.maxTextLength
*/
get: function () {
return this.getPropertyValue("maxLength");
},
set: function (val) {
this.setPropertyValue("maxLength", val);
},
enumerable: true,
configurable: true
});
QuestionCommentModel.prototype.getMaxLength = function () {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].getMaxLength(this.maxLength, this.survey ? this.survey.maxTextLength : -1);
};
Object.defineProperty(QuestionCommentModel.prototype, "placeHolder", {
/**
* Use this property to set the input place holder.
*/
get: function () {
return this.getLocalizableStringText("placeHolder");
},
set: function (val) {
this.setLocalizableStringText("placeHolder", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCommentModel.prototype, "locPlaceHolder", {
get: function () {
return this.getLocalizableString("placeHolder");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCommentModel.prototype, "rows", {
/**
* The html rows attribute.
*/
get: function () {
return this.getPropertyValue("rows");
},
set: function (val) {
this.setPropertyValue("rows", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCommentModel.prototype, "cols", {
/**
* The html cols attribute.
*/
get: function () {
return this.getPropertyValue("cols");
},
set: function (val) {
this.setPropertyValue("cols", val);
},
enumerable: true,
configurable: true
});
QuestionCommentModel.prototype.getType = function () {
return "comment";
};
QuestionCommentModel.prototype.isEmpty = function () {
return _super.prototype.isEmpty.call(this) || this.value === "";
};
Object.defineProperty(QuestionCommentModel.prototype, "textUpdateMode", {
/**
* Gets or sets a value that specifies how the question updates it's value.
*
* The following options are available:
* - `default` - get the value from survey.textUpdateMode
* - `onBlur` - the value is updated after an input loses the focus.
* - `onTyping` - update the value of text questions, "text" and "comment", on every key press.
*
* Note, that setting to "onTyping" may lead to a performance degradation, in case you have many expressions in the survey.
* @see survey.textUpdateMode
*/
get: function () {
return this.getPropertyValue("textUpdateMode");
},
set: function (val) {
this.setPropertyValue("textUpdateMode", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionCommentModel.prototype, "isSurveyInputTextUpdate", {
get: function () {
if (this.textUpdateMode == "default")
return !!this.survey ? this.survey.isUpdateValueTextOnTyping : false;
return this.textUpdateMode == "onTyping";
},
enumerable: true,
configurable: true
});
QuestionCommentModel.prototype.addSupportedValidators = function (supportedValidators) {
_super.prototype.addSupportedValidators.call(this, supportedValidators);
supportedValidators.push("text", "regex");
};
return QuestionCommentModel;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("comment", [
{ name: "maxLength:number", default: -1 },
{ name: "cols:number", default: 50 },
{ name: "rows:number", default: 4 },
{ name: "placeHolder", serializationProperty: "locPlaceHolder" },
{
name: "textUpdateMode",
default: "default",
choices: ["default", "onBlur", "onTyping"],
},
], function () {
return new QuestionCommentModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("comment", function (name) {
return new QuestionCommentModel(name);
});
/***/ }),
/* 126 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return ComponentQuestionJSON; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return ComponentCollection; });
/* unused harmony export QuestionCustomModelBase */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCustomModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionCompositeModel; });
var ComponentQuestionJSON = /** @class */ (function () {
function ComponentQuestionJSON(name, json) {
this.name = name;
this.json = json;
var self = this;
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass(name, [], function (json) {
return ComponentCollection.Instance.createQuestion(!!json ? json.name : "", self);
}, "question");
this.onInit();
}
ComponentQuestionJSON.prototype.onInit = function () {
if (!this.json.onInit)
return;
this.json.onInit();
};
ComponentQuestionJSON.prototype.onCreated = function (question) {
if (!this.json.onCreated)
return;
this.json.onCreated(question);
};
ComponentQuestionJSON.prototype.onLoaded = function (question) {
if (!this.json.onLoaded)
return;
this.json.onLoaded(question);
};
ComponentQuestionJSON.prototype.onAfterRender = function (question, htmlElement) {
if (!this.json.onAfterRender)
return;
this.json.onAfterRender(question, htmlElement);
};
ComponentQuestionJSON.prototype.onAfterRenderContentElement = function (question, element, htmlElement) {
if (!this.json.onAfterRenderContentElement)
return;
this.json.onAfterRenderContentElement(question, element, htmlElement);
};
ComponentQuestionJSON.prototype.onPropertyChanged = function (question, propertyName, newValue) {
if (!this.json.onPropertyChanged)
return;
this.json.onPropertyChanged(question, propertyName, newValue);
};
ComponentQuestionJSON.prototype.onItemValuePropertyChanged = function (question, item, propertyName, name, newValue) {
if (!this.json.onItemValuePropertyChanged)
return;
this.json.onItemValuePropertyChanged(question, {
obj: item,
propertyName: propertyName,
name: name,
newValue: newValue,
});
};
Object.defineProperty(ComponentQuestionJSON.prototype, "isComposite", {
get: function () {
return !!this.json.elementsJSON || !!this.json.createElements;
},
enumerable: true,
configurable: true
});
return ComponentQuestionJSON;
}());
var ComponentCollection = /** @class */ (function () {
function ComponentCollection() {
this.customQuestionValues = [];
}
ComponentCollection.prototype.add = function (json) {
if (!json)
return;
var name = json.name;
if (!name) {
throw "Attribute name is missed";
}
name = name.toLowerCase();
if (!!this.getCustomQuestionByName(name)) {
throw ("There is already registered custom question with name '" + name + "'");
}
if (!!__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].findClass(name)) {
throw "There is already class with name '" + name + "'";
}
var customQuestion = new ComponentQuestionJSON(name, json);
if (!!this.onAddingJson)
this.onAddingJson(name, customQuestion.isComposite);
this.customQuestionValues.push(customQuestion);
};
Object.defineProperty(ComponentCollection.prototype, "items", {
get: function () {
return this.customQuestionValues;
},
enumerable: true,
configurable: true
});
ComponentCollection.prototype.getCustomQuestionByName = function (name) {
for (var i = 0; i < this.customQuestionValues.length; i++) {
if (this.customQuestionValues[i].name == name)
return this.customQuestionValues[i];
}
return null;
};
ComponentCollection.prototype.clear = function () {
for (var i = 0; i < this.customQuestionValues.length; i++) {
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].removeClass(this.customQuestionValues[i].name);
}
this.customQuestionValues = [];
};
ComponentCollection.prototype.createQuestion = function (name, questionJSON) {
if (!!questionJSON.isComposite)
return this.createCompositeModel(name, questionJSON);
return this.createCustomModel(name, questionJSON);
};
ComponentCollection.prototype.createCompositeModel = function (name, questionJSON) {
if (!!this.onCreateComposite)
return this.onCreateComposite(name, questionJSON);
return new QuestionCompositeModel(name, questionJSON);
};
ComponentCollection.prototype.createCustomModel = function (name, questionJSON) {
if (!!this.onCreateCustom)
return this.onCreateCustom(name, questionJSON);
return new QuestionCustomModel(name, questionJSON);
};
ComponentCollection.Instance = new ComponentCollection();
return ComponentCollection;
}());
var QuestionCustomModelBase = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionCustomModelBase, _super);
function QuestionCustomModelBase(name, customQuestion) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.customQuestion = customQuestion;
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["b" /* CustomPropertiesCollection */].createProperties(_this);
__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */].CreateDisabledDesignElements = true;
_this.createWrapper();
__WEBPACK_IMPORTED_MODULE_3__base__["a" /* SurveyElement */].CreateDisabledDesignElements = false;
if (!!_this.customQuestion) {
_this.customQuestion.onCreated(_this);
}
return _this;
}
QuestionCustomModelBase.prototype.getType = function () {
return !!this.customQuestion ? this.customQuestion.name : "custom";
};
QuestionCustomModelBase.prototype.createWrapper = function () { };
QuestionCustomModelBase.prototype.onPropertyValueChanged = function (name, oldValue, newValue) {
_super.prototype.onPropertyValueChanged.call(this, name, oldValue, newValue);
if (!!this.customQuestion && !this.isLoadingFromJson) {
this.customQuestion.onPropertyChanged(this, name, newValue);
}
};
QuestionCustomModelBase.prototype.itemValuePropertyChanged = function (item, name, oldValue, newValue) {
_super.prototype.itemValuePropertyChanged.call(this, item, name, oldValue, newValue);
if (!!this.customQuestion && !this.isLoadingFromJson) {
this.customQuestion.onItemValuePropertyChanged(this, item, item.ownerPropertyName, name, newValue);
}
};
QuestionCustomModelBase.prototype.onFirstRendering = function () {
var el = this.getElement();
if (!!el) {
el.onFirstRendering();
}
_super.prototype.onFirstRendering.call(this);
};
QuestionCustomModelBase.prototype.initElement = function (el) {
if (!el)
return;
el.setSurveyImpl(this);
el.disableDesignActions = true;
};
QuestionCustomModelBase.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
this.initElement(this.getElement());
};
QuestionCustomModelBase.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
if (!!this.getElement()) {
this.getElement().onSurveyLoad();
this.customQuestion.onLoaded(this);
}
};
QuestionCustomModelBase.prototype.afterRenderQuestionElement = function (el) {
//Do nothing
};
QuestionCustomModelBase.prototype.afterRender = function (el) {
_super.prototype.afterRender.call(this, el);
if (!!this.customQuestion) {
this.customQuestion.onAfterRender(this, el);
}
};
QuestionCustomModelBase.prototype.setQuestionValue = function (newValue, updateIsAnswered) {
if (updateIsAnswered === void 0) { updateIsAnswered = true; }
_super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);
this.updateElementCss();
};
QuestionCustomModelBase.prototype.setNewValue = function (newValue) {
_super.prototype.setNewValue.call(this, newValue);
this.updateElementCss();
};
//ISurveyImpl
QuestionCustomModelBase.prototype.geSurveyData = function () {
return this;
};
QuestionCustomModelBase.prototype.getSurvey = function () {
return this.survey;
};
QuestionCustomModelBase.prototype.getTextProcessor = function () {
return this.textProcessor;
};
//ISurveyData
QuestionCustomModelBase.prototype.getValue = function (name) {
return this.value;
};
QuestionCustomModelBase.prototype.setValue = function (name, newValue, locNotification, allowNotifyValueChanged) {
if (!this.data)
return;
var newName = this.convertDataName(name);
this.data.setValue(newName, this.convertDataValue(name, newValue), locNotification, allowNotifyValueChanged);
this.updateIsAnswered();
this.updateElementCss();
};
QuestionCustomModelBase.prototype.convertDataName = function (name) {
return this.getValueName();
};
QuestionCustomModelBase.prototype.convertDataValue = function (name, newValue) {
return newValue;
};
QuestionCustomModelBase.prototype.getVariable = function (name) {
return !!this.data ? this.data.getVariable(name) : null;
};
QuestionCustomModelBase.prototype.setVariable = function (name, newValue) {
if (!this.data)
return;
this.data.setVariable(name, newValue);
};
QuestionCustomModelBase.prototype.getComment = function (name) {
return !!this.data ? this.data.getComment(this.getValueName()) : "";
};
QuestionCustomModelBase.prototype.setComment = function (name, newValue, locNotification) {
if (!this.data)
return;
this.data.setComment(this.getValueName(), newValue, locNotification);
};
QuestionCustomModelBase.prototype.getAllValues = function () {
return !!this.data ? this.data.getAllValues() : {};
};
QuestionCustomModelBase.prototype.getFilteredValues = function () {
return !!this.data ? this.data.getFilteredValues() : {};
};
QuestionCustomModelBase.prototype.getFilteredProperties = function () {
return !!this.data ? this.data.getFilteredProperties() : {};
};
//IPanel
QuestionCustomModelBase.prototype.addElement = function (element, index) { };
QuestionCustomModelBase.prototype.removeElement = function (element) {
return false;
};
QuestionCustomModelBase.prototype.getQuestionTitleLocation = function () {
return "left";
};
QuestionCustomModelBase.prototype.getQuestionStartIndex = function () {
return this.getStartIndex();
};
QuestionCustomModelBase.prototype.getChildrenLayoutType = function () {
return "row";
};
QuestionCustomModelBase.prototype.elementWidthChanged = function (el) { };
Object.defineProperty(QuestionCustomModelBase.prototype, "elements", {
get: function () {
return [];
},
enumerable: true,
configurable: true
});
QuestionCustomModelBase.prototype.indexOf = function (el) {
return -1;
};
return QuestionCustomModelBase;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
var QuestionCustomModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionCustomModel, _super);
function QuestionCustomModel() {
return _super !== null && _super.apply(this, arguments) || this;
}
QuestionCustomModel.prototype.getTemplate = function () {
return "custom";
};
QuestionCustomModel.prototype.createWrapper = function () {
this.questionWrapper = this.createQuestion();
};
QuestionCustomModel.prototype.getElement = function () {
return this.contentQuestion;
};
QuestionCustomModel.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
if (!this.contentQuestion)
return false;
var res = this.contentQuestion.hasErrors(fireCallback, rec);
this.errors = [];
for (var i = 0; i < this.contentQuestion.errors.length; i++) {
this.errors.push(this.contentQuestion.errors[i]);
}
if (!res) {
res = _super.prototype.hasErrors.call(this, fireCallback, rec);
}
this.updateElementCss();
return res;
};
QuestionCustomModel.prototype.focus = function (onError) {
if (onError === void 0) { onError = false; }
if (!!this.contentQuestion) {
this.contentQuestion.focus(onError);
}
else {
_super.prototype.focus.call(this, onError);
}
};
Object.defineProperty(QuestionCustomModel.prototype, "contentQuestion", {
get: function () {
return this.questionWrapper;
},
enumerable: true,
configurable: true
});
QuestionCustomModel.prototype.createQuestion = function () {
var json = this.customQuestion.json;
var res = null;
if (!!json.questionJSON) {
var qType = json.questionJSON.type;
if (!qType || !__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].findClass(qType))
throw "type attribute in questionJSON is empty or incorrect";
res = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].createClass(qType);
this.initElement(res);
res.fromJSON(json.questionJSON);
}
else {
if (!!json.createQuestion) {
res = json.createQuestion();
this.initElement(res);
}
}
if (!!res && !res.name) {
res.name = "question";
}
return res;
};
QuestionCustomModel.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
if (!this.contentQuestion)
return;
if (this.isEmpty() && !this.contentQuestion.isEmpty()) {
this.value = this.contentQuestion.value;
}
};
QuestionCustomModel.prototype.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
if (!!this.contentQuestion) {
this.contentQuestion.runCondition(values, properties);
}
};
QuestionCustomModel.prototype.convertDataName = function (name) {
if (!this.contentQuestion)
return _super.prototype.convertDataName.call(this, name);
var newName = name.replace(this.contentQuestion.getValueName(), this.getValueName());
return newName.indexOf(this.getValueName()) == 0
? newName
: _super.prototype.convertDataName.call(this, name);
};
QuestionCustomModel.prototype.convertDataValue = function (name, newValue) {
return this.convertDataName(name) == _super.prototype.convertDataName.call(this, name)
? this.contentQuestion.value
: newValue;
};
QuestionCustomModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) {
if (updateIsAnswered === void 0) { updateIsAnswered = true; }
_super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);
if (!!this.contentQuestion) {
this.contentQuestion.value = newValue;
}
};
QuestionCustomModel.prototype.onSurveyValueChanged = function (newValue) {
_super.prototype.onSurveyValueChanged.call(this, newValue);
if (!!this.contentQuestion) {
this.contentQuestion.onSurveyValueChanged(newValue);
}
};
QuestionCustomModel.prototype.initElement = function (el) {
var _this = this;
_super.prototype.initElement.call(this, el);
if (!!el) {
el.parent = this;
el.afterRenderQuestionCallback = function (question, element) {
if (!!_this.customQuestion) {
_this.customQuestion.onAfterRenderContentElement(_this, question, element);
}
};
}
};
QuestionCustomModel.prototype.updateElementCssCore = function (cssClasses) {
if (!!this.contentQuestion) {
cssClasses = this.contentQuestion.cssClasses;
}
_super.prototype.updateElementCssCore.call(this, cssClasses);
};
return QuestionCustomModel;
}(QuestionCustomModelBase));
var QuestionCompositeModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionCompositeModel, _super);
function QuestionCompositeModel() {
return _super !== null && _super.apply(this, arguments) || this;
}
QuestionCompositeModel.prototype.createWrapper = function () {
this.panelWrapper = this.createPanel();
};
QuestionCompositeModel.prototype.getTemplate = function () {
return "composite";
};
QuestionCompositeModel.prototype.getCssType = function () {
return "composite";
};
QuestionCompositeModel.prototype.getElement = function () {
return this.contentPanel;
};
Object.defineProperty(QuestionCompositeModel.prototype, "contentPanel", {
get: function () {
return this.panelWrapper;
},
enumerable: true,
configurable: true
});
QuestionCompositeModel.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
var res = _super.prototype.hasErrors.call(this, fireCallback, rec);
if (!this.contentPanel)
return res;
return this.contentPanel.hasErrors(fireCallback, false, rec) || res;
};
QuestionCompositeModel.prototype.updateElementCss = function () {
_super.prototype.updateElementCss.call(this);
if (this.contentPanel) {
this.contentPanel.updateElementCss();
}
};
QuestionCompositeModel.prototype.clearValueIfInvisible = function () {
_super.prototype.clearValueIfInvisible.call(this);
var questions = this.contentPanel.questions;
for (var i = 0; i < questions.length; i++) {
questions[i].clearValueIfInvisible();
}
};
QuestionCompositeModel.prototype.createPanel = function () {
var res = __WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].createClass("panel");
res.showQuestionNumbers = "off";
var json = this.customQuestion.json;
if (!!json.elementsJSON) {
res.fromJSON({ elements: json.elementsJSON });
}
if (!!json.createElements) {
json.createElements(res);
}
this.initElement(res);
res.readOnly = this.isReadOnly;
this.setAfterRenderCallbacks(res);
return res;
};
QuestionCompositeModel.prototype.onReadOnlyChanged = function () {
if (!!this.contentPanel) {
this.contentPanel.readOnly = this.isReadOnly;
}
_super.prototype.onReadOnlyChanged.call(this);
};
QuestionCompositeModel.prototype.onSurveyLoad = function () {
if (!!this.contentPanel) {
this.contentPanel.readOnly = this.isReadOnly;
this.setIsContentElement(this.contentPanel);
}
_super.prototype.onSurveyLoad.call(this);
};
QuestionCompositeModel.prototype.setIsContentElement = function (panel) {
panel.isContentElement = true;
var elements = panel.elements;
for (var i = 0; i < elements.length; i++) {
var el = elements[i];
if (el.isPanel) {
this.setIsContentElement(el);
}
else {
el.isContentElement = true;
}
}
};
QuestionCompositeModel.prototype.setVisibleIndex = function (val) {
var res = _super.prototype.setVisibleIndex.call(this, val);
if (this.isVisible && !!this.contentPanel) {
res += this.contentPanel.setVisibleIndex(val);
}
return res;
};
QuestionCompositeModel.prototype.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
if (!!this.contentPanel) {
var oldComposite = values.composite;
values.composite = this.contentPanel.getValue();
this.contentPanel.runCondition(values, properties);
delete values["composite"];
if (!!oldComposite) {
values.composite = oldComposite;
}
}
};
QuestionCompositeModel.prototype.getValue = function (name) {
var val = this.value;
return !!val ? val[name] : null;
};
QuestionCompositeModel.prototype.convertDataValue = function (name, newValue) {
var val = this.value;
if (!val)
val = {};
if (__WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isValueEmpty(newValue)) {
delete val[name];
}
else {
val[name] = newValue;
}
return val;
};
QuestionCompositeModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) {
if (updateIsAnswered === void 0) { updateIsAnswered = true; }
_super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);
var questions = this.contentPanel.questions;
for (var i = 0; i < questions.length; i++) {
var key = questions[i].getValueName();
questions[i].value = !!newValue ? newValue[key] : undefined;
}
};
QuestionCompositeModel.prototype.setAfterRenderCallbacks = function (panel) {
var _this = this;
if (!panel || !this.customQuestion)
return;
var questions = panel.questions;
for (var i = 0; i < questions.length; i++) {
questions[i].afterRenderQuestionCallback = function (question, element) {
_this.customQuestion.onAfterRenderContentElement(_this, question, element);
};
}
};
return QuestionCompositeModel;
}(QuestionCustomModelBase));
/***/ }),
/* 127 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionEmptyModel; });
/**
* A Model for an question that renders empty "div" tag. It used as a base class for some custom widgets
*/
var QuestionEmptyModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionEmptyModel, _super);
function QuestionEmptyModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
QuestionEmptyModel.prototype.getType = function () {
return "empty";
};
return QuestionEmptyModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("empty", [], function () {
return new QuestionEmptyModel("");
}, "question");
/***/ }),
/* 128 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__surveyStrings__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionFileModel; });
/**
* A Model for a file question
*/
var QuestionFileModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionFileModel, _super);
function QuestionFileModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isUploading = false;
/**
* The event is fired after question state has been changed.
* sender the question object that fires the event
* options.state new question state value.
*/
_this.onStateChanged = new __WEBPACK_IMPORTED_MODULE_4__base__["c" /* Event */]();
_this.previewValue = [];
_this.currentState = "empty";
return _this;
}
QuestionFileModel.prototype.getType = function () {
return "file";
};
QuestionFileModel.prototype.clearOnDeletingContainer = function () {
this.survey.clearFiles(this, this.name, this.value, null, function () { });
};
Object.defineProperty(QuestionFileModel.prototype, "showPreview", {
/**
* Set it to true, to show the preview for the image files.
*/
get: function () {
return this.getPropertyValue("showPreview");
},
set: function (val) {
this.setPropertyValue("showPreview", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "allowMultiple", {
/**
* Set it to true, to allow select multiple files.
*/
get: function () {
return this.getPropertyValue("allowMultiple", false);
},
set: function (val) {
this.setPropertyValue("allowMultiple", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "imageHeight", {
/**
* The image height.
*/
get: function () {
return this.getPropertyValue("imageHeight");
},
set: function (val) {
this.setPropertyValue("imageHeight", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "imageWidth", {
/**
* The image width.
*/
get: function () {
return this.getPropertyValue("imageWidth");
},
set: function (val) {
this.setPropertyValue("imageWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "acceptedTypes", {
/**
* Accepted file types. Passed to the 'accept' attribute of the file input tag. See https://www.w3schools.com/tags/att_input_accept.asp for more details.
*/
get: function () {
return this.getPropertyValue("acceptedTypes");
},
set: function (val) {
this.setPropertyValue("acceptedTypes", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "storeDataAsText", {
/**
* Set it to false if you do not want to serialize file content as text in the survey.data.
* In this case, you have to write the code onUploadFiles event to store the file content.
* @see SurveyModel.onUploadFiles
*/
get: function () {
return this.getPropertyValue("storeDataAsText");
},
set: function (val) {
this.setPropertyValue("storeDataAsText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "waitForUpload", {
/**
* Set it to true if you want to wait until files will be uploaded to your server.
*/
get: function () {
return this.getPropertyValue("waitForUpload", false);
},
set: function (val) {
this.setPropertyValue("waitForUpload", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "allowImagesPreview", {
/**
* Set it to false if you want to disable images preview.
*/
get: function () {
return this.getPropertyValue("allowImagesPreview");
},
set: function (val) {
this.setPropertyValue("allowImagesPreview", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "maxSize", {
/**
* Use this property to setup the maximum allowed file size.
*/
get: function () {
return this.getPropertyValue("maxSize", 0);
},
set: function (val) {
this.setPropertyValue("maxSize", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "needConfirmRemoveFile", {
/**
* Use this property to setup confirmation to remove file.
*/
get: function () {
return this.getPropertyValue("needConfirmRemoveFile");
},
set: function (val) {
this.setPropertyValue("needConfirmRemoveFile", val);
},
enumerable: true,
configurable: true
});
/**
* The remove file confirmation message.
*/
QuestionFileModel.prototype.getConfirmRemoveMessage = function (fileName) {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */]
.getString("confirmRemoveFile")["format"](fileName);
};
Object.defineProperty(QuestionFileModel.prototype, "confirmRemoveAllMessage", {
/**
* The remove all files confirmation message.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("confirmRemoveAllFiles");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "noFileChosenCaption", {
/**
* The no file chosen caption for modern theme.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("noFileChosen");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "chooseButtonCaption", {
/**
* The choose files button caption for modern theme.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("chooseFileCaption");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "cleanButtonCaption", {
/**
* The clean files button caption.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("cleanCaption");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "removeFileCaption", {
/**
* The remove file button caption.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("removeFileCaption");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionFileModel.prototype, "inputTitle", {
/**
* The input title value.
*/
get: function () {
if (this.isUploading)
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("loadingFile");
if (this.isEmpty())
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("chooseFile");
return " ";
},
enumerable: true,
configurable: true
});
/**
* Clear value programmatically.
*/
QuestionFileModel.prototype.clear = function (doneCallback) {
var _this = this;
this.survey.clearFiles(this, this.name, this.value, null, function (status, data) {
if (status === "success") {
_this.value = undefined;
_this.errors = [];
!!doneCallback && doneCallback();
}
});
};
/**
* Remove file item programmatically.
*/
QuestionFileModel.prototype.removeFile = function (content) {
var _this = this;
this.survey.clearFiles(this, this.name, this.value, content.name, function (status, data) {
if (status === "success") {
var oldValue = _this.value;
if (Array.isArray(oldValue)) {
_this.value = oldValue.filter(function (f) { return f.name !== content.name; });
}
else {
_this.value = undefined;
}
}
});
};
/**
* Load multiple files programmatically.
* @param files
*/
QuestionFileModel.prototype.loadFiles = function (files) {
var _this = this;
if (!this.survey) {
return;
}
this.errors = [];
if (!this.allFilesOk(files)) {
return;
}
this.stateChanged("loading");
var loadFilesProc = function () {
var content = [];
if (_this.storeDataAsText) {
files.forEach(function (file) {
var fileReader = new FileReader();
fileReader.onload = function (e) {
content = content.concat([
{ name: file.name, type: file.type, content: fileReader.result },
]);
if (content.length === files.length) {
_this.value = (_this.value || []).concat(content);
}
};
fileReader.readAsDataURL(file);
});
}
else {
_this.survey.uploadFiles(_this, _this.name, files, function (status, data) {
if (status === "error") {
_this.stateChanged("error");
}
if (status === "success") {
_this.value = (_this.value || []).concat(data.map(function (r) {
return {
name: r.file.name,
type: r.file.type,
content: r.content,
};
}));
}
});
}
};
if (this.allowMultiple) {
loadFilesProc();
}
else {
this.clear(loadFilesProc);
}
};
QuestionFileModel.prototype.canPreviewImage = function (fileItem) {
return this.allowImagesPreview && !!fileItem && this.isFileImage(fileItem);
};
QuestionFileModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) {
var _this = this;
if (updateIsAnswered === void 0) { updateIsAnswered = true; }
_super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);
this.previewValue = [];
var state = (!Array.isArray(newValue) && !!newValue) ||
(Array.isArray(newValue) && newValue.length > 0)
? this.showPreview
? "loading"
: "loaded"
: "empty";
this.stateChanged(state);
if (!this.showPreview || !newValue)
return;
var newValues = Array.isArray(newValue)
? newValue
: !!newValue
? [newValue]
: [];
if (this.storeDataAsText) {
newValues.forEach(function (value) {
var content = value.content || value;
_this.previewValue = _this.previewValue.concat([
{
name: value.name,
type: value.type,
content: content,
},
]);
});
if (state === "loading")
this.stateChanged("loaded");
}
else {
newValues.forEach(function (value) {
var content = value.content || value;
_this.survey.downloadFile(_this.name, value, function (status, data) {
if (status === "success") {
_this.previewValue = _this.previewValue.concat([
{
content: data,
name: value.name,
type: value.type,
},
]);
if (_this.previewValue.length === newValues.length) {
_this.stateChanged("loaded");
}
}
else {
_this.stateChanged("error");
}
});
});
}
};
QuestionFileModel.prototype.onCheckForErrors = function (errors, isOnValueChanged) {
_super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged);
if (this.isUploading && this.waitForUpload) {
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["g" /* UploadingFileError */](__WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("uploadingFile"), this));
}
};
QuestionFileModel.prototype.stateChanged = function (state) {
if (state === "loading") {
this.isUploading = true;
}
if (state === "loaded") {
this.isUploading = false;
}
if (state === "error") {
this.isUploading = false;
}
this.currentState = state;
this.onStateChanged.fire(this, { state: state });
};
QuestionFileModel.prototype.allFilesOk = function (files) {
var _this = this;
var errorLength = this.errors ? this.errors.length : 0;
(files || []).forEach(function (file) {
if (_this.maxSize > 0 && file.size > _this.maxSize) {
_this.errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["e" /* ExceedSizeError */](_this.maxSize, _this));
}
});
return errorLength === this.errors.length;
};
QuestionFileModel.prototype.isFileImage = function (file) {
if (!file)
return false;
var imagePrefix = "data:image";
var subStr = file.content && file.content.substr(0, imagePrefix.length);
subStr = subStr && subStr.toLowerCase();
var result = subStr === imagePrefix ||
(!!file.type && file.type.toLowerCase().indexOf("image/") === 0);
return result;
};
QuestionFileModel.prototype.getPlainData = function (options) {
if (options === void 0) { options = {
includeEmpty: true,
}; }
var questionPlainData = _super.prototype.getPlainData.call(this, options);
if (!!questionPlainData && !this.isEmpty()) {
questionPlainData.isNode = false;
var values = Array.isArray(this.value) ? this.value : [this.value];
questionPlainData.data = values.map(function (dataValue, index) {
return {
name: index,
title: "File",
value: (dataValue.content && dataValue.content) || dataValue,
displayValue: (dataValue.name && dataValue.name) || dataValue,
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: false,
};
});
}
return questionPlainData;
};
QuestionFileModel.prototype.supportComment = function () {
return true;
};
return QuestionFileModel;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("file", [
{ name: "hasComment:switch", layout: "row" },
{
name: "commentText",
dependsOn: "hasComment",
visibleIf: function (obj) {
return obj.hasComment;
},
serializationProperty: "locCommentText",
layout: "row",
},
{ name: "showPreview:boolean", default: true },
"allowMultiple:boolean",
{ name: "allowImagesPreview:boolean", default: true },
"imageHeight",
"imageWidth",
"acceptedTypes",
{ name: "storeDataAsText:boolean", default: true },
{ name: "waitForUpload:boolean", default: false },
"maxSize:number",
{ name: "defaultValue", visible: false },
{ name: "correctAnswer", visible: false },
{ name: "validators", visible: false },
{ name: "needConfirmRemoveFile:boolean", visible: true, default: false },
], function () {
return new QuestionFileModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("file", function (name) {
return new QuestionFileModel(name);
});
/***/ }),
/* 129 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__questionnonvalue__ = __webpack_require__(31);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionHtmlModel; });
/**
* A Model for html question. Unlike other questions it doesn't have value and title.
*/
var QuestionHtmlModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionHtmlModel, _super);
function QuestionHtmlModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
var locHtml = _this.createLocalizableString("html", _this);
var self = _this;
locHtml.onGetTextCallback = function (str) {
return !!self.survey ? self.survey.processHtml(str) : str;
};
return _this;
}
QuestionHtmlModel.prototype.getType = function () {
return "html";
};
Object.defineProperty(QuestionHtmlModel.prototype, "isCompositeQuestion", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionHtmlModel.prototype, "html", {
/**
* Set html to display it
*/
get: function () {
return this.getLocalizableStringText("html", "");
},
set: function (val) {
this.setLocalizableStringText("html", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionHtmlModel.prototype, "locHtml", {
get: function () {
return this.getLocalizableString("html");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionHtmlModel.prototype, "processedHtml", {
get: function () {
return this.survey ? this.survey.processHtml(this.html) : this.html;
},
enumerable: true,
configurable: true
});
return QuestionHtmlModel;
}(__WEBPACK_IMPORTED_MODULE_1__questionnonvalue__["a" /* QuestionNonValue */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("html", [{ name: "html:html", serializationProperty: "locHtml" }], function () {
return new QuestionHtmlModel("");
}, "nonvalue");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("html", function (name) {
return new QuestionHtmlModel(name);
});
/***/ }),
/* 130 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__questionnonvalue__ = __webpack_require__(31);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionImageModel; });
/**
* A Model for image question. This question hasn't any functionality and can be used to improve the appearance of the survey.
*/
var QuestionImageModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionImageModel, _super);
function QuestionImageModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("imageLink", _this, false);
return _this;
}
QuestionImageModel.prototype.getType = function () {
return "image";
};
Object.defineProperty(QuestionImageModel.prototype, "isCompositeQuestion", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImageModel.prototype, "imageLink", {
/**
* The image URL.
*/
get: function () {
return this.getLocalizableStringText("imageLink");
},
set: function (val) {
this.setLocalizableStringText("imageLink", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImageModel.prototype, "locImageLink", {
get: function () {
return this.getLocalizableString("imageLink");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImageModel.prototype, "imageHeight", {
/**
* The image height.
*/
get: function () {
return this.getPropertyValue("imageHeight");
},
set: function (val) {
this.setPropertyValue("imageHeight", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImageModel.prototype, "imageWidth", {
/**
* The image width.
*/
get: function () {
return this.getPropertyValue("imageWidth");
},
set: function (val) {
this.setPropertyValue("imageWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImageModel.prototype, "imageFit", {
/**
* The image fit mode.
*/
get: function () {
return this.getPropertyValue("imageFit");
},
set: function (val) {
this.setPropertyValue("imageFit", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImageModel.prototype, "contentMode", {
/**
* The content mode.
*/
get: function () {
return this.getPropertyValue("contentMode");
},
set: function (val) {
this.setPropertyValue("contentMode", val);
if (val === "video") {
this.showLabel = true;
}
},
enumerable: true,
configurable: true
});
return QuestionImageModel;
}(__WEBPACK_IMPORTED_MODULE_1__questionnonvalue__["a" /* QuestionNonValue */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("image", [
{ name: "imageLink", serializationProperty: "locImageLink" },
{
name: "contentMode",
default: "image",
choices: ["image", "video"],
},
{
name: "imageFit",
default: "contain",
choices: ["none", "contain", "cover", "fill"],
},
{ name: "imageHeight:number", default: 150, minValue: 0 },
{ name: "imageWidth:number", default: 200, minValue: 0 },
], function () {
return new QuestionImageModel("");
}, "nonvalue");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("image", function (name) {
return new QuestionImageModel(name);
});
/***/ }),
/* 131 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(20);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__helpers__ = __webpack_require__(4);
/* unused harmony export ImageItemValue */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionImagePickerModel; });
var ImageItemValue = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(ImageItemValue, _super);
function ImageItemValue(value, text, typeName) {
if (text === void 0) { text = null; }
if (typeName === void 0) { typeName = "imageitemvalue"; }
var _this = _super.call(this, value, text, typeName) || this;
_this.typeName = typeName;
_this.createLocalizableString("imageLink", _this, false);
return _this;
}
ImageItemValue.prototype.getType = function () {
return !!this.typeName ? this.typeName : "itemvalue";
};
Object.defineProperty(ImageItemValue.prototype, "imageLink", {
/**
* The image or video link property.
*/
get: function () {
return this.getLocalizableStringText("imageLink");
},
set: function (val) {
this.setLocalizableStringText("imageLink", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ImageItemValue.prototype, "locImageLink", {
get: function () {
return this.getLocalizableString("imageLink");
},
enumerable: true,
configurable: true
});
ImageItemValue.prototype.getLocale = function () {
return !!this.locOwner ? this.locOwner.getLocale() : "";
};
ImageItemValue.prototype.getMarkdownHtml = function (text) {
return !!this.locOwner ? this.locOwner.getMarkdownHtml(text) : text;
};
ImageItemValue.prototype.getProcessedText = function (text) {
return !!this.locOwner ? this.locOwner.getProcessedText(text) : text;
};
return ImageItemValue;
}(__WEBPACK_IMPORTED_MODULE_4__itemvalue__["a" /* ItemValue */]));
/**
* A Model for a select image question.
*/
var QuestionImagePickerModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionImagePickerModel, _super);
function QuestionImagePickerModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.colCount = 0;
return _this;
}
QuestionImagePickerModel.prototype.getType = function () {
return "imagepicker";
};
QuestionImagePickerModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
Object.defineProperty(QuestionImagePickerModel.prototype, "hasSingleInput", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionImagePickerModel.prototype.getItemValueType = function () {
return "imageitemvalue";
};
Object.defineProperty(QuestionImagePickerModel.prototype, "isCompositeQuestion", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImagePickerModel.prototype, "multiSelect", {
/**
* Multi select option. If set to true, then allows to select multiple images.
*/
get: function () {
return this.getPropertyValue("multiSelect", false);
},
set: function (newValue) {
this.setPropertyValue("multiSelect", newValue);
},
enumerable: true,
configurable: true
});
/**
* Returns true if item is checked
* @param item image picker item value
*/
QuestionImagePickerModel.prototype.isItemSelected = function (item) {
var val = this.value;
if (__WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].isValueEmpty(val))
return false;
if (!this.multiSelect)
return __WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].isTwoValueEquals(val, item.value);
if (!Array.isArray(val))
return false;
for (var i = 0; i < val.length; i++) {
if (__WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].isTwoValueEquals(val[i], item.value))
return true;
}
return false;
};
QuestionImagePickerModel.prototype.clearIncorrectValues = function () {
if (this.multiSelect) {
var val = this.value;
if (!val)
return;
if (!Array.isArray(val) || val.length == 0) {
this.clearValue();
return;
}
var newValue = [];
for (var i = 0; i < val.length; i++) {
if (!this.hasUnknownValue(val[i], true)) {
newValue.push(val[i]);
}
}
if (newValue.length == val.length)
return;
if (newValue.length == 0) {
this.clearValue();
}
else {
this.value = newValue;
}
}
else {
_super.prototype.clearIncorrectValues.call(this);
}
};
Object.defineProperty(QuestionImagePickerModel.prototype, "showLabel", {
/**
* Show label under the image.
*/
get: function () {
return this.getPropertyValue("showLabel", false);
},
set: function (newValue) {
this.setPropertyValue("showLabel", newValue);
},
enumerable: true,
configurable: true
});
QuestionImagePickerModel.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
if (!this.isDesignMode && this.multiSelect) {
this.createNewArray("renderedValue");
this.createNewArray("value");
}
};
QuestionImagePickerModel.prototype.getValueCore = function () {
var value = _super.prototype.getValueCore.call(this);
if (value !== undefined) {
return value;
}
if (this.multiSelect) {
return [];
}
return value;
};
QuestionImagePickerModel.prototype.convertValToArrayForMultSelect = function (val) {
if (!this.multiSelect)
return val;
if (__WEBPACK_IMPORTED_MODULE_5__helpers__["a" /* Helpers */].isValueEmpty(val) || Array.isArray(val))
return val;
return [val];
};
QuestionImagePickerModel.prototype.renderedValueFromDataCore = function (val) {
return this.convertValToArrayForMultSelect(val);
};
QuestionImagePickerModel.prototype.rendredValueToDataCore = function (val) {
return this.convertValToArrayForMultSelect(val);
};
Object.defineProperty(QuestionImagePickerModel.prototype, "imageHeight", {
/**
* The image height.
*/
get: function () {
return this.getPropertyValue("imageHeight");
},
set: function (val) {
this.setPropertyValue("imageHeight", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImagePickerModel.prototype, "imageWidth", {
/**
* The image width.
*/
get: function () {
return this.getPropertyValue("imageWidth");
},
set: function (val) {
this.setPropertyValue("imageWidth", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImagePickerModel.prototype, "imageFit", {
/**
* The image fit mode.
*/
get: function () {
return this.getPropertyValue("imageFit");
},
set: function (val) {
this.setPropertyValue("imageFit", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionImagePickerModel.prototype, "contentMode", {
/**
* The content mode.
*/
get: function () {
return this.getPropertyValue("contentMode");
},
set: function (val) {
this.setPropertyValue("contentMode", val);
if (val === "video") {
this.showLabel = true;
}
},
enumerable: true,
configurable: true
});
QuestionImagePickerModel.prototype.getItemClass = function (item) {
var itemClass = this.cssClasses.item +
(this.colCount === 0
? " " + this.cssClasses.itemInline
: " sv-q-col-" + this.colCount);
var isChecked = this.isItemSelected(item);
var isDisabled = this.isReadOnly || !item.isEnabled;
var allowHover = !isChecked && !isDisabled;
if (isChecked && !!this.cssClasses.itemChecked) {
itemClass += " " + this.cssClasses.itemChecked;
}
if (isDisabled && !!this.cssClasses.itemDisabled) {
itemClass += " " + this.cssClasses.itemDisabled;
}
if (allowHover && !!this.cssClasses.itemHover) {
itemClass += " " + this.cssClasses.itemHover;
}
return itemClass;
};
QuestionImagePickerModel.prototype.convertDefaultValue = function (val) {
return val;
};
return QuestionImagePickerModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("imageitemvalue", [], function (value) { return new ImageItemValue(value); }, "itemvalue");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addProperty("imageitemvalue", {
name: "imageLink",
serializationProperty: "locImageLink",
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("imagepicker", [
{ name: "hasOther", visible: false },
{ name: "otherText", visible: false },
{ name: "optionsCaption", visible: false },
{ name: "otherErrorText", visible: false },
{ name: "storeOthersAsComment", visible: false },
{
name: "contentMode",
default: "image",
choices: ["image", "video"],
},
{
name: "imageFit",
default: "contain",
choices: ["none", "contain", "cover", "fill"],
},
{ name: "imageHeight:number", default: 150, minValue: 0 },
{ name: "imageWidth:number", default: 200, minValue: 0 },
], function () {
return new QuestionImagePickerModel("");
}, "checkboxbase");
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addProperty("imagepicker", {
name: "showLabel:boolean",
default: false,
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addProperty("imagepicker", {
name: "colCount:number",
default: 0,
choices: [0, 1, 2, 3, 4, 5],
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addProperty("imagepicker", {
name: "multiSelect:boolean",
default: false,
});
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addProperty("imagepicker", {
name: "choices:imageitemvalue[]",
});
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("imagepicker", function (name) {
var q = new QuestionImagePickerModel(name);
//q.choices = QuestionFactory.DefaultChoices;
return q;
});
/***/ }),
/* 132 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__martixBase__ = __webpack_require__(47);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__localizablestring__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__question_dropdown__ = __webpack_require__(50);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return MartrixCells; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return QuestionMatrixModel; });
var MatrixRowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MatrixRowModel, _super);
function MatrixRowModel(item, fullName, data, value) {
var _this = _super.call(this) || this;
_this.fullName = fullName;
_this.item = item;
_this.data = data;
_this.value = value;
_this.cellClick = function (column) {
_this.value = column.value;
};
_this.registerFunctionOnPropertyValueChanged("value", function () {
if (_this.data)
_this.data.onMatrixRowChanged(_this);
});
return _this;
}
Object.defineProperty(MatrixRowModel.prototype, "name", {
get: function () {
return this.item.value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixRowModel.prototype, "text", {
get: function () {
return this.item.text;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixRowModel.prototype, "locText", {
get: function () {
return this.item.locText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixRowModel.prototype, "value", {
get: function () {
return this.getPropertyValue("value");
},
set: function (newValue) {
this.setPropertyValue("value", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixRowModel.prototype, "rowClasses", {
get: function () {
var cssClasses = this.data.cssClasses;
var rowClass = !!cssClasses.row ? cssClasses.row : "";
var rowErrorClass = !!cssClasses.rowError ? cssClasses.rowError : "";
var hasError = !!this.data.getErrorByType("requiredinallrowserror");
var classes = rowClass;
if (!!rowErrorClass && hasError && __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(this.value)) {
if (!!classes)
classes += " ";
classes += rowErrorClass;
}
return classes;
},
enumerable: true,
configurable: true
});
return MatrixRowModel;
}(__WEBPACK_IMPORTED_MODULE_5__base__["b" /* Base */]));
var MartrixCells = /** @class */ (function () {
function MartrixCells(cellsOwner) {
this.cellsOwner = cellsOwner;
this.values = {};
}
Object.defineProperty(MartrixCells.prototype, "isEmpty", {
get: function () {
return Object.keys(this.values).length == 0;
},
enumerable: true,
configurable: true
});
MartrixCells.prototype.setCellText = function (row, column, val) {
row = this.getCellRowColumnValue(row, this.rows);
column = this.getCellRowColumnValue(column, this.columns);
if (!row || !column)
return;
if (val) {
if (!this.values[row])
this.values[row] = {};
if (!this.values[row][column])
this.values[row][column] = this.createString();
this.values[row][column].text = val;
}
else {
if (this.values[row] && this.values[row][column]) {
var loc = this.values[row][column];
loc.text = "";
if (loc.isEmpty) {
delete this.values[row][column];
if (Object.keys(this.values[row]).length == 0) {
delete this.values[row];
}
}
}
}
};
MartrixCells.prototype.setDefaultCellText = function (column, val) {
this.setCellText(__WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].matrixDefaultRowName, column, val);
};
MartrixCells.prototype.getCellLocText = function (row, column) {
row = this.getCellRowColumnValue(row, this.rows);
column = this.getCellRowColumnValue(column, this.columns);
if (!row || !column)
return null;
if (!this.values[row])
return null;
if (!this.values[row][column])
return null;
return this.values[row][column];
};
MartrixCells.prototype.getDefaultCellLocText = function (column, val) {
return this.getCellLocText(__WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].matrixDefaultRowName, column);
};
MartrixCells.prototype.getCellDisplayLocText = function (row, column) {
var cellText = this.getCellLocText(row, column);
if (cellText && !cellText.isEmpty)
return cellText;
cellText = this.getCellLocText(__WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].matrixDefaultRowName, column);
if (cellText && !cellText.isEmpty)
return cellText;
if (typeof column == "number") {
column =
column >= 0 && column < this.columns.length
? this.columns[column]
: null;
}
if (column && column.locText)
return column.locText;
return null;
};
MartrixCells.prototype.getCellText = function (row, column) {
var loc = this.getCellLocText(row, column);
return loc ? loc.calculatedText : null;
};
MartrixCells.prototype.getDefaultCellText = function (column) {
var loc = this.getCellLocText(__WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].matrixDefaultRowName, column);
return loc ? loc.calculatedText : null;
};
MartrixCells.prototype.getCellDisplayText = function (row, column) {
var loc = this.getCellDisplayLocText(row, column);
return loc ? loc.calculatedText : null;
};
Object.defineProperty(MartrixCells.prototype, "rows", {
get: function () {
return this.cellsOwner ? this.cellsOwner.getRows() : [];
},
enumerable: true,
configurable: true
});
Object.defineProperty(MartrixCells.prototype, "columns", {
get: function () {
return this.cellsOwner ? this.cellsOwner.getColumns() : [];
},
enumerable: true,
configurable: true
});
MartrixCells.prototype.getCellRowColumnValue = function (val, values) {
if (typeof val == "number") {
if (val < 0 || val >= values.length)
return null;
val = values[val].value;
}
if (val.value)
return val.value;
return val;
};
MartrixCells.prototype.getJson = function () {
if (this.isEmpty)
return null;
var res = {};
for (var row in this.values) {
var resRow = {};
var rowValues = this.values[row];
for (var col in rowValues) {
resRow[col] = rowValues[col].getJson();
}
res[row] = resRow;
}
return res;
};
MartrixCells.prototype.setJson = function (value) {
this.values = {};
if (!value)
return;
for (var row in value) {
if (row == "pos")
continue;
var rowValues = value[row];
this.values[row] = {};
for (var col in rowValues) {
if (col == "pos")
continue;
var loc = this.createString();
loc.setJson(rowValues[col]);
this.values[row][col] = loc;
}
}
};
MartrixCells.prototype.createString = function () {
return new __WEBPACK_IMPORTED_MODULE_9__localizablestring__["a" /* LocalizableString */](this.cellsOwner, true);
};
return MartrixCells;
}());
/**
* A Model for a simple matrix question.
*/
var QuestionMatrixModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixModel, _super);
function QuestionMatrixModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isRowChanging = false;
_this.emptyLocalizableString = new __WEBPACK_IMPORTED_MODULE_9__localizablestring__["a" /* LocalizableString */](_this);
_this.cellsValue = new MartrixCells(_this);
var self = _this;
_this.registerFunctionOnPropertyValueChanged("columns", function () {
self.onColumnsChanged();
});
_this.registerFunctionOnPropertyValueChanged("rows", function () {
if (!self.filterItems()) {
self.onRowsChanged();
}
});
_this.registerFunctionOnPropertyValueChanged("hideIfRowsEmpty", function () {
self.updateVisibilityBasedOnRows();
});
return _this;
}
QuestionMatrixModel.prototype.getType = function () {
return "matrix";
};
Object.defineProperty(QuestionMatrixModel.prototype, "hasSingleInput", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "isAllRowRequired", {
/**
* Set this property to true, if you want a user to answer all rows.
*/
get: function () {
return this.getPropertyValue("isAllRowRequired", false);
},
set: function (val) {
this.setPropertyValue("isAllRowRequired", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "hasRows", {
/**
* Returns true, if there is at least one row.
*/
get: function () {
return this.rows.length > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "rowsOrder", {
/**
* Use this property to render items in a specific order: "random" or "initial". Default is "initial".
*/
get: function () {
return this.getPropertyValue("rowsOrder");
},
set: function (val) {
val = val.toLowerCase();
if (val == this.rowsOrder)
return;
this.setPropertyValue("rowsOrder", val);
this.onRowsChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "hideIfRowsEmpty", {
/**
* Set this property to true to hide the question if there is no visible rows in the matrix.
*/
get: function () {
return this.getPropertyValue("hideIfRowsEmpty", false);
},
set: function (val) {
this.setPropertyValue("hideIfRowsEmpty", val);
},
enumerable: true,
configurable: true
});
QuestionMatrixModel.prototype.getRows = function () {
return this.rows;
};
QuestionMatrixModel.prototype.getColumns = function () {
return this.visibleColumns;
};
QuestionMatrixModel.prototype.getItemClass = function (row, column) {
var isChecked = row.value == column.value;
var isDisabled = this.isReadOnly;
var allowHover = !isChecked && !isDisabled;
var cellDisabledClass = this.hasCellText
? this.cssClasses.cellTextDisabled
: this.cssClasses.itemDisabled;
var cellSelectedClass = this.hasCellText
? this.cssClasses.cellTextSelected
: this.cssClasses.itemChecked;
var itemHoverClass = !this.hasCellText ? this.cssClasses.itemHover : "";
var cellClass = this.hasCellText
? this.cssClasses.cellText
: this.cssClasses.label;
var itemClass = this.hasCellText && !!this.cssClasses.cell
? this.cssClasses.cell + " "
: "";
itemClass +=
cellClass +
(isChecked ? " " + cellSelectedClass : "") +
(isDisabled ? " " + cellDisabledClass : "") +
(allowHover ? " " + itemHoverClass : "");
return itemClass;
};
QuestionMatrixModel.prototype.getQuizQuestionCount = function () {
var res = 0;
for (var i = 0; i < this.rows.length; i++) {
if (!this.isValueEmpty(this.correctAnswer[this.rows[i].value]))
res++;
}
return res;
};
QuestionMatrixModel.prototype.getCorrectAnswerCount = function () {
var res = 0;
var value = this.value;
for (var i = 0; i < this.rows.length; i++) {
var row = this.rows[i].value;
if (!__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(value[row]) &&
__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isTwoValueEquals(this.correctAnswer[row], value[row]))
res++;
}
return res;
};
QuestionMatrixModel.prototype.getVisibleRows = function () {
var result = new Array();
var val = this.value;
if (!val)
val = {};
var rows = !!this.filteredRows ? this.filteredRows : this.rows;
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
if (this.isValueEmpty(row.value))
continue;
result.push(this.createMatrixRow(row, this.id + "_" + row.value.toString().replace(/\s/g, "_"), val[row.value]));
}
if (result.length == 0 && !this.filteredRows) {
result.push(this.createMatrixRow(new __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */](null), this.name.replace(/\s/g, "_"), val));
}
this.generatedVisibleRows = result;
return result;
};
QuestionMatrixModel.prototype.sortVisibleRows = function (array) {
var order = this.rowsOrder.toLowerCase();
if (order === "random")
return __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].randomizeArray(array);
return array;
};
QuestionMatrixModel.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
this.rows = this.sortVisibleRows(this.rows);
this.updateVisibilityBasedOnRows();
};
QuestionMatrixModel.prototype.processRowsOnSet = function (newRows) {
return this.sortVisibleRows(newRows);
};
Object.defineProperty(QuestionMatrixModel.prototype, "visibleRows", {
/**
* Returns the list of visible rows as model objects.
* @see rowsVisibleIf
*/
get: function () {
return this.getVisibleRows();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "cells", {
get: function () {
return this.cellsValue;
},
set: function (value) {
this.cells.setJson(value && value.getJson ? value.getJson() : null);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "hasCellText", {
get: function () {
return !this.cells.isEmpty;
},
enumerable: true,
configurable: true
});
QuestionMatrixModel.prototype.setCellText = function (row, column, val) {
this.cells.setCellText(row, column, val);
};
QuestionMatrixModel.prototype.getCellText = function (row, column) {
return this.cells.getCellText(row, column);
};
QuestionMatrixModel.prototype.setDefaultCellText = function (column, val) {
this.cells.setDefaultCellText(column, val);
};
QuestionMatrixModel.prototype.getDefaultCellText = function (column) {
return this.cells.getDefaultCellText(column);
};
QuestionMatrixModel.prototype.getCellDisplayText = function (row, column) {
return this.cells.getCellDisplayText(row, column);
};
QuestionMatrixModel.prototype.getCellDisplayLocText = function (row, column) {
var loc = this.cells.getCellDisplayLocText(row, column);
return loc ? loc : this.emptyLocalizableString;
};
QuestionMatrixModel.prototype.supportGoNextPageAutomatic = function () {
return this.hasValuesInAllRows();
};
QuestionMatrixModel.prototype.onCheckForErrors = function (errors, isOnValueChanged) {
_super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged);
if ((!isOnValueChanged || this.errors.length > 0) &&
this.hasErrorInRows()) {
errors.push(new __WEBPACK_IMPORTED_MODULE_7__error__["i" /* RequiredInAllRowsError */](null, this));
}
};
QuestionMatrixModel.prototype.hasErrorInRows = function () {
if (!this.isAllRowRequired)
return false;
return !this.hasValuesInAllRows();
};
QuestionMatrixModel.prototype.hasValuesInAllRows = function () {
var rows = this.generatedVisibleRows;
if (!rows)
rows = this.visibleRows;
if (!rows)
return true;
for (var i = 0; i < rows.length; i++) {
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(rows[i].value))
return false;
}
return true;
};
QuestionMatrixModel.prototype.getIsAnswered = function () {
return _super.prototype.getIsAnswered.call(this) && this.hasValuesInAllRows();
};
QuestionMatrixModel.prototype.createMatrixRow = function (item, fullName, value) {
var row = new MatrixRowModel(item, fullName, this, value);
this.onMatrixRowCreated(row);
return row;
};
QuestionMatrixModel.prototype.onMatrixRowCreated = function (row) { };
QuestionMatrixModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) {
if (updateIsAnswered === void 0) { updateIsAnswered = true; }
_super.prototype.setQuestionValue.call(this, newValue, this.isRowChanging || updateIsAnswered);
if (!this.generatedVisibleRows || this.generatedVisibleRows.length == 0)
return;
this.isRowChanging = true;
var val = this.value;
if (!val)
val = {};
if (this.rows.length == 0) {
this.generatedVisibleRows[0].value = val;
}
else {
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
var row = this.generatedVisibleRows[i];
var rowVal = val[row.name];
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(rowVal))
rowVal = null;
this.generatedVisibleRows[i].value = rowVal;
}
}
this.updateIsAnswered();
this.isRowChanging = false;
};
QuestionMatrixModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var res = {};
for (var key in value) {
var newKey = keysAsText
? __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.rows, key)
: key;
if (!newKey)
newKey = key;
var newValue = __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.columns, value[key]);
if (!newValue)
newValue = value[key];
res[newKey] = newValue;
}
return res;
};
QuestionMatrixModel.prototype.getPlainData = function (options) {
var _this = this;
if (options === void 0) { options = {
includeEmpty: true,
}; }
var questionPlainData = _super.prototype.getPlainData.call(this, options);
if (!!questionPlainData) {
var values = this.createValueCopy();
questionPlainData.isNode = true;
questionPlainData.data = Object.keys(values || {}).map(function (rowName) {
var row = _this.rows.filter(function (r) { return r.value === rowName; })[0];
var rowDataItem = {
name: rowName,
title: !!row ? row.text : "row",
value: values[rowName],
displayValue: __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(_this.visibleColumns, values[rowName]),
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: false,
};
var item = __WEBPACK_IMPORTED_MODULE_2__itemvalue__["a" /* ItemValue */].getItemByValue(_this.visibleColumns, values[rowName]);
if (!!item) {
(options.calculations || []).forEach(function (calculation) {
rowDataItem[calculation.propertyName] =
item[calculation.propertyName];
});
}
return rowDataItem;
});
}
return questionPlainData;
};
QuestionMatrixModel.prototype.addConditionObjectsByContext = function (objects, context) {
for (var i = 0; i < this.rows.length; i++) {
var row = this.rows[i];
if (!!row.value) {
objects.push({
name: this.getValueName() + "." + row.value,
text: this.processedTitle + "." + row.calculatedText,
question: this,
});
}
}
};
QuestionMatrixModel.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
if (!path)
return _super.prototype.getConditionJson.call(this);
var question = new __WEBPACK_IMPORTED_MODULE_10__question_dropdown__["a" /* QuestionDropdownModel */](path);
question.choices = this.columns;
var json = new __WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* JsonObject */]().toJsonObject(question);
json["type"] = question.getType();
return json;
};
QuestionMatrixModel.prototype.clearValueIfInvisible = function () {
_super.prototype.clearValueIfInvisible.call(this);
if (this.hasRows) {
this.clearInvisibleValuesInRows();
}
};
QuestionMatrixModel.prototype.getFirstInputElementId = function () {
var rows = this.generatedVisibleRows;
if (!rows)
rows = this.visibleRows;
if (rows.length > 0 && this.visibleColumns.length > 0) {
return this.inputId + "_" + rows[0].name + "_" + 0;
}
return _super.prototype.getFirstInputElementId.call(this);
};
QuestionMatrixModel.prototype.onRowsChanged = function () {
this.updateVisibilityBasedOnRows();
_super.prototype.onRowsChanged.call(this);
};
QuestionMatrixModel.prototype.updateVisibilityBasedOnRows = function () {
if (this.hideIfRowsEmpty) {
this.visible =
this.rows.length > 0 &&
(!this.filteredRows || this.filteredRows.length > 0);
}
};
//IMatrixData
QuestionMatrixModel.prototype.onMatrixRowChanged = function (row) {
if (this.isRowChanging)
return;
this.isRowChanging = true;
if (!this.hasRows) {
this.setNewValue(row.value);
}
else {
var newValue = this.value;
if (!newValue) {
newValue = {};
}
newValue[row.name] = row.value;
this.setNewValue(newValue);
}
this.isRowChanging = false;
};
return QuestionMatrixModel;
}(__WEBPACK_IMPORTED_MODULE_3__martixBase__["a" /* QuestionMatrixBaseModel */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("matrix", [
{
name: "columns:itemvalue[]",
baseValue: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("matrix_column");
},
},
{
name: "rows:itemvalue[]",
baseValue: function () {
return __WEBPACK_IMPORTED_MODULE_6__surveyStrings__["a" /* surveyLocalization */].getString("matrix_row");
},
},
{ name: "cells:cells", serializationProperty: "cells" },
{
name: "rowsOrder",
default: "initial",
choices: ["initial", "random"],
},
"isAllRowRequired:boolean",
"hideIfRowsEmpty:boolean",
], function () {
return new QuestionMatrixModel("");
}, "matrixbase");
__WEBPACK_IMPORTED_MODULE_8__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrix", function (name) {
var q = new QuestionMatrixModel(name);
q.rows = __WEBPACK_IMPORTED_MODULE_8__questionfactory__["a" /* QuestionFactory */].DefaultRows;
q.columns = __WEBPACK_IMPORTED_MODULE_8__questionfactory__["a" /* QuestionFactory */].DefaultColums;
return q;
});
/***/ }),
/* 133 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__ = __webpack_require__(30);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixDropdownRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrixDropdownModel; });
var MatrixDropdownRowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MatrixDropdownRowModel, _super);
function MatrixDropdownRowModel(name, item, data, value) {
var _this = _super.call(this, data, value) || this;
_this.name = name;
_this.item = item;
_this.buildCells(value);
return _this;
}
Object.defineProperty(MatrixDropdownRowModel.prototype, "rowName", {
get: function () {
return this.name;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModel.prototype, "text", {
get: function () {
return this.item.text;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MatrixDropdownRowModel.prototype, "locText", {
get: function () {
return this.item.locText;
},
enumerable: true,
configurable: true
});
return MatrixDropdownRowModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["d" /* MatrixDropdownRowModelBase */]));
/**
* A Model for a matrix dropdown question. You may use a dropdown, checkbox, radiogroup, text and comment questions as a cell editors.
*/
var QuestionMatrixDropdownModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixDropdownModel, _super);
function QuestionMatrixDropdownModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("totalText", _this, true);
var self = _this;
_this.registerFunctionOnPropertyValueChanged("rows", function () {
self.generatedVisibleRows = null;
self.resetRenderedTable();
self.filterItems();
});
return _this;
}
QuestionMatrixDropdownModel.prototype.getType = function () {
return "matrixdropdown";
};
Object.defineProperty(QuestionMatrixDropdownModel.prototype, "totalText", {
/**
* Set this property to show it on the first column for the total row.
*/
get: function () {
return this.getLocalizableStringText("totalText", "");
},
set: function (val) {
this.setLocalizableStringText("totalText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModel.prototype, "locTotalText", {
get: function () {
return this.getLocalizableString("totalText");
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModel.prototype.getFooterText = function () {
return this.locTotalText;
};
Object.defineProperty(QuestionMatrixDropdownModel.prototype, "rowTitleWidth", {
/**
* The column width for the first column, row title column.
*/
get: function () {
return this.getPropertyValue("rowTitleWidth", "");
},
set: function (val) {
this.setPropertyValue("rowTitleWidth", val);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModel.prototype.getRowTitleWidth = function () {
return this.rowTitleWidth;
};
QuestionMatrixDropdownModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var values = this.createValueCopy();
if (!values)
return values;
var rows = this.visibleRows;
var res = {};
for (var i = 0; i < rows.length; i++) {
var rowValue = this.rows[i].value;
var val = values[rowValue];
if (!val)
continue;
if (keysAsText) {
var displayRowValue = __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.rows, rowValue);
if (!!displayRowValue) {
rowValue = displayRowValue;
}
}
res[rowValue] = this.getRowDisplayValue(rows[i], val);
}
return values;
};
QuestionMatrixDropdownModel.prototype.addConditionObjectsByContext = function (objects, context) {
var hasContext = !!context ? this.columns.indexOf(context) > -1 : false;
for (var i = 0; i < this.rows.length; i++) {
var row = this.rows[i];
if (!row.value)
continue;
var prefixName = this.getValueName() + "." + row.value + ".";
var prefixTitle = this.processedTitle + "." + row.calculatedText + ".";
for (var j = 0; j < this.columns.length; j++) {
var column = this.columns[j];
objects.push({
name: prefixName + column.name,
text: prefixTitle + column.fullTitle,
question: this,
});
}
}
if (hasContext) {
for (var i = 0; i < this.columns.length; i++) {
var column = this.columns[i];
if (column == context)
continue;
objects.push({
name: "row." + column.name,
text: "row." + column.fullTitle,
question: this,
});
}
}
};
QuestionMatrixDropdownModel.prototype.clearIncorrectValues = function () {
var val = this.value;
if (!val)
return;
var newVal = null;
var isChanged = false;
var rows = !!this.filteredRows ? this.filteredRows : this.rows;
for (var key in val) {
if (__WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getItemByValue(rows, key)) {
if (newVal == null)
newVal = {};
newVal[key] = val[key];
}
else {
isChanged = true;
}
}
if (isChanged) {
this.value = newVal;
}
_super.prototype.clearIncorrectValues.call(this);
};
QuestionMatrixDropdownModel.prototype.clearValueIfInvisible = function () {
_super.prototype.clearValueIfInvisible.call(this);
this.clearInvisibleValuesInRows();
};
QuestionMatrixDropdownModel.prototype.generateRows = function () {
var result = new Array();
var rows = !!this.filteredRows ? this.filteredRows : this.rows;
if (!rows || rows.length === 0)
return result;
var val = this.value;
if (!val)
val = {};
for (var i = 0; i < rows.length; i++) {
if (!rows[i].value)
continue;
result.push(this.createMatrixRow(rows[i], val[rows[i].value]));
}
return result;
};
QuestionMatrixDropdownModel.prototype.createMatrixRow = function (item, value) {
return new MatrixDropdownRowModel(item.value, item, this, value);
};
return QuestionMatrixDropdownModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["e" /* QuestionMatrixDropdownModelBase */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("matrixdropdown", [
{
name: "rows:itemvalue[]",
},
"rowsVisibleIf:condition",
"rowTitleWidth",
{ name: "totalText", serializationProperty: "locTotalText" },
], function () {
return new QuestionMatrixDropdownModel("");
}, "matrixdropdownbase");
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrixdropdown", function (name) {
var q = new QuestionMatrixDropdownModel(name);
q.choices = [1, 2, 3, 4, 5];
q.rows = __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].DefaultColums;
__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["e" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q);
return q;
});
/***/ }),
/* 134 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__ = __webpack_require__(30);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__settings__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__utils_utils__ = __webpack_require__(24);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixDynamicRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrixDynamicModel; });
var MatrixDynamicRowModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MatrixDynamicRowModel, _super);
function MatrixDynamicRowModel(index, data, value) {
var _this = _super.call(this, data, value) || this;
_this.index = index;
_this.buildCells(value);
return _this;
}
Object.defineProperty(MatrixDynamicRowModel.prototype, "rowName", {
get: function () {
return this.id;
},
enumerable: true,
configurable: true
});
return MatrixDynamicRowModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["d" /* MatrixDropdownRowModelBase */]));
/**
* A Model for a matrix dymanic question. You may use a dropdown, checkbox, radiogroup, text and comment questions as a cell editors.
* An end-user may dynamically add/remove rows, unlike in matrix dropdown question.
*/
var QuestionMatrixDynamicModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMatrixDynamicModel, _super);
function QuestionMatrixDynamicModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.rowCounter = 0;
_this.initialRowCount = 2;
_this.setRowCountValueFromData = false;
void (_this.createLocalizableString("confirmDeleteText", _this));
void (_this.createLocalizableString("keyDuplicationError", _this));
void _this.createLocalizableString("addRowText", _this);
void (_this.createLocalizableString("removeRowText", _this));
return _this;
}
QuestionMatrixDynamicModel.prototype.getType = function () {
return "matrixdynamic";
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "isRowsDynamic", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "confirmDelete", {
/**
* Set it to true, to show a confirmation dialog on removing a row
* @see ConfirmDeleteText
*/
get: function () {
return this.getPropertyValue("confirmDelete", false);
},
set: function (val) {
this.setPropertyValue("confirmDelete", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "keyName", {
/**
* Set it to a column name and the library shows duplication error, if there are same values in different rows in the column.
* @see keyDuplicationError
*/
get: function () {
return this.getPropertyValue("keyName", "");
},
set: function (val) {
this.setPropertyValue("keyName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "defaultRowValue", {
/**
* If it is not empty, then this value is set to every new row, including rows created initially, unless the defaultValue is not empty
* @see defaultValue
* @see defaultValueFromLastRow
*/
get: function () {
return this.getPropertyValue("defaultRowValue");
},
set: function (val) {
this.setPropertyValue("defaultRowValue", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "defaultValueFromLastRow", {
/**
* Set it to true to copy the value into new added row from the last row. If defaultRowValue is set and this property equals to true,
* then the value for new added row is merging.
* @see defaultValue
* @see defaultRowValue
*/
get: function () {
return this.getPropertyValue("defaultValueFromLastRow", false);
},
set: function (val) {
this.setPropertyValue("defaultValueFromLastRow", val);
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.isDefaultValueEmpty = function () {
return (_super.prototype.isDefaultValueEmpty.call(this) && this.isValueEmpty(this.defaultRowValue));
};
QuestionMatrixDynamicModel.prototype.setDefaultValue = function () {
if (this.isValueEmpty(this.defaultRowValue) ||
!this.isValueEmpty(this.defaultValue)) {
_super.prototype.setDefaultValue.call(this);
return;
}
if (!this.isEmpty() || this.rowCount == 0)
return;
var newValue = [];
for (var i = 0; i < this.rowCount; i++) {
newValue.push(this.defaultRowValue);
}
this.value = newValue;
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "rowCount", {
/**
* The number of rows in the matrix.
* @see minRowCount
* @see maxRowCount
*/
get: function () {
return this.rowCountValue;
},
set: function (val) {
if (val < 0 || val > __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount)
return;
this.setRowCountValueFromData = false;
var prevValue = this.rowCountValue;
this.rowCountValue = val;
if (this.value && this.value.length > val) {
var qVal = this.value;
qVal.splice(val);
this.value = qVal;
}
if (this.isLoadingFromJson) {
this.initialRowCount = val;
return;
}
if (this.generatedVisibleRows) {
this.generatedVisibleRows.splice(val);
for (var i = prevValue; i < val; i++) {
var newRow = this.createMatrixRow(null);
this.generatedVisibleRows.push(newRow);
this.onMatrixRowCreated(newRow);
}
}
this.onRowsChanged();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "rowCountValue", {
get: function () {
return this.getPropertyValue("rowCount", 2);
},
set: function (val) {
this.setPropertyValue("rowCount", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "minRowCount", {
/**
* The minimum row count. A user could not delete a row if the rowCount equals to minRowCount
* @see rowCount
* @see maxRowCount
* @see allowAddRows
*/
get: function () {
return this.getPropertyValue("minRowCount", 0);
},
set: function (val) {
if (val < 0)
val = 0;
this.setPropertyValue("minRowCount", val);
if (val > this.maxRowCount)
this.maxRowCount = val;
if (this.rowCount < val)
this.rowCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "maxRowCount", {
/**
* The maximum row count. A user could not add a row if the rowCount equals to maxRowCount
* @see rowCount
* @see minRowCount
* @see allowAddRows
*/
get: function () {
return this.getPropertyValue("maxRowCount", __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount);
},
set: function (val) {
if (val <= 0)
return;
if (val > __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount)
val = __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount;
if (val == this.maxRowCount)
return;
this.setPropertyValue("maxRowCount", val);
if (val < this.minRowCount)
this.minRowCount = val;
if (this.rowCount > val)
this.rowCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "allowAddRows", {
/**
* Set this property to false to disable ability to add new rows. "Add new Row" button becomes invsible in UI
* @see canAddRow
* @see allowRemoveRows
*/
get: function () {
return this.getPropertyValue("allowAddRows", true);
},
set: function (val) {
this.setPropertyValue("allowAddRows", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "allowRemoveRows", {
/**
* Set this property to false to disable ability to remove rows. "Remove" row buttons become invsible in UI
* @see canRemoveRows
* @see allowAddRows
*/
get: function () {
return this.getPropertyValue("allowRemoveRows", true);
},
set: function (val) {
this.setPropertyValue("allowRemoveRows", val);
if (!this.isLoadingFromJson) {
this.resetRenderedTable();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canAddRow", {
/**
* Returns true, if a new row can be added.
* @see allowAddRows
* @see maxRowCount
* @see canRemoveRows
* @see rowCount
*/
get: function () {
return (this.allowAddRows && !this.isReadOnly && this.rowCount < this.maxRowCount);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canRemoveRows", {
/**
* Returns true, if row can be removed.
* @see minRowCount
* @see canAddRow
* @see rowCount
*/
get: function () {
return (this.allowRemoveRows &&
!this.isReadOnly &&
this.rowCount > this.minRowCount);
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.canRemoveRow = function (row) {
if (!this.survey)
return true;
return this.survey.matrixAllowRemoveRow(this, row.index, row);
};
/**
* Creates and add a new row.
*/
QuestionMatrixDynamicModel.prototype.addRow = function () {
var options = { question: this, canAddRow: this.canAddRow };
if (!!this.survey) {
this.survey.matrixBeforeRowAdded(options);
}
if (!options.canAddRow)
return;
this.onStartRowAddingRemoving();
this.addRowCore();
this.onEndRowAdding();
};
QuestionMatrixDynamicModel.prototype.hasRowsAsItems = function () {
return false;
};
QuestionMatrixDynamicModel.prototype.addRowCore = function () {
var prevRowCount = this.rowCount;
this.rowCount = this.rowCount + 1;
var defaultValue = this.getDefaultRowValue(true);
var newValue = null;
if (!this.isValueEmpty(defaultValue)) {
newValue = this.createNewValue();
if (newValue.length == this.rowCount) {
newValue[newValue.length - 1] = defaultValue;
this.value = newValue;
}
}
if (this.data) {
this.runCellsCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());
var row = this.visibleRows[this.rowCount - 1];
if (!__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(row.value)) {
if (!newValue) {
newValue = this.createNewValue();
}
if (!__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isTwoValueEquals(newValue[newValue.length - 1], row.value)) {
newValue[newValue.length - 1] = row.value;
this.value = newValue;
}
}
}
if (this.survey) {
if (prevRowCount + 1 == this.rowCount) {
this.survey.matrixRowAdded(this, this.visibleRows[this.visibleRows.length - 1]);
this.onRowsChanged();
}
}
};
QuestionMatrixDynamicModel.prototype.getDefaultRowValue = function (isRowAdded) {
var res = null;
for (var i = 0; i < this.columns.length; i++) {
var q = this.columns[i].templateQuestion;
if (!!q && !this.isValueEmpty(q.getDefaultValue())) {
res = res || {};
res[this.columns[i].name] = q.getDefaultValue();
}
}
if (!this.isValueEmpty(this.defaultRowValue)) {
for (var key in this.defaultRowValue) {
res = res || {};
res[key] = this.defaultRowValue[key];
}
}
if (isRowAdded && this.defaultValueFromLastRow) {
var val = this.value;
if (!!val && Array.isArray(val) && val.length >= this.rowCount - 1) {
var rowValue = val[this.rowCount - 2];
for (var key in rowValue) {
res = res || {};
res[key] = rowValue[key];
}
}
}
return res;
};
/**
* Removes a row by it's index. If confirmDelete is true, show a confirmation dialog
* @param index a row index, from 0 to rowCount - 1
* @see removeRow
* @see confirmDelete
*/
QuestionMatrixDynamicModel.prototype.removeRowUI = function (value) {
if (!!value && !!value.rowName) {
var index = this.visibleRows.indexOf(value);
if (index < 0)
return;
value = index;
}
if (!this.isRequireConfirmOnRowDelete(value) ||
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_8__utils_utils__["a" /* confirmAction */])(this.confirmDeleteText)) {
this.removeRow(value);
}
};
QuestionMatrixDynamicModel.prototype.isRequireConfirmOnRowDelete = function (index) {
if (!this.confirmDelete)
return false;
if (index < 0 || index >= this.rowCount)
return false;
var value = this.createNewValue();
if (__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value) || !Array.isArray(value))
return false;
if (index >= value.length)
return false;
return !__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(value[index]);
};
/**
* Removes a row by it's index.
* @param index a row index, from 0 to rowCount - 1
*/
QuestionMatrixDynamicModel.prototype.removeRow = function (index) {
if (!this.canRemoveRows)
return;
if (index < 0 || index >= this.rowCount)
return;
this.onStartRowAddingRemoving();
this.removeRowCore(index);
this.onEndRowRemoving(index);
};
QuestionMatrixDynamicModel.prototype.removeRowCore = function (index) {
if (this.survey) {
var row = this.generatedVisibleRows
? this.generatedVisibleRows[index]
: null;
this.survey.matrixRowRemoved(this, index, row);
}
if (this.generatedVisibleRows && index < this.generatedVisibleRows.length) {
this.generatedVisibleRows.splice(index, 1);
}
this.rowCountValue--;
if (this.value) {
var val = [];
if (Array.isArray(this.value) && index < this.value.length) {
val = this.createValueCopy();
}
else {
val = this.createNewValue();
}
val.splice(index, 1);
val = this.deleteRowValue(val, null);
this.isRowChanging = true;
this.value = val;
this.isRowChanging = false;
}
this.onRowsChanged();
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "confirmDeleteText", {
/**
* Use this property to change the default text showing in the confirmation delete dialog on removing a row.
*/
get: function () {
return this.getLocalizableStringText("confirmDeleteText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("confirmDelete"));
},
set: function (val) {
this.setLocalizableStringText("confirmDeleteText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locConfirmDeleteText", {
get: function () {
return this.getLocalizableString("confirmDeleteText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "keyDuplicationError", {
/**
* The duplication value error text. Set it to show the text different from the default.
* @see keyName
*/
get: function () {
return this.getLocalizableStringText("keyDuplicationError", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("keyDuplicationError"));
},
set: function (val) {
this.setLocalizableStringText("keyDuplicationError", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locKeyDuplicationError", {
get: function () {
return this.getLocalizableString("keyDuplicationError");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "addRowText", {
/**
* Use this property to change the default value of add row button text.
*/
get: function () {
var defaultLocName = this.isColumnLayoutHorizontal ? "addRow" : "addColumn";
return this.getLocalizableStringText("addRowText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString(defaultLocName));
},
set: function (val) {
this.setLocalizableStringText("addRowText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locAddRowText", {
get: function () {
return this.getLocalizableString("addRowText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "addRowLocation", {
/**
* By default the 'Add Row' button is shown on bottom if columnLayout is horizontal and on top if columnLayout is vertical.
* You may set it to "top", "bottom" or "topBottom" (to show on top and bottom).
* @see columnLayout
*/
get: function () {
return this.getPropertyValue("addRowLocation");
},
set: function (val) {
this.setPropertyValue("addRowLocation", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "isAddRowOnTop", {
get: function () {
if (!this.canAddRow)
return false;
if (this.addRowLocation === "default")
return this.columnLayout === "vertical";
return this.addRowLocation !== "bottom";
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "isAddRowOnBottom", {
get: function () {
if (!this.canAddRow)
return false;
if (this.addRowLocation === "default")
return this.columnLayout === "horizontal";
return this.addRowLocation !== "top";
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "removeRowText", {
/**
* Use this property to change the default value of remove row button text.
*/
get: function () {
return this.getLocalizableStringText("removeRowText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("removeRow"));
},
set: function (val) {
this.setLocalizableStringText("removeRowText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "locRemoveRowText", {
get: function () {
return this.getLocalizableString("removeRowText");
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var values = this.createValueCopy();
if (!values || !Array.isArray(values))
return values;
var rows = this.visibleRows;
for (var i = 0; i < rows.length && i < values.length; i++) {
var val = values[i];
if (!val)
continue;
values[i] = this.getRowDisplayValue(rows[i], val);
}
return values;
};
QuestionMatrixDynamicModel.prototype.addConditionObjectsByContext = function (objects, context) {
var hasContext = !!context ? this.columns.indexOf(context) > -1 : false;
for (var i = 0; i < this.columns.length; i++) {
var column = this.columns[i];
this.addColumnIntoaddConditionObjectsByContext(objects, 0, column);
if (hasContext && column != context) {
this.addColumnIntoaddConditionObjectsByContext(objects, -1, column);
}
for (var j = 1; j < Math.min(__WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaxRowCountInCondition, this.rowCount); j++) {
this.addColumnIntoaddConditionObjectsByContext(objects, j, column);
}
}
};
QuestionMatrixDynamicModel.prototype.addColumnIntoaddConditionObjectsByContext = function (objects, rowIndex, column) {
var rowName = rowIndex > -1 ? "[" + rowIndex.toString() + "]." : "row.";
objects.push({
name: (rowIndex > -1 ? this.getValueName() + rowName : rowName) + column.name,
text: (rowIndex > -1 ? this.processedTitle + rowName : rowName) +
column.fullTitle,
question: this,
});
};
QuestionMatrixDynamicModel.prototype.supportGoNextPageAutomatic = function () {
return false;
};
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "hasRowText", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.onCheckForErrors = function (errors, isOnValueChanged) {
_super.prototype.onCheckForErrors.call(this, errors, isOnValueChanged);
if (!isOnValueChanged && this.hasErrorInRows()) {
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["j" /* MinRowCountError */](this.minRowCount, this));
}
};
QuestionMatrixDynamicModel.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
var prevValue = _super.prototype.hasErrors.call(this, fireCallback, rec);
var isDuplicated = this.isValueDuplicated();
return isDuplicated || prevValue;
};
QuestionMatrixDynamicModel.prototype.hasErrorInRows = function () {
if (this.minRowCount <= 0 || !this.isRequired || !this.generatedVisibleRows)
return false;
var setRowCount = 0;
for (var rowIndex = 0; rowIndex < this.generatedVisibleRows.length; rowIndex++) {
var row = this.generatedVisibleRows[rowIndex];
if (!row.isEmpty)
setRowCount++;
}
return setRowCount < this.minRowCount;
};
QuestionMatrixDynamicModel.prototype.isValueDuplicated = function () {
if (!this.keyName || !this.generatedVisibleRows)
return false;
var column = this.getColumnByName(this.keyName);
if (!column)
return false;
var keyValues = [];
var res = false;
for (var i = 0; i < this.generatedVisibleRows.length; i++) {
res =
this.isValueDuplicatedInRow(this.generatedVisibleRows[i], column, keyValues) || res;
}
return res;
};
QuestionMatrixDynamicModel.prototype.isValueDuplicatedInRow = function (row, column, keyValues) {
var question = row.getQuestionByColumn(column);
if (!question || question.isEmpty())
return false;
var value = question.value;
for (var i = 0; i < keyValues.length; i++) {
if (value == keyValues[i]) {
question.addError(new __WEBPACK_IMPORTED_MODULE_5__error__["f" /* KeyDuplicationError */](this.keyDuplicationError, this));
return true;
}
}
keyValues.push(value);
return false;
};
QuestionMatrixDynamicModel.prototype.generateRows = function () {
var result = new Array();
if (this.rowCount === 0)
return result;
var val = this.createNewValue();
for (var i = 0; i < this.rowCount; i++) {
result.push(this.createMatrixRow(this.getRowValueByIndex(val, i)));
}
if (!this.isValueEmpty(this.getDefaultRowValue(false))) {
this.value = val;
}
return result;
};
QuestionMatrixDynamicModel.prototype.createMatrixRow = function (value) {
return new MatrixDynamicRowModel(this.rowCounter++, this, value);
};
QuestionMatrixDynamicModel.prototype.onBeforeValueChanged = function (val) {
if (!val || !Array.isArray(val))
return;
var newRowCount = val.length;
if (newRowCount == this.rowCount)
return;
if (!this.setRowCountValueFromData && newRowCount < this.initialRowCount)
return;
this.setRowCountValueFromData = true;
this.rowCountValue = newRowCount;
if (this.generatedVisibleRows) {
this.generatedVisibleRows = null;
this.generatedVisibleRows = this.visibleRows;
this.onRowsChanged();
}
};
QuestionMatrixDynamicModel.prototype.createNewValue = function () {
var result = this.createValueCopy();
if (!result || !Array.isArray(result))
result = [];
if (result.length > this.rowCount)
result.splice(this.rowCount);
var rowValue = this.getDefaultRowValue(false);
rowValue = rowValue || {};
for (var i = result.length; i < this.rowCount; i++) {
result.push(__WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].getUnbindValue(rowValue));
}
return result;
};
QuestionMatrixDynamicModel.prototype.deleteRowValue = function (newValue, row) {
var isEmpty = true;
for (var i = 0; i < newValue.length; i++) {
if (this.isObject(newValue[i]) && Object.keys(newValue[i]).length > 0) {
isEmpty = false;
break;
}
}
return isEmpty ? null : newValue;
};
QuestionMatrixDynamicModel.prototype.getRowValueByIndex = function (questionValue, index) {
return index >= 0 && index < questionValue.length
? questionValue[index]
: null;
};
QuestionMatrixDynamicModel.prototype.getRowValueCore = function (row, questionValue, create) {
if (create === void 0) { create = false; }
if (!this.generatedVisibleRows)
return {};
var res = this.getRowValueByIndex(questionValue, this.generatedVisibleRows.indexOf(row));
if (!res && create)
res = {};
return res;
};
return QuestionMatrixDynamicModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["e" /* QuestionMatrixDropdownModelBase */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* Serializer */].addClass("matrixdynamic", [
{ name: "rowsVisibleIf:condition", visible: false },
{ name: "allowAddRows:boolean", default: true },
{ name: "allowRemoveRows:boolean", default: true },
{ name: "rowCount:number", default: 2, minValue: 0, isBindable: true },
{ name: "minRowCount:number", default: 0, minValue: 0 },
{
name: "maxRowCount:number",
default: __WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].matrixMaximumRowCount,
},
{ name: "keyName" },
{
name: "keyDuplicationError",
serializationProperty: "locKeyDuplicationError",
},
"defaultRowValue:rowvalue",
"defaultValueFromLastRow:boolean",
{ name: "confirmDelete:boolean" },
{
name: "confirmDeleteText",
dependsOn: "confirmDelete",
visibleIf: function (obj) {
return !obj || obj.confirmDelete;
},
serializationProperty: "locConfirmDeleteText",
},
{
name: "addRowLocation",
default: "default",
choices: ["default", "top", "bottom", "topBottom"],
},
{ name: "addRowText", serializationProperty: "locAddRowText" },
{ name: "removeRowText", serializationProperty: "locRemoveRowText" },
], function () {
return new QuestionMatrixDynamicModel("");
}, "matrixdropdownbase");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrixdynamic", function (name) {
var q = new QuestionMatrixDynamicModel(name);
q.choices = [1, 2, 3, 4, 5];
__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["e" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q);
return q;
});
/***/ }),
/* 135 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_text__ = __webpack_require__(52);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__helpers__ = __webpack_require__(4);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MultipleTextItemModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMultipleTextModel; });
var MultipleTextItemModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(MultipleTextItemModel, _super);
function MultipleTextItemModel(name, title) {
if (name === void 0) { name = null; }
if (title === void 0) { title = null; }
var _this = _super.call(this) || this;
_this.editorValue = _this.createEditor(name);
_this.editor.questionTitleTemplateCallback = function () {
return "";
};
_this.editor.titleLocation = "left";
if (title) {
_this.title = title;
}
return _this;
}
MultipleTextItemModel.prototype.getType = function () {
return "multipletextitem";
};
Object.defineProperty(MultipleTextItemModel.prototype, "id", {
get: function () {
return this.editor.id;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "name", {
/**
* The item name.
*/
get: function () {
return this.editor.name;
},
set: function (val) {
this.editor.name = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "question", {
get: function () {
return this.data;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "editor", {
get: function () {
return this.editorValue;
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.createEditor = function (name) {
return new __WEBPACK_IMPORTED_MODULE_3__question_text__["a" /* QuestionTextModel */](name);
};
MultipleTextItemModel.prototype.addUsedLocales = function (locales) {
_super.prototype.addUsedLocales.call(this, locales);
this.editor.addUsedLocales(locales);
};
MultipleTextItemModel.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
this.editor.locStrsChanged();
};
MultipleTextItemModel.prototype.setData = function (data) {
this.data = data;
if (!!data) {
this.editor.defaultValue = data.getItemDefaultValue(this.name);
this.editor.setSurveyImpl(this);
this.editor.parent = data;
}
};
Object.defineProperty(MultipleTextItemModel.prototype, "isRequired", {
/**
* Set this property to true, to make the item a required. If a user doesn't fill the item then a validation error will be generated.
*/
get: function () {
return this.editor.isRequired;
},
set: function (val) {
this.editor.isRequired = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "inputType", {
/**
* Use this property to change the default input type.
*/
get: function () {
return this.editor.inputType;
},
set: function (val) {
this.editor.inputType = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "title", {
/**
* Item title. If it is empty, the item name is rendered as title. This property supports markdown.
* @see name
*/
get: function () {
return this.editor.title;
},
set: function (val) {
this.editor.title = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "locTitle", {
get: function () {
return this.editor.locTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "fullTitle", {
/**
* Returns the text or html for rendering the title.
*/
get: function () {
return this.editor.fullTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "maxLength", {
/**
* The maximum text length. If it is -1, defaul value, then the survey maxTextLength property will be used.
* If it is 0, then the value is unlimited
* @see SurveyModel.maxTextLength
*/
get: function () {
return this.editor.maxLength;
},
set: function (val) {
this.editor.maxLength = val;
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.getMaxLength = function () {
var survey = this.getSurvey();
return __WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].getMaxLength(this.maxLength, survey ? survey.maxTextLength : -1);
};
Object.defineProperty(MultipleTextItemModel.prototype, "placeHolder", {
/**
* The input place holder.
*/
get: function () {
return this.editor.placeHolder;
},
set: function (val) {
this.editor.placeHolder = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "locPlaceHolder", {
get: function () {
return this.editor.locPlaceHolder;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "requiredErrorText", {
/**
* The custom text that will be shown on required error. Use this property, if you do not want to show the default text.
*/
get: function () {
return this.editor.requiredErrorText;
},
set: function (val) {
this.editor.requiredErrorText = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "locRequiredErrorText", {
get: function () {
return this.editor.locRequiredErrorText;
},
enumerable: true,
configurable: true
});
Object.defineProperty(MultipleTextItemModel.prototype, "validators", {
/**
* The list of question validators.
*/
get: function () {
return this.editor.validators;
},
set: function (val) {
this.editor.validators = val;
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.getValidators = function () {
return this.validators;
};
Object.defineProperty(MultipleTextItemModel.prototype, "value", {
/**
* The item value.
*/
get: function () {
return this.data ? this.data.getMultipleTextValue(this.name) : null;
},
set: function (value) {
if (this.data != null) {
this.data.setMultipleTextValue(this.name, value);
}
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.isEmpty = function () {
return __WEBPACK_IMPORTED_MODULE_6__helpers__["a" /* Helpers */].isValueEmpty(this.value);
};
MultipleTextItemModel.prototype.onValueChanged = function (newValue) {
if (this.valueChangedCallback)
this.valueChangedCallback(newValue);
};
//ISurveyImpl
MultipleTextItemModel.prototype.geSurveyData = function () {
return this;
};
MultipleTextItemModel.prototype.getSurvey = function () {
return this.data ? this.data.getSurvey() : null;
};
MultipleTextItemModel.prototype.getTextProcessor = function () {
return this.data ? this.data.getTextProcessor() : null;
};
//ISurveyData
MultipleTextItemModel.prototype.getValue = function (name) {
if (!this.data)
return null;
return this.data.getMultipleTextValue(name);
};
MultipleTextItemModel.prototype.setValue = function (name, value) {
if (this.data) {
this.data.setMultipleTextValue(name, value);
}
};
MultipleTextItemModel.prototype.getVariable = function (name) {
return undefined;
};
MultipleTextItemModel.prototype.setVariable = function (name, newValue) { };
MultipleTextItemModel.prototype.getComment = function (name) {
return null;
};
MultipleTextItemModel.prototype.setComment = function (name, newValue) { };
MultipleTextItemModel.prototype.getAllValues = function () {
if (this.data)
return this.data.getAllValues();
return this.value;
};
MultipleTextItemModel.prototype.getFilteredValues = function () {
return this.getAllValues();
};
MultipleTextItemModel.prototype.getFilteredProperties = function () {
return { survey: this.getSurvey() };
};
//IValidatorOwner
MultipleTextItemModel.prototype.getValidatorTitle = function () {
return this.title;
};
Object.defineProperty(MultipleTextItemModel.prototype, "validatedValue", {
get: function () {
return this.value;
},
set: function (val) {
this.value = val;
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.getDataFilteredValues = function () {
return this.getFilteredValues();
};
MultipleTextItemModel.prototype.getDataFilteredProperties = function () {
return this.getFilteredProperties();
};
return MultipleTextItemModel;
}(__WEBPACK_IMPORTED_MODULE_1__base__["b" /* Base */]));
/**
* A Model for a multiple text question.
*/
var QuestionMultipleTextModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionMultipleTextModel, _super);
function QuestionMultipleTextModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.isMultipleItemValueChanging = false;
var self = _this;
_this.createNewArray("items", function (item) {
item.setData(self);
});
_this.registerFunctionOnPropertyValueChanged("items", function () {
self.fireCallback(self.colCountChangedCallback);
});
_this.registerFunctionOnPropertyValueChanged("colCount", function () {
self.fireCallback(self.colCountChangedCallback);
});
return _this;
}
QuestionMultipleTextModel.prototype.getType = function () {
return "multipletext";
};
QuestionMultipleTextModel.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
for (var i = 0; i < this.items.length; i++) {
this.items[i].setData(this);
}
};
Object.defineProperty(QuestionMultipleTextModel.prototype, "isAllowTitleLeft", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMultipleTextModel.prototype, "hasSingleInput", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionMultipleTextModel.prototype.onSurveyLoad = function () {
this.editorsOnSurveyLoad();
_super.prototype.onSurveyLoad.call(this);
this.fireCallback(this.colCountChangedCallback);
};
QuestionMultipleTextModel.prototype.setQuestionValue = function (newValue, updateIsAnswered) {
if (updateIsAnswered === void 0) { updateIsAnswered = true; }
_super.prototype.setQuestionValue.call(this, newValue, updateIsAnswered);
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.editor)
item.editor.updateValueFromSurvey(item.value);
}
this.updateIsAnswered();
};
QuestionMultipleTextModel.prototype.onSurveyValueChanged = function (newValue) {
_super.prototype.onSurveyValueChanged.call(this, newValue);
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.editor)
item.editor.onSurveyValueChanged(item.value);
}
};
QuestionMultipleTextModel.prototype.editorsOnSurveyLoad = function () {
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.editor) {
item.editor.onSurveyLoad();
}
}
};
Object.defineProperty(QuestionMultipleTextModel.prototype, "items", {
/**
* The list of input items.
*/
get: function () {
return this.getPropertyValue("items");
},
set: function (val) {
this.setPropertyValue("items", val);
},
enumerable: true,
configurable: true
});
/**
* Add a new text item.
* @param name a item name
* @param title a item title (optional)
*/
QuestionMultipleTextModel.prototype.addItem = function (name, title) {
if (title === void 0) { title = null; }
var item = this.createTextItem(name, title);
this.items.push(item);
return item;
};
QuestionMultipleTextModel.prototype.getItemByName = function (name) {
for (var i = 0; i < this.items.length; i++) {
if (this.items[i].name == name)
return this.items[i];
}
return null;
};
QuestionMultipleTextModel.prototype.addConditionObjectsByContext = function (objects, context) {
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
objects.push({
name: this.getValueName() + "." + item.name,
text: this.processedTitle + "." + item.fullTitle,
question: this,
});
}
};
QuestionMultipleTextModel.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
if (!path)
return _super.prototype.getConditionJson.call(this);
var item = this.getItemByName(path);
if (!item)
return null;
var json = new __WEBPACK_IMPORTED_MODULE_4__jsonobject__["c" /* JsonObject */]().toJsonObject(item);
json["type"] = "text";
return json;
};
QuestionMultipleTextModel.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
for (var i = 0; i < this.items.length; i++) {
this.items[i].locStrsChanged();
}
};
QuestionMultipleTextModel.prototype.supportGoNextPageAutomatic = function () {
for (var i = 0; i < this.items.length; i++) {
if (this.items[i].isEmpty())
return false;
}
return true;
};
Object.defineProperty(QuestionMultipleTextModel.prototype, "colCount", {
/**
* The number of columns. Items are rendred in one line if the value is 0.
*/
get: function () {
return this.getPropertyValue("colCount");
},
set: function (val) {
if (val < 1 || val > 5)
return;
this.setPropertyValue("colCount", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMultipleTextModel.prototype, "itemSize", {
/**
* The default text input size.
*/
get: function () {
return this.getPropertyValue("itemSize");
},
set: function (val) {
this.setPropertyValue("itemSize", val);
},
enumerable: true,
configurable: true
});
/**
* Returns the list of rendered rows.
*/
QuestionMultipleTextModel.prototype.getRows = function () {
var colCount = this.colCount;
var items = this.items;
var rows = [];
var index = 0;
for (var i = 0; i < items.length; i++) {
if (index == 0) {
rows.push([]);
}
rows[rows.length - 1].push(items[i]);
index++;
if (index >= colCount) {
index = 0;
}
}
return rows;
};
QuestionMultipleTextModel.prototype.onValueChanged = function () {
_super.prototype.onValueChanged.call(this);
this.onItemValueChanged();
};
QuestionMultipleTextModel.prototype.createTextItem = function (name, title) {
return new MultipleTextItemModel(name, title);
};
QuestionMultipleTextModel.prototype.onItemValueChanged = function () {
if (this.isMultipleItemValueChanging)
return;
for (var i = 0; i < this.items.length; i++) {
var itemValue = null;
if (this.value && this.items[i].name in this.value) {
itemValue = this.value[this.items[i].name];
}
this.items[i].onValueChanged(itemValue);
}
};
QuestionMultipleTextModel.prototype.getIsRunningValidators = function () {
if (_super.prototype.getIsRunningValidators.call(this))
return true;
for (var i = 0; i < this.items.length; i++) {
if (this.items[i].editor.isRunningValidators)
return true;
}
return false;
};
QuestionMultipleTextModel.prototype.hasErrors = function (fireCallback, rec) {
var _this = this;
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
var res = false;
for (var i = 0; i < this.items.length; i++) {
this.items[i].editor.onCompletedAsyncValidators = function (hasErrors) {
_this.raiseOnCompletedAsyncValidators();
};
if (!!rec &&
rec.isOnValueChanged === true &&
this.items[i].editor.isEmpty())
continue;
res = this.items[i].editor.hasErrors(fireCallback, rec) || res;
}
return _super.prototype.hasErrors.call(this, fireCallback) || res;
};
QuestionMultipleTextModel.prototype.getAllErrors = function () {
var result = _super.prototype.getAllErrors.call(this);
for (var i = 0; i < this.items.length; i++) {
var errors = this.items[i].editor.getAllErrors();
if (errors && errors.length > 0) {
result = result.concat(errors);
}
}
return result;
};
QuestionMultipleTextModel.prototype.clearErrors = function () {
_super.prototype.clearErrors.call(this);
for (var i = 0; i < this.items.length; i++) {
this.items[i].editor.clearErrors();
}
};
QuestionMultipleTextModel.prototype.getContainsErrors = function () {
var res = _super.prototype.getContainsErrors.call(this);
if (res)
return res;
var items = this.items;
for (var i = 0; i < items.length; i++) {
if (items[i].editor.containsErrors)
return true;
}
return false;
};
QuestionMultipleTextModel.prototype.getIsAnswered = function () {
if (!_super.prototype.getIsAnswered.call(this))
return false;
for (var i = 0; i < this.items.length; i++) {
var editor = this.items[i].editor;
if (editor.isVisible && !editor.isAnswered)
return false;
}
return true;
};
QuestionMultipleTextModel.prototype.getProgressInfo = function () {
var elements = [];
for (var i = 0; i < this.items.length; i++) {
elements.push(this.items[i].editor);
}
return __WEBPACK_IMPORTED_MODULE_1__base__["a" /* SurveyElement */].getProgressInfoByElements(elements, this.isRequired);
};
//IMultipleTextData
QuestionMultipleTextModel.prototype.getMultipleTextValue = function (name) {
if (!this.value)
return null;
return this.value[name];
};
QuestionMultipleTextModel.prototype.setMultipleTextValue = function (name, value) {
this.isMultipleItemValueChanging = true;
var newValue = this.value;
if (!newValue) {
newValue = {};
}
newValue[name] = value;
this.setNewValue(newValue);
this.isMultipleItemValueChanging = false;
};
QuestionMultipleTextModel.prototype.getItemDefaultValue = function (name) {
return !!this.defaultValue ? this.defaultValue[name] : null;
};
QuestionMultipleTextModel.prototype.getSurvey = function () {
return this.survey;
};
QuestionMultipleTextModel.prototype.getTextProcessor = function () {
return this.textProcessor;
};
QuestionMultipleTextModel.prototype.getAllValues = function () {
return this.data ? this.data.getAllValues() : null;
};
QuestionMultipleTextModel.prototype.getIsRequiredText = function () {
return this.survey ? this.survey.requiredText : "";
};
//IPanel
QuestionMultipleTextModel.prototype.addElement = function (element, index) { };
QuestionMultipleTextModel.prototype.removeElement = function (element) {
return false;
};
QuestionMultipleTextModel.prototype.getQuestionTitleLocation = function () {
return "left";
};
QuestionMultipleTextModel.prototype.getQuestionStartIndex = function () {
return this.getStartIndex();
};
QuestionMultipleTextModel.prototype.getChildrenLayoutType = function () {
return "row";
};
QuestionMultipleTextModel.prototype.elementWidthChanged = function (el) { };
Object.defineProperty(QuestionMultipleTextModel.prototype, "elements", {
get: function () {
return [];
},
enumerable: true,
configurable: true
});
QuestionMultipleTextModel.prototype.indexOf = function (el) {
return -1;
};
return QuestionMultipleTextModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("multipletextitem", [
"name",
"isRequired:boolean",
{ name: "placeHolder", serializationProperty: "locPlaceHolder" },
{
name: "inputType",
default: "text",
choices: [
"color",
"date",
"datetime",
"datetime-local",
"email",
"month",
"number",
"password",
"range",
"tel",
"text",
"time",
"url",
"week",
],
},
{ name: "title", serializationProperty: "locTitle" },
{ name: "maxLength:number", default: -1 },
{
name: "requiredErrorText:text",
serializationProperty: "locRequiredErrorText",
},
{
name: "validators:validators",
baseClassName: "surveyvalidator",
classNamePart: "validator",
},
], function () {
return new MultipleTextItemModel("");
});
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* Serializer */].addClass("multipletext", [
{ name: "!items:textitems", className: "multipletextitem" },
{ name: "itemSize:number", default: 25, minValue: 0 },
{ name: "colCount:number", default: 1, choices: [1, 2, 3, 4, 5] },
], function () {
return new QuestionMultipleTextModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("multipletext", function (name) {
var q = new QuestionMultipleTextModel(name);
q.addItem("text1");
q.addItem("text2");
return q;
});
/***/ }),
/* 136 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__textPreProcessor__ = __webpack_require__(23);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__panel__ = __webpack_require__(22);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__error__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__settings__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__utils_utils__ = __webpack_require__(24);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionPanelDynamicItem; });
/* unused harmony export QuestionPanelDynamicTemplateSurveyImpl */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionPanelDynamicModel; });
var QuestionPanelDynamicItem = /** @class */ (function () {
function QuestionPanelDynamicItem(data, panel) {
this.data = data;
this.panelValue = panel;
var self = this;
this.textPreProcessor = new __WEBPACK_IMPORTED_MODULE_4__textPreProcessor__["a" /* TextPreProcessor */]();
this.textPreProcessor.onProcess = function (textValue) {
self.getProcessedTextValue(textValue);
};
this.setSurveyImpl();
}
Object.defineProperty(QuestionPanelDynamicItem.prototype, "panel", {
get: function () {
return this.panelValue;
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicItem.prototype.setSurveyImpl = function () {
this.panel.setSurveyImpl(this);
};
QuestionPanelDynamicItem.prototype.getValue = function (name) {
var values = this.getAllValues();
return values[name];
};
QuestionPanelDynamicItem.prototype.setValue = function (name, newValue) {
this.data.setPanelItemData(this, name, newValue);
};
QuestionPanelDynamicItem.prototype.getVariable = function (name) {
return undefined;
};
QuestionPanelDynamicItem.prototype.setVariable = function (name, newValue) { };
QuestionPanelDynamicItem.prototype.getComment = function (name) {
var result = this.getValue(name + __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].commentPrefix);
return result ? result : "";
};
QuestionPanelDynamicItem.prototype.setComment = function (name, newValue, locNotification) {
this.setValue(name + __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].commentPrefix, newValue);
};
QuestionPanelDynamicItem.prototype.getAllValues = function () {
return this.data.getPanelItemData(this);
};
QuestionPanelDynamicItem.prototype.getFilteredValues = function () {
var values = {};
var surveyValues = !!this.data && !!this.data.getRootData()
? this.data.getRootData().getFilteredValues()
: {};
for (var key in surveyValues) {
values[key] = surveyValues[key];
}
values[QuestionPanelDynamicItem.ItemVariableName] = this.getAllValues();
return values;
};
QuestionPanelDynamicItem.prototype.getFilteredProperties = function () {
if (!!this.data && !!this.data.getRootData())
return this.data.getRootData().getFilteredProperties();
return { survey: this.getSurvey() };
};
QuestionPanelDynamicItem.prototype.geSurveyData = function () {
return this;
};
QuestionPanelDynamicItem.prototype.getSurvey = function () {
return this.data ? this.data.getSurvey() : null;
};
QuestionPanelDynamicItem.prototype.getTextProcessor = function () {
return this;
};
//ITextProcessor
QuestionPanelDynamicItem.prototype.getProcessedTextValue = function (textValue) {
if (!textValue)
return;
var panelIndex = !!this.data ? this.data.getItemIndex(this) : -1;
if (textValue.name == QuestionPanelDynamicItem.IndexVariableName) {
textValue.isExists = true;
textValue.value = panelIndex + 1;
return;
}
var firstName = new __WEBPACK_IMPORTED_MODULE_5__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(textValue.name);
textValue.isExists = firstName == QuestionPanelDynamicItem.ItemVariableName;
textValue.canProcess = textValue.isExists;
if (!textValue.canProcess)
return;
//name should start with the panel
textValue.name = textValue.name.replace(QuestionPanelDynamicItem.ItemVariableName + ".", "");
var firstName = new __WEBPACK_IMPORTED_MODULE_5__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(textValue.name);
var question = this.panel.getQuestionByValueName(firstName);
if (!question && panelIndex > -1) {
question = this.data.getSharedQuestionFromArray(firstName, panelIndex);
}
var values = {};
if (question) {
values[firstName] = textValue.returnDisplayValue
? question.displayValue
: question.value;
}
else {
var allValues = this.getAllValues();
if (allValues) {
values[firstName] = allValues[firstName];
}
}
textValue.value = new __WEBPACK_IMPORTED_MODULE_5__conditionProcessValue__["a" /* ProcessValue */]().getValue(textValue.name, values);
};
QuestionPanelDynamicItem.prototype.processText = function (text, returnDisplayValue) {
text = this.textPreProcessor.process(text, returnDisplayValue);
var survey = this.getSurvey();
return survey ? survey.processText(text, returnDisplayValue) : text;
};
QuestionPanelDynamicItem.prototype.processTextEx = function (text, returnDisplayValue) {
text = this.processText(text, returnDisplayValue);
var hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;
var res = { hasAllValuesOnLastRun: true, text: text };
if (this.getSurvey()) {
res = this.getSurvey().processTextEx(text, returnDisplayValue, false);
}
res.hasAllValuesOnLastRun =
res.hasAllValuesOnLastRun && hasAllValuesOnLastRun;
return res;
};
QuestionPanelDynamicItem.ItemVariableName = "panel";
QuestionPanelDynamicItem.IndexVariableName = "panelIndex";
return QuestionPanelDynamicItem;
}());
var QuestionPanelDynamicTemplateSurveyImpl = /** @class */ (function () {
function QuestionPanelDynamicTemplateSurveyImpl(data) {
this.data = data;
}
QuestionPanelDynamicTemplateSurveyImpl.prototype.geSurveyData = function () {
return null;
};
QuestionPanelDynamicTemplateSurveyImpl.prototype.getSurvey = function () {
return this.data.getSurvey();
};
QuestionPanelDynamicTemplateSurveyImpl.prototype.getTextProcessor = function () {
return null;
};
return QuestionPanelDynamicTemplateSurveyImpl;
}());
/**
* A Model for a panel dymanic question. You setup the template panel, but adding elements (any question or a panel) and assign a text to it's title, and this panel will be used as a template on creating dynamic panels. The number of panels is defined by panelCount property.
* An end-user may dynamically add/remove panels, unless you forbidden this.
*/
var QuestionPanelDynamicModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionPanelDynamicModel, _super);
function QuestionPanelDynamicModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.loadingPanelCount = 0;
_this.currentIndexValue = -1;
_this.isAddingNewPanels = false;
_this.createNewArray("panels");
_this.templateValue = _this.createAndSetupNewPanelObject();
_this.template.renderWidth = "100%";
_this.template.selectedElementInDesign = _this;
var self = _this;
_this.template.addElementCallback = function (element) {
self.addOnPropertyChangedCallback(element);
self.rebuildPanels();
};
_this.template.removeElementCallback = function (element) {
self.rebuildPanels();
};
_this.createLocalizableString("confirmDeleteText", _this);
_this.createLocalizableString("keyDuplicationError", _this);
_this.createLocalizableString("panelAddText", _this);
_this.createLocalizableString("panelRemoveText", _this);
_this.createLocalizableString("panelPrevText", _this);
_this.createLocalizableString("panelNextText", _this);
_this.registerFunctionOnPropertyValueChanged("panelsState", function () {
self.setPanelsState();
});
return _this;
}
Object.defineProperty(QuestionPanelDynamicModel.prototype, "hasSingleInput", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
this.setTemplatePanelSurveyImpl();
this.setPanelsSurveyImpl();
};
QuestionPanelDynamicModel.prototype.assignOnPropertyChangedToTemplate = function () {
var elements = this.template.elements;
for (var i = 0; i < elements.length; i++) {
this.addOnPropertyChangedCallback(elements[i]);
}
};
QuestionPanelDynamicModel.prototype.addOnPropertyChangedCallback = function (element) {
var self = this;
element.onPropertyChanged.add(function (element, options) {
self.onTemplateElementPropertyChanged(element, options);
});
if (element.isPanel) {
element.addElementCallback = function (element) {
self.addOnPropertyChangedCallback(element);
};
}
};
QuestionPanelDynamicModel.prototype.onTemplateElementPropertyChanged = function (element, options) {
if (this.isLoadingFromJson || this.isDesignMode || this.panels.length == 0)
return;
var property = __WEBPACK_IMPORTED_MODULE_8__jsonobject__["a" /* Serializer */].findProperty(element.getType(), options.name);
if (!property)
return;
var panels = this.panels;
for (var i = 0; i < panels.length; i++) {
var question = panels[i].getQuestionByName(element.name);
if (!!question && question[options.name] !== options.newValue) {
question[options.name] = options.newValue;
}
}
};
QuestionPanelDynamicModel.prototype.getType = function () {
return "paneldynamic";
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isCompositeQuestion", {
get: function () {
return true;
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.clearOnDeletingContainer = function () {
this.panels.forEach(function (panel) {
panel.clearOnDeletingContainer();
});
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isAllowTitleLeft", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.removeElement = function (element) {
return this.template.removeElement(element);
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "template", {
/**
* The template Panel. This panel is used as a template on creatign dynamic panels
* @see templateElements
* @see templateTitle
* @see panelCount
*/
get: function () {
return this.templateValue;
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.getPanel = function () {
return this.template;
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateElements", {
/**
* The template Panel elements, questions and panels.
* @see templateElements
* @see template
* @see panelCount
*/
get: function () {
return this.template.elements;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateTitle", {
/**
* The template Panel title property.
* @see templateElements
* @see template
* @see panelCount
*/
get: function () {
return this.template.title;
},
set: function (newValue) {
this.template.title = newValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locTemplateTitle", {
get: function () {
return this.template.locTitle;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateDescription", {
/**
* The template Panel description property.
* @see templateElements
* @see template
* @see panelCount
* @see templateTitle
*/
get: function () {
return this.template.description;
},
set: function (newValue) {
this.template.description = newValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locTemplateDescription", {
get: function () {
return this.template.locDescription;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "items", {
get: function () {
var res = [];
for (var i = 0; i < this.panels.length; i++) {
res.push(this.panels[i].data);
}
return res;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panels", {
/**
* The array of dynamic panels created based on panel template
* @see template
* @see panelCount
*/
get: function () {
return this.getPropertyValue("panels");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "currentIndex", {
/**
* The index of current active dynamical panel when the renderMode is not "list". If there is no dymamic panel (panelCount = 0) or renderMode equals "list" it returns -1, otherwise it returns a value from 0 to panelCount - 1.
* @see currentPanel
* @see panels
* @see panelCount
* @see renderMode
*/
get: function () {
if (this.isRenderModeList)
return -1;
if (this.isDesignMode)
return 0;
if (this.currentIndexValue < 0 && this.panelCount > 0) {
this.currentIndexValue = 0;
}
if (this.currentIndexValue >= this.panelCount) {
this.currentIndexValue = this.panelCount - 1;
}
return this.currentIndexValue;
},
set: function (val) {
if (this.currentIndexValue !== val) {
if (val >= this.panelCount)
val = this.panelCount - 1;
this.currentIndexValue = val;
this.fireCallback(this.currentIndexChangedCallback);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "currentPanel", {
/**
* The current active dynamical panel when the renderMode is not "list". If there is no dymamic panel (panelCount = 0) or renderMode equals "list" it returns null.
* @see currenIndex
* @see panels
* @see panelCount
* @see renderMode
*/
get: function () {
var index = this.currentIndex;
if (index < 0 || index >= this.panels.length)
return null;
return this.panels[index];
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "confirmDelete", {
/**
* Set it to true, to show a confirmation dialog on removing a panel
* @see ConfirmDeleteText
*/
get: function () {
return this.getPropertyValue("confirmDelete", false);
},
set: function (val) {
this.setPropertyValue("confirmDelete", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "keyName", {
/**
* Set it to a question name used in the template panel and the library shows duplication error, if there are same values in different panels of this question.
* @see keyDuplicationError
*/
get: function () {
return this.getPropertyValue("keyName", "");
},
set: function (val) {
this.setPropertyValue("keyName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "confirmDeleteText", {
/**
* Use this property to change the default text showing in the confirmation delete dialog on removing a panel.
*/
get: function () {
return this.getLocalizableStringText("confirmDeleteText", __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("confirmDelete"));
},
set: function (val) {
this.setLocalizableStringText("confirmDeleteText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locConfirmDeleteText", {
get: function () {
return this.getLocalizableString("confirmDeleteText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "keyDuplicationError", {
/**
* The duplication value error text. Set it to show the text different from the default.
* @see keyName
*/
get: function () {
return this.getLocalizableStringText("keyDuplicationError", __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("keyDuplicationError"));
},
set: function (val) {
this.setLocalizableStringText("keyDuplicationError", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locKeyDuplicationError", {
get: function () {
return this.getLocalizableString("keyDuplicationError");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelPrevText", {
/**
* Use this property to change the default previous button text. Previous button shows the previous panel, change the currentPanel, when the renderMode doesn't equal to "list".
* @see currentPanel
* @see currentIndex
* @see renderMode
*/
get: function () {
return this.getLocalizableStringText("panelPrevText", __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("pagePrevText"));
},
set: function (val) {
this.setLocalizableStringText("panelPrevText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelPrevText", {
get: function () {
return this.getLocalizableString("panelPrevText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelNextText", {
/**
* Use this property to change the default next button text. Next button shows the next panel, change the currentPanel, when the renderMode doesn't equal to "list".
* @see currentPanel
* @see currentIndex
* @see renderMode
*/
get: function () {
return this.getLocalizableStringText("panelNextText", __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("pageNextText"));
},
set: function (val) {
this.setLocalizableStringText("panelNextText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelNextText", {
get: function () {
return this.getLocalizableString("panelNextText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelAddText", {
/**
* Use this property to change the default value of add panel button text.
*/
get: function () {
return this.getLocalizableStringText("panelAddText", __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("addPanel"));
},
set: function (value) {
this.setLocalizableStringText("panelAddText", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelAddText", {
get: function () {
return this.getLocalizableString("panelAddText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelRemoveText", {
/**
* Use this property to change the default value of remove panel button text.
*/
get: function () {
return this.getLocalizableStringText("panelRemoveText", __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("removePanel"));
},
set: function (val) {
this.setLocalizableStringText("panelRemoveText", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "locPanelRemoveText", {
get: function () {
return this.getLocalizableString("panelRemoveText");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isProgressTopShowing", {
/**
* Returns true when the renderMode equals to "progressTop" or "progressTopBottom"
*/
get: function () {
return (this.renderMode == "progressTop" || this.renderMode == "progressTopBottom");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isProgressBottomShowing", {
/**
* Returns true when the renderMode equals to "progressBottom" or "progressTopBottom"
*/
get: function () {
return (this.renderMode == "progressBottom" ||
this.renderMode == "progressTopBottom");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isPrevButtonShowing", {
/**
* Returns true when currentIndex is more than 0.
* @see currenIndex
* @see currenPanel
*/
get: function () {
return this.currentIndex > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isNextButtonShowing", {
/**
* Returns true when currentIndex is more than or equal 0 and less than panelCount - 1.
* @see currenIndex
* @see currenPanel
* @see panelCount
*/
get: function () {
return this.currentIndex >= 0 && this.currentIndex < this.panelCount - 1;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isRangeShowing", {
/**
* Returns true when showRangeInProgress equals to true, renderMode doesn't equal to "list" and panelCount is >= 2.
*/
get: function () {
return (this.showRangeInProgress && this.currentIndex >= 0 && this.panelCount > 1);
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.getElementsInDesign = function (includeHidden) {
if (includeHidden === void 0) { includeHidden = false; }
return includeHidden ? [this.template] : this.templateElements;
};
QuestionPanelDynamicModel.prototype.prepareValueForPanelCreating = function () {
this.addingNewPanelsValue = this.value;
this.isAddingNewPanels = true;
this.isNewPanelsValueChanged = false;
};
QuestionPanelDynamicModel.prototype.setValueAfterPanelsCreating = function () {
this.isAddingNewPanels = false;
if (this.isNewPanelsValueChanged) {
this.isValueChangingInternally = true;
this.value = this.addingNewPanelsValue;
this.isValueChangingInternally = false;
}
};
QuestionPanelDynamicModel.prototype.getValueCore = function () {
return this.isAddingNewPanels
? this.addingNewPanelsValue
: _super.prototype.getValueCore.call(this);
};
QuestionPanelDynamicModel.prototype.setValueCore = function (newValue) {
if (this.isAddingNewPanels) {
this.isNewPanelsValueChanged = true;
this.addingNewPanelsValue = newValue;
}
else {
_super.prototype.setValueCore.call(this, newValue);
}
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelCount", {
/**
* Use this property to get/set the number of dynamic panels.
* @see template
* @see minPanelCount
* @see maxPanelCount
* @see addPanel
* @see removePanel
* @see removePanelUI
*/
get: function () {
return this.isLoadingFromJson || this.isDesignMode
? this.loadingPanelCount
: this.panels.length;
},
set: function (val) {
if (val < 0)
return;
if (this.isLoadingFromJson || this.isDesignMode) {
this.loadingPanelCount = val;
return;
}
if (val == this.panels.length || this.isDesignMode)
return;
this.updateBindings("panelCount", val);
this.prepareValueForPanelCreating();
for (var i = this.panelCount; i < val; i++) {
var panel = this.createNewPanel();
this.panels.push(panel);
if (this.renderMode == "list" && this.panelsState != "default") {
if (this.panelsState === "expand") {
panel.expand();
}
else {
if (!!panel.title) {
panel.collapse();
}
}
}
}
if (val < this.panelCount)
this.panels.splice(val, this.panelCount - val);
this.setValueAfterPanelsCreating();
this.setValueBasedOnPanelCount();
this.reRunCondition();
this.fireCallback(this.panelCountChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "panelsState", {
/**
* Use this property to allow the end-user to collapse/expand the panels. It works only if the renderMode property equals to "list" and templateTitle property is not empty. The following values are available:
* default - the default value. User can't collapse/expand panels
* expanded - User can collapse/expand panels and all panels are expanded by default
* collapsed - User can collapse/expand panels and all panels are collapsed by default
* firstExpanded - User can collapse/expand panels. The first panel is expanded and others are collapsed
* @see renderMode
* @see templateTitle
*/
get: function () {
return this.getPropertyValue("panelsState");
},
set: function (val) {
this.setPropertyValue("panelsState", val);
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.setTemplatePanelSurveyImpl = function () {
this.template.setSurveyImpl(this.isDesignMode
? this.surveyImpl
: new QuestionPanelDynamicTemplateSurveyImpl(this));
};
QuestionPanelDynamicModel.prototype.setPanelsSurveyImpl = function () {
for (var i = 0; i < this.panels.length; i++) {
var panel = this.panels[i];
if (panel == this.template)
continue;
panel.setSurveyImpl(panel.data);
}
};
QuestionPanelDynamicModel.prototype.setPanelsState = function () {
if (this.isDesignMode || this.renderMode != "list" || !this.templateTitle)
return;
for (var i = 0; i < this.panels.length; i++) {
var state = this.panelsState;
if (state === "firstExpanded") {
state = i === 0 ? "expanded" : "collapsed";
}
this.panels[i].state = state;
}
};
QuestionPanelDynamicModel.prototype.setValueBasedOnPanelCount = function () {
var value = this.value;
if (!value || !Array.isArray(value))
value = [];
if (value.length == this.panelCount)
return;
for (var i = value.length; i < this.panelCount; i++)
value.push({});
if (value.length > this.panelCount) {
value.splice(this.panelCount, value.length - this.panelCount);
}
this.isValueChangingInternally = true;
this.value = value;
this.isValueChangingInternally = false;
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "minPanelCount", {
/**
* The minimum panel count. A user could not delete a panel if the panelCount equals to minPanelCount
* @see panelCount
* @see maxPanelCount
*/
get: function () {
return this.getPropertyValue("minPanelCount", 0);
},
set: function (val) {
if (val < 0)
val = 0;
if (val == this.minPanelCount)
return;
this.setPropertyValue("minPanelCount", val);
if (val > this.maxPanelCount)
this.maxPanelCount = val;
if (this.panelCount < val)
this.panelCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "maxPanelCount", {
/**
* The maximum panel count. A user could not add a panel if the panelCount equals to maxPanelCount
* @see panelCount
* @see minPanelCount
*/
get: function () {
return this.getPropertyValue("maxPanelCount", __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].panelMaximumPanelCount);
},
set: function (val) {
if (val <= 0)
return;
if (val > __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].panelMaximumPanelCount)
val = __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].panelMaximumPanelCount;
if (val == this.maxPanelCount)
return;
this.setPropertyValue("maxPanelCount", val);
if (val < this.minPanelCount)
this.minPanelCount = val;
if (this.panelCount > val)
this.panelCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "allowAddPanel", {
/**
* Set this property to false to hide the 'Add New' button
* @see allowRemovePanel
*/
get: function () {
return this.getPropertyValue("allowAddPanel");
},
set: function (val) {
this.setPropertyValue("allowAddPanel", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "allowRemovePanel", {
/**
* Set this property to false to hide the 'Remove' button
* @see allowAddPanel
*/
get: function () {
return this.getPropertyValue("allowRemovePanel");
},
set: function (val) {
this.setPropertyValue("allowRemovePanel", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "templateTitleLocation", {
/**
* Set this property different from "default" to set the specific question title location for the template questions.
* @see SurveyModel.questionTitleLocation
* @see PanelModelBase.questionTitleLocation
*/
get: function () {
return this.getPropertyValue("templateTitleLocation");
},
set: function (value) {
this.setPropertyValue("templateTitleLocation", value.toLowerCase());
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "showQuestionNumbers", {
/**
* Use this property to show/hide the numbers in titles in questions inside a dynamic panel.
* By default the value is "off". You may set it to "onPanel" and the first question inside a dynamic panel will start with 1 or "onSurvey" to include nested questions in dymamic panels into global survey question numbering.
*/
get: function () {
return this.getPropertyValue("showQuestionNumbers");
},
set: function (val) {
this.setPropertyValue("showQuestionNumbers", val);
if (!this.isLoadingFromJson && this.survey) {
this.survey.questionVisibilityChanged(this, this.visible);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "showRangeInProgress", {
/**
* Shows the range from 1 to panelCount when renderMode doesn't equal to "list". Set to false to hide this element.
* @see panelCount
* @see renderMode
*/
get: function () {
return this.getPropertyValue("showRangeInProgress", true);
},
set: function (val) {
this.setPropertyValue("showRangeInProgress", val);
this.fireCallback(this.currentIndexChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "renderMode", {
/**
* By default the property equals to "list" and all dynamic panels are rendered one by one on the page. You may change it to: "progressTop", "progressBottom" or "progressTopBottom" to render only one dynamic panel at once. The progress and navigation elements can be rendred on top, bottom or both.
*/
get: function () {
return this.getPropertyValue("renderMode");
},
set: function (val) {
this.setPropertyValue("renderMode", val);
this.fireCallback(this.renderModeChangedCallback);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "isRenderModeList", {
/**
* Returns true when renderMode equals to "list".
* @see renderMode
*/
get: function () {
return this.renderMode == "list";
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.setVisibleIndex = function (value) {
if (!this.isVisible)
return 0;
var startIndex = this.showQuestionNumbers == "onSurvey" ? value : 0;
for (var i = 0; i < this.panels.length; i++) {
var counter = this.setPanelVisibleIndex(this.panels[i], startIndex, this.showQuestionNumbers != "off");
if (this.showQuestionNumbers == "onSurvey") {
startIndex += counter;
}
}
_super.prototype.setVisibleIndex.call(this, this.showQuestionNumbers != "onSurvey" ? value : -1);
return this.showQuestionNumbers != "onSurvey" ? 1 : startIndex - value;
};
QuestionPanelDynamicModel.prototype.setPanelVisibleIndex = function (panel, index, showIndex) {
if (!showIndex) {
panel.setVisibleIndex(-1);
return 0;
}
return panel.setVisibleIndex(index);
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "canAddPanel", {
/**
* Returns true when an end user may add a new panel. The question is not read only and panelCount less than maxPanelCount
* @see isReadOnly
* @see panelCount
* @see maxPanelCount
*/
get: function () {
if (this.survey && this.survey.isDesignMode)
return false;
return (this.allowAddPanel &&
!this.isReadOnly &&
this.panelCount < this.maxPanelCount);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "canRemovePanel", {
/**
* Returns true when an end user may remove a panel. The question is not read only and panelCount is more than minPanelCount
* @see isReadOnly
* @see panelCount
* @see minPanelCount
*/
get: function () {
if (this.survey && this.survey.isDesignMode)
return false;
return (this.allowRemovePanel &&
!this.isReadOnly &&
this.panelCount > this.minPanelCount);
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.rebuildPanels = function () {
var _a;
if (this.isLoadingFromJson)
return;
this.prepareValueForPanelCreating();
var panels = [];
if (this.isDesignMode) {
new QuestionPanelDynamicItem(this, this.template);
panels.push(this.template);
}
else {
for (var i = 0; i < this.panelCount; i++) {
panels.push(this.createNewPanel());
}
}
(_a = this.panels).splice.apply(_a, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["d" /* __spreadArrays */])([0, this.panels.length], panels));
this.setValueAfterPanelsCreating();
this.setPanelsState();
this.reRunCondition();
this.fireCallback(this.panelCountChangedCallback);
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "defaultPanelValue", {
/**
* If it is not empty, then this value is set to every new panel, including panels created initially, unless the defaultValue is not empty
* @see defaultValue
* @see defaultValueFromLastRow
*/
get: function () {
return this.getPropertyValue("defaultPanelValue");
},
set: function (val) {
this.setPropertyValue("defaultPanelValue", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionPanelDynamicModel.prototype, "defaultValueFromLastPanel", {
/**
* Set it to true to copy the value into new added panel from the last panel. If defaultPanelValue is set and this property equals to true,
* then the value for new added panel is merging.
* @see defaultValue
* @see defaultPanelValue
*/
get: function () {
return this.getPropertyValue("defaultValueFromLastPanel", false);
},
set: function (val) {
this.setPropertyValue("defaultValueFromLastPanel", val);
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicModel.prototype.isDefaultValueEmpty = function () {
return (_super.prototype.isDefaultValueEmpty.call(this) && this.isValueEmpty(this.defaultPanelValue));
};
QuestionPanelDynamicModel.prototype.setDefaultValue = function () {
if (this.isValueEmpty(this.defaultPanelValue) ||
!this.isValueEmpty(this.defaultValue)) {
_super.prototype.setDefaultValue.call(this);
return;
}
if (!this.isEmpty() || this.panelCount == 0)
return;
var newValue = [];
for (var i = 0; i < this.panelCount; i++) {
newValue.push(this.defaultPanelValue);
}
this.value = newValue;
};
QuestionPanelDynamicModel.prototype.isEmpty = function () {
var val = this.value;
if (!val || !Array.isArray(val))
return true;
for (var i = 0; i < val.length; i++) {
if (!this.isRowEmpty(val[i]))
return false;
}
return true;
};
QuestionPanelDynamicModel.prototype.getProgressInfo = function () {
return __WEBPACK_IMPORTED_MODULE_2__base__["a" /* SurveyElement */].getProgressInfoByElements(this.panels, this.isRequired);
};
QuestionPanelDynamicModel.prototype.isRowEmpty = function (val) {
for (var prop in val) {
if (val.hasOwnProperty(prop))
return false;
}
return true;
};
/**
* Add a new dynamic panel based on the template Panel. It checks if canAddPanel returns true and then calls addPanel method.
* @see template
* @see panelCount
* @see panels
* @see canAddPanel
*/
QuestionPanelDynamicModel.prototype.addPanelUI = function () {
if (!this.canAddPanel)
return null;
var newPanel = this.addPanel();
if (this.renderMode === "list" && this.panelsState !== "default") {
newPanel.expand();
}
return newPanel;
};
/**
* Add a new dynamic panel based on the template Panel.
* @see template
* @see panelCount
* @see panels
*/
QuestionPanelDynamicModel.prototype.addPanel = function () {
this.panelCount++;
if (!this.isRenderModeList) {
this.currentIndex = this.panelCount - 1;
}
var newValue = this.value;
var hasModified = false;
if (!this.isValueEmpty(this.defaultPanelValue)) {
if (!!newValue &&
Array.isArray(newValue) &&
newValue.length == this.panelCount) {
hasModified = true;
this.copyValue(newValue[newValue.length - 1], this.defaultPanelValue);
}
}
if (this.defaultValueFromLastPanel &&
!!newValue &&
Array.isArray(newValue) &&
newValue.length > 1 &&
newValue.length == this.panelCount) {
hasModified = true;
this.copyValue(newValue[newValue.length - 1], newValue[newValue.length - 2]);
}
if (hasModified) {
this.value = newValue;
}
if (this.survey)
this.survey.dynamicPanelAdded(this);
return this.panels[this.panelCount - 1];
};
QuestionPanelDynamicModel.prototype.copyValue = function (src, dest) {
for (var key in dest) {
src[key] = dest[key];
}
};
/**
* Call removePanel function. Do nothing is canRemovePanel returns false. If confirmDelete set to true, it shows the confirmation dialog first.
* @param value a panel or panel index
* @see removePanel
* @see confirmDelete
* @see confirmDeleteText
* @see canRemovePanel
*
*/
QuestionPanelDynamicModel.prototype.removePanelUI = function (value) {
if (!this.canRemovePanel)
return;
if (!this.confirmDelete || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_12__utils_utils__["a" /* confirmAction */])(this.confirmDeleteText)) {
this.removePanel(value);
}
};
/**
* Goes to the next panel in the PanelDynamic
*
*/
QuestionPanelDynamicModel.prototype.goToNextPanel = function () {
if (this.renderMode !== "list" && this.currentPanel.hasErrors())
return;
this.currentIndex++;
};
/**
* Goes to the previous panel in the PanelDynamic
*
*/
QuestionPanelDynamicModel.prototype.goToPrevPanel = function () {
this.currentIndex--;
};
/**
* Removes a dynamic panel from the panels array.
* @param value a panel or panel index
* @see panels
* @see template
*/
QuestionPanelDynamicModel.prototype.removePanel = function (value) {
var index = this.getPanelIndex(value);
if (index < 0 || index >= this.panelCount)
return;
var panel = this.panels[index];
this.panels.splice(index, 1);
this.updateBindings("panelCount", this.panelCount);
var value = this.value;
if (!value || !Array.isArray(value) || index >= value.length)
return;
this.isValueChangingInternally = true;
value.splice(index, 1);
this.value = value;
this.fireCallback(this.panelCountChangedCallback);
if (this.survey)
this.survey.dynamicPanelRemoved(this, index, panel);
this.isValueChangingInternally = false;
};
QuestionPanelDynamicModel.prototype.getPanelIndex = function (val) {
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isNumber(val))
return val;
var items = this.items;
for (var i = 0; i < this.panels.length; i++) {
if (this.panels[i] === val || items[i] === val)
return i;
}
return -1;
};
QuestionPanelDynamicModel.prototype.locStrsChanged = function () {
_super.prototype.locStrsChanged.call(this);
var panels = this.panels;
for (var i = 0; i < panels.length; i++) {
panels[i].locStrsChanged();
}
};
QuestionPanelDynamicModel.prototype.clearIncorrectValues = function () {
for (var i = 0; i < this.panels.length; i++) {
this.clearIncorrectValuesInPanel(i);
}
};
QuestionPanelDynamicModel.prototype.clearErrors = function () {
_super.prototype.clearErrors.call(this);
for (var i = 0; i < this.panels.length; i++) {
this.panels[i].clearErrors();
}
};
QuestionPanelDynamicModel.prototype.getQuestionFromArray = function (name, index) {
if (index >= this.panelCount)
return null;
return this.panels[index].getQuestionByName(name);
};
QuestionPanelDynamicModel.prototype.clearIncorrectValuesInPanel = function (index) {
var panel = this.panels[index];
panel.clearIncorrectValues();
var val = this.value;
var values = !!val && index < val.length ? val[index] : null;
if (!values)
return;
var isChanged = false;
for (var key in values) {
if (this.getSharedQuestionFromArray(key, index))
continue;
var q = panel.getQuestionByName(key);
if (!!q)
continue;
if (key.indexOf(__WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].commentPrefix) == key.length - __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].commentPrefix.length) {
q = panel.getQuestionByName(key.substr(0, key.indexOf(__WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].commentPrefix)));
if (!!q)
continue;
}
delete values[key];
isChanged = true;
}
if (isChanged) {
val[index] = values;
this.value = val;
}
};
QuestionPanelDynamicModel.prototype.getSharedQuestionFromArray = function (name, panelIndex) {
return !!this.survey && !!this.valueName
? (this.survey.getQuestionByValueNameFromArray(this.valueName, name, panelIndex))
: null;
};
QuestionPanelDynamicModel.prototype.addConditionObjectsByContext = function (objects, context) {
var hasContext = !!context
? this.template.questions.indexOf(context) > -1
: false;
var prefixName = this.getValueName() + "[0].";
var prefixText = this.processedTitle + "[0].";
var panelObjs = new Array();
var questions = this.template.questions;
for (var i = 0; i < questions.length; i++) {
questions[i].addConditionObjectsByContext(panelObjs, context);
}
for (var i = 0; i < panelObjs.length; i++) {
objects.push({
name: prefixName + panelObjs[i].name,
text: prefixText + panelObjs[i].text,
question: panelObjs[i].question,
});
}
if (hasContext) {
for (var i = 0; i < panelObjs.length; i++) {
if (panelObjs[i].question == context)
continue;
objects.push({
name: "panel." + panelObjs[i].name,
text: "panel." + panelObjs[i].text,
question: panelObjs[i].question,
});
}
}
};
QuestionPanelDynamicModel.prototype.getConditionJson = function (operator, path) {
if (operator === void 0) { operator = null; }
if (path === void 0) { path = null; }
if (!path)
return _super.prototype.getConditionJson.call(this, operator, path);
var questionName = path;
var pos = path.indexOf(".");
if (pos > -1) {
questionName = path.substr(0, pos);
path = path.substr(pos + 1);
}
var question = this.template.getQuestionByName(questionName);
if (!question)
return null;
return question.getConditionJson(operator, path);
};
QuestionPanelDynamicModel.prototype.onReadOnlyChanged = function () {
var readOnly = this.isReadOnly;
this.template.readOnly = readOnly;
for (var i = 0; i < this.panels.length; i++) {
this.panels[i].readOnly = readOnly;
}
_super.prototype.onReadOnlyChanged.call(this);
};
QuestionPanelDynamicModel.prototype.onSurveyLoad = function () {
this.template.readOnly = this.isReadOnly;
this.template.onSurveyLoad();
if (this.loadingPanelCount > 0) {
this.panelCount = this.loadingPanelCount;
}
if (this.isDesignMode) {
this.rebuildPanels();
}
this.setPanelsSurveyImpl();
this.setPanelsState();
this.assignOnPropertyChangedToTemplate();
_super.prototype.onSurveyLoad.call(this);
};
QuestionPanelDynamicModel.prototype.onFirstRendering = function () {
this.template.onFirstRendering();
for (var i = 0; i < this.panels.length; i++) {
this.panels[i].onFirstRendering();
}
_super.prototype.onFirstRendering.call(this);
};
QuestionPanelDynamicModel.prototype.runCondition = function (values, properties) {
_super.prototype.runCondition.call(this, values, properties);
this.runPanelsCondition(values, properties);
};
QuestionPanelDynamicModel.prototype.reRunCondition = function () {
if (!this.data)
return;
this.runCondition(this.getDataFilteredValues(), this.getDataFilteredProperties());
};
QuestionPanelDynamicModel.prototype.runPanelsCondition = function (values, properties) {
var cachedValues = {};
if (values && values instanceof Object) {
cachedValues = JSON.parse(JSON.stringify(values));
}
for (var i = 0; i < this.panels.length; i++) {
var panelValues = this.getPanelItemData(this.panels[i].data);
//Should be unique for every panel due async expression support
var newValues = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].createCopy(cachedValues);
newValues[QuestionPanelDynamicItem.ItemVariableName.toLowerCase()] = panelValues;
newValues[QuestionPanelDynamicItem.IndexVariableName.toLowerCase()] = i;
this.panels[i].runCondition(newValues, properties);
}
};
QuestionPanelDynamicModel.prototype.onAnyValueChanged = function (name) {
_super.prototype.onAnyValueChanged.call(this, name);
for (var i = 0; i < this.panels.length; i++) {
this.panels[i].onAnyValueChanged(name);
this.panels[i].onAnyValueChanged(QuestionPanelDynamicItem.ItemVariableName);
}
};
QuestionPanelDynamicModel.prototype.hasKeysDuplicated = function (fireCallback, rec) {
if (rec === void 0) { rec = null; }
var keyValues = [];
var res;
for (var i = 0; i < this.panels.length; i++) {
res =
this.isValueDuplicated(this.panels[i], keyValues, rec, fireCallback) ||
res;
}
return res;
};
QuestionPanelDynamicModel.prototype.updatePanelsContainsErrors = function () {
var question = this.changingValueQuestion;
var parent = question.parent;
while (!!parent) {
parent.updateContainsErrors();
parent = parent.parent;
}
this.updateContainsErrors();
};
QuestionPanelDynamicModel.prototype.hasErrors = function (fireCallback, rec) {
if (fireCallback === void 0) { fireCallback = true; }
if (rec === void 0) { rec = null; }
if (this.isValueChangingInternally)
return false;
var res = false;
if (!!this.changingValueQuestion) {
var res = this.changingValueQuestion.hasErrors(fireCallback, rec);
res = this.hasKeysDuplicated(fireCallback, rec) || res;
this.updatePanelsContainsErrors();
return res;
}
else {
var errosInPanels = this.hasErrorInPanels(fireCallback, rec);
return _super.prototype.hasErrors.call(this, fireCallback) || errosInPanels;
}
};
QuestionPanelDynamicModel.prototype.getContainsErrors = function () {
var res = _super.prototype.getContainsErrors.call(this);
if (res)
return res;
var panels = this.panels;
for (var i = 0; i < panels.length; i++) {
if (panels[i].containsErrors)
return true;
}
return false;
};
QuestionPanelDynamicModel.prototype.getIsAnswered = function () {
if (!_super.prototype.getIsAnswered.call(this))
return false;
var panels = this.panels;
for (var i = 0; i < panels.length; i++) {
var visibleQuestions = [];
panels[i].addQuestionsToList(visibleQuestions, true);
for (var j = 0; j < visibleQuestions.length; j++) {
if (!visibleQuestions[j].isAnswered)
return false;
}
}
return true;
};
QuestionPanelDynamicModel.prototype.clearValueIfInvisible = function () {
for (var i = 0; i < this.panels.length; i++) {
var questions = this.panels[i].questions;
for (var j = 0; j < questions.length; j++) {
questions[j].clearValueIfInvisible();
}
}
_super.prototype.clearValueIfInvisible.call(this);
};
QuestionPanelDynamicModel.prototype.getIsRunningValidators = function () {
if (_super.prototype.getIsRunningValidators.call(this))
return true;
for (var i = 0; i < this.panels.length; i++) {
var questions = this.panels[i].questions;
for (var j = 0; j < questions.length; j++) {
if (questions[j].isRunningValidators)
return true;
}
}
return false;
};
QuestionPanelDynamicModel.prototype.getAllErrors = function () {
var result = _super.prototype.getAllErrors.call(this);
for (var i = 0; i < this.panels.length; i++) {
var questions = this.panels[i].questions;
for (var j = 0; j < questions.length; j++) {
var errors = questions[j].getAllErrors();
if (errors && errors.length > 0) {
result = result.concat(errors);
}
}
}
return result;
};
QuestionPanelDynamicModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var values = this.createValueCopy();
if (!values || !Array.isArray(values))
return values;
for (var i = 0; i < this.panels.length && i < values.length; i++) {
var val = values[i];
if (!val)
continue;
values[i] = this.getPanelDisplayValue(i, val, keysAsText);
}
return values;
};
QuestionPanelDynamicModel.prototype.getPanelDisplayValue = function (panelIndex, val, keysAsText) {
if (!val)
return val;
var panel = this.panels[panelIndex];
for (var key in val) {
var question = panel.getQuestionByValueName(key);
if (!question) {
question = this.getSharedQuestionFromArray(key, panelIndex);
}
if (!!question) {
val[key] = question.getDisplayValue(keysAsText);
}
}
return val;
};
QuestionPanelDynamicModel.prototype.hasErrorInPanels = function (fireCallback, rec) {
var res = false;
var panels = this.panels;
var keyValues = [];
for (var i = 0; i < panels.length; i++) {
this.setOnCompleteAsyncInPanel(panels[i]);
}
for (var i = 0; i < panels.length; i++) {
var pnlError = panels[i].hasErrors(fireCallback, !!rec && rec.focuseOnFirstError, rec);
pnlError = this.isValueDuplicated(panels[i], keyValues, rec) || pnlError;
if (!this.isRenderModeList && pnlError && !res) {
this.currentIndex = i;
}
res = pnlError || res;
}
return res;
};
QuestionPanelDynamicModel.prototype.setOnCompleteAsyncInPanel = function (panel) {
var _this = this;
var questions = panel.questions;
for (var i = 0; i < questions.length; i++) {
questions[i].onCompletedAsyncValidators = function (hasErrors) {
_this.raiseOnCompletedAsyncValidators();
};
}
};
QuestionPanelDynamicModel.prototype.isValueDuplicated = function (panel, keyValues, rec, fireCallback) {
if (!this.keyName)
return false;
var question = panel.getQuestionByValueName(this.keyName);
if (!question || question.isEmpty())
return false;
var value = question.value;
if (!!this.changingValueQuestion &&
question != this.changingValueQuestion) {
question.hasErrors(fireCallback, rec);
}
for (var i = 0; i < keyValues.length; i++) {
if (value == keyValues[i]) {
question.addError(new __WEBPACK_IMPORTED_MODULE_10__error__["f" /* KeyDuplicationError */](this.keyDuplicationError, this));
if (!!rec && !rec.firstErrorQuestion) {
rec.firstErrorQuestion = question;
}
return true;
}
}
keyValues.push(value);
return false;
};
QuestionPanelDynamicModel.prototype.createNewPanel = function () {
var panel = this.createAndSetupNewPanelObject();
var json = this.template.toJSON();
new __WEBPACK_IMPORTED_MODULE_8__jsonobject__["c" /* JsonObject */]().toObject(json, panel);
panel.renderWidth = "100%";
panel.updateCustomWidgets();
new QuestionPanelDynamicItem(this, panel);
panel.onFirstRendering();
return panel;
};
QuestionPanelDynamicModel.prototype.createAndSetupNewPanelObject = function () {
var panel = this.createNewPanelObject();
var self = this;
panel.onGetQuestionTitleLocation = function () {
return self.getTemplateQuestionTitleLocation();
};
return panel;
};
QuestionPanelDynamicModel.prototype.getTemplateQuestionTitleLocation = function () {
return this.templateTitleLocation != "default"
? this.templateTitleLocation
: this.getTitleLocationCore();
};
QuestionPanelDynamicModel.prototype.createNewPanelObject = function () {
return new __WEBPACK_IMPORTED_MODULE_7__panel__["c" /* PanelModel */]();
};
QuestionPanelDynamicModel.prototype.setPanelCountBasedOnValue = function () {
if (this.isValueChangingInternally || this.isDesignMode)
return;
var val = this.value;
var newPanelCount = val && Array.isArray(val) ? val.length : 0;
if (newPanelCount == 0 && this.loadingPanelCount > 0) {
newPanelCount = this.loadingPanelCount;
}
this.panelCount = newPanelCount;
};
QuestionPanelDynamicModel.prototype.setQuestionValue = function (newValue) {
_super.prototype.setQuestionValue.call(this, newValue, false);
this.setPanelCountBasedOnValue();
for (var i = 0; i < this.panels.length; i++) {
this.panelUpdateValueFromSurvey(this.panels[i]);
}
this.updateIsAnswered();
};
QuestionPanelDynamicModel.prototype.onSurveyValueChanged = function (newValue) {
_super.prototype.onSurveyValueChanged.call(this, newValue);
for (var i = 0; i < this.panels.length; i++) {
this.panelSurveyValueChanged(this.panels[i]);
}
if (newValue === undefined) {
this.setValueBasedOnPanelCount();
}
};
QuestionPanelDynamicModel.prototype.panelUpdateValueFromSurvey = function (panel) {
var questions = panel.questions;
var values = this.getPanelItemData(panel.data);
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
q.updateValueFromSurvey(values[q.getValueName()]);
q.updateCommentFromSurvey(values[q.getValueName() + __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].commentPrefix]);
}
};
QuestionPanelDynamicModel.prototype.panelSurveyValueChanged = function (panel) {
var questions = panel.questions;
var values = this.getPanelItemData(panel.data);
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
q.onSurveyValueChanged(values[q.getValueName()]);
}
};
QuestionPanelDynamicModel.prototype.onSetData = function () {
_super.prototype.onSetData.call(this);
if (this.isDesignMode) {
this.setTemplatePanelSurveyImpl();
this.rebuildPanels();
}
};
//IQuestionPanelDynamicData
QuestionPanelDynamicModel.prototype.getItemIndex = function (item) {
return this.items.indexOf(item);
};
QuestionPanelDynamicModel.prototype.getPanelItemData = function (item) {
var items = this.items;
var index = items.indexOf(item);
var qValue = this.value;
if (index < 0 && Array.isArray(qValue) && qValue.length > items.length) {
index = items.length;
}
if (index < 0)
return {};
if (!qValue || !Array.isArray(qValue) || qValue.length <= index)
return {};
return qValue[index];
};
QuestionPanelDynamicModel.prototype.setPanelItemData = function (item, name, val) {
var items = this.items;
var index = items.indexOf(item);
if (index < 0)
index = items.length;
var qValue = __WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].getUnbindValue(this.value);
if (!qValue || !Array.isArray(qValue)) {
qValue = [];
}
if (qValue.length <= index) {
for (var i = qValue.length; i <= index; i++) {
qValue.push({});
}
}
if (!qValue[index])
qValue[index] = {};
if (!this.isValueEmpty(val)) {
qValue[index][name] = val;
}
else {
delete qValue[index][name];
}
if (index >= 0 && index < this.panels.length) {
this.changingValueQuestion = this.panels[index].getQuestionByValueName(name);
}
this.value = qValue;
this.changingValueQuestion = null;
if (this.survey) {
var options = {
question: this,
panel: item.panel,
name: name,
itemIndex: index,
itemValue: qValue[index],
value: val,
};
this.survey.dynamicPanelItemValueChanged(this, options);
}
};
QuestionPanelDynamicModel.prototype.getSurvey = function () {
return this.survey;
};
QuestionPanelDynamicModel.prototype.getRootData = function () {
return this.data;
};
QuestionPanelDynamicModel.prototype.getPlainData = function (options) {
if (options === void 0) { options = {
includeEmpty: true,
}; }
var questionPlainData = _super.prototype.getPlainData.call(this, options);
if (!!questionPlainData) {
questionPlainData.isNode = true;
questionPlainData.data = this.panels.map(function (panel, index) {
var panelDataItem = {
name: panel.name || index,
title: panel.title || "Panel",
value: panel.getValue(),
displayValue: panel.getValue(),
getString: function (val) {
return typeof val === "object" ? JSON.stringify(val) : val;
},
isNode: true,
data: panel.questions
.map(function (question) { return question.getPlainData(options); })
.filter(function (d) { return !!d; }),
};
(options.calculations || []).forEach(function (calculation) {
panelDataItem[calculation.propertyName] = panel[calculation.propertyName];
});
return panelDataItem;
});
}
return questionPlainData;
};
QuestionPanelDynamicModel.prototype.updateElementCss = function () {
_super.prototype.updateElementCss.call(this);
for (var i = 0; i < this.panels.length; i++) {
var el = this.panels[i];
el.updateElementCss();
}
};
Object.defineProperty(QuestionPanelDynamicModel.prototype, "progressText", {
get: function () {
var rangeMax = this.panelCount;
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */]
.getString("panelDynamicProgressText")["format"](this.currentIndex + 1, rangeMax);
},
enumerable: true,
configurable: true
});
return QuestionPanelDynamicModel;
}(__WEBPACK_IMPORTED_MODULE_6__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_8__jsonobject__["a" /* Serializer */].addClass("paneldynamic", [
{
name: "templateElements",
alternativeName: "questions",
visible: false,
isLightSerializable: false,
},
{ name: "templateTitle:text", serializationProperty: "locTemplateTitle" },
{
name: "templateDescription:text",
serializationProperty: "locTemplateDescription",
},
{ name: "allowAddPanel:boolean", default: true },
{ name: "allowRemovePanel:boolean", default: true },
{
name: "panelCount:number",
isBindable: true,
default: 0,
choices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
},
{ name: "minPanelCount:number", default: 0, minValue: 0 },
{
name: "maxPanelCount:number",
default: __WEBPACK_IMPORTED_MODULE_11__settings__["a" /* settings */].panelMaximumPanelCount,
},
"defaultPanelValue:panelvalue",
"defaultValueFromLastPanel:boolean",
{
name: "panelsState",
default: "default",
choices: ["default", "collapsed", "expanded", "firstExpanded"],
},
{ name: "keyName" },
{
name: "keyDuplicationError",
serializationProperty: "locKeyDuplicationError",
},
{ name: "confirmDelete:boolean" },
{
name: "confirmDeleteText",
serializationProperty: "locConfirmDeleteText",
},
{ name: "panelAddText", serializationProperty: "locPanelAddText" },
{ name: "panelRemoveText", serializationProperty: "locPanelRemoveText" },
{ name: "panelPrevText", serializationProperty: "locPanelPrevText" },
{ name: "panelNextText", serializationProperty: "locPanelNextText" },
{
name: "showQuestionNumbers",
default: "off",
choices: ["off", "onPanel", "onSurvey"],
},
{ name: "showRangeInProgress:boolean", default: true },
{
name: "renderMode",
default: "list",
choices: ["list", "progressTop", "progressBottom", "progressTopBottom"],
},
{
name: "templateTitleLocation",
default: "default",
choices: ["default", "top", "bottom", "left"],
},
], function () {
return new QuestionPanelDynamicModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_9__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("paneldynamic", function (name) {
return new QuestionPanelDynamicModel(name);
});
/***/ }),
/* 137 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(20);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__itemvalue__ = __webpack_require__(13);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRadiogroupModel; });
/**
* A Model for a radiogroup question.
*/
var QuestionRadiogroupModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionRadiogroupModel, _super);
function QuestionRadiogroupModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
QuestionRadiogroupModel.prototype.getType = function () {
return "radiogroup";
};
QuestionRadiogroupModel.prototype.getFirstInputElementId = function () {
return this.inputId + "_0";
};
Object.defineProperty(QuestionRadiogroupModel.prototype, "selectedItem", {
get: function () {
if (this.isEmpty())
return null;
return __WEBPACK_IMPORTED_MODULE_5__itemvalue__["a" /* ItemValue */].getItemByValue(this.visibleChoices, this.value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRadiogroupModel.prototype, "showClearButton", {
/**
* Show "clear button" flag.
*/
get: function () {
return this.getPropertyValue("showClearButton", false);
},
set: function (val) {
this.setPropertyValue("showClearButton", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRadiogroupModel.prototype, "canShowClearButton", {
get: function () {
return this.showClearButton && !this.isReadOnly;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRadiogroupModel.prototype, "clearButtonCaption", {
get: function () {
return __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("clearCaption");
},
enumerable: true,
configurable: true
});
QuestionRadiogroupModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
QuestionRadiogroupModel.prototype.getItemClass = function (item) {
var itemClass = this.cssClasses.item;
var isDisabled = this.isReadOnly || !item.isEnabled;
var isChecked = item.value === this.value ||
(this.isOtherSelected && this.otherItem.value === item.value);
var allowHover = !isDisabled && !isChecked;
if (!this.hasColumns) {
itemClass +=
this.colCount === 0
? " " + this.cssClasses.itemInline
: " sv-q-col-" + this.colCount;
}
if (isDisabled && !!this.cssClasses.itemDisabled)
itemClass += " " + this.cssClasses.itemDisabled;
if (isChecked && !!this.cssClasses.itemChecked)
itemClass += " " + this.cssClasses.itemChecked;
if (allowHover && !!this.cssClasses.itemHover)
itemClass += " " + this.cssClasses.itemHover;
return itemClass;
};
return QuestionRadiogroupModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("radiogroup", [{ name: "showClearButton:boolean", default: false }], function () {
return new QuestionRadiogroupModel("");
}, "checkboxbase");
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("radiogroup", function (name) {
var q = new QuestionRadiogroupModel(name);
q.choices = __WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 138 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__itemvalue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRatingModel; });
/**
* A Model for a rating question.
*/
var QuestionRatingModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionRatingModel, _super);
function QuestionRatingModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createItemValues("rates");
var self = _this;
_this.registerFunctionOnPropertyValueChanged("rates", function () {
self.fireCallback(self.rateValuesChangedCallback);
});
_this.onPropertyChanged.add(function (sender, options) {
if (options.name == "rateMin" ||
options.name == "rateMax" ||
options.name == "rateStep") {
self.fireCallback(self.rateValuesChangedCallback);
}
});
var locMinRateDescriptionValue = _this.createLocalizableString("minRateDescription", _this, true);
var locMaxRateDescriptionValue = _this.createLocalizableString("maxRateDescription", _this, true);
locMinRateDescriptionValue.onGetTextCallback = function (text) {
return text ? text + " " : text;
};
locMaxRateDescriptionValue.onGetTextCallback = function (text) {
return text ? " " + text : text;
};
return _this;
}
QuestionRatingModel.prototype.onSurveyLoad = function () {
_super.prototype.onSurveyLoad.call(this);
this.fireCallback(this.rateValuesChangedCallback);
};
Object.defineProperty(QuestionRatingModel.prototype, "rateValues", {
/**
* The list of rate items. Every item has value and text. If text is empty, the value is rendered. The item text supports markdown. If it is empty the array is generated by using rateMin, rateMax and rateStep properties.
* @see rateMin
* @see rateMax
* @see rateStep
*/
get: function () {
return this.getPropertyValue("rates");
},
set: function (val) {
this.setPropertyValue("rates", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "rateMin", {
/**
* This property is used to generate rate values if rateValues array is empty. It is the first value in the rating. The default value is 1.
* @see rateValues
* @see rateMax
* @see rateStep
*/
get: function () {
return this.getPropertyValue("rateMin");
},
set: function (val) {
if (!this.isLoadingFromJson && val > this.rateMax - this.rateStep)
val = this.rateMax - this.rateStep;
this.setPropertyValue("rateMin", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "rateMax", {
/**
* This property is used to generate rate values if rateValues array is empty. It is the last value in the rating. The default value is 5.
* @see rateValues
* @see rateMin
* @see rateStep
*/
get: function () {
return this.getPropertyValue("rateMax");
},
set: function (val) {
if (!this.isLoadingFromJson && val < this.rateMin + this.rateStep)
val = this.rateMin + this.rateStep;
this.setPropertyValue("rateMax", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "rateStep", {
/**
* This property is used to generate rate values if rateValues array is empty. It is the step value. The number of rate values are (rateMax - rateMin) / rateStep. The default value is 1.
* @see rateValues
* @see rateMin
* @see rateMax
*/
get: function () {
return this.getPropertyValue("rateStep");
},
set: function (val) {
if (val <= 0)
val = 1;
if (!this.isLoadingFromJson && val > this.rateMax - this.rateMin)
val = this.rateMax - this.rateMin;
this.setPropertyValue("rateStep", val);
},
enumerable: true,
configurable: true
});
QuestionRatingModel.prototype.getDisplayValueCore = function (keysAsText, value) {
var res = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.visibleRateValues, value);
return !!res ? res : value;
};
Object.defineProperty(QuestionRatingModel.prototype, "visibleRateValues", {
get: function () {
if (this.rateValues.length > 0)
return this.rateValues;
var res = [];
var value = this.rateMin;
var step = this.rateStep;
while (value <= this.rateMax &&
res.length < __WEBPACK_IMPORTED_MODULE_5__settings__["a" /* settings */].ratingMaximumRateValueCount) {
res.push(new __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */](value));
value = this.correctValue(value + step, step);
}
return res;
},
enumerable: true,
configurable: true
});
QuestionRatingModel.prototype.correctValue = function (value, step) {
if (!value)
return value;
if (Math.round(value) == value)
return value;
var fr = 0;
while (Math.round(step) != step) {
step *= 10;
fr++;
}
return parseFloat(value.toFixed(fr));
};
QuestionRatingModel.prototype.getType = function () {
return "rating";
};
QuestionRatingModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
QuestionRatingModel.prototype.supportComment = function () {
return true;
};
QuestionRatingModel.prototype.supportOther = function () {
return true;
};
Object.defineProperty(QuestionRatingModel.prototype, "minRateDescription", {
/**
* The description of minimum (first) item.
*/
get: function () {
return this.getLocalizableStringText("minRateDescription");
},
set: function (val) {
this.setLocalizableStringText("minRateDescription", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "locMinRateDescription", {
get: function () {
return this.getLocalizableString("minRateDescription");
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "maxRateDescription", {
/**
* The description of maximum (last) item.
*/
get: function () {
return this.getLocalizableStringText("maxRateDescription");
},
set: function (val) {
this.setLocalizableStringText("maxRateDescription", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "locMaxRateDescription", {
get: function () {
return this.getLocalizableString("maxRateDescription");
},
enumerable: true,
configurable: true
});
QuestionRatingModel.prototype.valueToData = function (val) {
if (this.rateValues.length > 0) {
var item = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getItemByValue(this.rateValues, val);
return !!item ? item.value : val;
}
return !isNaN(val) ? parseFloat(val) : val;
};
return QuestionRatingModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("rating", [
{ name: "hasComment:switch", layout: "row" },
{
name: "commentText",
dependsOn: "hasComment",
visibleIf: function (obj) {
return obj.hasComment;
},
serializationProperty: "locCommentText",
layout: "row",
},
{
name: "rateValues:itemvalue[]",
},
{ name: "rateMin:number", default: 1 },
{ name: "rateMax:number", default: 5 },
{ name: "rateStep:number", default: 1, minValue: 0.1 },
{
name: "minRateDescription",
alternativeName: "mininumRateDescription",
serializationProperty: "locMinRateDescription",
},
{
name: "maxRateDescription",
alternativeName: "maximumRateDescription",
serializationProperty: "locMaxRateDescription",
},
], function () {
return new QuestionRatingModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("rating", function (name) {
return new QuestionRatingModel(name);
});
/***/ }),
/* 139 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__surveyStrings__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_signature_pad__ = __webpack_require__(82);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__questionfactory__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionSignaturePadModel; });
var defaultWidth = 300;
var defaultHeight = 200;
function resizeCanvas(canvas) {
var context = canvas.getContext("2d");
var devicePixelRatio = window.devicePixelRatio || 1;
var backingStoreRatio = context.webkitBackingStorePixelRatio ||
context.mozBackingStorePixelRatio ||
context.msBackingStorePixelRatio ||
context.oBackingStorePixelRatio ||
context.backingStorePixelRatio ||
1;
var ratio = devicePixelRatio / backingStoreRatio;
var oldWidth = canvas.width;
var oldHeight = canvas.height;
canvas.width = oldWidth * ratio;
canvas.height = oldHeight * ratio;
canvas.style.width = oldWidth + "px";
canvas.style.height = oldHeight + "px";
context.scale(ratio, ratio);
}
/**
* A Model for signature pad question.
*/
var QuestionSignaturePadModel = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(QuestionSignaturePadModel, _super);
function QuestionSignaturePadModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
QuestionSignaturePadModel.prototype.getCssRoot = function (cssClasses) {
var classes = _super.prototype.getCssRoot.call(this, cssClasses);
if ("" + this.width === "300") {
classes += " " + cssClasses.small;
}
return classes;
};
QuestionSignaturePadModel.prototype.updateValue = function () {
if (this.signaturePad) {
var data = this.signaturePad.toDataURL(this.dataFormat);
this.value = data;
}
};
QuestionSignaturePadModel.prototype.getType = function () {
return "signaturepad";
};
QuestionSignaturePadModel.prototype.afterRenderQuestionElement = function (el) {
if (!!el) {
this.initSignaturePad(el);
}
_super.prototype.afterRenderQuestionElement.call(this, el);
};
QuestionSignaturePadModel.prototype.beforeDestroyQuestionElement = function (el) {
if (!!el) {
this.destroySignaturePad(el);
}
};
QuestionSignaturePadModel.prototype.initSignaturePad = function (el) {
var _this = this;
var canvas = el.getElementsByTagName("canvas")[0];
var buttonEl = el.getElementsByTagName("button")[0];
var signaturePad = new __WEBPACK_IMPORTED_MODULE_4_signature_pad__["a" /* default */](canvas, { backgroundColor: "#ffffff" });
if (this.isReadOnly) {
signaturePad.off();
}
buttonEl.onclick = function () {
_this.value = undefined;
};
this.readOnlyChangedCallback = function () {
if (!_this.allowClear || _this.isReadOnly) {
signaturePad.off();
buttonEl.style.display = "none";
}
else {
signaturePad.on();
buttonEl.style.display = "block";
}
};
signaturePad.penColor = this.penColor;
signaturePad.onBegin = function () {
canvas.focus();
};
signaturePad.onEnd = function () {
_this.updateValue();
};
var updateValueHandler = function () {
var data = _this.value;
canvas.width = _this.width || defaultWidth;
canvas.height = _this.height || defaultHeight;
resizeCanvas(canvas);
if (!data) {
signaturePad.clear();
}
else {
signaturePad.fromDataURL(data);
}
};
this.valueChangedCallback = updateValueHandler;
updateValueHandler();
this.readOnlyChangedCallback();
this.signaturePad = signaturePad;
var propertyChangedHandler = function (sender, options) {
if (options.name === "width" || options.name === "height") {
updateValueHandler();
}
};
this.onPropertyChanged.add(propertyChangedHandler);
this.signaturePad.propertyChangedHandler = propertyChangedHandler;
};
QuestionSignaturePadModel.prototype.destroySignaturePad = function (el) {
if (this.signaturePad) {
this.onPropertyChanged.remove(this.signaturePad.propertyChangedHandler);
this.signaturePad.off();
}
this.readOnlyChangedCallback = null;
this.signaturePad = null;
};
Object.defineProperty(QuestionSignaturePadModel.prototype, "dataFormat", {
/**
* Use it to set the specific dataFormat for the signature pad image data.
* formats: "" (default) - png, "image/jpeg" - jpeg, "image/svg+xml" - svg
*/
get: function () {
return this.getPropertyValue("dataFormat", "");
},
set: function (val) {
this.setPropertyValue("dataFormat", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSignaturePadModel.prototype, "width", {
/**
* Use it to set the specific width for the signature pad.
*/
get: function () {
return this.getPropertyValue("width", 300);
},
set: function (val) {
this.setPropertyValue("width", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSignaturePadModel.prototype, "height", {
/**
* Use it to set the specific height for the signature pad.
*/
get: function () {
return this.getPropertyValue("height", 200);
},
set: function (val) {
this.setPropertyValue("height", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSignaturePadModel.prototype, "allowClear", {
/**
* Use it to clear content of the signature pad.
*/
get: function () {
return this.getPropertyValue("allowClear", true);
},
set: function (val) {
this.setPropertyValue("allowClear", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSignaturePadModel.prototype, "penColor", {
/**
* Use it to set pen color for the signature pad.
*/
get: function () {
return this.getPropertyValue("penColor", "#1ab394");
},
set: function (val) {
this.setPropertyValue("penColor", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionSignaturePadModel.prototype, "clearButtonCaption", {
/**
* The clear signature button caption.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_3__surveyStrings__["a" /* surveyLocalization */].getString("clearCaption");
},
enumerable: true,
configurable: true
});
return QuestionSignaturePadModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* Serializer */].addClass("signaturepad", [
{
name: "width:number",
category: "general",
default: 300,
},
{
name: "height:number",
category: "general",
default: 200,
},
{
name: "allowClear:boolean",
category: "general",
default: true,
},
{
name: "penColor:color",
category: "general",
default: "#1ab394",
},
{
name: "dataFormat",
category: "general",
default: "",
choices: [
{ value: "", text: "PNG" },
{ value: "image/jpeg", text: "JPEG" },
{ value: "image/svg+xml", text: "SVG" },
],
},
{ name: "defaultValue", visible: false },
{ name: "correctAnswer", visible: false },
], function () {
return new QuestionSignaturePadModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("signaturepad", function (name) {
return new QuestionSignaturePadModel(name);
});
/***/ }),
/* 140 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__reactquestionelement__ = __webpack_require__(5);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyCustomWidget; });
var SurveyCustomWidget = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyCustomWidget, _super);
function SurveyCustomWidget(props) {
var _this = _super.call(this, props) || this;
_this.widgetRef = __WEBPACK_IMPORTED_MODULE_1_react__["createRef"]();
return _this;
}
SurveyCustomWidget.prototype._afterRender = function () {
if (this.questionBase.customWidget) {
var el = this.widgetRef.current;
if (!!el) {
this.questionBase.customWidget.afterRender(this.questionBase, el);
this.questionBase.customWidgetData.isNeedRender = false;
}
}
};
SurveyCustomWidget.prototype.componentDidMount = function () {
_super.prototype.componentDidMount.call(this);
if (this.questionBase) {
this._afterRender();
}
};
SurveyCustomWidget.prototype.componentDidUpdate = function (prevProps, prevState) {
_super.prototype.componentDidUpdate.call(this, prevProps, prevState);
var isDefaultRender = !!this.questionBase.customWidget &&
this.questionBase.customWidget.isDefaultRender;
if (this.questionBase && !isDefaultRender) {
this._afterRender();
}
};
SurveyCustomWidget.prototype.componentWillUnmount = function () {
_super.prototype.componentWillUnmount.call(this);
if (this.questionBase.customWidget) {
var el = this.widgetRef.current;
if (!!el) {
this.questionBase.customWidget.willUnmount(this.questionBase, el);
}
}
};
SurveyCustomWidget.prototype.canRender = function () {
return _super.prototype.canRender.call(this) && this.questionBase.visible;
};
SurveyCustomWidget.prototype.renderElement = function () {
var customWidget = this.questionBase.customWidget;
if (customWidget.isDefaultRender) {
return (__WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: this.widgetRef }, this.creator.createQuestionElement(this.questionBase)));
}
var widget = null;
if (customWidget.widgetJson.render) {
widget = customWidget.widgetJson.render(this.questionBase);
}
else {
if (customWidget.htmlTemplate) {
var htmlValue = { __html: customWidget.htmlTemplate };
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: this.widgetRef, dangerouslySetInnerHTML: htmlValue });
}
}
return __WEBPACK_IMPORTED_MODULE_1_react__["createElement"]("div", { ref: this.widgetRef }, widget);
};
return SurveyCustomWidget;
}(__WEBPACK_IMPORTED_MODULE_2__reactquestionelement__["b" /* SurveyQuestionElementBase */]));
/***/ }),
/* 141 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__expressions_expressions__ = __webpack_require__(28);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__settings__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return Trigger; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTrigger; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return SurveyTriggerVisible; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SurveyTriggerComplete; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return SurveyTriggerSetValue; });
/* unused harmony export SurveyTriggerSkip */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return SurveyTriggerRunExpression; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return SurveyTriggerCopyValue; });
/**
* A base class for all triggers.
* A trigger calls a method when the expression change the result: from false to true or from true to false.
* Please note, it runs only one changing the expression result.
*/
var Trigger = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(Trigger, _super);
function Trigger() {
var _this = _super.call(this) || this;
_this.usedNames = [];
var self = _this;
_this.registerFunctionOnPropertiesValueChanged(["operator", "value", "name"], function () {
self.oldPropertiesChanged();
});
_this.registerFunctionOnPropertyValueChanged("expression", function () {
self.onExpressionChanged();
});
return _this;
}
Object.defineProperty(Trigger, "operators", {
get: function () {
if (Trigger.operatorsValue != null)
return Trigger.operatorsValue;
Trigger.operatorsValue = {
empty: function (value, expectedValue) {
return !value;
},
notempty: function (value, expectedValue) {
return !!value;
},
equal: function (value, expectedValue) {
return value == expectedValue;
},
notequal: function (value, expectedValue) {
return value != expectedValue;
},
contains: function (value, expectedValue) {
return value && value["indexOf"] && value.indexOf(expectedValue) > -1;
},
notcontains: function (value, expectedValue) {
return (!value || !value["indexOf"] || value.indexOf(expectedValue) == -1);
},
greater: function (value, expectedValue) {
return value > expectedValue;
},
less: function (value, expectedValue) {
return value < expectedValue;
},
greaterorequal: function (value, expectedValue) {
return value >= expectedValue;
},
lessorequal: function (value, expectedValue) {
return value <= expectedValue;
},
};
return Trigger.operatorsValue;
},
enumerable: true,
configurable: true
});
Trigger.prototype.getType = function () {
return "triggerbase";
};
Trigger.prototype.toString = function () {
var res = this.getType().replace("trigger", "");
var exp = !!this.expression ? this.expression : this.buildExpression();
if (exp) {
res += ", " + exp;
}
return res;
};
Object.defineProperty(Trigger.prototype, "operator", {
get: function () {
return this.getPropertyValue("operator", "equal");
},
set: function (value) {
if (!value)
return;
value = value.toLowerCase();
if (!Trigger.operators[value])
return;
this.setPropertyValue("operator", value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Trigger.prototype, "value", {
get: function () {
return this.getPropertyValue("value", null);
},
set: function (val) {
this.setPropertyValue("value", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Trigger.prototype, "name", {
get: function () {
return this.getPropertyValue("name", "");
},
set: function (val) {
this.setPropertyValue("name", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(Trigger.prototype, "expression", {
get: function () {
return this.getPropertyValue("expression", "");
},
set: function (val) {
this.setPropertyValue("expression", val);
},
enumerable: true,
configurable: true
});
Trigger.prototype.checkExpression = function (keys, values, properties) {
if (properties === void 0) { properties = null; }
if (!this.isCheckRequired(keys))
return;
if (!!this.conditionRunner) {
this.perform(values, properties);
}
};
Trigger.prototype.check = function (value) {
var triggerResult = Trigger.operators[this.operator](value, this.value);
if (triggerResult) {
this.onSuccess({}, null);
}
else {
this.onFailure();
}
};
Trigger.prototype.perform = function (values, properties) {
var _this = this;
this.conditionRunner.onRunComplete = function (res) {
_this.triggerResult(res, values, properties);
};
this.conditionRunner.run(values, properties);
};
Trigger.prototype.triggerResult = function (res, values, properties) {
if (res) {
this.onSuccess(values, properties);
}
else {
this.onFailure();
}
};
Trigger.prototype.onSuccess = function (values, properties) { };
Trigger.prototype.onFailure = function () { };
Trigger.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
this.oldPropertiesChanged();
};
Trigger.prototype.oldPropertiesChanged = function () {
this.onExpressionChanged();
};
Trigger.prototype.onExpressionChanged = function () {
this.usedNames = [];
this.hasFunction = false;
this.conditionRunner = null;
};
Trigger.prototype.buildExpression = function () {
if (!this.name)
return "";
if (__WEBPACK_IMPORTED_MODULE_1__helpers__["a" /* Helpers */].isValueEmpty(this.value) && this.isRequireValue)
return "";
return ("{" +
this.name +
"} " +
this.operator +
" " +
__WEBPACK_IMPORTED_MODULE_5__expressions_expressions__["h" /* OperandMaker */].toOperandString(this.value));
};
Trigger.prototype.isCheckRequired = function (keys) {
if (!keys)
return false;
this.buildUsedNames();
if (this.hasFunction === true)
return true;
for (var i = 0; i < this.usedNames.length; i++) {
if (keys.hasOwnProperty(this.usedNames[i]))
return true;
}
return false;
};
Trigger.prototype.buildUsedNames = function () {
if (!!this.conditionRunner)
return;
var expression = this.expression;
if (!expression) {
expression = this.buildExpression();
}
if (!expression)
return;
this.conditionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["b" /* ConditionRunner */](expression);
this.hasFunction = this.conditionRunner.hasFunction();
this.usedNames = this.conditionRunner.getVariables();
var processValue = new __WEBPACK_IMPORTED_MODULE_6__conditionProcessValue__["a" /* ProcessValue */]();
for (var i = 0; i < this.usedNames.length; i++) {
this.usedNames[i] = processValue.getFirstName(this.usedNames[i]);
}
};
Object.defineProperty(Trigger.prototype, "isRequireValue", {
get: function () {
return this.operator !== "empty" && this.operator != "notempty";
},
enumerable: true,
configurable: true
});
Trigger.operatorsValue = null;
return Trigger;
}(__WEBPACK_IMPORTED_MODULE_2__base__["b" /* Base */]));
/**
* It extends the Trigger base class and add properties required for SurveyJS classes.
*/
var SurveyTrigger = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTrigger, _super);
function SurveyTrigger() {
var _this = _super.call(this) || this;
_this.ownerValue = null;
return _this;
}
Object.defineProperty(SurveyTrigger.prototype, "owner", {
get: function () {
return this.ownerValue;
},
enumerable: true,
configurable: true
});
SurveyTrigger.prototype.setOwner = function (owner) {
this.ownerValue = owner;
};
Object.defineProperty(SurveyTrigger.prototype, "isOnNextPage", {
get: function () {
return false;
},
enumerable: true,
configurable: true
});
return SurveyTrigger;
}(Trigger));
/**
* If expression returns true, it makes questions/pages visible.
* Ohterwise it makes them invisible.
*/
var SurveyTriggerVisible = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerVisible, _super);
function SurveyTriggerVisible() {
var _this = _super.call(this) || this;
_this.pages = [];
_this.questions = [];
return _this;
}
SurveyTriggerVisible.prototype.getType = function () {
return "visibletrigger";
};
SurveyTriggerVisible.prototype.onSuccess = function (values, properties) {
this.onTrigger(this.onItemSuccess);
};
SurveyTriggerVisible.prototype.onFailure = function () {
this.onTrigger(this.onItemFailure);
};
SurveyTriggerVisible.prototype.onTrigger = function (func) {
if (!this.owner)
return;
var objects = this.owner.getObjects(this.pages, this.questions);
for (var i = 0; i < objects.length; i++) {
func(objects[i]);
}
};
SurveyTriggerVisible.prototype.onItemSuccess = function (item) {
item.visible = true;
};
SurveyTriggerVisible.prototype.onItemFailure = function (item) {
item.visible = false;
};
return SurveyTriggerVisible;
}(SurveyTrigger));
/**
* If expression returns true, it completes the survey.
*/
var SurveyTriggerComplete = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerComplete, _super);
function SurveyTriggerComplete() {
return _super.call(this) || this;
}
SurveyTriggerComplete.prototype.getType = function () {
return "completetrigger";
};
Object.defineProperty(SurveyTriggerComplete.prototype, "isOnNextPage", {
get: function () {
return !__WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].executeCompleteTriggerOnValueChanged;
},
enumerable: true,
configurable: true
});
SurveyTriggerComplete.prototype.onSuccess = function (values, properties) {
if (this.owner)
this.owner.setCompleted();
};
return SurveyTriggerComplete;
}(SurveyTrigger));
/**
* If expression returns true, the value from property **setValue** will be set to **setToName**
*/
var SurveyTriggerSetValue = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerSetValue, _super);
function SurveyTriggerSetValue() {
return _super.call(this) || this;
}
SurveyTriggerSetValue.prototype.getType = function () {
return "setvaluetrigger";
};
Object.defineProperty(SurveyTriggerSetValue.prototype, "setToName", {
get: function () {
return this.getPropertyValue("setToName", "");
},
set: function (val) {
this.setPropertyValue("setToName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyTriggerSetValue.prototype, "setValue", {
get: function () {
return this.getPropertyValue("setValue");
},
set: function (val) {
this.setPropertyValue("setValue", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyTriggerSetValue.prototype, "isVariable", {
get: function () {
return this.getPropertyValue("isVariable", false);
},
set: function (val) {
this.setPropertyValue("isVariable", val);
},
enumerable: true,
configurable: true
});
SurveyTriggerSetValue.prototype.onSuccess = function (values, properties) {
if (!this.setToName || !this.owner)
return;
this.owner.setTriggerValue(this.setToName, this.setValue, this.isVariable);
};
return SurveyTriggerSetValue;
}(SurveyTrigger));
/**
* If expression returns true, the survey go to question **gotoName** and focus it.
*/
var SurveyTriggerSkip = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerSkip, _super);
function SurveyTriggerSkip() {
return _super.call(this) || this;
}
SurveyTriggerSkip.prototype.getType = function () {
return "skiptrigger";
};
Object.defineProperty(SurveyTriggerSkip.prototype, "gotoName", {
get: function () {
return this.getPropertyValue("gotoName", "");
},
set: function (val) {
this.setPropertyValue("gotoName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyTriggerSkip.prototype, "isOnNextPage", {
get: function () {
return !__WEBPACK_IMPORTED_MODULE_7__settings__["a" /* settings */].executeSkipTriggerOnValueChanged;
},
enumerable: true,
configurable: true
});
SurveyTriggerSkip.prototype.onSuccess = function (values, properties) {
if (!this.gotoName || !this.owner)
return;
this.owner.focusQuestion(this.gotoName);
};
return SurveyTriggerSkip;
}(SurveyTrigger));
/**
* If expression returns true, the **runExpression** will be run. If **setToName** property is not empty then the result of **runExpression** will be set to it.
*/
var SurveyTriggerRunExpression = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerRunExpression, _super);
function SurveyTriggerRunExpression() {
return _super.call(this) || this;
}
SurveyTriggerRunExpression.prototype.getType = function () {
return "runexpressiontrigger";
};
Object.defineProperty(SurveyTriggerRunExpression.prototype, "setToName", {
get: function () {
return this.getPropertyValue("setToName", "");
},
set: function (val) {
this.setPropertyValue("setToName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyTriggerRunExpression.prototype, "runExpression", {
get: function () {
return this.getPropertyValue("runExpression", "");
},
set: function (val) {
this.setPropertyValue("runExpression", val);
},
enumerable: true,
configurable: true
});
SurveyTriggerRunExpression.prototype.onSuccess = function (values, properties) {
var _this = this;
if (!this.owner || !this.runExpression)
return;
var expression = new __WEBPACK_IMPORTED_MODULE_4__conditions__["a" /* ExpressionRunner */](this.runExpression);
if (expression.canRun) {
expression.onRunComplete = function (res) {
_this.onCompleteRunExpression(res);
};
expression.run(values, properties);
}
};
SurveyTriggerRunExpression.prototype.onCompleteRunExpression = function (newValue) {
if (!this.setToName || newValue !== undefined) {
this.owner.setTriggerValue(this.setToName, newValue, false);
}
};
return SurveyTriggerRunExpression;
}(SurveyTrigger));
/**
* If expression returns true, the value from question **fromName** will be set into **setToName**.
*/
var SurveyTriggerCopyValue = /** @class */ (function (_super) {
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */])(SurveyTriggerCopyValue, _super);
function SurveyTriggerCopyValue() {
return _super.call(this) || this;
}
Object.defineProperty(SurveyTriggerCopyValue.prototype, "setToName", {
get: function () {
return this.getPropertyValue("setToName", "");
},
set: function (val) {
this.setPropertyValue("setToName", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyTriggerCopyValue.prototype, "fromName", {
get: function () {
return this.getPropertyValue("fromName", "");
},
set: function (val) {
this.setPropertyValue("fromName", val);
},
enumerable: true,
configurable: true
});
SurveyTriggerCopyValue.prototype.getType = function () {
return "copyvaluetrigger";
};
SurveyTriggerCopyValue.prototype.onSuccess = function (values, properties) {
if (!this.setToName || !this.owner)
return;
this.owner.copyTriggerValue(this.setToName, this.fromName);
};
return SurveyTriggerCopyValue;
}(SurveyTrigger));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("trigger", [
{ name: "operator", default: "equal", visible: false },
{ name: "value", visible: false },
"expression:condition",
]);
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("surveytrigger", [{ name: "name", visible: false }], null, "trigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("visibletrigger", ["pages:pages", "questions:questions"], function () {
return new SurveyTriggerVisible();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("completetrigger", [], function () {
return new SurveyTriggerComplete();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("setvaluetrigger", [
{ name: "!setToName:questionvalue" },
{
name: "setValue:triggervalue",
dependsOn: "setToName",
visibleIf: function (obj) {
return !!obj && !!obj["setToName"];
},
},
{ name: "isVariable:boolean", visible: false },
], function () {
return new SurveyTriggerSetValue();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("copyvaluetrigger", [{ name: "!setToName:questionvalue" }, { name: "!fromName:questionvalue" }], function () {
return new SurveyTriggerCopyValue();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("skiptrigger", [{ name: "!gotoName:question" }], function () {
return new SurveyTriggerSkip();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* Serializer */].addClass("runexpressiontrigger", [{ name: "setToName:questionvalue" }, "runExpression:expression"], function () {
return new SurveyTriggerRunExpression();
}, "surveytrigger");
/***/ }),
/* 142 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__chunks_model__ = __webpack_require__(60);
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Version", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["a"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "settings", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["b"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Helpers", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["c"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "AnswerCountValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["d"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "EmailValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["e"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "NumericValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["f"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RegexValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["g"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["h"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["i"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorResult", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["j"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ExpressionValidator", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["k"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorRunner", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["l"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ItemValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["m"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Base", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["n"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Event", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["o"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["p"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyElement", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["q"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CalculatedValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["r"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["s"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "AnswerRequiredError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["t"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "OneAnswerRequiredError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["u"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RequreNumericError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["v"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ExceedSizeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["w"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "LocalizableString", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["x"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "HtmlConditionItem", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["y"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "UrlConditionItem", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["z"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ChoicesRestfull", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["A"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "FunctionFactory", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["B"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "registerFunction", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["C"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionRunner", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["D"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ExpressionRunner", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["E"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Operand", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["F"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Const", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["G"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "BinaryOperand", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["H"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Variable", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["I"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "FunctionOperand", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["J"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ArrayOperand", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["K"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionsParser", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["L"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ProcessValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["M"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["N"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonIncorrectTypeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["O"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadata", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["P"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadataClass", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Q"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["R"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeErrorBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["S"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObject", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["T"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObjectProperty", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["U"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonRequiredPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["V"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonUnknownPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["W"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Serializer", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["X"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownCell", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Y"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownColumn", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Z"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "matrixDropdownColumnTypes", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_0"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_1"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_2"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_3"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_4"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDynamicRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_5"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_6"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_7"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MartrixCells", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_8"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_9"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MultipleTextItemModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_10"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleTextModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_11"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_12"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModelBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_13"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_14"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "FlowPanelModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_15"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PageModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_16"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Question", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_17"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionNonValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_18"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionEmptyModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_19"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_20"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionSelectBase", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_21"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_22"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCommentModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_23"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_24"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFactory", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_25"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ElementFactory", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_26"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFileModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_27"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionHtmlModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_28"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRadiogroupModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_29"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRatingModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_30"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionExpressionModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_31"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionTextModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_32"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionBooleanModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_33"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionImagePickerModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_34"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionImageModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_35"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionSignaturePadModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_36"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_37"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicItem", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_38"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTimer", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_39"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_40"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTrigger", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_41"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerComplete", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_42"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerSetValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_43"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerVisible", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_44"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerCopyValue", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_45"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerRunExpression", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_46"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Trigger", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_47"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyWindowModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_48"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextPreProcessor", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_49"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "dxSurveyService", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_50"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "englishStrings", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_51"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyLocalization", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_52"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyStrings", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_53"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCustomWidget", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_54"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomWidgetCollection", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_55"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCustomModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_56"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCompositeModel", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_57"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ComponentQuestionJSON", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_58"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ComponentCollection", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_59"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "StylesManager", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_60"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__chunks_localization__ = __webpack_require__(59);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__ = __webpack_require__(0);
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["a"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["b"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["c"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__spreadArrays", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["d"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__defaultCss_cssstandard__ = __webpack_require__(14);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "defaultStandardCss", function() { return __WEBPACK_IMPORTED_MODULE_3__defaultCss_cssstandard__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssbootstrap__ = __webpack_require__(56);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "defaultBootstrapCss", function() { return __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssbootstrap__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssbootstrapmaterial__ = __webpack_require__(57);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "defaultBootstrapMaterialCss", function() { return __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssbootstrapmaterial__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssmodern__ = __webpack_require__(58);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "modernCss", function() { return __WEBPACK_IMPORTED_MODULE_6__defaultCss_cssmodern__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__react_reactSurvey__ = __webpack_require__(36);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Survey", function() { return __WEBPACK_IMPORTED_MODULE_7__react_reactSurvey__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__react_reactsurveymodel__ = __webpack_require__(27);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Model", function() { return __WEBPACK_IMPORTED_MODULE_8__react_reactsurveymodel__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "WindowModel", function() { return __WEBPACK_IMPORTED_MODULE_8__react_reactsurveymodel__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__react_reactSurveyNavigationBase__ = __webpack_require__(25);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyNavigationBase", function() { return __WEBPACK_IMPORTED_MODULE_9__react_reactSurveyNavigationBase__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__react_reacttimerpanel__ = __webpack_require__(41);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyTimerPanel", function() { return __WEBPACK_IMPORTED_MODULE_10__react_reacttimerpanel__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__react_reactSurveyNavigation__ = __webpack_require__(37);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyNavigation", function() { return __WEBPACK_IMPORTED_MODULE_11__react_reactSurveyNavigation__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__react_page__ = __webpack_require__(35);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyPage", function() { return __WEBPACK_IMPORTED_MODULE_12__react_page__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__react_row__ = __webpack_require__(42);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyRow", function() { return __WEBPACK_IMPORTED_MODULE_13__react_row__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__react_panel__ = __webpack_require__(21);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyPanel", function() { return __WEBPACK_IMPORTED_MODULE_14__react_panel__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__react_flow_panel__ = __webpack_require__(61);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyFlowPanel", function() { return __WEBPACK_IMPORTED_MODULE_15__react_flow_panel__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__react_reactquestion__ = __webpack_require__(17);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestion", function() { return __WEBPACK_IMPORTED_MODULE_16__react_reactquestion__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyElementErrors", function() { return __WEBPACK_IMPORTED_MODULE_16__react_reactquestion__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionAndErrorsCell", function() { return __WEBPACK_IMPORTED_MODULE_16__react_reactquestion__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__react_reactquestionelement__ = __webpack_require__(5);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyElementBase", function() { return __WEBPACK_IMPORTED_MODULE_17__react_reactquestionelement__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionElementBase", function() { return __WEBPACK_IMPORTED_MODULE_17__react_reactquestionelement__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__react_reactquestioncomment__ = __webpack_require__(18);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionCommentItem", function() { return __WEBPACK_IMPORTED_MODULE_18__react_reactquestioncomment__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionComment", function() { return __WEBPACK_IMPORTED_MODULE_18__react_reactquestioncomment__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__react_reactquestioncheckbox__ = __webpack_require__(39);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionCheckbox", function() { return __WEBPACK_IMPORTED_MODULE_19__react_reactquestioncheckbox__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionCheckboxItem", function() { return __WEBPACK_IMPORTED_MODULE_19__react_reactquestioncheckbox__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__react_reactquestiondropdown__ = __webpack_require__(67);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionDropdown", function() { return __WEBPACK_IMPORTED_MODULE_20__react_reactquestiondropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__react_reactquestionmatrix__ = __webpack_require__(72);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrix", function() { return __WEBPACK_IMPORTED_MODULE_21__react_reactquestionmatrix__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixRow", function() { return __WEBPACK_IMPORTED_MODULE_21__react_reactquestionmatrix__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__react_reactquestionhtml__ = __webpack_require__(71);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionHtml", function() { return __WEBPACK_IMPORTED_MODULE_22__react_reactquestionhtml__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__react_reactquestionfile__ = __webpack_require__(70);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionFile", function() { return __WEBPACK_IMPORTED_MODULE_23__react_reactquestionfile__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__react_reactquestionmultipletext__ = __webpack_require__(75);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMultipleText", function() { return __WEBPACK_IMPORTED_MODULE_24__react_reactquestionmultipletext__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__react_reactquestionradiogroup__ = __webpack_require__(40);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionRadiogroup", function() { return __WEBPACK_IMPORTED_MODULE_25__react_reactquestionradiogroup__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__react_reactquestiontext__ = __webpack_require__(78);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionText", function() { return __WEBPACK_IMPORTED_MODULE_26__react_reactquestiontext__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__react_reactquestionboolean__ = __webpack_require__(65);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionBoolean", function() { return __WEBPACK_IMPORTED_MODULE_27__react_reactquestionboolean__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__react_reactquestionempty__ = __webpack_require__(68);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionEmpty", function() { return __WEBPACK_IMPORTED_MODULE_28__react_reactquestionempty__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__react_reactquestionmatrixdropdownbase__ = __webpack_require__(26);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixDropdownCell", function() { return __WEBPACK_IMPORTED_MODULE_29__react_reactquestionmatrixdropdownbase__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__react_reactquestionmatrixdropdown__ = __webpack_require__(73);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixDropdown", function() { return __WEBPACK_IMPORTED_MODULE_30__react_reactquestionmatrixdropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__react_reactquestionmatrixdynamic__ = __webpack_require__(74);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionMatrixDynamic", function() { return __WEBPACK_IMPORTED_MODULE_31__react_reactquestionmatrixdynamic__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__react_reactquestionpaneldynamic__ = __webpack_require__(76);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionPanelDynamic", function() { return __WEBPACK_IMPORTED_MODULE_32__react_reactquestionpaneldynamic__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__react_reactSurveyProgress__ = __webpack_require__(38);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyProgress", function() { return __WEBPACK_IMPORTED_MODULE_33__react_reactSurveyProgress__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__react_reactquestionrating__ = __webpack_require__(77);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionRating", function() { return __WEBPACK_IMPORTED_MODULE_34__react_reactquestionrating__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__react_reactquestionexpression__ = __webpack_require__(69);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionExpression", function() { return __WEBPACK_IMPORTED_MODULE_35__react_reactquestionexpression__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__react_reactSurveyWindow__ = __webpack_require__(64);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyWindow", function() { return __WEBPACK_IMPORTED_MODULE_36__react_reactSurveyWindow__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__react_reactquestionfactory__ = __webpack_require__(6);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ReactQuestionFactory", function() { return __WEBPACK_IMPORTED_MODULE_37__react_reactquestionfactory__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__react_element_factory__ = __webpack_require__(19);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ReactElementFactory", function() { return __WEBPACK_IMPORTED_MODULE_38__react_element_factory__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__react_imagepicker__ = __webpack_require__(63);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionImagePicker", function() { return __WEBPACK_IMPORTED_MODULE_39__react_imagepicker__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__react_image__ = __webpack_require__(62);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionImage", function() { return __WEBPACK_IMPORTED_MODULE_40__react_image__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__react_signaturepad__ = __webpack_require__(79);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionSignaturePad", function() { return __WEBPACK_IMPORTED_MODULE_41__react_signaturepad__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__react_reactquestioncustom__ = __webpack_require__(66);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionCustom", function() { return __WEBPACK_IMPORTED_MODULE_42__react_reactquestioncustom__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyQuestionComposite", function() { return __WEBPACK_IMPORTED_MODULE_42__react_reactquestioncustom__["b"]; });
// model
// localization
// helpers
// css standard
// css bootstrap
// css bootstrap + material
// react
//Property Grid
//export { PropertyGrid } from "../react/reactpropertygrid";
//Uncomment to include the "date" question type.
//export {default as SurveyQuestionDate} from "../plugins/react/reactquestiondate";
/***/ })
/******/ ]);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAzNjg0NmFiYjNiMjczZmM3MTJhNiIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9jaHVua3MvaGVscGVycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5U3RyaW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvanNvbm9iamVjdC50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwiUmVhY3RcIixcImNvbW1vbmpzMlwiOlwicmVhY3RcIixcImNvbW1vbmpzXCI6XCJyZWFjdFwiLFwiYW1kXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9zcmMvaGVscGVycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmVsZW1lbnQudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uZmFjdG9yeS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2Jhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uZmFjdG9yeS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9jb25kaXRpb25zLnRzIiwid2VicGFjazovLy8uL3NyYy9lcnJvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvaXRlbXZhbHVlLnRzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkLnRzIiwid2VicGFjazovLy8uL3NyYy9jb25kaXRpb25Qcm9jZXNzVmFsdWUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphYmxlc3RyaW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmNvbW1lbnQudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9lbGVtZW50LWZhY3RvcnkudHN4Iiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9iYXNlc2VsZWN0LnRzIiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9wYW5lbC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhbmVsLnRzIiwid2VicGFjazovLy8uL3NyYy90ZXh0UHJlUHJvY2Vzc29yLnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy91dGlscy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlOYXZpZ2F0aW9uQmFzZS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkcm9wZG93bmJhc2UudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHN1cnZleW1vZGVsLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvZXhwcmVzc2lvbnMvZXhwcmVzc2lvbnMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Z1bmN0aW9uc2ZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25ub252YWx1ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3R5bGVzbWFuYWdlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy92YWxpZGF0b3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3BhZ2UudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdFN1cnZleS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0U3VydmV5TmF2aWdhdGlvbi50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0U3VydmV5UHJvZ3Jlc3MudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uY2hlY2tib3gudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ucmFkaW9ncm91cC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0dGltZXJwYW5lbC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3Jvdy50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL2Nob2ljZXNSZXN0ZnVsbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvY29uZGl0aW9uc1BhcnNlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZHhTdXJ2ZXlTZXJ2aWNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZW5nbGlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbWFydGl4QmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25DdXN0b21XaWRnZXRzLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fZXhwcmVzc2lvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fdGV4dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcGFuZWwtYmFzZS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleVdpbmRvdy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5dGltZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwLnRzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcG1hdGVyaWFsLnRzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc21vZGVybi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9jaHVua3MvbG9jYWxpemF0aW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9lbnRyaWVzL2NodW5rcy9tb2RlbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvZmxvdy1wYW5lbC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L2ltYWdlLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvaW1hZ2VwaWNrZXIudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdFN1cnZleVdpbmRvdy50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25ib29sZWFuLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmN1c3RvbS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25kcm9wZG93bi50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25lbXB0eS50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25leHByZXNzaW9uLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmZpbGUudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uaHRtbC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXgudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4ZHJvcGRvd24udHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4ZHluYW1pYy50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tdWx0aXBsZXRleHQudHN4Iiwid2VicGFjazovLy8uL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ucGFuZWxkeW5hbWljLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbnJhdGluZy50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb250ZXh0LnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3Qvc2lnbmF0dXJlcGFkLnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvbWFpbi5zY3NzIiwid2VicGFjazovLy8uL3NyYy9tb2Rlcm4uc2NzcyIsIndlYnBhY2s6Ly8vLi9+L3NpZ25hdHVyZV9wYWQvZGlzdC9zaWduYXR1cmVfcGFkLm1qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY2FsY3VsYXRlZFZhbHVlLnRzIiwid2VicGFjazovLy8uL3NyYy9leHByZXNzaW9uSXRlbXMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V4cHJlc3Npb25zL2V4cHJlc3Npb25QYXJzZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Zsb3dwYW5lbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2J1bGdhcmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2NhdGFsYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9jemVjaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2RhbmlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2R1dGNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZXN0b25pYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9maW5uaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZnJlbmNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZ2VvcmdpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9nZXJtYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9ncmVlay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2hlYnJldy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2h1bmdhcmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2ljZWxhbmRpYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2luZG9uZXNpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9pdGFsaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vamFwYW5lc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9rb3JlYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9sYXR2aWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vbGl0aHVhbmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL25vcndlZ2lhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3BlcnNpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9wb2xpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9wb3J0dWd1ZXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vcm9tYW5pYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9ydXNzaWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vc2ltcGxpZmllZC1jaGluZXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vc3BhbmlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3N3YWhpbGkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9zd2VkaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vdGFqaWsudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi90aGFpLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vdHJhZGl0aW9uYWwtY2hpbmVzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3R1cmtpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi91a3JhaW5pYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2NoZWNrYm94LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9jdXN0b20udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2VtcHR5LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9maWxlLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9odG1sLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9pbWFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25faW1hZ2VwaWNrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX21hdHJpeC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX211bHRpcGxldGV4dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fcGFuZWxkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9yYXRpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX3NpZ25hdHVyZXBhZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVhY3QvY3VzdG9tLXdpZGdldC50c3giLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyaWdnZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMvcmVhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFD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QUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQyxDQUFDO0FBRUssSUFBSSxjQUFjLEdBQUc7SUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUFFLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3BGLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQzdELENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUM7Ozs7Ozs7Ozs7O0FDdERzRDtBQUVqRCxJQUFJLGtCQUFrQixHQUFHO0lBQzlCLGtCQUFrQixFQUFFLEVB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SztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJGQUEyRixhQUFhO0FBQ3hHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4REFBOEQ7O0FBRTlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FB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LENBQUM7QUFDakMsQ0FBQyxFQUNELGVBQWUsQ0FDaEIsQ0FBQztBQUNGLCtEQUFVLENBQUMsUUFBUSxDQUNqQixzQkFBc0IsRUFDdEIsQ0FBQyxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxFQUFFLDBCQUEwQixDQUFDLEVBQ2pFO0lBQ0UsT0FBTyxJQUFJLDBCQUEwQixFQUFFLENBQUM7QUFDMUMsQ0FBQyxFQUNELGVBQWUsQ0FDaEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbmRGO0FBQUEsUUFBUTtBQUN1QjtBQUUvQixlQUFlO0FBQ2dCO0FBRS9CLFVBQVU7QUFDdUI7QUFFakMsZUFBZTtBQUNnRDtBQUMvRCxnQkFBZ0I7QUFDaUQ7QUFDakUsMkJBQTJCO0FBQ3NEO0FBQzdCO0FBRXBELFFBQVE7QUFDc0M7QUFDaUM7QUFDMUM7QUFDTTtBQUMrQjtBQUNkO0FBQ007QUFDdkI7QUFDRjtBQUNJO0FBQ1M7QUFLdEI7QUFJTztBQUlBO0FBSUM7QUFDZ0M7QUFJbEM7QUFDMEI7QUFDQTtBQUNnQjtBQUNKO0FBQ1o7QUFDTTtBQUNKO0FBQzBCO0FBQ1I7QUFDRjtBQUNGO0FBQ2xCO0FBQ007QUFDUTtBQUNsQjtBQUNXO0FBQ047QUFDRTtBQUNaO0FBQ2M7QUFJN0I7QUFFdEMsZUFBZTtBQUNmLDREQUE0RDtBQUU1RCxnREFBZ0Q7QUFDaEQsbUZBQW1GIiwiZmlsZSI6Ii4vcGFja2FnZXMvc3VydmV5LXJlYWN0L3N1cnZleS5yZWFjdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcInJlYWN0XCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwiU3VydmV5XCIsIFtcInJlYWN0XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlN1cnZleVwiXSA9IGZhY3RvcnkocmVxdWlyZShcInJlYWN0XCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJTdXJ2ZXlcIl0gPSBmYWN0b3J5KHJvb3RbXCJSZWFjdFwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzNfXykge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxNDIpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDM2ODQ2YWJiM2IyNzNmYzcxMmE2IiwiZXhwb3J0IHZhciBfX2Fzc2lnbiA9XG4gICg8YW55Pk9iamVjdClbXCJhc3NpZ25cIl0gfHxcbiAgZnVuY3Rpb24odGFyZ2V0OiBhbnkpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBwIGluIHMpXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRhcmdldFtwXSA9IHNbcF07XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHModGhpc0NsYXNzOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gIGZvciAodmFyIHAgaW4gYmFzZUNsYXNzKVxuICAgIGlmIChiYXNlQ2xhc3MuaGFzT3duUHJvcGVydHkocCkpIHRoaXNDbGFzc1twXSA9IGJhc2VDbGFzc1twXTtcbiAgZnVuY3Rpb24gX18oKSB7XG4gICAgdGhpcy5jb25zdHJ1Y3RvciA9IHRoaXNDbGFzcztcbiAgfVxuICB0aGlzQ2xhc3MucHJvdG90eXBlID1cbiAgICBiYXNlQ2xhc3MgPT09IG51bGxcbiAgICAgID8gT2JqZWN0LmNyZWF0ZShiYXNlQ2xhc3MpXG4gICAgICA6ICgoX18ucHJvdG90eXBlID0gYmFzZUNsYXNzLnByb3RvdHlwZSksIG5ldyAoPGFueT5fXykoKSk7XG59XG5cbmRlY2xhcmUgdmFyIFJlZmxlY3Q6YW55O1xuXG5leHBvcnQgdmFyIF9fZGVjb3JhdGUgPSBmdW5jdGlvbihcbiAgZGVjb3JhdG9yczogYW55LFxuICB0YXJnZXQ6IGFueSxcbiAga2V5OiBhbnksXG4gIGRlc2M6IGFueVxuKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICByID1cbiAgICAgIGMgPCAzXG4gICAgICAgID8gdGFyZ2V0XG4gICAgICAgIDogZGVzYyA9PT0gbnVsbFxuICAgICAgICAgID8gKGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSlcbiAgICAgICAgICA6IGRlc2MsXG4gICAgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pXG4gICAgICBpZiAoKGQgPSBkZWNvcmF0b3JzW2ldKSlcbiAgICAgICAgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59O1xuXG5leHBvcnQgdmFyIF9fc3ByZWFkQXJyYXlzID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9jaHVua3MvaGVscGVycy50cyIsImltcG9ydCB7IGVuZ2xpc2hTdHJpbmdzIH0gZnJvbSBcIi4vbG9jYWxpemF0aW9uL2VuZ2xpc2hcIjtcblxuZXhwb3J0IHZhciBzdXJ2ZXlMb2NhbGl6YXRpb24gPSB7XG4gIGN1cnJlbnRMb2NhbGVWYWx1ZTogXCJcIixcbiAgZGVmYXVsdExvY2FsZVZhbHVlOiBcImVuXCIsXG4gIGxvY2FsZXM6IDx7IFtpbmRleDogc3RyaW5nXTogYW55IH0+e30sXG4gIGxvY2FsZU5hbWVzOiA8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pnt9LFxuICBzdXBwb3J0ZWRMb2NhbGVzOiA8QXJyYXk8YW55Pj5bXSxcbiAgZ2V0IGN1cnJlbnRMb2NhbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudExvY2FsZVZhbHVlID09PSB0aGlzLmRlZmF1bHRMb2NhbGVWYWx1ZVxuICAgICAgPyBcIlwiXG4gICAgICA6IHRoaXMuY3VycmVudExvY2FsZVZhbHVlO1xuICB9LFxuICBzZXQgY3VycmVudExvY2FsZSh2YWw6IHN0cmluZykge1xuICAgIGlmICh2YWwgPT09IFwiY3pcIikgdmFsID0gXCJjc1wiO1xuICAgIHRoaXMuY3VycmVudExvY2FsZVZhbHVlID0gdmFsO1xuICB9LFxuICBnZXQgZGVmYXVsdExvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0TG9jYWxlVmFsdWU7XG4gIH0sXG4gIHNldCBkZWZhdWx0TG9jYWxlKHZhbDogc3RyaW5nKSB7XG4gICAgaWYgKHZhbCA9PT0gXCJjelwiKSB2YWwgPSBcImNzXCI7XG4gICAgdGhpcy5kZWZhdWx0TG9jYWxlVmFsdWUgPSB2YWw7XG4gIH0sXG4gIGdldExvY2FsZVN0cmluZ3MobG9jOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZXNbbG9jXTtcbiAgfSxcbiAgZ2V0Q3VycmVudFN0cmluZ3MoKTogYW55IHtcbiAgICB2YXIgbG9jID0gdGhpcy5jdXJyZW50TG9jYWxlXG4gICAgICA/IHRoaXMubG9jYWxlc1t0aGlzLmN1cnJlbnRMb2NhbGVdXG4gICAgICA6IHRoaXMubG9jYWxlc1t0aGlzLmRlZmF1bHRMb2NhbGVdO1xuICAgIGlmICghbG9jKSBsb2MgPSB0aGlzLmxvY2FsZXNbdGhpcy5kZWZhdWx0TG9jYWxlXTtcbiAgICByZXR1cm4gbG9jO1xuICB9LFxuICBnZXRTdHJpbmc6IGZ1bmN0aW9uIChzdHJOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbG9jID0gdGhpcy5nZXRDdXJyZW50U3RyaW5ncygpO1xuICAgIGlmICghbG9jW3N0ck5hbWVdKSBsb2MgPSB0aGlzLmxvY2FsZXNbdGhpcy5kZWZhdWx0TG9jYWxlXTtcbiAgICB2YXIgcmVzdWx0ID0gbG9jW3N0ck5hbWVdO1xuICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5sb2NhbGVzW1wiZW5cIl1bc3RyTmFtZV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG4gIGdldExvY2FsZXM6IGZ1bmN0aW9uICgpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgcmVzLnB1c2goXCJcIik7XG4gICAgaWYgKHRoaXMuc3VwcG9ydGVkTG9jYWxlcyAmJiB0aGlzLnN1cHBvcnRlZExvY2FsZXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1cHBvcnRlZExvY2FsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnB1c2godGhpcy5zdXBwb3J0ZWRMb2NhbGVzW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMubG9jYWxlcykge1xuICAgICAgICByZXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXMuc29ydCgpO1xuICAgIHJldHVybiByZXM7XG4gIH0sXG59O1xuXG5leHBvcnQgdmFyIHN1cnZleVN0cmluZ3MgPSBlbmdsaXNoU3RyaW5ncztcbig8YW55PnN1cnZleUxvY2FsaXphdGlvbikubG9jYWxlc1tcImVuXCJdID0gZW5nbGlzaFN0cmluZ3M7XG4oPGFueT5zdXJ2ZXlMb2NhbGl6YXRpb24pLmxvY2FsZU5hbWVzW1wiZW5cIl0gPSBcImVuZ2xpc2hcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXlTdHJpbmdzLnRzIiwiaW1wb3J0IHsgSGVscGVycywgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wZXJ0eURlY29yYXRvck9wdGlvbnMge1xuICBkZWZhdWx0VmFsdWU/OiBhbnk7XG4gIGRlZmF1bHRTb3VyY2U/OiBzdHJpbmc7XG4gIGxvY2FsaXphYmxlPzogeyBuYW1lOiBzdHJpbmcsIG9uR2V0VGV4dENhbGxiYWNrPzogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcgfSB8IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGVuc3VyZUxvY1N0cmluZyh0YXJnZXQ6IGFueSwgb3B0aW9uczogSVByb3BlcnR5RGVjb3JhdG9yT3B0aW9ucywga2V5OiBzdHJpbmcpIHtcbiAgbGV0IGxvY1N0cmluZyA9IHRhcmdldC5nZXRMb2NhbGl6YWJsZVN0cmluZyhrZXkpO1xuICBpZighbG9jU3RyaW5nKSB7XG4gICAgbG9jU3RyaW5nID0gdGFyZ2V0LmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKGtleSwgdGFyZ2V0LCB0cnVlKTtcbiAgICBpZih0eXBlb2Ygb3B0aW9ucy5sb2NhbGl6YWJsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb3B0aW9ucy5sb2NhbGl6YWJsZS5vbkdldFRleHRDYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBsb2NTdHJpbmcub25HZXRUZXh0Q2FsbGJhY2sgPSBvcHRpb25zLmxvY2FsaXphYmxlLm9uR2V0VGV4dENhbGxiYWNrO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkob3B0aW9ucz86IElQcm9wZXJ0eURlY29yYXRvck9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBpZighb3B0aW9ucyB8fCAhb3B0aW9ucy5sb2NhbGl6YWJsZSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoa2V5LCAhIW9wdGlvbnMgPyBvcHRpb25zLmRlZmF1bHRWYWx1ZSB8fCB0aGlzW29wdGlvbnMuZGVmYXVsdFNvdXJjZV0gOiB1bmRlZmluZWQpOyB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbDogYW55KSB7IHRoaXMuc2V0UHJvcGVydHlWYWx1ZShrZXksIHZhbCk7IH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsgZW5zdXJlTG9jU3RyaW5nKHRoaXMsIG9wdGlvbnMsIGtleSk7IHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChrZXksIG9wdGlvbnMuZGVmYXVsdFZhbHVlIHx8IHRoaXNbb3B0aW9ucy5kZWZhdWx0U291cmNlXSk7IH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24odmFsOiBhbnkpIHsgZW5zdXJlTG9jU3RyaW5nKHRoaXMsIG9wdGlvbnMsIGtleSk7ICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChrZXksIHZhbCk7IH1cbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgb3B0aW9ucy5sb2NhbGl6YWJsZSA9PT0gdHJ1ZSA/IFwibG9jXCIgKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSkgOiBvcHRpb25zLmxvY2FsaXphYmxlLm5hbWUsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBlbnN1cmVMb2NTdHJpbmcodGhpcywgb3B0aW9ucywga2V5KTsgXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElPYmplY3Qge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uT2JqZWN0UHJvcGVydHkgaW1wbGVtZW50cyBJT2JqZWN0IHtcbiAgcHVibGljIHN0YXRpYyBnZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlOiAodmFsOiBhbnkpID0+IGFueTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBwcml2YXRlIHN0YXRpYyBtZXJnYWJsZVZhbHVlcyA9IFtcbiAgICBcInR5cGVWYWx1ZVwiLFxuICAgIFwiY2hvaWNlc1ZhbHVlXCIsXG4gICAgXCJiYXNlVmFsdWVcIixcbiAgICBcInJlYWRPbmx5VmFsdWVcIixcbiAgICBcInZpc2libGVWYWx1ZVwiLFxuICAgIFwiaXNTZXJpYWxpemFibGVcIixcbiAgICBcImlzTGlnaHRTZXJpYWxpemFibGVcIixcbiAgICBcImlzQ3VzdG9tXCIsXG4gICAgXCJpc0JpbmRhYmxlXCIsXG4gICAgXCJpc1VuaXF1ZVwiLFxuICAgIFwiaXNEeW5hbWljQ2hvaWNlc1wiLFxuICAgIFwiaXNMb2NhbGl6YWJsZVZhbHVlXCIsXG4gICAgXCJjbGFzc05hbWVcIixcbiAgICBcImFsdGVybmF0aXZlTmFtZVwiLFxuICAgIFwibGF5b3V0XCIsXG4gICAgXCJjbGFzc05hbWVQYXJ0XCIsXG4gICAgXCJiYXNlQ2xhc3NOYW1lXCIsXG4gICAgXCJkZWZhdWx0VmFsdWVcIixcbiAgICBcInNlcmlhbGl6YXRpb25Qcm9wZXJ0eVwiLFxuICAgIFwib25HZXRWYWx1ZVwiLFxuICAgIFwib25TZXRWYWx1ZVwiLFxuICAgIFwiZGlzcGxheU5hbWVcIixcbiAgICBcImNhdGVnb3J5XCIsXG4gICAgXCJjYXRlZ29yeUluZGV4XCIsXG4gICAgXCJ2aXNpYmxlSW5kZXhcIixcbiAgICBcIm5leHRUb1Byb3BlcnR5XCIsXG4gICAgXCJzaG93TW9kZVwiLFxuICAgIFwiZGVwZW5kZWRQcm9wZXJ0aWVzXCIsXG4gICAgXCJ2aXNpYmxlSWZcIixcbiAgICBcIm9uUHJvcGVydHlFZGl0b3JVcGRhdGVcIixcbiAgICBcIm1heExlbmd0aFwiLFxuICAgIFwibWF4VmFsdWVcIixcbiAgICBcIm1pblZhbHVlXCIsXG4gICAgXCJkYXRhTGlzdFZhbHVlXCIsXG4gIF07XG4gIHByaXZhdGUgY2xhc3NJbmZvVmFsdWU6IEpzb25NZXRhZGF0YUNsYXNzO1xuICBwcml2YXRlIHR5cGVWYWx1ZTogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBjaG9pY2VzVmFsdWU6IEFycmF5PGFueT4gPSBudWxsO1xuICBwcml2YXRlIGJhc2VWYWx1ZTogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBpc1JlcXVpcmVkVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1VuaXF1ZVZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZE9ubHlWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZpc2libGVWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzTG9jYWxpemFibGVWYWx1ZTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNob2ljZXNmdW5jOiAob2JqOiBhbnksIGNob2ljZXNDYWxsYmFjazogYW55KSA9PiBBcnJheTxhbnk+ID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXBlbmRlZFByb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBudWxsO1xuICBwdWJsaWMgaXNTZXJpYWxpemFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgaXNMaWdodFNlcmlhbGl6YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBpc0N1c3RvbTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNEeW5hbWljQ2hvaWNlczogYm9vbGVhbiA9IGZhbHNlOyAvL1RPRE8gb2Jzb2xldGUsIHVzZSBkZXBlbmRzT24gYXR0cmlidXRlXG4gIHB1YmxpYyBpc0JpbmRhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBhbHRlcm5hdGl2ZU5hbWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBjbGFzc05hbWVQYXJ0OiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgYmFzZUNsYXNzTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIGRlZmF1bHRWYWx1ZVZhbHVlOiBhbnkgPSBudWxsO1xuICBwdWJsaWMgc2VyaWFsaXphdGlvblByb3BlcnR5OiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgZGlzcGxheU5hbWU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBjYXRlZ29yeTogc3RyaW5nID0gXCJcIjtcbiAgcHVibGljIGNhdGVnb3J5SW5kZXg6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgdmlzaWJsZUluZGV4OiBudW1iZXIgPSAtMTtcbiAgcHVibGljIG5leHRUb1Byb3BlcnR5OiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgc2hvd01vZGU6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBtYXhMZW5ndGg6IG51bWJlciA9IC0xO1xuICBwdWJsaWMgbWF4VmFsdWU6IGFueTtcbiAgcHVibGljIG1pblZhbHVlOiBhbnk7XG4gIHByaXZhdGUgZGF0YUxpc3RWYWx1ZTogQXJyYXk8c3RyaW5nPjtcbiAgcHVibGljIGxheW91dDogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIG9uR2V0VmFsdWU6IChvYmo6IGFueSkgPT4gYW55ID0gbnVsbDtcbiAgcHVibGljIG9uU2V0VmFsdWU6IChvYmo6IGFueSwgdmFsdWU6IGFueSwganNvbkNvbnY6IEpzb25PYmplY3QpID0+IGFueSA9IG51bGw7XG4gIHB1YmxpYyB2aXNpYmxlSWY6IChvYmo6IGFueSkgPT4gYm9vbGVhbiA9IG51bGw7XG4gIHB1YmxpYyBvblByb3BlcnR5RWRpdG9yVXBkYXRlOiAob2JqOiBhbnksIHByb3BFZGl0b3I6IGFueSkgPT4gYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsYXNzSW5mbzogSnNvbk1ldGFkYXRhQ2xhc3MsXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBpc1JlcXVpcmVkOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5jbGFzc0luZm9WYWx1ZSA9IGNsYXNzSW5mbztcbiAgICB0aGlzLmlzUmVxdWlyZWRWYWx1ZSA9IGlzUmVxdWlyZWQ7XG4gIH1cbiAgcHVibGljIGdldCBjbGFzc0luZm8oKTogSnNvbk1ldGFkYXRhQ2xhc3Mge1xuICAgIHJldHVybiB0aGlzLmNsYXNzSW5mb1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR5cGVWYWx1ZSA/IHRoaXMudHlwZVZhbHVlIDogXCJzdHJpbmdcIjtcbiAgfVxuICBwdWJsaWMgc2V0IHR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSA9PT0gXCJpdGVtdmFsdWVzXCIpIHZhbHVlID0gXCJpdGVtdmFsdWVbXVwiO1xuICAgIHRoaXMudHlwZVZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMudHlwZVZhbHVlLmluZGV4T2YoXCJbXVwiKSA9PT0gdGhpcy50eXBlVmFsdWUubGVuZ3RoIC0gMikge1xuICAgICAgdGhpcy5pc0FycmF5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gdGhpcy50eXBlVmFsdWUuc3Vic3RyKDAsIHRoaXMudHlwZVZhbHVlLmxlbmd0aCAtIDIpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaXNBcnJheSA9IGZhbHNlO1xuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzUmVxdWlyZWRWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVW5pcXVlKCkge1xuICAgIHJldHVybiB0aGlzLmlzVW5pcXVlVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBpc1VuaXF1ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzVW5pcXVlVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUb1VzZUdldFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLm9uR2V0VmFsdWUgfHwgdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHk7XG4gIH1cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKSB7XG4gICAgdmFyIHJlc3VsdDogYW55ID0gdGhpcy5kZWZhdWx0VmFsdWVWYWx1ZTtcbiAgICBpZiAoXG4gICAgICAhIUpzb25PYmplY3RQcm9wZXJ0eS5nZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlICYmXG4gICAgICBKc29uT2JqZWN0Lm1ldGFEYXRhLmlzRGVzY2VuZGFudE9mKHRoaXMuY2xhc3NOYW1lLCBcIml0ZW12YWx1ZVwiKVxuICAgICkge1xuICAgICAgcmVzdWx0ID0gSnNvbk9iamVjdFByb3BlcnR5LmdldEl0ZW1WYWx1ZXNEZWZhdWx0VmFsdWUoXG4gICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlVmFsdWUgfHwgW11cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWUobmV3VmFsdWUpIHtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZVZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbiAgcHVibGljIGlzRGVmYXVsdFZhbHVlKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKSlcbiAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZSA9PSB2YWx1ZTtcbiAgICByZXR1cm4gKFxuICAgICAgKHZhbHVlID09PSBmYWxzZSAmJiAodGhpcy50eXBlID09IFwiYm9vbGVhblwiIHx8IHRoaXMudHlwZSA9PSBcInN3aXRjaFwiKSkgfHxcbiAgICAgIHZhbHVlID09PSBcIlwiIHx8XG4gICAgICBIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZShvYmo6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMub25HZXRWYWx1ZSkgcmV0dXJuIHRoaXMub25HZXRWYWx1ZShvYmopO1xuICAgIGlmICh0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSAmJiAhIW9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0pXG4gICAgICByZXR1cm4gb2JqW3RoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5XS5nZXRKc29uKCk7XG4gICAgcmV0dXJuIG9ialt0aGlzLm5hbWVdO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9wZXJ0eVZhbHVlKG9iajogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5pc0xvY2FsaXphYmxlKSB7XG4gICAgICByZXR1cm4gISFvYmpbdGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHldXG4gICAgICAgID8gb2JqW3RoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5XS50ZXh0XG4gICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUob2JqKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RvVXNlU2V0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMub25TZXRWYWx1ZSB8fCB0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eTtcbiAgfVxuICBwdWJsaWMgc2V0VmFsdWUob2JqOiBhbnksIHZhbHVlOiBhbnksIGpzb25Db252OiBKc29uT2JqZWN0KSB7XG4gICAgaWYgKHRoaXMub25TZXRWYWx1ZSkge1xuICAgICAgdGhpcy5vblNldFZhbHVlKG9iaiwgdmFsdWUsIGpzb25Db252KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5ICYmICEhb2JqW3RoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5XSlcbiAgICAgICAgb2JqW3RoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5XS5zZXRKc29uKHZhbHVlKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSBcImJvb2xlYW5cIiB8fCB0aGlzLnR5cGUgPT0gXCJzd2l0Y2hcIikge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgb2JqW3RoaXMubmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldE9ialR5cGUob2JqVHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmNsYXNzTmFtZVBhcnQpIHJldHVybiBvYmpUeXBlO1xuICAgIHJldHVybiBvYmpUeXBlLnJlcGxhY2UodGhpcy5jbGFzc05hbWVQYXJ0LCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q2xhc3NOYW1lKGNsYXNzTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoY2xhc3NOYW1lKSBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy5jbGFzc05hbWVQYXJ0ICYmIGNsYXNzTmFtZS5pbmRleE9mKHRoaXMuY2xhc3NOYW1lUGFydCkgPCAwXG4gICAgICA/IGNsYXNzTmFtZSArIHRoaXMuY2xhc3NOYW1lUGFydFxuICAgICAgOiBjbGFzc05hbWU7XG4gIH1cbiAgLyoqXG4gICAqIERlcHJpY2F0ZWQsIHBsZWFzZSB1c2UgZ2V0Q2hvaWNlc1xuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldENob2ljZXMobnVsbCk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNDaG9pY2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuY2hvaWNlc1ZhbHVlIHx8ICEhdGhpcy5jaG9pY2VzZnVuYztcbiAgfVxuICBwdWJsaWMgZ2V0Q2hvaWNlcyhvYmo6IGFueSwgY2hvaWNlc0NhbGxiYWNrOiBhbnkgPSBudWxsKTogQXJyYXk8YW55PiB7XG4gICAgaWYgKHRoaXMuY2hvaWNlc1ZhbHVlICE9IG51bGwpIHJldHVybiB0aGlzLmNob2ljZXNWYWx1ZTtcbiAgICBpZiAodGhpcy5jaG9pY2VzZnVuYyAhPSBudWxsKSByZXR1cm4gdGhpcy5jaG9pY2VzZnVuYyhvYmosIGNob2ljZXNDYWxsYmFjayk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIHNldENob2ljZXMoXG4gICAgdmFsdWU6IEFycmF5PGFueT4sXG4gICAgdmFsdWVGdW5jOiAob2JqOiBhbnkpID0+IEFycmF5PGFueT4gPSBudWxsXG4gICkge1xuICAgIHRoaXMuY2hvaWNlc1ZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5jaG9pY2VzZnVuYyA9IHZhbHVlRnVuYztcbiAgfVxuICBwdWJsaWMgZ2V0QmFzZVZhbHVlKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmJhc2VWYWx1ZSkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmJhc2VWYWx1ZSA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0aGlzLmJhc2VWYWx1ZSgpO1xuICAgIHJldHVybiB0aGlzLmJhc2VWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0QmFzZVZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5iYXNlVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkT25seVZhbHVlICE9IG51bGwgPyB0aGlzLnJlYWRPbmx5VmFsdWUgOiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlYWRPbmx5KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMucmVhZE9ubHlWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgaXNWaXNpYmxlKGxheW91dDogc3RyaW5nLCBvYmo6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICBsZXQgaXNMYXlvdXQgPSAhdGhpcy5sYXlvdXQgfHwgdGhpcy5sYXlvdXQgPT0gbGF5b3V0O1xuICAgIGlmICghdGhpcy52aXNpYmxlIHx8ICFpc0xheW91dCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghIXRoaXMudmlzaWJsZUlmICYmICEhb2JqKSByZXR1cm4gdGhpcy52aXNpYmxlSWYob2JqKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVZhbHVlICE9IG51bGwgPyB0aGlzLnZpc2libGVWYWx1ZSA6IHRydWU7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMudmlzaWJsZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNMb2NhbGl6YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvY2FsaXphYmxlVmFsdWUgIT0gbnVsbCA/IHRoaXMuaXNMb2NhbGl6YWJsZVZhbHVlIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldCBpc0xvY2FsaXphYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNMb2NhbGl6YWJsZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgZGF0YUxpc3QoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhTGlzdFZhbHVlKSA/IHRoaXMuZGF0YUxpc3RWYWx1ZSA6IFtdO1xuICB9XG4gIHB1YmxpYyBzZXQgZGF0YUxpc3QodmFsOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5kYXRhTGlzdFZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBtZXJnZVdpdGgocHJvcDogSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgdmFyIHZhbHVlc05hbWVzID0gSnNvbk9iamVjdFByb3BlcnR5Lm1lcmdhYmxlVmFsdWVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMubWVyZ2VWYWx1ZShwcm9wLCB2YWx1ZXNOYW1lc1tpXSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhZGREZXBlbmRlZFByb3BlcnR5KG5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5kZXBlbmRlZFByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuZGVwZW5kZWRQcm9wZXJ0aWVzID0gW107XG4gICAgfVxuICAgIGlmICh0aGlzLmRlcGVuZGVkUHJvcGVydGllcy5pbmRleE9mKG5hbWUpIDwgMCkge1xuICAgICAgdGhpcy5kZXBlbmRlZFByb3BlcnRpZXMucHVzaChuYW1lKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldERlcGVuZGVkUHJvcGVydGllcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICByZXR1cm4gISF0aGlzLmRlcGVuZGVkUHJvcGVydGllcyA/IHRoaXMuZGVwZW5kZWRQcm9wZXJ0aWVzIDogW107XG4gIH1cbiAgcHJpdmF0ZSBtZXJnZVZhbHVlKHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSwgdmFsdWVOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpc1t2YWx1ZU5hbWVdID09IG51bGwgJiYgcHJvcFt2YWx1ZU5hbWVdICE9IG51bGwpIHtcbiAgICAgIHRoaXNbdmFsdWVOYW1lXSA9IHByb3BbdmFsdWVOYW1lXTtcbiAgICB9XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbiB7XG4gIHByaXZhdGUgc3RhdGljIHByb3BlcnRpZXM6IElPYmplY3QgPSB7fTtcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyZW50Q2xhc3NlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBwdWJsaWMgc3RhdGljIGFkZFByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eTogYW55KSB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHByb3BzID0gQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucHJvcGVydGllcztcbiAgICBpZiAoIXByb3BzW2NsYXNzTmFtZV0pIHtcbiAgICAgIHByb3BzW2NsYXNzTmFtZV0gPSBbXTtcbiAgICB9XG4gICAgcHJvcHNbY2xhc3NOYW1lXS5wdXNoKHByb3BlcnR5KTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHJlbW92ZVByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgaWYgKCFwcm9wc1tjbGFzc05hbWVdKSByZXR1cm47XG4gICAgdmFyIHByb3BlcnRpZXMgPSBwcm9wc1tjbGFzc05hbWVdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHByb3BlcnRpZXNbaV0ubmFtZSA9PSBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgcHJvcHNbY2xhc3NOYW1lXS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIGFkZENsYXNzKGNsYXNzTmFtZTogc3RyaW5nLCBwYXJlbnRDbGFzc05hbWU6IHN0cmluZykge1xuICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChwYXJlbnRDbGFzc05hbWUpIHtcbiAgICAgIHBhcmVudENsYXNzTmFtZSA9IHBhcmVudENsYXNzTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wYXJlbnRDbGFzc2VzW2NsYXNzTmFtZV0gPSBwYXJlbnRDbGFzc05hbWU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nKTogQXJyYXk8YW55PiB7XG4gICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgd2hpbGUgKGNsYXNzTmFtZSkge1xuICAgICAgdmFyIHByb3BlcnRpZXMgPSBwcm9wc1tjbGFzc05hbWVdO1xuICAgICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzTmFtZSA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnBhcmVudENsYXNzZXNbY2xhc3NOYW1lXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVByb3BlcnRpZXMob2JqOiBhbnkpIHtcbiAgICBpZiAoIW9iaiB8fCAhb2JqLmdldFR5cGUpIHJldHVybjtcbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzQ29yZShvYmosIG9iai5nZXRUeXBlKCkpO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVByb3BlcnRpZXNDb3JlKG9iajogYW55LCBjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgaWYgKHByb3BzW2NsYXNzTmFtZV0pIHtcbiAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXNJbk9iaihvYmosIHByb3BzW2NsYXNzTmFtZV0pO1xuICAgIH1cbiAgICB2YXIgcGFyZW50Q2xhc3MgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wYXJlbnRDbGFzc2VzW2NsYXNzTmFtZV07XG4gICAgaWYgKHBhcmVudENsYXNzKSB7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzQ29yZShvYmosIHBhcmVudENsYXNzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUHJvcGVydGllc0luT2JqKG9iajogYW55LCBwcm9wZXJ0aWVzOiBhbnlbXSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydHlJbk9iaihvYmosIHByb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eUluT2JqKG9iajogYW55LCBwcm9wOiBKc29uT2JqZWN0UHJvcGVydHkpIHtcbiAgICBpZiAob2JqW3Byb3AubmFtZV0gfHwgb2JqLmhhc093blByb3BlcnR5KHByb3AubmFtZSkpIHJldHVybjtcbiAgICBpZiAoXG4gICAgICBwcm9wLmlzTG9jYWxpemFibGUgJiZcbiAgICAgIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5ICYmXG4gICAgICAhb2JqW3Byb3Auc2VyaWFsaXphdGlvblByb3BlcnR5XSAmJlxuICAgICAgb2JqLmNyZWF0ZUN1c3RvbUxvY2FsaXphYmxlT2JqXG4gICAgKSB7XG4gICAgICBvYmouY3JlYXRlQ3VzdG9tTG9jYWxpemFibGVPYmoocHJvcC5uYW1lKTtcbiAgICAgIHZhciBsb2NEZXNjID0ge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gb2JqLmdldExvY2FsaXphYmxlU3RyaW5nKHByb3AubmFtZSk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHksIGxvY0Rlc2MpO1xuICAgICAgdmFyIGRlc2MgPSB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBvYmouZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KHByb3AubmFtZSwgcHJvcC5kZWZhdWx0VmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2OiBhbnkpIHtcbiAgICAgICAgICBvYmouc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KHByb3AubmFtZSwgdik7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcC5uYW1lLCBkZXNjKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3AuZGVmYXVsdFZhbHVlO1xuICAgICAgdmFyIGlzQXJyYXlQcm9wID0gZmFsc2U7XG4gICAgICBpZih0eXBlb2Ygb2JqLmNyZWF0ZU5ld0FycmF5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEpzb25PYmplY3QubWV0YURhdGEuaXNEZXNjZW5kYW50T2YocHJvcC5jbGFzc05hbWUsIFwiaXRlbXZhbHVlXCIpXG4gICAgICAgICkge1xuICAgICAgICAgIG9iai5jcmVhdGVOZXdBcnJheShwcm9wLm5hbWUsIGZ1bmN0aW9uIChpdGVtOiBhbnkpIHtcbiAgICAgICAgICAgIGl0ZW0ubG9jT3duZXIgPSBvYmo7XG4gICAgICAgICAgICBpdGVtLm93bmVyUHJvcGVydHlOYW1lID0gcHJvcC5uYW1lO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlzQXJyYXlQcm9wID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvL0l0IGlzIGEgc2ltcGxlIGFycmF5IHByb3BlcnR5XG4gICAgICAgIGlmKHByb3AudHlwZSA9PT0gXCJtdWx0aXBsZXZhbHVlc1wiKSB7XG4gICAgICAgICAgb2JqLmNyZWF0ZU5ld0FycmF5KHByb3AubmFtZSk7XG4gICAgICAgICAgaXNBcnJheVByb3AgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGlzQXJyYXlQcm9wKSB7XG4gICAgICAgICAgaWYoQXJyYXkuaXNBcnJheShkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgICBvYmouc2V0UHJvcGVydHlWYWx1ZShwcm9wLm5hbWUsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghIW9iai5nZXRQcm9wZXJ0eVZhbHVlICYmICEhb2JqLnNldFByb3BlcnR5VmFsdWUpIHtcbiAgICAgICAgdmFyIGRlc2MgPSB7XG4gICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoISFwcm9wLm9uR2V0VmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHByb3Aub25HZXRWYWx1ZShvYmopO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9iai5nZXRQcm9wZXJ0eVZhbHVlKHByb3AubmFtZSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24gKHY6IGFueSkge1xuICAgICAgICAgICAgaWYgKCEhcHJvcC5vblNldFZhbHVlKSB7XG4gICAgICAgICAgICAgIHByb3Aub25TZXRWYWx1ZShvYmosIHYsIG51bGwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb2JqLnNldFByb3BlcnR5VmFsdWUocHJvcC5uYW1lLCB2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLm5hbWUsIGRlc2MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSnNvbk1ldGFkYXRhQ2xhc3Mge1xuICBzdGF0aWMgcmVxdWlyZWRTeW1ib2wgPSBcIiFcIjtcbiAgc3RhdGljIHR5cGVTeW1ib2wgPSBcIjpcIjtcbiAgcHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydGllczogQXJyYXk8YW55PixcbiAgICBwdWJsaWMgY3JlYXRvcjogKGpzb24/OiBhbnkpID0+IGFueSA9IG51bGwsXG4gICAgcHVibGljIHBhcmVudE5hbWU6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodGhpcy5wYXJlbnROYW1lKSB7XG4gICAgICB0aGlzLnBhcmVudE5hbWUgPSB0aGlzLnBhcmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmFkZENsYXNzKG5hbWUsIHRoaXMucGFyZW50TmFtZSk7XG4gICAgfVxuICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHRoaXMuY3JlYXRlUHJvcGVydHkocHJvcGVydGllc1tpXSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGZpbmQobmFtZTogc3RyaW5nKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucHJvcGVydGllc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLnByb3BlcnRpZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVQcm9wZXJ0eShwcm9wSW5mbzogYW55KTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICB2YXIgcHJvcGVydHlOYW1lID0gdHlwZW9mIHByb3BJbmZvID09PSBcInN0cmluZ1wiID8gcHJvcEluZm8gOiBwcm9wSW5mby5uYW1lO1xuICAgIGlmICghcHJvcGVydHlOYW1lKSByZXR1cm47XG4gICAgdmFyIHByb3BlcnR5VHlwZSA9IG51bGw7XG4gICAgdmFyIHR5cGVJbmRleCA9IHByb3BlcnR5TmFtZS5pbmRleE9mKEpzb25NZXRhZGF0YUNsYXNzLnR5cGVTeW1ib2wpO1xuICAgIGlmICh0eXBlSW5kZXggPiAtMSkge1xuICAgICAgcHJvcGVydHlUeXBlID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZyh0eXBlSW5kZXggKyAxKTtcbiAgICAgIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgdHlwZUluZGV4KTtcbiAgICB9XG4gICAgdmFyIGlzUmVxdWlyZWQgPVxuICAgICAgdGhpcy5nZXRJc1Byb3BlcnR5TmFtZVJlcXVpcmVkKHByb3BlcnR5TmFtZSkgfHwgISFwcm9wSW5mby5pc1JlcXVpcmVkO1xuICAgIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7XG4gICAgdmFyIHByb3AgPSBuZXcgSnNvbk9iamVjdFByb3BlcnR5KHRoaXMsIHByb3BlcnR5TmFtZSwgaXNSZXF1aXJlZCk7XG4gICAgaWYgKHByb3BlcnR5VHlwZSkge1xuICAgICAgcHJvcC50eXBlID0gcHJvcGVydHlUeXBlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb3BJbmZvID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBpZiAocHJvcEluZm8udHlwZSkge1xuICAgICAgICBwcm9wLnR5cGUgPSBwcm9wSW5mby50eXBlO1xuICAgICAgfVxuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShwcm9wSW5mby5kZWZhdWx0KSkge1xuICAgICAgICBwcm9wLmRlZmF1bHRWYWx1ZSA9IHByb3BJbmZvLmRlZmF1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmlzU2VyaWFsaXphYmxlKSkge1xuICAgICAgICBwcm9wLmlzU2VyaWFsaXphYmxlID0gcHJvcEluZm8uaXNTZXJpYWxpemFibGU7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmlzTGlnaHRTZXJpYWxpemFibGUpKSB7XG4gICAgICAgIHByb3AuaXNMaWdodFNlcmlhbGl6YWJsZSA9IHByb3BJbmZvLmlzTGlnaHRTZXJpYWxpemFibGU7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLm1heExlbmd0aCkpIHtcbiAgICAgICAgcHJvcC5tYXhMZW5ndGggPSBwcm9wSW5mby5tYXhMZW5ndGg7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmRpc3BsYXlOYW1lKSkge1xuICAgICAgICBwcm9wLmRpc3BsYXlOYW1lID0gcHJvcEluZm8uZGlzcGxheU5hbWU7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmNhdGVnb3J5KSkge1xuICAgICAgICBwcm9wLmNhdGVnb3J5ID0gcHJvcEluZm8uY2F0ZWdvcnk7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmNhdGVnb3J5SW5kZXgpKSB7XG4gICAgICAgIHByb3AuY2F0ZWdvcnlJbmRleCA9IHByb3BJbmZvLmNhdGVnb3J5SW5kZXg7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLm5leHRUb1Byb3BlcnR5KSkge1xuICAgICAgICBwcm9wLm5leHRUb1Byb3BlcnR5ID0gcHJvcEluZm8ubmV4dFRvUHJvcGVydHk7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLnZpc2libGVJbmRleCkpIHtcbiAgICAgICAgcHJvcC52aXNpYmxlSW5kZXggPSBwcm9wSW5mby52aXNpYmxlSW5kZXg7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLnNob3dNb2RlKSkge1xuICAgICAgICBwcm9wLnNob3dNb2RlID0gcHJvcEluZm8uc2hvd01vZGU7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLm1heFZhbHVlKSkge1xuICAgICAgICBwcm9wLm1heFZhbHVlID0gcHJvcEluZm8ubWF4VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLm1pblZhbHVlKSkge1xuICAgICAgICBwcm9wLm1pblZhbHVlID0gcHJvcEluZm8ubWluVmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmRhdGFMaXN0KSkge1xuICAgICAgICBwcm9wLmRhdGFMaXN0ID0gcHJvcEluZm8uZGF0YUxpc3Q7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmlzRHluYW1pY0Nob2ljZXMpKSB7XG4gICAgICAgIHByb3AuaXNEeW5hbWljQ2hvaWNlcyA9IHByb3BJbmZvLmlzRHluYW1pY0Nob2ljZXM7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmlzQmluZGFibGUpKSB7XG4gICAgICAgIHByb3AuaXNCaW5kYWJsZSA9IHByb3BJbmZvLmlzQmluZGFibGU7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmlzVW5pcXVlKSkge1xuICAgICAgICBwcm9wLmlzVW5pcXVlID0gcHJvcEluZm8uaXNVbmlxdWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8udmlzaWJsZSA9PT0gdHJ1ZSB8fCBwcm9wSW5mby52aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgICBwcm9wLnZpc2libGUgPSBwcm9wSW5mby52aXNpYmxlO1xuICAgICAgfVxuICAgICAgaWYgKCEhcHJvcEluZm8udmlzaWJsZUlmKSB7XG4gICAgICAgIHByb3AudmlzaWJsZUlmID0gcHJvcEluZm8udmlzaWJsZUlmO1xuICAgICAgfVxuICAgICAgaWYgKCEhcHJvcEluZm8ub25Qcm9wZXJ0eUVkaXRvclVwZGF0ZSkge1xuICAgICAgICBwcm9wLm9uUHJvcGVydHlFZGl0b3JVcGRhdGUgPSBwcm9wSW5mby5vblByb3BlcnR5RWRpdG9yVXBkYXRlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLnJlYWRPbmx5ID09PSB0cnVlKSB7XG4gICAgICAgIHByb3AucmVhZE9ubHkgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmNob2ljZXMpIHtcbiAgICAgICAgdmFyIGNob2ljZXNGdW5jID1cbiAgICAgICAgICB0eXBlb2YgcHJvcEluZm8uY2hvaWNlcyA9PT0gXCJmdW5jdGlvblwiID8gcHJvcEluZm8uY2hvaWNlcyA6IG51bGw7XG4gICAgICAgIHZhciBjaG9pY2VzVmFsdWUgPVxuICAgICAgICAgIHR5cGVvZiBwcm9wSW5mby5jaG9pY2VzICE9PSBcImZ1bmN0aW9uXCIgPyBwcm9wSW5mby5jaG9pY2VzIDogbnVsbDtcbiAgICAgICAgcHJvcC5zZXRDaG9pY2VzKGNob2ljZXNWYWx1ZSwgY2hvaWNlc0Z1bmMpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcHJvcEluZm8uYmFzZVZhbHVlKSB7XG4gICAgICAgIHByb3Auc2V0QmFzZVZhbHVlKHByb3BJbmZvLmJhc2VWYWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8ub25HZXRWYWx1ZSkge1xuICAgICAgICBwcm9wLm9uR2V0VmFsdWUgPSBwcm9wSW5mby5vbkdldFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLm9uU2V0VmFsdWUpIHtcbiAgICAgICAgcHJvcC5vblNldFZhbHVlID0gcHJvcEluZm8ub25TZXRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5pc0xvY2FsaXphYmxlKSB7XG4gICAgICAgIHByb3BJbmZvLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSA9IFwibG9jXCIgKyBwcm9wLm5hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uc2VyaWFsaXphdGlvblByb3BlcnR5KSB7XG4gICAgICAgIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5ID0gcHJvcEluZm8uc2VyaWFsaXphdGlvblByb3BlcnR5O1xuICAgICAgICB2YXIgczogc3RyaW5nO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHkgJiZcbiAgICAgICAgICBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eS5pbmRleE9mKFwibG9jXCIpID09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvcC5pc0xvY2FsaXphYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmlzTG9jYWxpemFibGUpIHtcbiAgICAgICAgcHJvcC5pc0xvY2FsaXphYmxlID0gcHJvcEluZm8uaXNMb2NhbGl6YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5jbGFzc05hbWUpIHtcbiAgICAgICAgcHJvcC5jbGFzc05hbWUgPSBwcm9wSW5mby5jbGFzc05hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uYmFzZUNsYXNzTmFtZSkge1xuICAgICAgICBwcm9wLmJhc2VDbGFzc05hbWUgPSBwcm9wSW5mby5iYXNlQ2xhc3NOYW1lO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmNsYXNzTmFtZVBhcnQpIHtcbiAgICAgICAgcHJvcC5jbGFzc05hbWVQYXJ0ID0gcHJvcEluZm8uY2xhc3NOYW1lUGFydDtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5hbHRlcm5hdGl2ZU5hbWUpIHtcbiAgICAgICAgcHJvcC5hbHRlcm5hdGl2ZU5hbWUgPSBwcm9wSW5mby5hbHRlcm5hdGl2ZU5hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8ubGF5b3V0KSB7XG4gICAgICAgIHByb3AubGF5b3V0ID0gcHJvcEluZm8ubGF5b3V0O1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmRlcGVuZHNPbikge1xuICAgICAgICB0aGlzLmFkZERlcGVuZHNPblByb3BlcnRpZXMocHJvcCwgcHJvcEluZm8uZGVwZW5kc09uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG4gIH1cbiAgcHJpdmF0ZSBhZGREZXBlbmRzT25Qcm9wZXJ0aWVzKHByb3A6IEpzb25PYmplY3RQcm9wZXJ0eSwgZGVwZW5kc09uOiBhbnkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkZXBlbmRzT24pKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZHNPbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmFkZERlcGVuZHNPblByb3BlcnR5KHByb3AsIGRlcGVuZHNPbltpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRGVwZW5kc09uUHJvcGVydHkocHJvcCwgZGVwZW5kc09uKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGREZXBlbmRzT25Qcm9wZXJ0eShwcm9wOiBKc29uT2JqZWN0UHJvcGVydHksIGRlcGVuZHNPbjogc3RyaW5nKSB7XG4gICAgdmFyIHByb3BlcnR5ID0gdGhpcy5maW5kKGRlcGVuZHNPbik7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcHJvcGVydHkgPSBTZXJpYWxpemVyLmZpbmRQcm9wZXJ0eSh0aGlzLnBhcmVudE5hbWUsIGRlcGVuZHNPbik7XG4gICAgfVxuICAgIGlmICghcHJvcGVydHkpIHJldHVybjtcbiAgICBwcm9wZXJ0eS5hZGREZXBlbmRlZFByb3BlcnR5KHByb3AubmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJc1Byb3BlcnR5TmFtZVJlcXVpcmVkKHByb3BlcnR5TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHByb3BlcnR5TmFtZS5sZW5ndGggPiAwICYmXG4gICAgICBwcm9wZXJ0eU5hbWVbMF0gPT0gSnNvbk1ldGFkYXRhQ2xhc3MucmVxdWlyZWRTeW1ib2xcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZ2V0SXNQcm9wZXJ0eU5hbWVSZXF1aXJlZChwcm9wZXJ0eU5hbWUpKSByZXR1cm4gcHJvcGVydHlOYW1lO1xuICAgIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS5zbGljZSgxKTtcbiAgICByZXR1cm4gcHJvcGVydHlOYW1lO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvbk1ldGFkYXRhIHtcbiAgcHJpdmF0ZSBjbGFzc2VzOiBIYXNoVGFibGU8SnNvbk1ldGFkYXRhQ2xhc3M+ID0ge307XG4gIHByaXZhdGUgYWx0ZXJuYXRpdmVOYW1lczogSGFzaFRhYmxlPHN0cmluZz4gPSB7fTtcbiAgcHJpdmF0ZSBjaGlsZHJlbkNsYXNzZXM6IEhhc2hUYWJsZTxBcnJheTxKc29uTWV0YWRhdGFDbGFzcz4+ID0ge307XG4gIHByaXZhdGUgY2xhc3NQcm9wZXJ0aWVzOiBIYXNoVGFibGU8QXJyYXk8SnNvbk9iamVjdFByb3BlcnR5Pj4gPSB7fTtcbiAgcHJpdmF0ZSBjbGFzc0hhc2hQcm9wZXJ0aWVzOiBIYXNoVGFibGU8SGFzaFRhYmxlPEpzb25PYmplY3RQcm9wZXJ0eT4+ID0ge307XG4gIHB1YmxpYyBhZGRDbGFzcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydGllczogQXJyYXk8YW55PixcbiAgICBjcmVhdG9yOiAoanNvbj86IGFueSkgPT4gYW55ID0gbnVsbCxcbiAgICBwYXJlbnROYW1lOiBzdHJpbmcgPSBudWxsXG4gICk6IEpzb25NZXRhZGF0YUNsYXNzIHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gbmV3IEpzb25NZXRhZGF0YUNsYXNzKFxuICAgICAgbmFtZSxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICBjcmVhdG9yLFxuICAgICAgcGFyZW50TmFtZVxuICAgICk7XG4gICAgdGhpcy5jbGFzc2VzW25hbWVdID0gbWV0YURhdGFDbGFzcztcbiAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5DbGFzc2VzW3BhcmVudE5hbWVdO1xuICAgICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgICB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1twYXJlbnROYW1lXSA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGlsZHJlbkNsYXNzZXNbcGFyZW50TmFtZV0ucHVzaChtZXRhRGF0YUNsYXNzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFEYXRhQ2xhc3M7XG4gIH1cbiAgcHVibGljIHJlbW92ZUNsYXNzKG5hbWU6IHN0cmluZykge1xuICAgIHZhciBtZXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhuYW1lKTtcbiAgICBpZiAoIW1ldGFDbGFzcykgcmV0dXJuO1xuICAgIGRlbGV0ZSB0aGlzLmNsYXNzZXNbbWV0YUNsYXNzLm5hbWVdO1xuICAgIGlmICghIW1ldGFDbGFzcy5wYXJlbnROYW1lKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1ttZXRhQ2xhc3MucGFyZW50TmFtZV0uaW5kZXhPZihtZXRhQ2xhc3MpO1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbkNsYXNzZXNbbWV0YUNsYXNzLnBhcmVudE5hbWVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBvdmVycmlkZUNsYXNzQ3JlYXRvcmUobmFtZTogc3RyaW5nLCBjcmVhdG9yOiAoKSA9PiBhbnkpIHtcbiAgICB0aGlzLm92ZXJyaWRlQ2xhc3NDcmVhdG9yKG5hbWUsIGNyZWF0b3IpO1xuICB9XG4gIHB1YmxpYyBvdmVycmlkZUNsYXNzQ3JlYXRvcihuYW1lOiBzdHJpbmcsIGNyZWF0b3I6ICgpID0+IGFueSkge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIG1ldGFEYXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhuYW1lKTtcbiAgICBpZiAobWV0YURhdGFDbGFzcykge1xuICAgICAgbWV0YURhdGFDbGFzcy5jcmVhdG9yID0gY3JlYXRvcjtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFByb3BlcnRpZXMoY2xhc3NOYW1lOiBzdHJpbmcpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgbWV0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICBpZiAoIW1ldGFDbGFzcykgcmV0dXJuIFtdO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5jbGFzc1Byb3BlcnRpZXNbbWV0YUNsYXNzLm5hbWVdO1xuICAgIGlmICghIXByb3BlcnRpZXMpIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIHRoaXMuZmlsbFByb3BlcnRpZXNGb3JDbGFzcyhtZXRhQ2xhc3MubmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NQcm9wZXJ0aWVzW21ldGFDbGFzcy5uYW1lXTtcbiAgfVxuICBwcml2YXRlIGdldEhhc2hQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nKTogSGFzaFRhYmxlPEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciBtZXRhQ2xhc3MgPSB0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpO1xuICAgIGlmICghbWV0YUNsYXNzKSByZXR1cm4ge307XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmNsYXNzSGFzaFByb3BlcnRpZXNbbWV0YUNsYXNzLm5hbWVdO1xuICAgIGlmICghIXByb3BlcnRpZXMpIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIHRoaXMuZmlsbFByb3BlcnRpZXNGb3JDbGFzcyhtZXRhQ2xhc3MubmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NIYXNoUHJvcGVydGllc1ttZXRhQ2xhc3MubmFtZV07XG4gIH1cbiAgcHJpdmF0ZSBmaWxsUHJvcGVydGllc0ZvckNsYXNzKGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBuZXcgQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PigpO1xuICAgIHZhciBoYXNoUHJvcGVydGllcyA9IHt9O1xuICAgIHRoaXMuZmlsbFByb3BlcnRpZXMoY2xhc3NOYW1lLCBwcm9wZXJ0aWVzLCBoYXNoUHJvcGVydGllcyk7XG4gICAgdGhpcy5jbGFzc1Byb3BlcnRpZXNbY2xhc3NOYW1lXSA9IHByb3BlcnRpZXM7XG4gICAgdGhpcy5jbGFzc0hhc2hQcm9wZXJ0aWVzW2NsYXNzTmFtZV0gPSBoYXNoUHJvcGVydGllcztcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydGllc0J5T2JqKG9iajogYW55KTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgaWYgKCFvYmogfHwgIW9iai5nZXRUeXBlKSByZXR1cm4gW107XG4gICAgdmFyIHJlczogYW55ID0ge307XG4gICAgdmFyIHByb3BzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKG9iai5nZXRUeXBlKCkpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc1twcm9wc1tpXS5uYW1lXSA9IHByb3BzW2ldO1xuICAgIH1cbiAgICB2YXIgZHluYW1pY1Byb3BzID0gISFvYmouZ2V0RHluYW1pY1R5cGVcbiAgICAgID8gdGhpcy5nZXRQcm9wZXJ0aWVzKG9iai5nZXREeW5hbWljVHlwZSgpKVxuICAgICAgOiBudWxsO1xuICAgIGlmIChkeW5hbWljUHJvcHMgJiYgZHluYW1pY1Byb3BzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHluYW1pY1Byb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBkUHJvcCA9IGR5bmFtaWNQcm9wc1tpXTtcbiAgICAgICAgaWYgKCEhcmVzW2RQcm9wLm5hbWVdKSBjb250aW51ZTtcbiAgICAgICAgcmVzW2RQcm9wLm5hbWVdID0gZFByb3A7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXMpLm1hcCgoa2V5KSA9PiByZXNba2V5XSk7XG4gIH1cbiAgcHVibGljIGdldER5bmFtaWNQcm9wZXJ0aWVzQnlPYmooXG4gICAgb2JqOiBhbnksXG4gICAgZHluYW1pY1R5cGU6IHN0cmluZyA9IG51bGxcbiAgKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgaWYgKCFvYmogfHwgIW9iai5nZXRUeXBlIHx8ICghb2JqLmdldER5bmFtaWNUeXBlICYmICFkeW5hbWljVHlwZSkpXG4gICAgICByZXR1cm4gW107XG4gICAgdmFyIGRUeXBlID0gISFkeW5hbWljVHlwZSA/IGR5bmFtaWNUeXBlIDogb2JqLmdldER5bmFtaWNUeXBlKCk7XG4gICAgaWYgKCFkVHlwZSkgcmV0dXJuIFtdO1xuICAgIHZhciBkeW5hbWljUHJvcHMgPSB0aGlzLmdldFByb3BlcnRpZXMoZFR5cGUpO1xuICAgIGlmICghZHluYW1pY1Byb3BzIHx8IGR5bmFtaWNQcm9wcy5sZW5ndGggPT0gMCkgcmV0dXJuIFtdO1xuICAgIHZhciBoYXNoOiBhbnkgPSB7fTtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLmdldFByb3BlcnRpZXMob2JqLmdldFR5cGUoKSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgaGFzaFtwcm9wc1tpXS5uYW1lXSA9IHByb3BzW2ldO1xuICAgIH1cbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkeW5hbWljUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBkUHJvcCA9IGR5bmFtaWNQcm9wc1tpXTtcbiAgICAgIGlmICghaGFzaFtkUHJvcC5uYW1lXSkge1xuICAgICAgICByZXMucHVzaChkUHJvcCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGZpbmRQcm9wZXJ0eShcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuICApOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgIHZhciBoYXNoID0gdGhpcy5nZXRIYXNoUHJvcGVydGllcyhjbGFzc05hbWUpO1xuICAgIHZhciByZXMgPSBoYXNoW3Byb3BlcnR5TmFtZV07XG4gICAgcmV0dXJuICEhcmVzID8gcmVzIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZmluZFByb3BlcnRpZXMoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lczogQXJyYXk8c3RyaW5nPlxuICApOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGhhc2ggPSB0aGlzLmdldEhhc2hQcm9wZXJ0aWVzKGNsYXNzTmFtZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IGhhc2hbcHJvcGVydHlOYW1lc1tpXV07XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICByZXN1bHQucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsUHJvcGVydGllc0J5TmFtZShcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuICApOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgcmVzID0gbmV3IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4oKTtcbiAgICB2YXIgY2xhc3NlcyA9IHRoaXMuZ2V0QWxsQ2xhc3NlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNsYXNzSW5mbyA9IHRoaXMuZmluZENsYXNzKGNsYXNzZXNbaV0pO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjbGFzc0luZm8ucHJvcGVydGllcy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoY2xhc3NJbmZvLnByb3BlcnRpZXNbal0ubmFtZSA9PSBwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICByZXMucHVzaChjbGFzc0luZm8ucHJvcGVydGllc1tqXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0QWxsQ2xhc3NlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuY2xhc3Nlcykge1xuICAgICAgcmVzLnB1c2gobmFtZSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGNyZWF0ZUNsYXNzKG5hbWU6IHN0cmluZywganNvbjogYW55ID0gdW5kZWZpbmVkKTogYW55IHtcbiAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MobmFtZSk7XG4gICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gbnVsbDtcbiAgICBpZiAobWV0YURhdGFDbGFzcy5jcmVhdG9yKSByZXR1cm4gbWV0YURhdGFDbGFzcy5jcmVhdG9yKGpzb24pO1xuICAgIHZhciBwYXJlbnROYW1lID0gbWV0YURhdGFDbGFzcy5wYXJlbnROYW1lO1xuICAgIHdoaWxlIChwYXJlbnROYW1lKSB7XG4gICAgICBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MocGFyZW50TmFtZSk7XG4gICAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybiBudWxsO1xuICAgICAgcGFyZW50TmFtZSA9IG1ldGFEYXRhQ2xhc3MucGFyZW50TmFtZTtcbiAgICAgIGlmIChtZXRhRGF0YUNsYXNzLmNyZWF0b3IpXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUN1c3RvbVR5cGUobmFtZSwgbWV0YURhdGFDbGFzcy5jcmVhdG9yLCBqc29uKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVDdXN0b21UeXBlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVhdG9yOiBhbnksXG4gICAganNvbjogYW55ID0gdW5kZWZpbmVkXG4gICk6IGFueSB7XG4gICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcmVzID0gY3JlYXRvcihqc29uKTtcbiAgICB2YXIgY3VzdG9tVHlwZU5hbWUgPSBuYW1lO1xuICAgIHZhciBjdXN0b21UZW1wbGF0ZU5hbWUgPSByZXMuZ2V0VGVtcGxhdGVcbiAgICAgID8gcmVzLmdldFRlbXBsYXRlKClcbiAgICAgIDogcmVzLmdldFR5cGUoKTtcbiAgICByZXMuZ2V0VHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjdXN0b21UeXBlTmFtZTtcbiAgICB9O1xuICAgIHJlcy5nZXRUZW1wbGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjdXN0b21UZW1wbGF0ZU5hbWU7XG4gICAgfTtcbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzKHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0Q2hpbGRyZW5DbGFzc2VzKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYW5CZUNyZWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTxKc29uTWV0YWRhdGFDbGFzcz4ge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlc3VsdDogQXJyYXk8SnNvbk1ldGFkYXRhQ2xhc3M+ID0gW107XG4gICAgdGhpcy5maWxsQ2hpbGRyZW5DbGFzc2VzKG5hbWUsIGNhbkJlQ3JlYXRlZCwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBnZXRSZXF1aXJlZFByb3BlcnRpZXMobmFtZTogc3RyaW5nKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXMobmFtZSk7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHByb3BlcnRpZXNbaV0uaXNSZXF1aXJlZCkge1xuICAgICAgICByZXMucHVzaChwcm9wZXJ0aWVzW2ldLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBhZGRQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzSW5mb3M6IEFycmF5PGFueT4pIHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzSW5mb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkQ3VzdG9tUHJvcGVydHlDb3JlKG1ldGFEYXRhQ2xhc3MsIHByb3BlcnRpZXNJbmZvc1tpXSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhZGRQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHlJbmZvOiBhbnkpOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgIHJldHVybiB0aGlzLmFkZEN1c3RvbVByb3BlcnR5Q29yZSh0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpLCBwcm9wZXJ0eUluZm8pO1xuICB9XG4gIHByaXZhdGUgYWRkQ3VzdG9tUHJvcGVydHlDb3JlKFxuICAgIG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIHByb3BlcnR5SW5mbzogYW55XG4gICk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcHJvcGVydHkgPSBtZXRhRGF0YUNsYXNzLmNyZWF0ZVByb3BlcnR5KHByb3BlcnR5SW5mbyk7XG4gICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICBwcm9wZXJ0eS5pc0N1c3RvbSA9IHRydWU7XG4gICAgICB0aGlzLmFkZFByb3BlcnR5VG9DbGFzcyhtZXRhRGF0YUNsYXNzLCBwcm9wZXJ0eSk7XG4gICAgICB0aGlzLmVtcHR5Q2xhc3NQcm9wZXJ0aWVzSGFzaChtZXRhRGF0YUNsYXNzKTtcbiAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmFkZFByb3BlcnR5KG1ldGFEYXRhQ2xhc3MubmFtZSwgcHJvcGVydHkpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcGVydHk7XG4gIH1cbiAgcHVibGljIHJlbW92ZVByb3BlcnR5KGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcHJvcGVydHkgPSBtZXRhRGF0YUNsYXNzLmZpbmQocHJvcGVydHlOYW1lKTtcbiAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgIHRoaXMucmVtb3ZlUHJvcGVydHlGcm9tQ2xhc3MobWV0YURhdGFDbGFzcywgcHJvcGVydHkpO1xuICAgICAgdGhpcy5lbXB0eUNsYXNzUHJvcGVydGllc0hhc2gobWV0YURhdGFDbGFzcyk7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5yZW1vdmVQcm9wZXJ0eShcbiAgICAgICAgbWV0YURhdGFDbGFzcy5uYW1lLFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkUHJvcGVydHlUb0NsYXNzKFxuICAgIG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MuZmluZChwcm9wZXJ0eS5uYW1lKSAhPSBudWxsKSByZXR1cm47XG4gICAgbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkpO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUHJvcGVydHlGcm9tQ2xhc3MoXG4gICAgbWV0YURhdGFDbGFzczogSnNvbk1ldGFkYXRhQ2xhc3MsXG4gICAgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eVxuICApIHtcbiAgICB2YXIgaW5kZXggPSBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eSk7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgIG1ldGFEYXRhQ2xhc3MucHJvcGVydGllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHByaXZhdGUgZW1wdHlDbGFzc1Byb3BlcnRpZXNIYXNoKG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzKSB7XG4gICAgdGhpcy5jbGFzc1Byb3BlcnRpZXNbbWV0YURhdGFDbGFzcy5uYW1lXSA9IG51bGw7XG4gICAgdGhpcy5jbGFzc0hhc2hQcm9wZXJ0aWVzW21ldGFEYXRhQ2xhc3MubmFtZV0gPSBudWxsO1xuICAgIHZhciBjaGlsZENsYXNzZXMgPSB0aGlzLmdldENoaWxkcmVuQ2xhc3NlcyhtZXRhRGF0YUNsYXNzLm5hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNsYXNzUHJvcGVydGllc1tjaGlsZENsYXNzZXNbaV0ubmFtZV0gPSBudWxsO1xuICAgICAgdGhpcy5jbGFzc0hhc2hQcm9wZXJ0aWVzW2NoaWxkQ2xhc3Nlc1tpXS5uYW1lXSA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmlsbENoaWxkcmVuQ2xhc3NlcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2FuQmVDcmVhdGVkOiBib29sZWFuLFxuICAgIHJlc3VsdDogQXJyYXk8SnNvbk1ldGFkYXRhQ2xhc3M+XG4gICkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5DbGFzc2VzW25hbWVdO1xuICAgIGlmICghY2hpbGRyZW4pIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWNhbkJlQ3JlYXRlZCB8fCBjaGlsZHJlbltpXS5jcmVhdG9yKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsbENoaWxkcmVuQ2xhc3NlcyhjaGlsZHJlbltpXS5uYW1lLCBjYW5CZUNyZWF0ZWQsIHJlc3VsdCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBmaW5kQ2xhc3MobmFtZTogc3RyaW5nKTogSnNvbk1ldGFkYXRhQ2xhc3Mge1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlcyA9IHRoaXMuY2xhc3Nlc1tuYW1lXTtcbiAgICBpZiAoIXJlcykge1xuICAgICAgdmFyIG5ld05hbWUgPSB0aGlzLmFsdGVybmF0aXZlTmFtZXNbbmFtZV07XG4gICAgICBpZiAoISFuZXdOYW1lICYmIG5ld05hbWUgIT0gbmFtZSkgcmV0dXJuIHRoaXMuZmluZENsYXNzKG5ld05hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBpc0Rlc2NlbmRhbnRPZihjbGFzc05hbWU6IHN0cmluZywgYW5jZXN0b3JDbGFzc05hbWU6IHN0cmluZykge1xuICAgIGlmICghY2xhc3NOYW1lIHx8ICFhbmNlc3RvckNsYXNzTmFtZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBhbmNlc3RvckNsYXNzTmFtZSA9IGFuY2VzdG9yQ2xhc3NOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGNsYXNzXyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgaWYgKCFjbGFzc18pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHBhcmVudENsYXNzID0gY2xhc3NfO1xuICAgIGRvIHtcbiAgICAgIGlmIChwYXJlbnRDbGFzcy5uYW1lID09PSBhbmNlc3RvckNsYXNzTmFtZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHBhcmVudENsYXNzID0gdGhpcy5jbGFzc2VzW3BhcmVudENsYXNzLnBhcmVudE5hbWVdO1xuICAgIH0gd2hpbGUgKCEhcGFyZW50Q2xhc3MpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgYWRkQWx0ZXJOYXRpdmVDbGFzc05hbWUobmFtZTogc3RyaW5nLCBhbHRlcm5hdGl2ZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuYWx0ZXJuYXRpdmVOYW1lc1thbHRlcm5hdGl2ZU5hbWUudG9Mb3dlckNhc2UoKV0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcHJpdmF0ZSBmaWxsUHJvcGVydGllcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbGlzdDogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PixcbiAgICBoYXNoOiBIYXNoVGFibGU8SnNvbk9iamVjdFByb3BlcnR5PlxuICApIHtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuO1xuICAgIGlmIChtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUpIHtcbiAgICAgIHRoaXMuZmlsbFByb3BlcnRpZXMobWV0YURhdGFDbGFzcy5wYXJlbnROYW1lLCBsaXN0LCBoYXNoKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzW2ldO1xuICAgICAgdGhpcy5hZGRQcm9wZXJ0eUNvcmUocHJvcCwgbGlzdCwgaGFzaCk7XG4gICAgICBoYXNoW3Byb3AubmFtZV0gPSBwcm9wO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZFByb3BlcnR5Q29yZShcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIGxpc3Q6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAgaGFzaDogSGFzaFRhYmxlPEpzb25PYmplY3RQcm9wZXJ0eT5cbiAgKSB7XG4gICAgaWYgKCFoYXNoW3Byb3BlcnR5Lm5hbWVdKSB7XG4gICAgICBsaXN0LnB1c2gocHJvcGVydHkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT0gcHJvcGVydHkubmFtZSkge1xuICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9wZXJ0eS5tZXJnZVdpdGgobGlzdFtpbmRleF0pO1xuICAgIGxpc3RbaW5kZXhdID0gcHJvcGVydHk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uRXJyb3Ige1xuICBwdWJsaWMgZGVzY3JpcHRpb246IHN0cmluZyA9IFwiXCI7XG4gIHB1YmxpYyBhdDogTnVtYmVyID0gLTE7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0eXBlOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcpIHt9XG4gIHB1YmxpYyBnZXRGdWxsRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlICsgKHRoaXMuZGVzY3JpcHRpb24gPyBcIlxcblwiICsgdGhpcy5kZXNjcmlwdGlvbiA6IFwiXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvblVua25vd25Qcm9wZXJ0eUVycm9yIGV4dGVuZHMgSnNvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHByb3BlcnR5TmFtZTogc3RyaW5nLCBwdWJsaWMgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIFwidW5rbm93bnByb3BlcnR5XCIsXG4gICAgICBcIlRoZSBwcm9wZXJ0eSAnXCIgK1xuICAgICAgICBwcm9wZXJ0eU5hbWUgK1xuICAgICAgICBcIicgaW4gY2xhc3MgJ1wiICtcbiAgICAgICAgY2xhc3NOYW1lICtcbiAgICAgICAgXCInIGlzIHVua25vd24uXCJcbiAgICApO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZSk7XG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBcIlRoZSBsaXN0IG9mIGF2YWlsYWJsZSBwcm9wZXJ0aWVzIGFyZTogXCI7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPiAwKSB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLCBcIjtcbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiArPSBwcm9wZXJ0aWVzW2ldLm5hbWU7XG4gICAgICB9XG4gICAgICB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLlwiO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSBleHRlbmRzIEpzb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBiYXNlQ2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIHR5cGU6IHN0cmluZyxcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKHR5cGUsIG1lc3NhZ2UpO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBcIlRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGF2YWlsYWJsZTogXCI7XG4gICAgdmFyIHR5cGVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRDaGlsZHJlbkNsYXNzZXMoYmFzZUNsYXNzTmFtZSwgdHJ1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgPiAwKSB0aGlzLmRlc2NyaXB0aW9uICs9IFwiLCBcIjtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gXCInXCIgKyB0eXBlc1tpXS5uYW1lICsgXCInXCI7XG4gICAgfVxuICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gXCIuXCI7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uTWlzc2luZ1R5cGVFcnJvciBleHRlbmRzIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgYmFzZUNsYXNzTmFtZSxcbiAgICAgIFwibWlzc2luZ3R5cGVwcm9wZXJ0eVwiLFxuICAgICAgXCJUaGUgcHJvcGVydHkgdHlwZSBpcyBtaXNzaW5nIGluIHRoZSBvYmplY3QuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCBwcm9wZXJ0eTogJ1wiICtcbiAgICAgICAgcHJvcGVydHlOYW1lICtcbiAgICAgICAgXCInLlwiXG4gICAgKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25JbmNvcnJlY3RUeXBlRXJyb3IgZXh0ZW5kcyBKc29uTWlzc2luZ1R5cGVFcnJvckJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyBiYXNlQ2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGJhc2VDbGFzc05hbWUsXG4gICAgICBcImluY29ycmVjdHR5cGVwcm9wZXJ0eVwiLFxuICAgICAgXCJUaGUgcHJvcGVydHkgdHlwZSBpcyBpbmNvcnJlY3QgaW4gdGhlIG9iamVjdC4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHByb3BlcnR5OiAnXCIgK1xuICAgICAgICBwcm9wZXJ0eU5hbWUgK1xuICAgICAgICBcIicuXCJcbiAgICApO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvblJlcXVpcmVkUHJvcGVydHlFcnJvciBleHRlbmRzIEpzb25FcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBcInJlcXVpcmVkcHJvcGVydHlcIixcbiAgICAgIFwiVGhlIHByb3BlcnR5ICdcIiArXG4gICAgICAgIHByb3BlcnR5TmFtZSArXG4gICAgICAgIFwiJyBpcyByZXF1aXJlZCBpbiBjbGFzcyAnXCIgK1xuICAgICAgICBjbGFzc05hbWUgK1xuICAgICAgICBcIicuXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBKc29uT2JqZWN0IHtcbiAgcHJpdmF0ZSBzdGF0aWMgdHlwZVByb3BlcnR5TmFtZSA9IFwidHlwZVwiO1xuICBwcml2YXRlIHN0YXRpYyBwb3NpdGlvblByb3BlcnR5TmFtZSA9IFwicG9zXCI7XG4gIHByaXZhdGUgc3RhdGljIG1ldGFEYXRhVmFsdWUgPSBuZXcgSnNvbk1ldGFkYXRhKCk7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IG1ldGFEYXRhKCkge1xuICAgIHJldHVybiBKc29uT2JqZWN0Lm1ldGFEYXRhVmFsdWU7XG4gIH1cbiAgcHVibGljIGVycm9ycyA9IG5ldyBBcnJheTxKc29uRXJyb3I+KCk7XG4gIHB1YmxpYyBsaWdodFNlcmlhbGl6aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyB0b0pzb25PYmplY3Qob2JqOiBhbnksIHN0b3JlRGVmYXVsdHMgPSBmYWxzZSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudG9Kc29uT2JqZWN0Q29yZShvYmosIG51bGwsIHN0b3JlRGVmYXVsdHMpO1xuICB9XG4gIHB1YmxpYyB0b09iamVjdChqc29uT2JqOiBhbnksIG9iajogYW55KSB7XG4gICAgdGhpcy50b09iamVjdENvcmUoanNvbk9iaiwgb2JqKTtcbiAgICBpZiAoISFvYmouZ2V0VHlwZSkge1xuICAgICAgdmFyIGVycm9yID0gdGhpcy5nZXRSZXF1aXJlZEVycm9yKGpzb25PYmosIG9iai5nZXRUeXBlKCkpO1xuICAgICAgaWYgKCEhZXJyb3IpIHtcbiAgICAgICAgdGhpcy5hZGROZXdFcnJvcihlcnJvciwganNvbk9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyB0b09iamVjdENvcmUoanNvbk9iajogYW55LCBvYmo6IGFueSkge1xuICAgIGlmICghanNvbk9iaikgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gbnVsbDtcbiAgICB2YXIgb2JqVHlwZSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgbmVlZEFkZEVycm9ycyA9IHRydWU7XG4gICAgaWYgKG9iai5nZXRUeXBlKSB7XG4gICAgICBvYmpUeXBlID0gb2JqLmdldFR5cGUoKTtcbiAgICAgIHByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMob2JqVHlwZSk7XG4gICAgICBuZWVkQWRkRXJyb3JzID1cbiAgICAgICAgISFvYmpUeXBlICYmICFKc29uT2JqZWN0Lm1ldGFEYXRhLmlzRGVzY2VuZGFudE9mKG9ialR5cGUsIFwiaXRlbXZhbHVlXCIpO1xuICAgIH1cbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybjtcbiAgICBpZiAob2JqLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICBvYmouc3RhcnRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB9XG4gICAgcHJvcGVydGllcyA9IHRoaXMuYWRkRHluYW1pY1Byb3BlcnRpZXMob2JqLCBqc29uT2JqLCBwcm9wZXJ0aWVzKTtcbiAgICBmb3IgKHZhciBrZXkgaW4ganNvbk9iaikge1xuICAgICAgaWYgKGtleSA9PT0gSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lKSBjb250aW51ZTtcbiAgICAgIGlmIChrZXkgPT09IEpzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgb2JqW2tleV0gPSBqc29uT2JqW2tleV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5maW5kUHJvcGVydHkocHJvcGVydGllcywga2V5KTtcbiAgICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgICAgaWYgKG5lZWRBZGRFcnJvcnMpIHtcbiAgICAgICAgICB0aGlzLmFkZE5ld0Vycm9yKFxuICAgICAgICAgICAgbmV3IEpzb25Vbmtub3duUHJvcGVydHlFcnJvcihrZXkudG9TdHJpbmcoKSwgb2JqVHlwZSksXG4gICAgICAgICAgICBqc29uT2JqXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMudmFsdWVUb09iaihqc29uT2JqW2tleV0sIG9iaiwgcHJvcGVydHkpO1xuICAgIH1cbiAgICBpZiAob2JqLmVuZExvYWRpbmdGcm9tSnNvbikge1xuICAgICAgb2JqLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdG9Kc29uT2JqZWN0Q29yZShcbiAgICBvYmo6IGFueSxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIHN0b3JlRGVmYXVsdHMgPSBmYWxzZVxuICApOiBhbnkge1xuICAgIGlmICghb2JqIHx8ICFvYmouZ2V0VHlwZSkgcmV0dXJuIG9iajtcbiAgICBpZiAodHlwZW9mIG9iai5nZXREYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBvYmouZ2V0RGF0YSgpO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiAhcHJvcGVydHkuY2xhc3NOYW1lKSB7XG4gICAgICAoPGFueT5yZXN1bHQpW0pzb25PYmplY3QudHlwZVByb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eS5nZXRPYmpUeXBlKFxuICAgICAgICBvYmouZ2V0VHlwZSgpXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnByb3BlcnRpZXNUb0pzb24oXG4gICAgICBvYmosXG4gICAgICBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMob2JqLmdldFR5cGUoKSksXG4gICAgICByZXN1bHQsXG4gICAgICBzdG9yZURlZmF1bHRzXG4gICAgKTtcbiAgICB0aGlzLnByb3BlcnRpZXNUb0pzb24oXG4gICAgICBvYmosXG4gICAgICB0aGlzLmdldER5bmFtaWNQcm9wZXJ0aWVzKG9iaiksXG4gICAgICByZXN1bHQsXG4gICAgICBzdG9yZURlZmF1bHRzXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqOiBhbnkpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICByZXR1cm4gU2VyaWFsaXplci5nZXREeW5hbWljUHJvcGVydGllc0J5T2JqKG9iaik7XG4gIH1cbiAgcHJpdmF0ZSBhZGREeW5hbWljUHJvcGVydGllcyhcbiAgICBvYmo6IGFueSxcbiAgICBqc29uT2JqOiBhbnksXG4gICAgcHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PlxuICApOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICBpZiAoIW9iai5nZXREeW5hbWljUHJvcGVydHlOYW1lKSByZXR1cm4gcHJvcGVydGllcztcbiAgICB2YXIgZHluYW1pY1Byb3BOYW1lID0gb2JqLmdldER5bmFtaWNQcm9wZXJ0eU5hbWUoKTtcbiAgICBpZiAoIWR5bmFtaWNQcm9wTmFtZSkgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgaWYgKGpzb25PYmpbZHluYW1pY1Byb3BOYW1lXSkge1xuICAgICAgb2JqW2R5bmFtaWNQcm9wTmFtZV0gPSBqc29uT2JqW2R5bmFtaWNQcm9wTmFtZV07XG4gICAgfVxuICAgIHZhciBkeW5hbWljUHJvcGVydGllcyA9IHRoaXMuZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChwcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkeW5hbWljUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goZHluYW1pY1Byb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgcHJvcGVydGllc1RvSnNvbihcbiAgICBvYmo6IGFueSxcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+LFxuICAgIGpzb246IGFueSxcbiAgICBzdG9yZURlZmF1bHRzID0gZmFsc2VcbiAgKSB7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudmFsdWVUb0pzb24ob2JqLCBqc29uLCBwcm9wZXJ0aWVzW2ldLCBzdG9yZURlZmF1bHRzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHZhbHVlVG9Kc29uKFxuICAgIG9iajogYW55LFxuICAgIHJlc3VsdDogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksXG4gICAgc3RvcmVEZWZhdWx0cyA9IGZhbHNlXG4gICkge1xuICAgIGlmIChcbiAgICAgIHByb3BlcnR5LmlzU2VyaWFsaXphYmxlID09PSBmYWxzZSB8fFxuICAgICAgKHByb3BlcnR5LmlzTGlnaHRTZXJpYWxpemFibGUgPT09IGZhbHNlICYmIHRoaXMubGlnaHRTZXJpYWxpemluZylcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdmFyIHZhbHVlID0gcHJvcGVydHkuZ2V0VmFsdWUob2JqKTtcbiAgICBpZiAoIXN0b3JlRGVmYXVsdHMgJiYgcHJvcGVydHkuaXNEZWZhdWx0VmFsdWUodmFsdWUpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUFycmF5KHZhbHVlKSkge1xuICAgICAgdmFyIGFyclZhbHVlID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFyclZhbHVlLnB1c2godGhpcy50b0pzb25PYmplY3RDb3JlKHZhbHVlW2ldLCBwcm9wZXJ0eSwgc3RvcmVEZWZhdWx0cykpO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSBhcnJWYWx1ZS5sZW5ndGggPiAwID8gYXJyVmFsdWUgOiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRoaXMudG9Kc29uT2JqZWN0Q29yZSh2YWx1ZSwgcHJvcGVydHksIHN0b3JlRGVmYXVsdHMpO1xuICAgIH1cbiAgICB2YXIgaGFzVmFsdWUgPVxuICAgICAgdHlwZW9mIG9ialtcImdldFByb3BlcnR5VmFsdWVcIl0gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgb2JqW1wiZ2V0UHJvcGVydHlWYWx1ZVwiXShwcm9wZXJ0eS5uYW1lLCBudWxsKSAhPT0gbnVsbDtcbiAgICBpZiAoKHN0b3JlRGVmYXVsdHMgJiYgaGFzVmFsdWUpIHx8ICFwcm9wZXJ0eS5pc0RlZmF1bHRWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdFtwcm9wZXJ0eS5uYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVUb09iaih2YWx1ZTogYW55LCBvYmo6IGFueSwgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5yZW1vdmVQb3MocHJvcGVydHksIHZhbHVlKTtcbiAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiBwcm9wZXJ0eS5oYXNUb1VzZVNldFZhbHVlKSB7XG4gICAgICBwcm9wZXJ0eS5zZXRWYWx1ZShvYmosIHZhbHVlLCB0aGlzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUFycmF5KHZhbHVlKSkge1xuICAgICAgdGhpcy52YWx1ZVRvQXJyYXkodmFsdWUsIG9iaiwgcHJvcGVydHkubmFtZSwgcHJvcGVydHkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmV3T2JqID0gdGhpcy5jcmVhdGVOZXdPYmoodmFsdWUsIHByb3BlcnR5KTtcbiAgICBpZiAobmV3T2JqLm5ld09iaikge1xuICAgICAgdGhpcy50b09iamVjdENvcmUodmFsdWUsIG5ld09iai5uZXdPYmopO1xuICAgICAgdmFsdWUgPSBuZXdPYmoubmV3T2JqO1xuICAgIH1cbiAgICBpZiAoIW5ld09iai5lcnJvcikge1xuICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpIHtcbiAgICAgICAgcHJvcGVydHkuc2V0VmFsdWUob2JqLCB2YWx1ZSwgdGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmpbcHJvcGVydHkubmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmVQb3MocHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSwgdmFsdWU6IGFueSkge1xuICAgIGlmICghcHJvcGVydHkgfHwgIXByb3BlcnR5LnR5cGUgfHwgcHJvcGVydHkudHlwZS5pbmRleE9mKFwidmFsdWVcIikgPCAwKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMucmVtb3ZlUG9zRnJvbU9iaih2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmVQb3NGcm9tT2JqKG9iajogYW55KSB7XG4gICAgaWYgKCFvYmopIHJldHVybjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnJlbW92ZVBvc0Zyb21PYmoob2JqW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhb2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdKSB7XG4gICAgICBkZWxldGUgb2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzVmFsdWVBcnJheSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTmV3T2JqKHZhbHVlOiBhbnksIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHkpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IGFueSA9IHsgbmV3T2JqOiBudWxsLCBlcnJvcjogbnVsbCB9O1xuICAgIHZhciBjbGFzc05hbWUgPSB2YWx1ZVtKc29uT2JqZWN0LnR5cGVQcm9wZXJ0eU5hbWVdO1xuICAgIGlmICghY2xhc3NOYW1lICYmIHByb3BlcnR5ICE9IG51bGwgJiYgcHJvcGVydHkuY2xhc3NOYW1lKSB7XG4gICAgICBjbGFzc05hbWUgPSBwcm9wZXJ0eS5jbGFzc05hbWU7XG4gICAgfVxuICAgIGNsYXNzTmFtZSA9IHByb3BlcnR5LmdldENsYXNzTmFtZShjbGFzc05hbWUpO1xuICAgIHJlc3VsdC5uZXdPYmogPSBjbGFzc05hbWVcbiAgICAgID8gSnNvbk9iamVjdC5tZXRhRGF0YS5jcmVhdGVDbGFzcyhjbGFzc05hbWUsIHZhbHVlKVxuICAgICAgOiBudWxsO1xuICAgIHJlc3VsdC5lcnJvciA9IHRoaXMuY2hlY2tOZXdPYmplY3RPbkVycm9ycyhcbiAgICAgIHJlc3VsdC5uZXdPYmosXG4gICAgICB2YWx1ZSxcbiAgICAgIHByb3BlcnR5LFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgY2hlY2tOZXdPYmplY3RPbkVycm9ycyhcbiAgICBuZXdPYmo6IGFueSxcbiAgICB2YWx1ZTogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksXG4gICAgY2xhc3NOYW1lOiBzdHJpbmdcbiAgKTogSnNvbkVycm9yIHtcbiAgICB2YXIgZXJyb3IgPSBudWxsO1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGVycm9yID0gdGhpcy5nZXRSZXF1aXJlZEVycm9yKHZhbHVlLCBjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcGVydHkuYmFzZUNsYXNzTmFtZSkge1xuICAgICAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgICAgIGVycm9yID0gbmV3IEpzb25NaXNzaW5nVHlwZUVycm9yKFxuICAgICAgICAgICAgcHJvcGVydHkubmFtZSxcbiAgICAgICAgICAgIHByb3BlcnR5LmJhc2VDbGFzc05hbWVcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yID0gbmV3IEpzb25JbmNvcnJlY3RUeXBlRXJyb3IoXG4gICAgICAgICAgICBwcm9wZXJ0eS5uYW1lLFxuICAgICAgICAgICAgcHJvcGVydHkuYmFzZUNsYXNzTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICB0aGlzLmFkZE5ld0Vycm9yKGVycm9yLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuICBwcml2YXRlIGdldFJlcXVpcmVkRXJyb3IodmFsdWU6IGFueSwgY2xhc3NOYW1lOiBzdHJpbmcpOiBKc29uRXJyb3Ige1xuICAgIHZhciByZXF1aXJlZFByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFJlcXVpcmVkUHJvcGVydGllcyhcbiAgICAgIGNsYXNzTmFtZVxuICAgICk7XG4gICAgaWYgKCFyZXF1aXJlZFByb3BlcnRpZXMpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVxdWlyZWRQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXZhbHVlW3JlcXVpcmVkUHJvcGVydGllc1tpXV0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKc29uUmVxdWlyZWRQcm9wZXJ0eUVycm9yKHJlcXVpcmVkUHJvcGVydGllc1tpXSwgY2xhc3NOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBhZGROZXdFcnJvcihlcnJvcjogSnNvbkVycm9yLCBqc29uT2JqOiBhbnkpIHtcbiAgICBpZiAoanNvbk9iaiAmJiBqc29uT2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdKSB7XG4gICAgICBlcnJvci5hdCA9IGpzb25PYmpbSnNvbk9iamVjdC5wb3NpdGlvblByb3BlcnR5TmFtZV0uc3RhcnQ7XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICB9XG4gIHByaXZhdGUgdmFsdWVUb0FycmF5KFxuICAgIHZhbHVlOiBBcnJheTxhbnk+LFxuICAgIG9iajogYW55LFxuICAgIGtleTogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgaWYgKG9ialtrZXldICYmIHZhbHVlLmxlbmd0aCA+IDApIG9ialtrZXldLnNwbGljZSgwLCBvYmpba2V5XS5sZW5ndGgpO1xuICAgIHZhciB2YWx1ZVJlcyA9IG9ialtrZXldID8gb2JqW2tleV0gOiBbXTtcbiAgICB0aGlzLmFkZFZhbHVlc0ludG9BcnJheSh2YWx1ZSwgdmFsdWVSZXMsIHByb3BlcnR5KTtcbiAgICBpZiAoIW9ialtrZXldKSBvYmpba2V5XSA9IHZhbHVlUmVzO1xuICB9XG4gIHByaXZhdGUgYWRkVmFsdWVzSW50b0FycmF5KFxuICAgIHZhbHVlOiBBcnJheTxhbnk+LFxuICAgIHJlc3VsdDogQXJyYXk8YW55PixcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5XG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3T2JqKHZhbHVlW2ldLCBwcm9wZXJ0eSk7XG4gICAgICBpZiAobmV3VmFsdWUubmV3T2JqKSB7XG4gICAgICAgIGlmICghIXZhbHVlW2ldLm5hbWUpIHtcbiAgICAgICAgICBuZXdWYWx1ZS5uZXdPYmoubmFtZSA9IHZhbHVlW2ldLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnB1c2gobmV3VmFsdWUubmV3T2JqKTtcbiAgICAgICAgdGhpcy50b09iamVjdENvcmUodmFsdWVbaV0sIG5ld1ZhbHVlLm5ld09iaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIW5ld1ZhbHVlLmVycm9yKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmluZFByb3BlcnR5KFxuICAgIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAga2V5OiBhbnlcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgaWYgKHByb3AubmFtZSA9PSBrZXkgfHwgcHJvcC5hbHRlcm5hdGl2ZU5hbWUgPT0ga2V5KSByZXR1cm4gcHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IHZhciBTZXJpYWxpemVyID0gSnNvbk9iamVjdC5tZXRhRGF0YTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9qc29ub2JqZWN0LnRzIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzNfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJSZWFjdFwiLFwiY29tbW9uanMyXCI6XCJyZWFjdFwiLFwiY29tbW9uanNcIjpcInJlYWN0XCIsXCJhbWRcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImV4cG9ydCBpbnRlcmZhY2UgSGFzaFRhYmxlPFQ+IHtcbiAgW2tleTogc3RyaW5nXTogVDtcbn1cblxuZXhwb3J0IGNsYXNzIEhlbHBlcnMge1xuICAvKipcbiAgICogQSBzdGF0aWMgbWV0aG9kcyB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIHVuZGVyZmluZWQsIG51bGwsIGVtcHR5IHN0cmluZyBvciBlbXB0eSBhcnJheS5cbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzVmFsdWVFbXB0eSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCEhdmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gIXZhbHVlICYmIHZhbHVlICE9PSAwICYmIHZhbHVlICE9PSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQXJyYXlDb250YWluc0VxdWFsKHg6IGFueSwgeTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHgpIHx8ICFBcnJheS5pc0FycmF5KHkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGogPSAwO1xuICAgICAgZm9yICg7IGogPCB5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoeFtpXSwgeVtqXSkpIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGogPT09IHkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNBcnJheXNFcXVhbChcbiAgICB4OiBhbnksXG4gICAgeTogYW55LFxuICAgIGlnbm9yZU9yZGVyOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHgpIHx8ICFBcnJheS5pc0FycmF5KHkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpZ25vcmVPcmRlcikge1xuICAgICAgdmFyIHhTb3J0ZWQgPSBbXTtcbiAgICAgIHZhciB5U29ydGVkID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgeFNvcnRlZC5wdXNoKHhbaV0pO1xuICAgICAgICB5U29ydGVkLnB1c2goeVtpXSk7XG4gICAgICB9XG4gICAgICB4U29ydGVkLnNvcnQoKTtcbiAgICAgIHlTb3J0ZWQuc29ydCgpO1xuICAgICAgeCA9IHhTb3J0ZWQ7XG4gICAgICB5ID0geVNvcnRlZDtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh4W2ldLCB5W2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzVHdvVmFsdWVFcXVhbHMoXG4gICAgeDogYW55LFxuICAgIHk6IGFueSxcbiAgICBpZ25vcmVPcmRlcjogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICh4ID09PSB5KSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHgpICYmIHgubGVuZ3RoID09PSAwICYmIHR5cGVvZiB5ID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeSkgJiYgeS5sZW5ndGggPT09IDAgJiYgdHlwZW9mIHggPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoKHggPT09IHVuZGVmaW5lZCB8fCB4ID09PSBudWxsKSAmJiB5ID09PSBcIlwiKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoKHkgPT09IHVuZGVmaW5lZCB8fCB5ID09PSBudWxsKSAmJiB4ID09PSBcIlwiKSByZXR1cm4gdHJ1ZTtcblxuICAgIGlmICh0eXBlb2YgeCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgeSA9PSBcInN0cmluZ1wiKSByZXR1cm4geCA9PSB5O1xuXG4gICAgaWYgKEhlbHBlcnMuaXNDb252ZXJ0aWJsZVRvTnVtYmVyKHgpICYmIEhlbHBlcnMuaXNDb252ZXJ0aWJsZVRvTnVtYmVyKHkpKSB7XG4gICAgICBpZiAocGFyc2VJbnQoeCkgPT09IHBhcnNlSW50KHkpICYmIHBhcnNlRmxvYXQoeCkgPT09IHBhcnNlRmxvYXQoeSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eSh4KSAmJiBIZWxwZXJzLmlzVmFsdWVFbXB0eSh5KSkgfHxcbiAgICAgIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh4KSAmJiAhSGVscGVycy5pc1ZhbHVlRW1wdHkoeSkpXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICgoeCA9PT0gdHJ1ZSB8fCB4ID09PSBmYWxzZSkgJiYgdHlwZW9mIHkgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHgudG9TdHJpbmcoKSA9PT0geS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBpZiAoKHkgPT09IHRydWUgfHwgeSA9PT0gZmFsc2UpICYmIHR5cGVvZiB4ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB5LnRvU3RyaW5nKCkgPT09IHgudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICB9XG4gICAgaWYgKCEoeCBpbnN0YW5jZW9mIE9iamVjdCkgJiYgISh5IGluc3RhbmNlb2YgT2JqZWN0KSkgcmV0dXJuIHggPT0geTtcbiAgICBpZiAoISh4IGluc3RhbmNlb2YgT2JqZWN0KSB8fCAhKHkgaW5zdGFuY2VvZiBPYmplY3QpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHhbXCJlcXVhbHNcIl0pIHJldHVybiB4LmVxdWFscyh5KTtcbiAgICBpZiAoISF4LnRvSlNPTiAmJiAhIXkudG9KU09OKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHgudG9KU09OKCksIHkudG9KU09OKCkpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSAmJiBBcnJheS5pc0FycmF5KHkpKVxuICAgICAgcmV0dXJuIEhlbHBlcnMuaXNBcnJheXNFcXVhbCh4LCB5LCBpZ25vcmVPcmRlcik7XG5cbiAgICBmb3IgKHZhciBwIGluIHgpIHtcbiAgICAgIGlmICgheC5oYXNPd25Qcm9wZXJ0eShwKSkgY29udGludWU7XG4gICAgICBpZiAoIXkuaGFzT3duUHJvcGVydHkocCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh4W3BdID09PSB5W3BdKSBjb250aW51ZTtcbiAgICAgIGlmICh0eXBlb2YgeFtwXSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKCF0aGlzLmlzVHdvVmFsdWVFcXVhbHMoeFtwXSwgeVtwXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChwIGluIHkpIHtcbiAgICAgIGlmICh5Lmhhc093blByb3BlcnR5KHApICYmICF4Lmhhc093blByb3BlcnR5KHApKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyByYW5kb21pemVBcnJheTxUPihhcnJheTogQXJyYXk8VD4pOiBBcnJheTxUPiB7XG4gICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICB2YXIgdGVtcCA9IGFycmF5W2ldO1xuICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICAgIGFycmF5W2pdID0gdGVtcDtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0VW5iaW5kVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCEhdmFsdWUgJiYgdmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIC8vZG8gbm90IHJldHVybiB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UhISFcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUNvcHkob2JqOiBhbnkpIHtcbiAgICB2YXIgcmVzOiBhbnkgPSB7fTtcbiAgICBpZiAoIW9iaikgcmV0dXJuIHJlcztcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICByZXNba2V5XSA9IG9ialtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNDb252ZXJ0aWJsZVRvTnVtYmVyKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgIWlzTmFOKHZhbHVlKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBpc051bWJlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgJiZcbiAgICAgICEhdmFsdWUgJiZcbiAgICAgIHZhbHVlLmluZGV4T2YoXCIweFwiKSA9PSAwICYmXG4gICAgICB2YWx1ZS5sZW5ndGggPiAzMlxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIWlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKSAmJiBpc0Zpbml0ZSh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRNYXhMZW5ndGgobWF4TGVuZ3RoOiBudW1iZXIsIHN1cnZleUxlbmd0aDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAobWF4TGVuZ3RoIDwgMCkge1xuICAgICAgbWF4TGVuZ3RoID0gc3VydmV5TGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gbWF4TGVuZ3RoID4gMCA/IG1heExlbmd0aCA6IG51bGw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXROdW1iZXJCeUluZGV4KGluZGV4OiBudW1iZXIsIHN0YXJ0SW5kZXhTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSAxO1xuICAgIHZhciBwcmVmaXggPSBcIlwiO1xuICAgIHZhciBwb3N0Zml4ID0gXCIuXCI7XG4gICAgdmFyIGlzTnVtZXJpYyA9IHRydWU7XG4gICAgdmFyIHN0ckluZGV4ID0gXCJBXCI7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgaWYgKCEhc3RhcnRJbmRleFN0cikge1xuICAgICAgc3RyID0gc3RhcnRJbmRleFN0cjtcbiAgICAgIHZhciBpbmQgPSBzdHIubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBoYXNEaWdpdCA9IGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNDaGFyRGlnaXQoc3RyW2ldKSkge1xuICAgICAgICAgIGhhc0RpZ2l0ID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNoZWNrTGV0dGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChoYXNEaWdpdCAmJiAhSGVscGVycy5pc0NoYXJEaWdpdChzdHJbaW5kXSkpIHx8XG4gICAgICAgICAgSGVscGVycy5pc0NoYXJOb3RMZXR0ZXJBbmREaWdpdChzdHJbaW5kXSlcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICB3aGlsZSAoaW5kID49IDAgJiYgY2hlY2tMZXR0ZXIoKSkgaW5kLS07XG4gICAgICB2YXIgbmV3UG9zdGZpeCA9IFwiXCI7XG4gICAgICBpZiAoaW5kIDwgc3RyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgbmV3UG9zdGZpeCA9IHN0ci5zdWJzdHIoaW5kICsgMSk7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgaW5kICsgMSk7XG4gICAgICB9XG4gICAgICBpbmQgPSBzdHIubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlIChpbmQgPj0gMCkge1xuICAgICAgICBpZiAoY2hlY2tMZXR0ZXIoKSkgYnJlYWs7XG4gICAgICAgIGluZC0tO1xuICAgICAgICBpZiAoIWhhc0RpZ2l0KSBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0ckluZGV4ID0gc3RyLnN1YnN0cihpbmQgKyAxKTtcbiAgICAgIHByZWZpeCA9IHN0ci5zdWJzdHIoMCwgaW5kICsgMSk7XG4gICAgICBpZiAocGFyc2VJbnQoc3RySW5kZXgpKSBzdGFydEluZGV4ID0gcGFyc2VJbnQoc3RySW5kZXgpO1xuICAgICAgZWxzZSBpZiAoc3RySW5kZXgubGVuZ3RoID09IDEpIGlzTnVtZXJpYyA9IGZhbHNlO1xuICAgICAgaWYgKCEhbmV3UG9zdGZpeCB8fCAhIXByZWZpeCkge1xuICAgICAgICBwb3N0Zml4ID0gbmV3UG9zdGZpeDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTnVtZXJpYykgcmV0dXJuIHByZWZpeCArIChpbmRleCArIHN0YXJ0SW5kZXgpLnRvU3RyaW5nKCkgKyBwb3N0Zml4O1xuICAgIHJldHVybiAoXG4gICAgICBwcmVmaXggKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHN0ckluZGV4LmNoYXJDb2RlQXQoMCkgKyBpbmRleCkgKyBwb3N0Zml4XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQ2hhck5vdExldHRlckFuZERpZ2l0KGNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2gudG9VcHBlckNhc2UoKSA9PSBjaC50b0xvd2VyQ2FzZSgpICYmICFIZWxwZXJzLmlzQ2hhckRpZ2l0KGNoKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQ2hhckRpZ2l0KGNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2ggPj0gXCIwXCIgJiYgY2ggPD0gXCI5XCI7XG4gIH1cbn1cbmlmICghKDxhbnk+U3RyaW5nLnByb3RvdHlwZSlbXCJmb3JtYXRcIl0pIHtcbiAgKDxhbnk+U3RyaW5nLnByb3RvdHlwZSlbXCJmb3JtYXRcIl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIHRoaXMucmVwbGFjZSgveyhcXGQrKX0vZywgZnVuY3Rpb24gKG1hdGNoOiBhbnksIG51bWJlcjogYW55KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGFyZ3NbbnVtYmVyXSAhPSBcInVuZGVmaW5lZFwiID8gYXJnc1tudW1iZXJdIDogbWF0Y2g7XG4gICAgfSk7XG4gIH07XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvaGVscGVycy50cyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IElTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvblwiO1xuaW1wb3J0IHsgQmFzZSwgSVRpdGxlT3duZXIgfSBmcm9tIFwiLi4vYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5TG9jU3RyaW5nIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PGFueSwgYW55PiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHsgY2hhbmdlZDogMCB9O1xuICB9XG4gIHByaXZhdGUgZ2V0IGxvY1N0cigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMubG9jU3RyO1xuICB9XG4gIHByaXZhdGUgZ2V0IHN0eWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuc3R5bGU7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgaWYgKCF0aGlzLmxvY1N0cikgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmxvY1N0ci5vbkNoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLnNldFN0YXRlKHsgY2hhbmdlZDogc2VsZi5zdGF0ZS5jaGFuZ2VkICsgMSB9KTtcbiAgICB9O1xuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGlmICghdGhpcy5sb2NTdHIpIHJldHVybjtcbiAgICB0aGlzLmxvY1N0ci5vbkNoYW5nZWQgPSBmdW5jdGlvbiAoKSB7fTtcbiAgfVxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5sb2NTdHIpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLmxvY1N0ci5oYXNIdG1sKSB7XG4gICAgICBsZXQgaHRtbFZhbHVlID0geyBfX2h0bWw6IHRoaXMubG9jU3RyLnJlbmRlcmVkSHRtbCB9O1xuICAgICAgcmV0dXJuIDxzcGFuIHN0eWxlPXt0aGlzLnN0eWxlfSBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbFZhbHVlfSAvPjtcbiAgICB9XG4gICAgcmV0dXJuIDxzcGFuIHN0eWxlPXt0aGlzLnN0eWxlfT57dGhpcy5sb2NTdHIucmVuZGVyZWRIdG1sfTwvc3Bhbj47XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleUVsZW1lbnRCYXNlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PGFueSwgYW55PiB7XG4gIHB1YmxpYyBzdGF0aWMgcmVuZGVyTG9jU3RyaW5nKFxuICAgIGxvY1N0cjogTG9jYWxpemFibGVTdHJpbmcsXG4gICAgc3R5bGU6IGFueSA9IG51bGwsXG4gICAga2V5Pzogc3RyaW5nXG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gPFN1cnZleUxvY1N0cmluZyBsb2NTdHI9e2xvY1N0cn0gc3R5bGU9e3N0eWxlfSBrZXk9e2tleX0gLz47XG4gIH1cbiAgcHJpdmF0ZSBpc1JlbmRlcmluZ1ZhbHVlOiBib29sZWFuO1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMubWFrZUJhc2VFbGVtZW50c1JlYWN0KCk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy51bk1ha2VCYXNlRWxlbWVudHNSZWFjdCgpO1xuICB9XG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IGFueSwgcHJldlN0YXRlOiBhbnkpIHtcbiAgICB0aGlzLm1ha2VCYXNlRWxlbWVudHNSZWFjdCgpO1xuICB9XG4gIHJlbmRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLmNhblJlbmRlcigpKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLmlzUmVuZGVyaW5nVmFsdWUgPSB0cnVlO1xuICAgIHZhciByZXMgPSB0aGlzLnJlbmRlckVsZW1lbnQoKTtcbiAgICB0aGlzLmlzUmVuZGVyaW5nVmFsdWUgPSBmYWxzZTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaXNSZW5kZXJpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZW5kZXJpbmdWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVuZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcml2YXRlIG1ha2VCYXNlRWxlbWVudHNSZWFjdCgpIHtcbiAgICB2YXIgZWxzID0gdGhpcy5nZXRTdGF0ZUVsZW1lbnRzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMubWFrZUJhc2VFbGVtZW50UmVhY3QoZWxzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSB1bk1ha2VCYXNlRWxlbWVudHNSZWFjdCgpIHtcbiAgICB2YXIgZWxzID0gdGhpcy5nZXRTdGF0ZUVsZW1lbnRzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudW5NYWtlQmFzZUVsZW1lbnRSZWFjdChlbHNbaV0pO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhdGVFbGVtZW50cygpOiBBcnJheTxCYXNlPiB7XG4gICAgdmFyIGVsID0gdGhpcy5nZXRTdGF0ZUVsZW1lbnQoKTtcbiAgICByZXR1cm4gISFlbCA/IFtlbF0gOiBbXTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhdGVFbGVtZW50KCk6IEJhc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaXNEaXNwbGF5TW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pc0Rpc3BsYXlNb2RlIHx8IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJMb2NTdHJpbmcoXG4gICAgbG9jU3RyOiBMb2NhbGl6YWJsZVN0cmluZyxcbiAgICBzdHlsZTogYW55ID0gbnVsbFxuICApOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIFN1cnZleUVsZW1lbnRCYXNlLnJlbmRlckxvY1N0cmluZyhsb2NTdHIsIHN0eWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgdGl0bGVLZXlJbmRleCA9IDA7XG4gIHByaXZhdGUgdGl0bGVLZXlQcmVmaXggPSBcIi10aXRsZUtleS1cIjtcbiAgcHJpdmF0ZSBnZXRUaXRsZUtleSA9IChlbGVtZW50OiBJVGl0bGVPd25lcikgPT4ge1xuICAgIHRoaXMudGl0bGVLZXlJbmRleCsrO1xuICAgIHJldHVybiBlbGVtZW50Lm5hbWUgKyB0aGlzLnRpdGxlS2V5UHJlZml4ICsgdGhpcy50aXRsZUtleUluZGV4O1xuICB9O1xuICBwcm90ZWN0ZWQgcmVuZGVyVGl0bGVTcGFucyhlbGVtZW50OiBJVGl0bGVPd25lciwgY3NzQ2xhc3NlczogYW55KSB7XG4gICAgdmFyIGdldFNwYWNlU3BhbiA9ICgpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgZGF0YS1rZXk9e3RoaXMuZ2V0VGl0bGVLZXkoZWxlbWVudCl9XG4gICAgICAgICAga2V5PXt0aGlzLmdldFRpdGxlS2V5KGVsZW1lbnQpfVxuICAgICAgICA+XG4gICAgICAgICAgJm5ic3A7XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICk7XG4gICAgfTtcbiAgICB2YXIgc3BhbnMgPSBbXTtcbiAgICBpZiAoZWxlbWVudC5pc1JlcXVpcmVUZXh0T25TdGFydCkge1xuICAgICAgc3BhbnMucHVzaCh0aGlzLnJlbmRlclJlcXVpcmVUZXh0KGVsZW1lbnQsIGNzc0NsYXNzZXMpKTtcbiAgICAgIHNwYW5zLnB1c2goZ2V0U3BhY2VTcGFuKCkpO1xuICAgIH1cbiAgICB2YXIgcXVlc3Rpb25OdW1iZXIgPSBlbGVtZW50Lm5vO1xuICAgIGlmIChxdWVzdGlvbk51bWJlcikge1xuICAgICAgc3BhbnMucHVzaChcbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBkYXRhLWtleT17dGhpcy5nZXRUaXRsZUtleShlbGVtZW50KX1cbiAgICAgICAgICBrZXk9e3RoaXMuZ2V0VGl0bGVLZXkoZWxlbWVudCl9XG4gICAgICAgICAgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLm51bWJlcn1cbiAgICAgICAgICBzdHlsZT17eyBwb3NpdGlvbjogXCJzdGF0aWNcIiB9fVxuICAgICAgICA+XG4gICAgICAgICAge3F1ZXN0aW9uTnVtYmVyfVxuICAgICAgICA8L3NwYW4+XG4gICAgICApO1xuICAgICAgc3BhbnMucHVzaChnZXRTcGFjZVNwYW4oKSk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmlzUmVxdWlyZVRleHRCZWZvcmVUaXRsZSkge1xuICAgICAgc3BhbnMucHVzaCh0aGlzLnJlbmRlclJlcXVpcmVUZXh0KGVsZW1lbnQsIGNzc0NsYXNzZXMpKTtcbiAgICAgIHNwYW5zLnB1c2goZ2V0U3BhY2VTcGFuKCkpO1xuICAgIH1cbiAgICBzcGFucy5wdXNoKFxuICAgICAgU3VydmV5RWxlbWVudEJhc2UucmVuZGVyTG9jU3RyaW5nKFxuICAgICAgICBlbGVtZW50LmxvY1RpdGxlLFxuICAgICAgICBudWxsLFxuICAgICAgICB0aGlzLmdldFRpdGxlS2V5KGVsZW1lbnQpXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudC5pc1JlcXVpcmVUZXh0QWZ0ZXJUaXRsZSkge1xuICAgICAgc3BhbnMucHVzaChnZXRTcGFjZVNwYW4oKSk7XG4gICAgICBzcGFucy5wdXNoKHRoaXMucmVuZGVyUmVxdWlyZVRleHQoZWxlbWVudCwgY3NzQ2xhc3NlcykpO1xuICAgIH1cbiAgICByZXR1cm4gc3BhbnM7XG4gIH1cbiAgcHJpdmF0ZSByZW5kZXJSZXF1aXJlVGV4dChcbiAgICBlbGVtZW50OiBJVGl0bGVPd25lcixcbiAgICBjc3NDbGFzc2VzOiBhbnlcbiAgKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAoXG4gICAgICA8c3BhblxuICAgICAgICBkYXRhLWtleT17dGhpcy5nZXRUaXRsZUtleShlbGVtZW50KX1cbiAgICAgICAga2V5PXt0aGlzLmdldFRpdGxlS2V5KGVsZW1lbnQpfVxuICAgICAgICBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucmVxdWlyZWRUZXh0IHx8IGNzc0NsYXNzZXMucGFuZWwucmVxdWlyZWRUZXh0fVxuICAgICAgPlxuICAgICAgICB7ZWxlbWVudC5yZXF1aXJlZFRleHR9XG4gICAgICA8L3NwYW4+XG4gICAgKTtcbiAgfVxuICBwcml2YXRlIG1ha2VCYXNlRWxlbWVudFJlYWN0KHN0YXRlRWxlbWVudDogQmFzZSkge1xuICAgIGlmICghc3RhdGVFbGVtZW50KSByZXR1cm47XG4gICAgc3RhdGVFbGVtZW50Lml0ZXJhdGVQcm9wZXJ0aWVzSGFzaCgoaGFzaCwga2V5KSA9PiB7XG4gICAgICB2YXIgdmFsOiBhbnkgPSBoYXNoW2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHZhciB2YWw6IGFueSA9IHZhbDtcbiAgICAgICAgdmFsW1wib25BcnJheUNoYW5nZWRcIl0gPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNSZW5kZXJpbmcpIHJldHVybjtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKChzdGF0ZTogYW55KSA9PiB7XG4gICAgICAgICAgICB2YXIgbmV3U3RhdGU6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgICAgICAgICAgbmV3U3RhdGVba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzdGF0ZUVsZW1lbnQuc2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyID0gKFxuICAgICAgaGFzaDogYW55LFxuICAgICAga2V5OiBzdHJpbmcsXG4gICAgICB2YWw6IGFueVxuICAgICkgPT4ge1xuICAgICAgaWYgKGhhc2hba2V5XSAhPT0gdmFsKSB7XG4gICAgICAgIGhhc2hba2V5XSA9IHZhbDtcbiAgICAgICAgaWYgKHRoaXMuaXNSZW5kZXJpbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSgoc3RhdGU6IGFueSkgPT4ge1xuICAgICAgICAgIHZhciBuZXdTdGF0ZTogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgICAgbmV3U3RhdGVba2V5XSA9IHZhbDtcbiAgICAgICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSB1bk1ha2VCYXNlRWxlbWVudFJlYWN0KHN0YXRlRWxlbWVudDogQmFzZSkge1xuICAgIGlmICghc3RhdGVFbGVtZW50KSByZXR1cm47XG4gICAgc3RhdGVFbGVtZW50LnNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICBzdGF0ZUVsZW1lbnQuaXRlcmF0ZVByb3BlcnRpZXNIYXNoKChoYXNoLCBrZXkpID0+IHtcbiAgICAgIHZhciB2YWw6IGFueSA9IGhhc2hba2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgdmFyIHZhbDogYW55ID0gdmFsO1xuICAgICAgICB2YWxbXCJvbkFycmF5Q2hhbmdlZFwiXSA9ICgpID0+IHt9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWFjdFN1cnZleUVsZW1lbnQgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBjc3NDbGFzc2VzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY3NzQ2xhc3NlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSBleHRlbmRzIFN1cnZleUVsZW1lbnRCYXNlIHtcbiAgY29udHJvbDogYW55O1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IGFueSwgcHJldlN0YXRlOiBhbnkpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpO1xuICAgIHRoaXMudXBkYXRlRG9tRWxlbWVudCgpO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMudXBkYXRlRG9tRWxlbWVudCgpO1xuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgaWYgKCEhdGhpcy5xdWVzdGlvbkJhc2UpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25CYXNlLmJlZm9yZURlc3Ryb3lRdWVzdGlvbkVsZW1lbnQodGhpcy5jb250cm9sKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZURvbUVsZW1lbnQoKSB7XG4gICAgdmFyIGVsID0gdGhpcy5jb250cm9sO1xuICAgIGlmICghIWVsKSB7XG4gICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1yZW5kZXJlZFwiKSAhPT0gXCJyXCIpIHtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKFwiZGF0YS1yZW5kZXJlZFwiLCBcInJcIik7XG4gICAgICAgIHRoaXMucXVlc3Rpb25CYXNlLmFmdGVyUmVuZGVyUXVlc3Rpb25FbGVtZW50KGVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbkJhc2UoKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnF1ZXN0aW9uO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgY3JlYXRvcigpOiBJU3VydmV5Q3JlYXRvciB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY3JlYXRvcjtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVuZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb25CYXNlICYmICEhdGhpcy5jcmVhdG9yO1xuICB9XG4gIHB1YmxpYyBzaG91bGRDb21wb25lbnRVcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXQgfHxcbiAgICAgICEhdGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0RGF0YS5pc05lZWRSZW5kZXIgfHxcbiAgICAgICEhdGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0LndpZGdldEpzb24uaXNEZWZhdWx0UmVuZGVyIHx8XG4gICAgICAhIXRoaXMucXVlc3Rpb25CYXNlLmN1c3RvbVdpZGdldC53aWRnZXRKc29uLnJlbmRlclxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uVW5jb250cm9sbGVkRWxlbWVudDxcbiAgVCBleHRlbmRzIFF1ZXN0aW9uXG4+IGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZU9uRXZlbnQgPSB0aGlzLnVwZGF0ZVZhbHVlT25FdmVudC5iaW5kKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogVCB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFQ7XG4gIH1cbiAgdXBkYXRlVmFsdWVPbkV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBpZiAoXG4gICAgICAhSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHRoaXMucXVlc3Rpb25CYXNlLnZhbHVlLCBldmVudC50YXJnZXQudmFsdWUpXG4gICAgKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uQmFzZS52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB9XG4gIH07XG4gIHByb3RlY3RlZCB1cGRhdGVEb21FbGVtZW50KCkge1xuICAgIGlmICghIXRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5jb250cm9sLnZhbHVlID0gdGhpcy5nZXRWYWx1ZSh0aGlzLnF1ZXN0aW9uQmFzZS52YWx1ZSk7XG4gICAgfVxuICAgIHN1cGVyLnVwZGF0ZURvbUVsZW1lbnQoKTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25lbGVtZW50LnRzeCIsImltcG9ydCB7IEhhc2hUYWJsZSB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IFJlYWN0UXVlc3Rpb25GYWN0b3J5ID0gbmV3IFJlYWN0UXVlc3Rpb25GYWN0b3J5KCk7XG4gIHByaXZhdGUgY3JlYXRvckhhc2g6IEhhc2hUYWJsZTwobmFtZTogc3RyaW5nKSA9PiBKU1guRWxlbWVudD4gPSB7fTtcblxuICBwdWJsaWMgcmVnaXN0ZXJRdWVzdGlvbihcbiAgICBxdWVzdGlvblR5cGU6IHN0cmluZyxcbiAgICBxdWVzdGlvbkNyZWF0b3I6IChuYW1lOiBzdHJpbmcpID0+IEpTWC5FbGVtZW50XG4gICkge1xuICAgIHRoaXMuY3JlYXRvckhhc2hbcXVlc3Rpb25UeXBlXSA9IHF1ZXN0aW9uQ3JlYXRvcjtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsVHlwZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc29ydCgpO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihxdWVzdGlvblR5cGU6IHN0cmluZywgcGFyYW1zOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JIYXNoW3F1ZXN0aW9uVHlwZV07XG4gICAgaWYgKGNyZWF0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGNyZWF0b3IocGFyYW1zKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25mYWN0b3J5LnRzeCIsImltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbixcbiAgSnNvbk9iamVjdCxcbiAgSnNvbk9iamVjdFByb3BlcnR5LFxuICBTZXJpYWxpemVyLFxufSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5RGF0YSB7XG4gIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgc2V0VmFsdWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgbG9jTm90aWZpY2F0aW9uOiBhbnksXG4gICAgYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQ/OiBib29sZWFuXG4gICk6IGFueTtcbiAgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55O1xuICBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiB2b2lkO1xuICBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZztcbiAgc2V0Q29tbWVudChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcsIGxvY05vdGlmaWNhdGlvbjogYW55KTogYW55O1xuICBnZXRBbGxWYWx1ZXMoKTogYW55O1xuICBnZXRGaWx0ZXJlZFZhbHVlcygpOiBhbnk7XG4gIGdldEZpbHRlcmVkUHJvcGVydGllcygpOiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIElUZXh0UHJvY2Vzc29yIHtcbiAgcHJvY2Vzc1RleHQodGV4dDogc3RyaW5nLCByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pOiBzdHJpbmc7XG4gIHByb2Nlc3NUZXh0RXgoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbixcbiAgICBkb0VuY29kaW5nOiBib29sZWFuXG4gICk6IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleUVycm9yT3duZXIgZXh0ZW5kcyBJTG9jYWxpemFibGVPd25lciB7XG4gIGdldEVycm9yQ3VzdG9tVGV4dCh0ZXh0OiBzdHJpbmcsIGVycm9yOiBTdXJ2ZXlFcnJvcik6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5IGV4dGVuZHMgSVRleHRQcm9jZXNzb3IsIElTdXJ2ZXlFcnJvck93bmVyIHtcbiAgY3VycmVudFBhZ2U6IElQYWdlO1xuICBwYWdlczogQXJyYXk8SVBhZ2U+O1xuICBnZXRDc3MoKTogYW55O1xuICBpc1BhZ2VTdGFydGVkKHBhZ2U6IElQYWdlKTogYm9vbGVhbjtcbiAgcGFnZVZpc2liaWxpdHlDaGFuZ2VkKHBhZ2U6IElQYWdlLCBuZXdWYWx1ZTogYm9vbGVhbik6IGFueTtcbiAgcGFuZWxWaXNpYmlsaXR5Q2hhbmdlZChwYW5lbDogSVBhbmVsLCBuZXdWYWx1ZTogYm9vbGVhbik6IGFueTtcbiAgcXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBuZXdWYWx1ZTogYm9vbGVhbik6IGFueTtcbiAgaXNDbGVhclZhbHVlT25IaWRkZW46IGJvb2xlYW47XG4gIHF1ZXN0aW9uc09yZGVyOiBzdHJpbmc7XG4gIHF1ZXN0aW9uQ3JlYXRlZChxdWVzdGlvbjogSVF1ZXN0aW9uKTogYW55O1xuICBxdWVzdGlvbkFkZGVkKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYXJlbnRQYW5lbDogYW55LFxuICAgIHJvb3RQYW5lbDogYW55XG4gICk6IGFueTtcbiAgcGFuZWxBZGRlZChcbiAgICBwYW5lbDogSUVsZW1lbnQsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYXJlbnRQYW5lbDogYW55LFxuICAgIHJvb3RQYW5lbDogYW55XG4gICk6IGFueTtcbiAgcXVlc3Rpb25SZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBhbnk7XG4gIHBhbmVsUmVtb3ZlZChwYW5lbDogSUVsZW1lbnQpOiBhbnk7XG4gIHF1ZXN0aW9uUmVuYW1lZChcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIG9sZE5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZU5hbWU6IHN0cmluZ1xuICApOiBhbnk7XG4gIHZhbGlkYXRlUXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbik6IFN1cnZleUVycm9yO1xuICB2YWxpZGF0ZVBhbmVsKHBhbmVsOiBJUGFuZWwpOiBTdXJ2ZXlFcnJvcjtcbiAgaGFzVmlzaWJsZVF1ZXN0aW9uQnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICBxdWVzdGlvbkNvdW50QnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIHByb2Nlc3NIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0U3VydmV5TWFya2Rvd25IdG1sKGVsZW1lbnQ6IEJhc2UsIHRleHQ6IHN0cmluZyk6IHN0cmluZztcbiAgaXNEaXNwbGF5TW9kZTogYm9vbGVhbjtcbiAgaXNEZXNpZ25Nb2RlOiBib29sZWFuO1xuICBhcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmc6IGJvb2xlYW47XG4gIGFyZUVtcHR5RWxlbWVudHNIaWRkZW46IGJvb2xlYW47XG4gIGlzTG9hZGluZ0Zyb21Kc29uOiBib29sZWFuO1xuICBpc1VwZGF0ZVZhbHVlVGV4dE9uVHlwaW5nOiBib29sZWFuO1xuXG4gIHN0YXRlOiBzdHJpbmc7XG4gIGNhbmNlbFByZXZpZXdCeVBhZ2UocGFuZWw6IElQYW5lbCk6IGFueTtcblxuICByZXF1aXJlZFRleHQ6IHN0cmluZztcbiAgYmVmb3JlU2V0dGluZ1F1ZXN0aW9uRXJyb3JzKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj5cbiAgKTogdm9pZDtcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm46IHN0cmluZztcbiAgZ2V0VXBkYXRlZFF1ZXN0aW9uVGl0bGUocXVlc3Rpb246IElRdWVzdGlvbiwgdGl0bGU6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0VXBkYXRlZFF1ZXN0aW9uTm8ocXVlc3Rpb246IElRdWVzdGlvbiwgbm86IHN0cmluZyk6IHN0cmluZztcblxuICBxdWVzdGlvblN0YXJ0SW5kZXg6IHN0cmluZztcbiAgcXVlc3Rpb25UaXRsZUxvY2F0aW9uOiBzdHJpbmc7XG4gIHF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvbjogc3RyaW5nO1xuICBxdWVzdGlvbkVycm9yTG9jYXRpb246IHN0cmluZztcbiAgc3RvcmVPdGhlcnNBc0NvbW1lbnQ6IGJvb2xlYW47XG5cbiAgbWF4VGV4dExlbmd0aDogbnVtYmVyO1xuICBtYXhPdGhlcnNMZW5ndGg6IG51bWJlcjtcbiAgY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zOiBib29sZWFuO1xuXG4gIHVwbG9hZEZpbGVzKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZpbGVzOiBGaWxlW10sXG4gICAgdXBsb2FkaW5nQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKTogYW55O1xuICBkb3dubG9hZEZpbGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nLCBkYXRhOiBhbnkpID0+IGFueVxuICApOiBhbnk7XG4gIGNsZWFyRmlsZXMoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBmaWxlTmFtZTogc3RyaW5nLFxuICAgIGNsZWFyQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKTogYW55O1xuICB1cGRhdGVDaG9pY2VzRnJvbVNlcnZlcihcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGNob2ljZXM6IEFycmF5PGFueT4sXG4gICAgc2VydmVyUmVzdWx0OiBhbnlcbiAgKTogQXJyYXk8YW55PjtcbiAgdXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNzc0NsYXNzZXM6IGFueSk6IGFueTtcbiAgdXBkYXRlUGFuZWxDc3NDbGFzc2VzKHBhbmVsOiBJUGFuZWwsIGNzc0NsYXNzZXM6IGFueSk6IGFueTtcbiAgdXBkYXRlUGFnZUNzc0NsYXNzZXMocGFuZWw6IElQYW5lbCwgY3NzQ2xhc3NlczogYW55KTogYW55O1xuICBhZnRlclJlbmRlclF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGh0bWxFbGVtZW50OiBhbnkpOiBhbnk7XG4gIGFmdGVyUmVuZGVyUXVlc3Rpb25JbnB1dChxdWVzdGlvbjogSVF1ZXN0aW9uLCBodG1sRWxlbWVudDogYW55KTogYW55O1xuICBhZnRlclJlbmRlclBhbmVsKHBhbmVsOiBJRWxlbWVudCwgaHRtbEVsZW1lbnQ6IGFueSk6IGFueTtcbiAgYWZ0ZXJSZW5kZXJQYWdlKGh0bWxFbGVtZW50OiBhbnkpOiBhbnk7XG5cbiAgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZUZyb21BcnJheShcbiAgICB2YWx1ZU5hbWU6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBJUXVlc3Rpb247XG4gIG1hdHJpeFJvd0FkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHJvdzogYW55KTogYW55O1xuICBtYXRyaXhCZWZvcmVSb3dBZGRlZChvcHRpb25zOiB7XG4gICAgcXVlc3Rpb246IElRdWVzdGlvbjtcbiAgICBjYW5BZGRSb3c6IGJvb2xlYW47XG4gIH0pOiBhbnk7XG4gIG1hdHJpeFJvd1JlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgcm93SW5kZXg6IG51bWJlciwgcm93OiBhbnkpOiBhbnk7XG4gIG1hdHJpeEFsbG93UmVtb3ZlUm93KFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICByb3c6IGFueVxuICApOiBib29sZWFuO1xuICBtYXRyaXhDZWxsQ3JlYXRlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpOiBhbnk7XG4gIG1hdHJpeEFmdGVyQ2VsbFJlbmRlcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpOiBhbnk7XG4gIG1hdHJpeENlbGxWYWx1ZUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogYW55O1xuICBtYXRyaXhDZWxsVmFsdWVDaGFuZ2luZyhxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpOiBhbnk7XG4gIG1hdHJpeENlbGxWYWxpZGF0ZShxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpOiBTdXJ2ZXlFcnJvcjtcbiAgZHluYW1pY1BhbmVsQWRkZWQocXVlc3Rpb246IElRdWVzdGlvbik6IGFueTtcbiAgZHluYW1pY1BhbmVsUmVtb3ZlZChcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIHBhbmVsSW5kZXg6IG51bWJlcixcbiAgICBwYW5lbDogSVBhbmVsXG4gICk6IGFueTtcbiAgZHluYW1pY1BhbmVsSXRlbVZhbHVlQ2hhbmdlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpOiBhbnk7XG5cbiAgZHJhZ0FuZERyb3BBbGxvdyhvcHRpb25zOiBhbnkpOiBib29sZWFuO1xuXG4gIHNjcm9sbEVsZW1lbnRUb1RvcChcbiAgICBlbGVtZW50OiBJU3VydmV5RWxlbWVudCxcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIHBhZ2U6IElQYWdlLFxuICAgIGlkOiBzdHJpbmdcbiAgKTogYW55O1xuICBydW5FeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZyk6IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleUltcGwge1xuICBnZVN1cnZleURhdGEoKTogSVN1cnZleURhdGE7XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yO1xufVxuZXhwb3J0IGludGVyZmFjZSBJQ29uZGl0aW9uUnVubmVyIHtcbiAgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5RWxlbWVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNWaXNpYmxlOiBib29sZWFuO1xuICBpc1JlYWRPbmx5OiBib29sZWFuO1xuICBpc1BhZ2U6IGJvb2xlYW47XG4gIGlzUGFuZWw6IGJvb2xlYW47XG4gIGNvbnRhaW5zRXJyb3JzOiBib29sZWFuO1xuICBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCk6IGFueTtcbiAgb25TdXJ2ZXlMb2FkKCk6IGFueTtcbiAgb25GaXJzdFJlbmRlcmluZygpOiBhbnk7XG4gIGdldFR5cGUoKTogc3RyaW5nO1xuICBzZXRWaXNpYmxlSW5kZXgodmFsdWU6IG51bWJlcik6IG51bWJlcjtcbiAgbG9jU3Ryc0NoYW5nZWQoKTogYW55O1xuICBkZWxldGUoKTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJRWxlbWVudCBleHRlbmRzIElDb25kaXRpb25SdW5uZXIsIElTdXJ2ZXlFbGVtZW50IHtcbiAgdmlzaWJsZTogYm9vbGVhbjtcbiAgcGFyZW50OiBJUGFuZWw7XG4gIHJlbmRlcldpZHRoOiBzdHJpbmc7XG4gIHdpZHRoOiBzdHJpbmc7XG4gIG1pbldpZHRoPzogc3RyaW5nO1xuICBtYXhXaWR0aD86IHN0cmluZztcbiAgcmlnaHRJbmRlbnQ6IG51bWJlcjtcbiAgc3RhcnRXaXRoTmV3TGluZTogYm9vbGVhbjtcbiAgZ2V0UGFuZWwoKTogSVBhbmVsO1xuICBnZXRMYXlvdXRUeXBlKCk6IHN0cmluZztcbiAgaXNMYXlvdXRUeXBlU3VwcG9ydGVkKGxheW91dFR5cGU6IHN0cmluZyk6IGJvb2xlYW47XG4gIHJlbW92ZUVsZW1lbnQoZWw6IElFbGVtZW50KTogYm9vbGVhbjtcbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKTogYW55O1xuICB1cGRhdGVDdXN0b21XaWRnZXRzKCk6IGFueTtcbiAgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTogYW55O1xuICBjbGVhckVycm9ycygpOiBhbnk7XG4gIGRpc3Bvc2UoKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUXVlc3Rpb24gZXh0ZW5kcyBJRWxlbWVudCwgSVN1cnZleUVycm9yT3duZXIge1xuICBoYXNUaXRsZTogYm9vbGVhbjtcbiAgaXNFbXB0eSgpOiBib29sZWFuO1xuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KTogYW55O1xuICB1cGRhdGVWYWx1ZUZyb21TdXJ2ZXkobmV3VmFsdWU6IGFueSk6IGFueTtcbiAgdXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkobmV3VmFsdWU6IGFueSk6IGFueTtcbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKTogYm9vbGVhbjtcbiAgY2xlYXJVbnVzZWRWYWx1ZXMoKTogYW55O1xuICBnZXREaXNwbGF5VmFsdWUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueTtcbiAgZ2V0VmFsdWVOYW1lKCk6IHN0cmluZztcbiAgY2xlYXJWYWx1ZSgpOiBhbnk7XG4gIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpOiBhbnk7XG4gIGlzQW5zd2VyQ29ycmVjdCgpOiBib29sZWFuO1xuICB1cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpOiBhbnk7XG4gIGdldFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IElRdWVzdGlvbjtcbiAgdmFsdWU6IGFueTtcbiAgc3VydmV5OiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIElQYXJlbnRFbGVtZW50IHtcbiAgYWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcik6IGFueTtcbiAgcmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW47XG4gIGlzUmVhZE9ubHk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBhbmVsIGV4dGVuZHMgSVN1cnZleUVsZW1lbnQsIElQYXJlbnRFbGVtZW50IHtcbiAgZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCk6IHN0cmluZztcbiAgZ2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZztcbiAgZ2V0UXVlc3Rpb25TdGFydEluZGV4KCk6IHN0cmluZztcbiAgcGFyZW50OiBJUGFuZWw7XG4gIGVsZW1lbnRXaWR0aENoYW5nZWQoZWw6IElFbGVtZW50KTogYW55O1xuICBpbmRleE9mKGVsOiBJRWxlbWVudCk6IG51bWJlcjtcbiAgZWxlbWVudHM6IEFycmF5PElFbGVtZW50Pjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVBhZ2UgZXh0ZW5kcyBJUGFuZWwsIElDb25kaXRpb25SdW5uZXIge1xuICBpc1N0YXJ0ZWQ6IGJvb2xlYW47XG59XG5leHBvcnQgaW50ZXJmYWNlIElUaXRsZU93bmVyIHtcbiAgbmFtZTogc3RyaW5nO1xuICBubzogc3RyaW5nO1xuICByZXF1aXJlZFRleHQ6IHN0cmluZztcbiAgaXNSZXF1aXJlVGV4dE9uU3RhcnQ6IGJvb2xlYW47XG4gIGlzUmVxdWlyZVRleHRCZWZvcmVUaXRsZTogYm9vbGVhbjtcbiAgaXNSZXF1aXJlVGV4dEFmdGVyVGl0bGU6IGJvb2xlYW47XG4gIGxvY1RpdGxlOiBMb2NhbGl6YWJsZVN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVByb2dyZXNzSW5mbyB7XG4gIHF1ZXN0aW9uQ291bnQ6IG51bWJlcjtcbiAgYW5zd2VyZWRRdWVzdGlvbkNvdW50OiBudW1iZXI7XG4gIHJlcXVpcmVkUXVlc3Rpb25Db3VudDogbnVtYmVyO1xuICByZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgQmluZGluZ3Mge1xuICBwcml2YXRlIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4gPSBudWxsO1xuICBwcml2YXRlIHZhbHVlczogYW55ID0gbnVsbDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvYmo6IEJhc2UpIHt9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYmluZGluZ3NcIjtcbiAgfVxuICBwdWJsaWMgZ2V0TmFtZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHRoaXMuZmlsbFByb3BlcnRpZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucHJvcGVydGllc1tpXS5pc1Zpc2libGUoXCJcIiwgdGhpcy5vYmopKSB7XG4gICAgICAgIHJlcy5wdXNoKHRoaXMucHJvcGVydGllc1tpXS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydGllcygpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICB2YXIgcmVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+ID0gW107XG4gICAgdGhpcy5maWxsUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaCh0aGlzLnByb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBzZXRCaW5kaW5nKHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZU5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy52YWx1ZXMpIHRoaXMudmFsdWVzID0ge307XG4gICAgaWYgKCEhdmFsdWVOYW1lKSB7XG4gICAgICB0aGlzLnZhbHVlc1twcm9wZXJ0eU5hbWVdID0gdmFsdWVOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy52YWx1ZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhpcy52YWx1ZXMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgY2xlYXJCaW5kaW5nKHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRCaW5kaW5nKHByb3BlcnR5TmFtZSwgXCJcIik7XG4gIH1cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnZhbHVlcztcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWVOYW1lQnlQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy52YWx1ZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW3Byb3BlcnR5TmFtZV07XG4gIH1cbiAgcHVibGljIGdldFByb3BlcnRpZXNCeVZhbHVlTmFtZSh2YWx1ZU5hbWU6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xuICAgIGlmICghdGhpcy52YWx1ZXMpIHJldHVybiBbXTtcbiAgICB2YXIgcmVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsdWVzKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZXNba2V5XSA9PSB2YWx1ZU5hbWUpIHtcbiAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0SnNvbigpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHJlczogYW55ID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsdWVzKSB7XG4gICAgICByZXNba2V5XSA9IHRoaXMudmFsdWVzW2tleV07XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNldEpzb24odmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWVzID0gbnVsbDtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWVzW2tleV0gPSB2YWx1ZVtrZXldO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGZpbGxQcm9wZXJ0aWVzKCkge1xuICAgIGlmICh0aGlzLnByb3BlcnRpZXMgIT09IG51bGwpIHJldHVybjtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSBbXTtcbiAgICB2YXIgb2JqUHJvcGVydGllcyA9IFNlcmlhbGl6ZXIuZ2V0UHJvcGVydGllc0J5T2JqKHRoaXMub2JqKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9ialByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChvYmpQcm9wZXJ0aWVzW2ldLmlzQmluZGFibGUpIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1c2gob2JqUHJvcGVydGllc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBTdXJ2ZXlKUyBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgQmFzZSB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGNvbW1lbnRQcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2V0dGluZ3MuY29tbWVudFByZWZpeDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBjb21tZW50UHJlZml4KHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3MuY29tbWVudFByZWZpeCA9IHZhbDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUl0ZW1WYWx1ZTogKGl0ZW06IGFueSwgdHlwZT86IHN0cmluZykgPT4gYW55O1xuICBwdWJsaWMgc3RhdGljIGl0ZW1WYWx1ZUxvY1N0ckNoYW5nZWQ6IChhcnI6IEFycmF5PGFueT4pID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBBIHN0YXRpYyBtZXRob2RzIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgdW5kZXJmaW5lZCwgbnVsbCwgZW1wdHkgc3RyaW5nIG9yIGVtcHR5IGFycmF5LlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBpc1ZhbHVlRW1wdHkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIElzUHJvcGVydHlFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiICYmIHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcGVydHlIYXNoOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBsb2NhbGl6YWJsZVN0cmluZ3M6IHsgW2luZGV4OiBzdHJpbmddOiBMb2NhbGl6YWJsZVN0cmluZyB9O1xuICBwcml2YXRlIGFycmF5c0luZm86IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfTtcbiAgcHJpdmF0ZSBiaW5kaW5nc1ZhbHVlOiBCaW5kaW5ncztcbiAgcHJpdmF0ZSBvblByb3BDaGFuZ2VGdW5jdGlvbnM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZnVuYzogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuICAgIGtleTogc3RyaW5nO1xuICB9PjtcbiAgcHJvdGVjdGVkIGlzTG9hZGluZ0Zyb21Kc29uVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGxvYWRpbmdPd25lcjogQmFzZSA9IG51bGw7XG4gIC8qKlxuICAgKiBFdmVudCB0aGF0IHJhaXNlIG9uIHByb3BlcnR5IGNoYW5nZSBvZiB0aGUgc2VuZGVyIG9iamVjdFxuICAgKiBzZW5kZXIgLSB0aGUgb2JqZWN0IHRoYXQgb3ducyB0aGUgcHJvcGVydHlcbiAgICogb3B0aW9ucy5uYW1lIC0gdGhlIHByb3BlcnR5IG5hbWUgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkXG4gICAqIG9wdGlvbnMub2xkVmFsdWUgLSBvbGQgdmFsdWUuIFBsZWFzZSBub3RlLCBpdCBlcXVhbHMgdG8gb3B0aW9ucy5uZXdWYWx1ZSBpZiBwcm9wZXJ0eSBpcyBhbiBhcnJheVxuICAgKiBvcHRpb25zLm5ld1ZhbHVlIC0gbmV3IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIG9uUHJvcGVydHlDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBCYXNlLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogRXZlbnQgdGhhdCByYWlzZWQgb24gY2hhbmdpbmcgcHJvcGVydHkgb2YgdGhlIEl0ZW1WYWx1ZSBvYmplY3QuXG4gICAqIHNlbmRlciAtIHRoZSBvYmplY3QgdGhhdCBvd25zIHRoZSBwcm9wZXJ0eVxuICAgKiBvcHRpb25zLnByb3BlcnR5TmFtZSAtIHRoZSBwcm9wZXJ0eSBuYW1lIHRvIHdoaWNoIEl0ZW1WYWx1ZSBhcnJheSBpcyBiZWxvbmcuIEl0IGNhbiBiZSBcImNob2ljZXNcIiBmb3IgZHJvcGRvd24gcXVlc3Rpb25cbiAgICogb3B0aW9ucy5vYmogLSB0aGUgaW5zdGFuY2Ugb2YgSXRlbVZhbHVlIG9iamVjdCB3aGljaCBwcm9wZXJ0eSBoYXMgYmVlbiBjaGFuZ2VkXG4gICAqIG9wdGlvbnMubmFtZSAtIHRoZSBwcm9wZXJ0eSBvZiBJdGVtT2JqZWN0IHRoYXQgaGFzIGJlZW4gY2hhbmdlZFxuICAgKiBvcHRpb25zLm9sZFZhbHVlIC0gb2xkIHZhbHVlXG4gICAqIG9wdGlvbnMubmV3VmFsdWUgLSBuZXcgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBvbkl0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogQmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogQmFzZSwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcblxuICBnZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXI6IChwcm9wZXJ0aWVzSGFzaDogYW55LCBuYW1lOiBzdHJpbmcpID0+IGFueTtcblxuICBzZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXI6IChcbiAgICBwcm9wZXJ0aWVzSGFzaDogYW55LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB2YWw6IGFueVxuICApID0+IHZvaWQ7XG4gIGNyZWF0ZUFycmF5Q29yZUhhbmRsZXI6IChwcm9wZXJ0aWVzSGFzaDogYW55LCBuYW1lOiBzdHJpbmcpID0+IEFycmF5PGFueT47XG5cbiAgcHJpdmF0ZSBpc0NyZWF0aW5nID0gdHJ1ZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5iaW5kaW5nc1ZhbHVlID0gbmV3IEJpbmRpbmdzKHRoaXMpO1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXModGhpcyk7XG4gICAgdGhpcy5vbkJhc2VDcmVhdGluZygpO1xuICAgIHRoaXMuaXNDcmVhdGluZyA9IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBvbkJhc2VDcmVhdGluZygpIHt9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYXMgYSBzdHJpbmcgYXMgaXQgcmVwcmVzZW50cyBpbiB0aGUganNvbi4gSXQgc2hvdWxkIGJlIGluIGxvd2Nhc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImJhc2VcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGJpbmRpbmdzKCk6IEJpbmRpbmdzIHtcbiAgICByZXR1cm4gdGhpcy5iaW5kaW5nc1ZhbHVlO1xuICB9XG4gIGNoZWNrQmluZGluZ3ModmFsdWVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHt9XG4gIHByb3RlY3RlZCB1cGRhdGVCaW5kaW5ncyhwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHZhciB2YWx1ZU5hbWUgPSB0aGlzLmJpbmRpbmdzLmdldFZhbHVlTmFtZUJ5UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKCEhdmFsdWVOYW1lKSB7XG4gICAgICB0aGlzLnVwZGF0ZUJpbmRpbmdWYWx1ZSh2YWx1ZU5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUJpbmRpbmdWYWx1ZSh2YWx1ZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge31cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVsZW1lbnQgdGVtcGxhdGUgbmFtZSB3aXRob3V0IHByZWZpeC4gVHlwaWNhbGx5IGl0IGVxdWFscyB0byBnZXRUeXBlKCkuXG4gICAqIEBzZWUgZ2V0VHlwZVxuICAgKi9cbiAgcHVibGljIGdldFRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VHlwZSgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyBsb2FkaW5nIGZyb20gSnNvbiBhdCB0aGUgY3VycmVudCBtb21lbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTG9hZGluZ0Zyb21Kc29uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldElzTG9hZGluZ0Zyb21Kc29uKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzTG9hZGluZ0Zyb21Kc29uKCk6IGJvb2xlYW4ge1xuICAgIGlmICghIXRoaXMubG9hZGluZ093bmVyICYmIHRoaXMubG9hZGluZ093bmVyLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmdGcm9tSnNvblZhbHVlO1xuICB9XG5cbiAgc3RhcnRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvblZhbHVlID0gdHJ1ZTtcbiAgfVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgdGhpcy5pc0xvYWRpbmdGcm9tSnNvblZhbHVlID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplZCB0aGUgY3VycmVudCBvYmplY3QgaW50byBKU09OXG4gICAqIEBzZWUgZnJvbUpTT05cbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKTogYW55IHtcbiAgICByZXR1cm4gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3QodGhpcyk7XG4gIH1cbiAgLyoqXG4gICAqIExvYWQgb2JqZWN0IHByb3BlcnRpZXMgYW5kIGVsZW1lbnRzLiBJdCBkb2Vzbid0IHJlc2V0IHByb3BlcnRpZXMgdGhhdCB3YXMgY2hhbmdlZCBiZWZvcmUgYW5kIHRoZXkgYXJlIG5vdCBkZWZpbmVkIGluIHRoZSBqc29uIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIGpzb24gdGhlIG9iamVjdCBKU09OIGRlZmluaXRpb25cbiAgICogQHNlZSB0b0pTT05cbiAgICovXG4gIHB1YmxpYyBmcm9tSlNPTihqc29uOiBhbnkpIHtcbiAgICByZXR1cm4gbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCB0aGlzKTtcbiAgfVxuICAvKipcbiAgICogTWFrZSBhIGNsb25lIG9mIHRoZSBleGlzdGluZyBvYmplY3QuIENyZWF0ZSBhIG5ldyBvYmplY3Qgb2YgdGhlIHNhbWUgdHlwZSBhbmQgbG9hZCBhbGwgcHJvcGVydGllcyBpbnRvIGl0LlxuICAgKi9cbiAgcHVibGljIGNsb25lKCk6IEJhc2Uge1xuICAgIHZhciBjbG9uZWRPYmogPSA8QmFzZT5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKHRoaXMuZ2V0VHlwZSgpKTtcbiAgICBjbG9uZWRPYmouZnJvbUpTT04odGhpcy50b0pTT04oKSk7XG4gICAgcmV0dXJuIGNsb25lZE9iajtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvZ3Jlc3NJbmZvKCk6IElQcm9ncmVzc0luZm8ge1xuICAgIHJldHVybiBTdXJ2ZXlFbGVtZW50LmNyZWF0ZVByb2dyZXNzSW5mbygpO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBpZiAoISF0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmFycmF5c0luZm9ba2V5XTtcbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5pc0l0ZW1WYWx1ZXMpIHtcbiAgICAgICAgICB2YXIgYXJyID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGtleSk7XG4gICAgICAgICAgaWYgKGFyciAmJiAhIUJhc2UuaXRlbVZhbHVlTG9jU3RyQ2hhbmdlZClcbiAgICAgICAgICAgIEJhc2UuaXRlbVZhbHVlTG9jU3RyQ2hhbmdlZChhcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIXRoaXMubG9jYWxpemFibGVTdHJpbmdzKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKGtleSk7XG4gICAgICAgIGlmIChpdGVtKSBpdGVtLnN0ckNoYW5nZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlIGJ5IG5hbWVcbiAgICogQHBhcmFtIG5hbWUgcHJvcGVydHkgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldFByb3BlcnR5VmFsdWUobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IGFueSA9IG51bGwpOiBhbnkge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFByb3BlcnR5VmFsdWVDb3JlKHRoaXMucHJvcGVydHlIYXNoLCBuYW1lKTtcbiAgICBpZiAodGhpcy5Jc1Byb3BlcnR5RW1wdHkocmVzKSkge1xuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgdmFyIHByb3AgPSBTZXJpYWxpemVyLmZpbmRQcm9wZXJ0eSh0aGlzLmdldFR5cGUoKSwgbmFtZSk7XG4gICAgICBpZighIXByb3AgJiYgKCFwcm9wLmlzQ3VzdG9tIHx8ICF0aGlzLmlzQ3JlYXRpbmcpKSB7XG4gICAgICAgIGlmICghdGhpcy5Jc1Byb3BlcnR5RW1wdHkocHJvcC5kZWZhdWx0VmFsdWUpICYmICFBcnJheS5pc0FycmF5KHByb3AuZGVmYXVsdFZhbHVlKSkgcmV0dXJuIHByb3AuZGVmYXVsdFZhbHVlO1xuICAgICAgICBpZihwcm9wLnR5cGUgPT0gXCJib29sZWFuXCIgfHwgcHJvcC50eXBlID09IFwic3dpdGNoXCIpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvcGVydHlWYWx1ZUNvcmUocHJvcGVydGllc0hhc2g6IGFueSwgbmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZ2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKHByb3BlcnRpZXNIYXNoLCBuYW1lKTtcbiAgICBlbHNlIHJldHVybiBwcm9wZXJ0aWVzSGFzaFtuYW1lXTtcbiAgfVxuICBwdWJsaWMgZ2VWYWx1ZUZyb21IYXNoKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlIYXNoW1widmFsdWVcIl07XG4gIH1cbiAgcHJvdGVjdGVkIHNldFByb3BlcnR5VmFsdWVDb3JlKHByb3BlcnRpZXNIYXNoOiBhbnksIG5hbWU6IHN0cmluZywgdmFsOiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZUhhbmRsZXIpXG4gICAgICB0aGlzLnNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcihwcm9wZXJ0aWVzSGFzaCwgbmFtZSwgdmFsKTtcbiAgICBlbHNlIHByb3BlcnRpZXNIYXNoW25hbWVdID0gdmFsO1xuICB9XG4gIHB1YmxpYyBpdGVyYXRlUHJvcGVydGllc0hhc2goZnVuYzogKGhhc2g6IGFueSwga2V5OiBhbnkpID0+IHZvaWQpIHtcbiAgICB2YXIga2V5czogYW55W10gPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5wcm9wZXJ0eUhhc2gpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4gZnVuYyh0aGlzLnByb3BlcnR5SGFzaCwga2V5KSk7XG4gIH1cbiAgLyoqXG4gICAqIHNldCBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAcGFyYW0gbmFtZSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSB2YWwgbmV3IHByb3BlcnR5IHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc2V0UHJvcGVydHlWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xuICAgIGlmIChvbGRWYWx1ZSAmJiBBcnJheS5pc0FycmF5KG9sZFZhbHVlKSkge1xuICAgICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgdmFsKSkgcmV0dXJuO1xuICAgICAgdmFyIGFycmF5SW5mbyA9IHRoaXMuYXJyYXlzSW5mb1tuYW1lXTtcbiAgICAgIHRoaXMuc2V0QXJyYXkoXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG9sZFZhbHVlLFxuICAgICAgICB2YWwsXG4gICAgICAgIGFycmF5SW5mbyA/IGFycmF5SW5mby5pc0l0ZW1WYWx1ZXMgOiBmYWxzZSxcbiAgICAgICAgYXJyYXlJbmZvID8gYXJyYXlJbmZvLm9uUHVzaCA6IG51bGxcbiAgICAgICk7XG4gICAgICAvL3RoaXMucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgb2xkVmFsdWUsIG9sZFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZSh0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSwgdmFsKTtcbiAgICAgIGlmICghdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG9sZFZhbHVlLCB2YWwpKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgb2xkVmFsdWUsIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBvblByb3BlcnR5VmFsdWVDaGFuZ2VkQ2FsbGJhY2soXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9sZFZhbHVlOiBhbnksXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICBzZW5kZXI6IEJhc2UsXG4gICAgYXJyYXlDaGFuZ2VzOiBBcnJheUNoYW5nZXNcbiAgKSB7fVxuICBwdWJsaWMgaXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkKFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICBuZXdWYWx1ZTogYW55XG4gICkge1xuICAgIHRoaXMub25JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICBvYmo6IGl0ZW0sXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgcHJvcGVydHlOYW1lOiBpdGVtLm93bmVyUHJvcGVydHlOYW1lLFxuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBvblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7fVxuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9sZFZhbHVlOiBhbnksXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICBhcnJheUNoYW5nZXM/OiBBcnJheUNoYW5nZXMsXG4gICAgdGFyZ2V0PzogQmFzZVxuICApIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlQmluZGluZ3MobmFtZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMub25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kb1Byb3BlcnR5VmFsdWVDaGFuZ2VkQ2FsbGJhY2sgJiZcbiAgICAgIHRoaXMuZG9Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgICBuYW1lLFxuICAgICAgICBvbGRWYWx1ZSxcbiAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgIGFycmF5Q2hhbmdlcyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcblxuICAgIGlmICghdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnNbaV0ubmFtZSA9PSBuYW1lKVxuICAgICAgICB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9uc1tpXS5mdW5jKG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRvUHJvcGVydHlWYWx1ZUNoYW5nZWRDYWxsYmFjayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb2xkVmFsdWU6IGFueSxcbiAgICBuZXdWYWx1ZTogYW55LFxuICAgIGFycmF5Q2hhbmdlcz86IEFycmF5Q2hhbmdlcyxcbiAgICB0YXJnZXQ/OiBCYXNlXG4gICkge1xuICAgIGlmICghdGFyZ2V0KSB0YXJnZXQgPSB0aGlzO1xuICAgIGxldCBwYXJlbnRCYXNlID0gdGhpcy5nZXRPd25lckZvclByb3BlcnR5Q2hhbmdlZCgpO1xuICAgIGlmICghIXBhcmVudEJhc2UpIHtcbiAgICAgIHBhcmVudEJhc2UuZG9Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKFxuICAgICAgICBuYW1lLFxuICAgICAgICBvbGRWYWx1ZSxcbiAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgIGFycmF5Q2hhbmdlcyxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uUHJvcGVydHlWYWx1ZUNoYW5nZWRDYWxsYmFjayhcbiAgICAgICAgbmFtZSxcbiAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIGFycmF5Q2hhbmdlc1xuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRPd25lckZvclByb3BlcnR5Q2hhbmdlZCgpOiBCYXNlIHtcbiAgICB2YXIgdGVzdFByb3BzID0gW1wiY29sT3duZXJcIiwgXCJsb2NPd25lclwiLCBcInN1cnZleVwiLCBcIm93bmVyXCIsIFwiZXJyb3JPd25lclwiXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3RQcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSB0ZXN0UHJvcHNbaV07XG4gICAgICB2YXIgdGVzdE9iaiA9ICg8YW55PnRoaXMpW3Byb3BdO1xuICAgICAgaWYgKCEhdGVzdE9iaiAmJiAhIXRlc3RPYmouZG9Qcm9wZXJ0eVZhbHVlQ2hhbmdlZENhbGxiYWNrKSByZXR1cm4gdGVzdE9iajtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGEgcHJvcGVydHkgdmFsdWUgY2hhbmdlZC5cbiAgICogQHBhcmFtIG5hbWUgdGhlIHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIGZ1bmMgdGhlIGZ1bmN0aW9uIHdpdGggbm8gcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIHByb3BlcnR5IGNoYW5nZWQuXG4gICAqIEBwYXJhbSBrZXkgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVnaXN0ZXJlZCBmdW5jdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSwgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZnVuYzogYW55LFxuICAgIGtleTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBpZiAoIXRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zKSB7XG4gICAgICB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucyA9IFtdO1xuICAgIH1cbiAgICBpZiAoa2V5KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpdGVtID0gdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnNbaV07XG4gICAgICAgIGlmIChpdGVtLm5hbWUgPT0gbmFtZSAmJiBpdGVtLmtleSA9PSBrZXkpIHtcbiAgICAgICAgICBpdGVtLmZ1bmMgPSBmdW5jO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucy5wdXNoKHsgbmFtZTogbmFtZSwgZnVuYzogZnVuYywga2V5OiBrZXkgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBhIHByb3BlcnR5IHZhbHVlIGNoYW5nZWQgZnJvbSB0aGUgbmFtZXMgbGlzdC5cbiAgICogQHBhcmFtIG5hbWVzIHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgbmFtZXNcbiAgICogQHBhcmFtIGZ1bmMgdGhlIGZ1bmN0aW9uIHdpdGggbm8gcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIHByb3BlcnR5IGNoYW5nZWQuXG4gICAqIEBwYXJhbSBrZXkgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVnaXN0ZXJlZCBmdW5jdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSwgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGZ1bmM6IGFueSxcbiAgICBrZXk6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lc1tpXSwgZnVuYywga2V5KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgbm90aWZpY2F0aW9uIG9uIHByb3BlcnR5IHZhbHVlIGNoYW5nZWRcbiAgICogQHBhcmFtIG5hbWUgdGhlIHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIGtleSB0aGUga2V5IHdpdGggd2hpY2ggeW91IGhhdmUgcmVnaXN0ZXJlZCB0aGUgbm90aWZpY2F0aW9uIGZvciB0aGlzIHByb3BlcnR5LiBJdCBjYW4gYmUgbnVsbC5cbiAgICovXG4gIHB1YmxpYyB1blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBrZXk6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnNbaV07XG4gICAgICBpZiAoaXRlbS5uYW1lID09IG5hbWUgJiYgaXRlbS5rZXkgPT0ga2V5KSB7XG4gICAgICAgIHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLnNwbGljZShpLCAxKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVW5yZWdpc3RlciBub3RpZmljYXRpb24gb24gcHJvcGVydHkgdmFsdWUgY2hhbmdlZCBmb3IgYWxsIHByb3BlcnRpZXMgaW4gdGhlIG5hbWVzIGxpc3QuXG4gICAqIEBwYXJhbSBuYW1lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIG5hbWVzXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB3aXRoIHdoaWNoIHlvdSBoYXZlIHJlZ2lzdGVyZWQgdGhlIG5vdGlmaWNhdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eS4gSXQgY2FuIGJlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgdW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgIG5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGtleTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZXNbaV0sIGtleSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjcmVhdGVDdXN0b21Mb2NhbGl6YWJsZU9iaihuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbG9jU3RyID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhuYW1lKTtcbiAgICBpZiAobG9jU3RyIHx8ICEoPGFueT50aGlzKS5nZXRMb2NhbGUpIHJldHVybjtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKG5hbWUsIDxJTG9jYWxpemFibGVPd25lcj4oPGFueT50aGlzKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvd25lcjogSUxvY2FsaXphYmxlT3duZXIsXG4gICAgdXNlTWFya0Rvd246IGJvb2xlYW4gPSBmYWxzZVxuICApOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgdmFyIGxvY1N0ciA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhvd25lciwgdXNlTWFya0Rvd24pO1xuICAgIGlmICghdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgIHRoaXMubG9jYWxpemFibGVTdHJpbmdzID0ge307XG4gICAgfVxuICAgIHRoaXMubG9jYWxpemFibGVTdHJpbmdzW25hbWVdID0gbG9jU3RyO1xuICAgIHJldHVybiBsb2NTdHI7XG4gIH1cbiAgcHVibGljIGdldExvY2FsaXphYmxlU3RyaW5nKG5hbWU6IHN0cmluZyk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmxvY2FsaXphYmxlU3RyaW5ncyA/IHRoaXMubG9jYWxpemFibGVTdHJpbmdzW25hbWVdIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZWZhdWx0U3RyOiBzdHJpbmcgPSBcIlwiXG4gICk6IHN0cmluZyB7XG4gICAgdmFyIGxvY1N0ciA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcobmFtZSk7XG4gICAgaWYgKCFsb2NTdHIpIHJldHVybiBcIlwiO1xuICAgIHZhciByZXMgPSBsb2NTdHIudGV4dDtcbiAgICByZXR1cm4gcmVzID8gcmVzIDogZGVmYXVsdFN0cjtcbiAgfVxuICBwdWJsaWMgc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHZhciBsb2NTdHIgPSB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKG5hbWUpO1xuICAgIGlmICghbG9jU3RyKSByZXR1cm47XG4gICAgdmFyIG9sZFZhbHVlID0gbG9jU3RyLnRleHQ7XG4gICAgaWYgKG9sZFZhbHVlID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIGxvY1N0ci50ZXh0ID0gdmFsdWU7XG4gICAgdGhpcy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpO1xuICB9XG4gIHB1YmxpYyBhZGRVc2VkTG9jYWxlcyhsb2NhbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgaWYgKCEhdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmxvY2FsaXphYmxlU3RyaW5ncykge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHRoaXMuQWRkTG9jU3RyaW5nVG9Vc2VkTG9jYWxlcyhpdGVtLCBsb2NhbGVzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhdGhpcy5hcnJheXNJbmZvKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5hcnJheXNJbmZvKSB7XG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShrZXkpO1xuICAgICAgICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmFkZFVzZWRMb2NhbGVzKSB7XG4gICAgICAgICAgICBpdGVtLmFkZFVzZWRMb2NhbGVzKGxvY2FsZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgQWRkTG9jU3RyaW5nVG9Vc2VkTG9jYWxlcyhcbiAgICBsb2NTdHI6IExvY2FsaXphYmxlU3RyaW5nLFxuICAgIGxvY2FsZXM6IEFycmF5PHN0cmluZz5cbiAgKSB7XG4gICAgdmFyIGxvY3MgPSBsb2NTdHIuZ2V0TG9jYWxlcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxvY2FsZXMuaW5kZXhPZihsb2NzW2ldKSA8IDApIHtcbiAgICAgICAgbG9jYWxlcy5wdXNoKGxvY3NbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlSXRlbVZhbHVlcyhuYW1lOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuY3JlYXRlTmV3QXJyYXkobmFtZSwgZnVuY3Rpb24gKGl0ZW06IGFueSkge1xuICAgICAgaXRlbS5sb2NPd25lciA9IHNlbGY7XG4gICAgICBpdGVtLm93bmVyUHJvcGVydHlOYW1lID0gbmFtZTtcbiAgICB9KTtcbiAgICB0aGlzLmFycmF5c0luZm9bbmFtZV0uaXNJdGVtVmFsdWVzID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgbm90aWZ5QXJyYXlDaGFuZ2VkKGFyOiBhbnkpIHtcbiAgICAhIWFyLm9uQXJyYXlDaGFuZ2VkICYmIGFyLm9uQXJyYXlDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld0FycmF5Q29yZShuYW1lOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgcmVzID0gbnVsbDtcbiAgICBpZiAoISF0aGlzLmNyZWF0ZUFycmF5Q29yZUhhbmRsZXIpIHtcbiAgICAgIHJlcyA9IHRoaXMuY3JlYXRlQXJyYXlDb3JlSGFuZGxlcih0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSk7XG4gICAgfVxuICAgIGlmICghcmVzKSB7XG4gICAgICByZXMgPSBuZXcgQXJyYXk8YW55PigpO1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZSh0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSwgcmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3QXJyYXkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9uUHVzaDogYW55ID0gbnVsbCxcbiAgICBvblJlbW92ZTogYW55ID0gbnVsbFxuICApOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgbmV3QXJyYXkgPSB0aGlzLmNyZWF0ZU5ld0FycmF5Q29yZShuYW1lKTtcbiAgICBpZiAoIXRoaXMuYXJyYXlzSW5mbykge1xuICAgICAgdGhpcy5hcnJheXNJbmZvID0ge307XG4gICAgfVxuICAgIHRoaXMuYXJyYXlzSW5mb1tuYW1lXSA9IHsgb25QdXNoOiBvblB1c2gsIGlzSXRlbVZhbHVlczogZmFsc2UgfTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgbmV3QXJyYXkucHVzaCA9IGZ1bmN0aW9uICh2YWx1ZSk6IG51bWJlciB7XG4gICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ld0FycmF5KS5wdXNoLmNhbGwobmV3QXJyYXksIHZhbHVlKTtcbiAgICAgIGlmIChvblB1c2gpIG9uUHVzaCh2YWx1ZSwgbmV3QXJyYXkubGVuZ3RoIC0gMSk7XG4gICAgICBjb25zdCBhcnJheUNoYW5nZXMgPSBuZXcgQXJyYXlDaGFuZ2VzKFxuICAgICAgICBuZXdBcnJheS5sZW5ndGggLSAxLFxuICAgICAgICAwLFxuICAgICAgICBbdmFsdWVdLFxuICAgICAgICBbXVxuICAgICAgKTtcbiAgICAgIHNlbGYucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgbmV3QXJyYXksIG5ld0FycmF5LCBhcnJheUNoYW5nZXMpO1xuICAgICAgc2VsZi5ub3RpZnlBcnJheUNoYW5nZWQobmV3QXJyYXkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIG5ld0FycmF5LnVuc2hpZnQgPSBmdW5jdGlvbiAodmFsdWUpOiBudW1iZXIge1xuICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXdBcnJheSkudW5zaGlmdC5jYWxsKFxuICAgICAgICBuZXdBcnJheSxcbiAgICAgICAgdmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAob25QdXNoKSBvblB1c2godmFsdWUsIG5ld0FycmF5Lmxlbmd0aCAtIDEpO1xuICAgICAgY29uc3QgYXJyYXlDaGFuZ2VzID0gbmV3IEFycmF5Q2hhbmdlcygwLCAwLCBbdmFsdWVdLCBbXSk7XG4gICAgICBzZWxmLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG5ld0FycmF5LCBuZXdBcnJheSwgYXJyYXlDaGFuZ2VzKTtcbiAgICAgIHNlbGYubm90aWZ5QXJyYXlDaGFuZ2VkKG5ld0FycmF5KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBuZXdBcnJheS5wb3AgPSBmdW5jdGlvbiAoKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3QXJyYXkpLnBvcC5jYWxsKG5ld0FycmF5KTtcbiAgICAgIGlmIChvblJlbW92ZSkgb25SZW1vdmUocmVzdWx0KTtcbiAgICAgIGNvbnN0IGFycmF5Q2hhbmdlcyA9IG5ldyBBcnJheUNoYW5nZXMobmV3QXJyYXkubGVuZ3RoIC0gMSwgMSwgW10sIFtdKTtcbiAgICAgIHNlbGYucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgbmV3QXJyYXksIG5ld0FycmF5LCBhcnJheUNoYW5nZXMpO1xuICAgICAgc2VsZi5ub3RpZnlBcnJheUNoYW5nZWQobmV3QXJyYXkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIG5ld0FycmF5LnNwbGljZSA9IGZ1bmN0aW9uIChcbiAgICAgIHN0YXJ0PzogbnVtYmVyLFxuICAgICAgZGVsZXRlQ291bnQ/OiBudW1iZXIsXG4gICAgICAuLi5pdGVtczogYW55W11cbiAgICApOiBhbnlbXSB7XG4gICAgICBpZiAoIXN0YXJ0KSBzdGFydCA9IDA7XG4gICAgICBpZiAoIWRlbGV0ZUNvdW50KSBkZWxldGVDb3VudCA9IDA7XG4gICAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ld0FycmF5KS5zcGxpY2UuY2FsbChcbiAgICAgICAgbmV3QXJyYXksXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBkZWxldGVDb3VudCxcbiAgICAgICAgLi4uaXRlbXNcbiAgICAgICk7XG4gICAgICBpZiAoIWl0ZW1zKSBpdGVtcyA9IFtdO1xuICAgICAgaWYgKG9uUmVtb3ZlICYmIHJlc3VsdCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIG9uUmVtb3ZlKHJlc3VsdFtpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvblB1c2gpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIG9uUHVzaChpdGVtc1tpXSwgc3RhcnQgKyBpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBhcnJheUNoYW5nZXMgPSBuZXcgQXJyYXlDaGFuZ2VzKHN0YXJ0LCBkZWxldGVDb3VudCwgaXRlbXMsIHJlc3VsdCk7XG4gICAgICBzZWxmLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG5ld0FycmF5LCBuZXdBcnJheSwgYXJyYXlDaGFuZ2VzKTtcbiAgICAgIHNlbGYubm90aWZ5QXJyYXlDaGFuZ2VkKG5ld0FycmF5KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHJldHVybiBuZXdBcnJheTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXRlbVZhbHVlVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcHJvdGVjdGVkIHNldEFycmF5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzcmM6IGFueVtdLFxuICAgIGRlc3Q6IGFueVtdLFxuICAgIGlzSXRlbVZhbHVlczogYm9vbGVhbixcbiAgICBvblB1c2g6IGFueVxuICApIHtcbiAgICB2YXIgZGVsZXRlZEl0ZW1zID0gW10uY29uY2F0KHNyYyk7XG4gICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHNyYykuc3BsaWNlLmNhbGwoc3JjLCAwLCBzcmMubGVuZ3RoKTtcbiAgICBpZiAoISFkZXN0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBkZXN0W2ldO1xuICAgICAgICBpZiAoaXNJdGVtVmFsdWVzKSB7XG4gICAgICAgICAgaWYgKCEhQmFzZS5jcmVhdGVJdGVtVmFsdWUpIHtcbiAgICAgICAgICAgIGl0ZW0gPSBCYXNlLmNyZWF0ZUl0ZW1WYWx1ZShpdGVtLCB0aGlzLmdldEl0ZW1WYWx1ZVR5cGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihzcmMpLnB1c2guY2FsbChzcmMsIGl0ZW0pO1xuICAgICAgICBpZiAob25QdXNoKSBvblB1c2goc3JjW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgYXJyYXlDaGFuZ2VzID0gbmV3IEFycmF5Q2hhbmdlcyhcbiAgICAgIDAsXG4gICAgICBkZWxldGVkSXRlbXMubGVuZ3RoLFxuICAgICAgc3JjLFxuICAgICAgZGVsZXRlZEl0ZW1zXG4gICAgKTtcbiAgICB0aGlzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIGRlbGV0ZWRJdGVtcywgc3JjLCBhcnJheUNoYW5nZXMpO1xuICAgIHRoaXMubm90aWZ5QXJyYXlDaGFuZ2VkKHNyYyk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVHdvVmFsdWVFcXVhbHMoXG4gICAgeDogYW55LFxuICAgIHk6IGFueSxcbiAgICBjYXNlSW5TZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoY2FzZUluU2Vuc2l0aXZlKSB7XG4gICAgICB4ID0gdGhpcy5nZXRWYWx1ZUluTG93Q2FzZSh4KTtcbiAgICAgIHkgPSB0aGlzLmdldFZhbHVlSW5Mb3dDYXNlKHkpO1xuICAgIH1cbiAgICByZXR1cm4gSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHgsIHkpO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIGNvcHlPYmplY3QoZHN0OiBhbnksIHNyYzogYW55KSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgdmFyIHNvdXJjZSA9IHNyY1trZXldO1xuICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgc291cmNlID0ge307XG4gICAgICAgIHRoaXMuY29weU9iamVjdChzb3VyY2UsIHNyY1trZXldKTtcbiAgICAgIH1cbiAgICAgIGRzdFtrZXldID0gc291cmNlO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY29weUNzc0NsYXNzZXMoZGVzdDogYW55LCBzb3VyY2U6IGFueSkge1xuICAgIGlmICghc291cmNlKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICBkZXN0W1wicm9vdFwiXSA9IHNvdXJjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgU3VydmV5RWxlbWVudC5jb3B5T2JqZWN0KGRlc3QsIHNvdXJjZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVJbkxvd0Nhc2UodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICghIXZhbCAmJiB0eXBlb2YgdmFsID09IFwic3RyaW5nXCIpIHJldHVybiB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdmFsO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcnJheUNoYW5nZXMge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaW5kZXg6IG51bWJlcixcbiAgICBwdWJsaWMgZGVsZXRlQ291bnQ6IG51bWJlcixcbiAgICBwdWJsaWMgaXRlbXNUb0FkZDogYW55W10sXG4gICAgcHVibGljIGRlbGV0ZWRJdGVtczogYW55W11cbiAgKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5RXJyb3Ige1xuICBwcml2YXRlIGxvY1RleHRWYWx1ZTogTG9jYWxpemFibGVTdHJpbmc7XG4gIHB1YmxpYyB2aXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsXG4gICAgcHJvdGVjdGVkIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbFxuICApIHt9XG4gIHB1YmxpYyBnZXQgbG9jVGV4dCgpIHtcbiAgICBpZiAoIXRoaXMubG9jVGV4dFZhbHVlKSB7XG4gICAgICB0aGlzLmxvY1RleHRWYWx1ZSA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyh0aGlzLmVycm9yT3duZXIsIHRydWUpO1xuICAgICAgdGhpcy5sb2NUZXh0VmFsdWUudGV4dCA9IHRoaXMuZ2V0VGV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0VmFsdWU7XG4gIH1cbiAgcHVibGljIGdldFRleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gdGhpcy50ZXh0O1xuICAgIGlmICghcmVzKSByZXMgPSB0aGlzLmdldERlZmF1bHRUZXh0KCk7XG4gICAgaWYgKCEhdGhpcy5lcnJvck93bmVyKSB7XG4gICAgICByZXMgPSB0aGlzLmVycm9yT3duZXIuZ2V0RXJyb3JDdXN0b21UZXh0KHJlcywgdGhpcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImJhc2VcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3Mgb2YgU3VydmV5SlMgRWxlbWVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFbGVtZW50IGV4dGVuZHMgQmFzZSBpbXBsZW1lbnRzIElTdXJ2ZXlFbGVtZW50IHtcbiAgcHVibGljIHN0YXRpYyBjcmVhdGVQcm9ncmVzc0luZm8oKTogSVByb2dyZXNzSW5mbyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICBhbnN3ZXJlZFF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICByZXF1aXJlZFF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICByZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudDogMCxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZ2V0UHJvZ3Jlc3NJbmZvQnlFbGVtZW50cyhcbiAgICBjaGlsZHJlbjogQXJyYXk8U3VydmV5RWxlbWVudD4sXG4gICAgaXNSZXF1aXJlZDogYm9vbGVhblxuICApOiBJUHJvZ3Jlc3NJbmZvIHtcbiAgICB2YXIgaW5mbyA9IFN1cnZleUVsZW1lbnQuY3JlYXRlUHJvZ3Jlc3NJbmZvKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFjaGlsZHJlbltpXS5pc1Zpc2libGUpIGNvbnRpbnVlO1xuICAgICAgdmFyIGNoaWxkSW5mbyA9IGNoaWxkcmVuW2ldLmdldFByb2dyZXNzSW5mbygpO1xuICAgICAgaW5mby5xdWVzdGlvbkNvdW50ICs9IGNoaWxkSW5mby5xdWVzdGlvbkNvdW50O1xuICAgICAgaW5mby5hbnN3ZXJlZFF1ZXN0aW9uQ291bnQgKz0gY2hpbGRJbmZvLmFuc3dlcmVkUXVlc3Rpb25Db3VudDtcbiAgICAgIGluZm8ucmVxdWlyZWRRdWVzdGlvbkNvdW50ICs9IGNoaWxkSW5mby5yZXF1aXJlZFF1ZXN0aW9uQ291bnQ7XG4gICAgICBpbmZvLnJlcXVpcmVkQW5zd2VyZWRRdWVzdGlvbkNvdW50ICs9XG4gICAgICAgIGNoaWxkSW5mby5yZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudDtcbiAgICB9XG4gICAgaWYgKGlzUmVxdWlyZWQgJiYgaW5mby5xdWVzdGlvbkNvdW50ID4gMCkge1xuICAgICAgaWYgKGluZm8ucmVxdWlyZWRRdWVzdGlvbkNvdW50ID09IDApIGluZm8ucmVxdWlyZWRRdWVzdGlvbkNvdW50ID0gMTtcbiAgICAgIGlmIChpbmZvLmFuc3dlcmVkUXVlc3Rpb25Db3VudCA+IDApXG4gICAgICAgIGluZm8ucmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnQgPSAxO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfVxuICBwcml2YXRlIHN1cnZleUltcGxWYWx1ZTogSVN1cnZleUltcGw7XG4gIHByaXZhdGUgc3VydmV5RGF0YVZhbHVlOiBJU3VydmV5RGF0YTtcbiAgcHJpdmF0ZSBzdXJ2ZXlWYWx1ZTogSVN1cnZleTtcbiAgcHJpdmF0ZSB0ZXh0UHJvY2Vzc29yVmFsdWU6IElUZXh0UHJvY2Vzc29yO1xuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudEluRGVzaWduVmFsdWU6IFN1cnZleUVsZW1lbnQgPSB0aGlzO1xuICBwdWJsaWMgcmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgcHVibGljIHN0YXRpYyBTY3JvbGxFbGVtZW50VG9Ub3AoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWVsZW1lbnRJZCB8fCB0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgIGlmICghZWwgfHwgIWVsLnNjcm9sbEludG9WaWV3KSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGVsZW1Ub3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgaWYgKGVsZW1Ub3AgPCAwKSBlbC5zY3JvbGxJbnRvVmlldygpO1xuICAgIHJldHVybiBlbGVtVG9wIDwgMDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIEdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoXG4gICAgZWxlbWVudHM6IGFueSxcbiAgICByZW1vdmVTcGFjZXM6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICBpZiAoIWVsZW1lbnRzIHx8ICFlbGVtZW50cy5sZW5ndGggfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChyZW1vdmVTcGFjZXMpIHtcbiAgICAgIHZhciB0RWwgPSBlbGVtZW50c1swXTtcbiAgICAgIGlmICh0RWwubm9kZU5hbWUgPT09IFwiI3RleHRcIikgdEVsLmRhdGEgPSBcIlwiO1xuICAgICAgdEVsID0gZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAodEVsLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHRFbC5kYXRhID0gXCJcIjtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGVsZW1lbnRzW2ldLm5vZGVOYW1lICE9IFwiI3RleHRcIiAmJiBlbGVtZW50c1tpXS5ub2RlTmFtZSAhPSBcIiNjb21tZW50XCIpXG4gICAgICAgIHJldHVybiBlbGVtZW50c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBGb2N1c0VsZW1lbnQoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWVsZW1lbnRJZCB8fCB0eXBlb2YgZG9jdW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwuZm9jdXMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBDcmVhdGVEaXNhYmxlZERlc2lnbkVsZW1lbnRzOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBkaXNhYmxlRGVzaWduQWN0aW9uczogYm9vbGVhbiA9XG4gICAgU3VydmV5RWxlbWVudC5DcmVhdGVEaXNhYmxlZERlc2lnbkVsZW1lbnRzO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcImVycm9yc1wiKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImlzUmVhZE9ubHlcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHRoaXMuc3VydmV5SW1wbFZhbHVlID0gdmFsdWU7XG4gICAgaWYgKCF0aGlzLnN1cnZleUltcGxWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5RGF0YVZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2VTdXJ2ZXlEYXRhKCk7XG4gICAgdGhpcy5zdXJ2ZXlWYWx1ZSA9IHRoaXMuc3VydmV5SW1wbFZhbHVlLmdldFN1cnZleSgpO1xuICAgIHRoaXMudGV4dFByb2Nlc3NvclZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0VGV4dFByb2Nlc3NvcigpO1xuICAgIHRoaXMub25TZXREYXRhKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXlJbXBsKCkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleUltcGxWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzLnN1cnZleURhdGFWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3VydmV5IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIGlmICghIXRoaXMuc3VydmV5VmFsdWUpIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xuICAgIGlmICghIXRoaXMuc3VydmV5SW1wbFZhbHVlKSB7XG4gICAgICB0aGlzLnN1cnZleVZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0U3VydmV5KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIGluIGRlc2lnbiBtb2RlIHJpZ2h0IG5vdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXNpZ25Nb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZTtcbiAgfVxuICBwdWJsaWMgaXNDb250ZW50RWxlbWVudDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgZ2V0IGFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLnN1cnZleSAmJlxuICAgICAgdGhpcy5zdXJ2ZXkuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nICYmXG4gICAgICAhdGhpcy5pc0NvbnRlbnRFbGVtZW50XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSB0byBtYWtlIGFuIGVsZW1lbnQgcXVlc3Rpb24vcGFuZWwvcGFnZSByZWFkb25seS5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKiBAc2VlIGVuYWJsZUlmXG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVhZE9ubHlcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVhZE9ubHkodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMucmVhZE9ubHkgPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVhZE9ubHlcIiwgdmFsKTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHtcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVhZE9ubHlcIiwgdGhpcy5pc1JlYWRPbmx5KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVhZE9ubHlDaGFuZ2VkKCkge1xuICAgIGlmICghIXRoaXMucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMucmVhZE9ubHlDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHVwZGF0ZUVsZW1lbnRDc3MoKSB7fVxuICBwcm90ZWN0ZWQgZ2V0SXNMb2FkaW5nRnJvbUpzb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKHN1cGVyLmdldElzTG9hZGluZ0Zyb21Kc29uKCkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LmlzTG9hZGluZ0Zyb21Kc29uIDogZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIGlkZW50aWZpZXIgb2YgYSBzdXJ2ZXkgZWxlbWVudCAtIHF1ZXN0aW9uIG9yIHBhbmVsLlxuICAgKiBAc2VlIHZhbHVlTmFtZVxuICAgKi9cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5uYW1lO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgdGhpcy5nZXRWYWxpZE5hbWUodmFsKSk7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmICEhb2xkVmFsdWUpIHtcbiAgICAgIHRoaXMub25OYW1lQ2hhbmdlZChvbGRWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRWYWxpZE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25OYW1lQ2hhbmdlZChvbGRWYWx1ZTogc3RyaW5nKSB7fVxuICBwcm90ZWN0ZWQgdXBkYXRlQmluZGluZ1ZhbHVlKHZhbHVlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLmRhdGEgJiZcbiAgICAgICFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModmFsdWUsIHRoaXMuZGF0YS5nZXRWYWx1ZSh2YWx1ZU5hbWUpKVxuICAgICkge1xuICAgICAgdGhpcy5kYXRhLnNldFZhbHVlKHZhbHVlTmFtZSwgdmFsdWUsIGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVycm9ycy4gSXQgaXMgY3JlYXRlZCBieSBjYWxsaWcgaGFzRXJyb3JzIGZ1bmN0aW9uc1xuICAgKiBAc2VlIGhhc0Vycm9yc1xuICAgKi9cbiAgcHVibGljIGdldCBlcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXJyb3JzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXJyb3JzKHZhbDogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXJyb3JzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIHF1ZXN0aW9uIG9yIGEgY29udGFpbmVyIChwYW5lbC9wYWdlKSBvciB0aGVpciBjaGlkcmVuIGhhdmUgYW4gZXJyb3IuXG4gICAqIFRoZSB2YWx1ZSBjYW4gYmUgb3V0IG9mIGRhdGUuIGhhc0Vycm9ycyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29udGFpbnNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbnRhaW5zRXJyb3JzXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ29udGFpbnNFcnJvcnMoKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29udGFpbnNFcnJvcnNcIiwgdGhpcy5nZXRDb250YWluc0Vycm9ycygpKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29udGFpbnNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmxlbmd0aCA+IDA7XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRzSW5EZXNpZ24oaW5jbHVkZUhpZGRlbjogYm9vbGVhbiA9IGZhbHNlKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIGdldCBzZWxlY3RlZEVsZW1lbnRJbkRlc2lnbigpOiBTdXJ2ZXlFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24odmFsOiBTdXJ2ZXlFbGVtZW50KSB7XG4gICAgdGhpcy5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnblZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXRzKCkge31cblxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge31cbiAgcHVibGljIG9uRmlyc3RSZW5kZXJpbmcoKSB7fVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5vblN1cnZleUxvYWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUGFnZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBmYWxzZSBpZiBpdCBpcyBub3QgcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBkZWxldGUoKSB7fVxuICBwcm90ZWN0ZWQgcmVtb3ZlU2VsZkZyb21MaXN0KGxpc3Q6IEFycmF5PGFueT4pIHtcbiAgICBpZiAoIWxpc3QgfHwgIUFycmF5LmlzQXJyYXkobGlzdCkpIHJldHVybjtcbiAgICB2YXIgaW5kZXggPSBsaXN0LmluZGV4T2YodGhpcyk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb2Nlc3NlZEh0bWwoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWh0bWwgfHwgIXRoaXMudGV4dFByb2Nlc3NvcikgcmV0dXJuIGh0bWw7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dChodG1sLCB0cnVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TZXREYXRhKCkge31cbiAgcHJvdGVjdGVkIGdldFBhZ2UocGFyZW50OiBJUGFuZWwpOiBJUGFnZSB7XG4gICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQucGFyZW50KSBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIGlmIChwYXJlbnQgJiYgcGFyZW50LmdldFR5cGUoKSA9PSBcInBhZ2VcIikgcmV0dXJuIDxJUGFnZT4oPGFueT5wYXJlbnQpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBtb3ZlVG9CYXNlKFxuICAgIHBhcmVudDogSVBhbmVsLFxuICAgIGNvbnRhaW5lcjogSVBhbmVsLFxuICAgIGluc2VydEJlZm9yZTogYW55ID0gbnVsbFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIGZhbHNlO1xuICAgIHBhcmVudC5yZW1vdmVFbGVtZW50KDxJRWxlbWVudD4oPGFueT50aGlzKSk7XG4gICAgdmFyIGluZGV4ID0gLTE7XG4gICAgaWYgKEhlbHBlcnMuaXNOdW1iZXIoaW5zZXJ0QmVmb3JlKSkge1xuICAgICAgaW5kZXggPSBwYXJzZUludChpbnNlcnRCZWZvcmUpO1xuICAgIH1cbiAgICBpZiAoaW5kZXggPT0gLTEgJiYgISFpbnNlcnRCZWZvcmUgJiYgISFpbnNlcnRCZWZvcmUuZ2V0VHlwZSkge1xuICAgICAgaW5kZXggPSBjb250YWluZXIuaW5kZXhPZihpbnNlcnRCZWZvcmUpO1xuICAgIH1cbiAgICBjb250YWluZXIuYWRkRWxlbWVudCg8SUVsZW1lbnQ+KDxhbnk+dGhpcyksIGluZGV4KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRQYWdlKHBhcmVudDogSVBhbmVsLCB2YWw6IElQYWdlKSB7XG4gICAgdmFyIG9sZFBhZ2UgPSB0aGlzLmdldFBhZ2UocGFyZW50KTtcbiAgICBpZiAob2xkUGFnZSA9PT0gdmFsKSByZXR1cm47XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUVsZW1lbnQoPElFbGVtZW50Pig8YW55PnRoaXMpKTtcbiAgICBpZiAodmFsKSB7XG4gICAgICB2YWwuYWRkRWxlbWVudCg8SUVsZW1lbnQ+KDxhbnk+dGhpcyksIC0xKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50PFQgZXh0ZW5kcyBGdW5jdGlvbiwgT3B0aW9ucz4ge1xuICBwdWJsaWMgb25DYWxsYmFja3NDaGFuZ2VkOiAoKSA9PiB2b2lkO1xuICBwcm90ZWN0ZWQgY2FsbGJhY2tzOiBBcnJheTxUPjtcbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrcyA9PSBudWxsIHx8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aCA9PSAwO1xuICB9XG4gIHB1YmxpYyBmaXJlKHNlbmRlcjogYW55LCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrc1tpXShzZW5kZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBbXTtcbiAgICB0aGlzLmZpcmVDYWxsYmFja0NoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgYWRkKGZ1bmM6IFQpIHtcbiAgICBpZiAodGhpcy5oYXNGdW5jKGZ1bmMpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IEFycmF5PFQ+KCk7XG4gICAgfVxuICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goZnVuYyk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2tDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIHJlbW92ZShmdW5jOiBUKSB7XG4gICAgaWYgKHRoaXMuaGFzRnVuYyhmdW5jKSkge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5jYWxsYmFja3MuaW5kZXhPZihmdW5jLCAwKTtcbiAgICAgIHRoaXMuY2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB0aGlzLmZpcmVDYWxsYmFja0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGhhc0Z1bmMoZnVuYzogVCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuY2FsbGJhY2tzLmluZGV4T2YoZnVuYywgMCkgPiAtMTtcbiAgfVxuICBwcml2YXRlIGZpcmVDYWxsYmFja0NoYW5nZWQoKSB7XG4gICAgaWYgKCEhdGhpcy5vbkNhbGxiYWNrc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMub25DYWxsYmFja3NDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvYmFzZS50cyIsImltcG9ydCB7IEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IElFbGVtZW50IH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcblxuLy9UT0RPIHJlcGxhY2UgY29tcGxldGVseSB3aXRoIEVsZW1lbnRGYWN0b3J5XG5leHBvcnQgY2xhc3MgUXVlc3Rpb25GYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogUXVlc3Rpb25GYWN0b3J5ID0gbmV3IFF1ZXN0aW9uRmFjdG9yeSgpO1xuICBwdWJsaWMgc3RhdGljIGdldCBEZWZhdWx0Q2hvaWNlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIikgKyBcIjFcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIikgKyBcIjJcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIikgKyBcIjNcIlxuICAgIF07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdENvbHVtcygpOiBzdHJpbmdbXSB7XG4gICAgdmFyIGNvbE5hbWUgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWF0cml4X2NvbHVtblwiKSArIFwiIFwiO1xuICAgIHJldHVybiBbY29sTmFtZSArIFwiMVwiLCBjb2xOYW1lICsgXCIyXCIsIGNvbE5hbWUgKyBcIjNcIl07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdFJvd3MoKTogc3RyaW5nW10ge1xuICAgIHZhciByb3dOYW1lID0gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9yb3dcIikgKyBcIiBcIjtcbiAgICByZXR1cm4gW3Jvd05hbWUgKyBcIjFcIiwgcm93TmFtZSArIFwiMlwiXTtcbiAgfVxuICBwcml2YXRlIGNyZWF0b3JIYXNoOiBIYXNoVGFibGU8KG5hbWU6IHN0cmluZykgPT4gUXVlc3Rpb24+ID0ge307XG5cbiAgcHVibGljIHJlZ2lzdGVyUXVlc3Rpb24oXG4gICAgcXVlc3Rpb25UeXBlOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25DcmVhdG9yOiAobmFtZTogc3RyaW5nKSA9PiBRdWVzdGlvblxuICApIHtcbiAgICB0aGlzLmNyZWF0b3JIYXNoW3F1ZXN0aW9uVHlwZV0gPSBxdWVzdGlvbkNyZWF0b3I7XG4gIH1cbiAgcHVibGljIHVucmVnaXN0ZXJFbGVtZW50KGVsZW1lbnRUeXBlOiBzdHJpbmcpIHtcbiAgICBkZWxldGUgdGhpcy5jcmVhdG9ySGFzaFtlbGVtZW50VHlwZV07XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuY3JlYXRvckhhc2ggPSB7fTtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsVHlwZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc29ydCgpO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihxdWVzdGlvblR5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciBjcmVhdG9yID0gdGhpcy5jcmVhdG9ySGFzaFtxdWVzdGlvblR5cGVdO1xuICAgIGlmIChjcmVhdG9yID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBjcmVhdG9yKG5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50RmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IEVsZW1lbnRGYWN0b3J5ID0gbmV3IEVsZW1lbnRGYWN0b3J5KCk7XG4gIHByaXZhdGUgY3JlYXRvckhhc2g6IEhhc2hUYWJsZTwobmFtZTogc3RyaW5nKSA9PiBJRWxlbWVudD4gPSB7fTtcblxuICBwdWJsaWMgcmVnaXN0ZXJFbGVtZW50KFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4gICAgZWxlbWVudENyZWF0b3I6IChuYW1lOiBzdHJpbmcpID0+IElFbGVtZW50XG4gICkge1xuICAgIHRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdID0gZWxlbWVudENyZWF0b3I7XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuY3JlYXRvckhhc2ggPSB7fTtcbiAgfVxuICBwdWJsaWMgdW5yZWdpc3RlckVsZW1lbnQoXG4gICAgZWxlbWVudFR5cGU6IHN0cmluZyxcbiAgICByZW1vdmVGcm9tU2VyaWFsaXplcjogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIGRlbGV0ZSB0aGlzLmNyZWF0b3JIYXNoW2VsZW1lbnRUeXBlXTtcbiAgICBRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UudW5yZWdpc3RlckVsZW1lbnQoZWxlbWVudFR5cGUpO1xuICAgIGlmIChyZW1vdmVGcm9tU2VyaWFsaXplcikge1xuICAgICAgU2VyaWFsaXplci5yZW1vdmVDbGFzcyhlbGVtZW50VHlwZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzdWx0ID0gUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmdldEFsbFR5cGVzKCk7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuY3JlYXRvckhhc2gpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc29ydCgpO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVFbGVtZW50KGVsZW1lbnRUeXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IElFbGVtZW50IHtcbiAgICB2YXIgY3JlYXRvciA9IHRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdO1xuICAgIGlmIChjcmVhdG9yID09IG51bGwpXG4gICAgICByZXR1cm4gUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmNyZWF0ZVF1ZXN0aW9uKGVsZW1lbnRUeXBlLCBuYW1lKTtcbiAgICByZXR1cm4gY3JlYXRvcihuYW1lKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uZmFjdG9yeS50cyIsIi8qKlxuICogR2xvYmFsIHN1cnZleSBzZXR0aW5nc1xuICovXG5leHBvcnQgdmFyIHNldHRpbmdzID0ge1xuICAvKipcbiAgICogVGhlIHByZWZpeCB0aGF0IHVzZXMgdG8gc3RvcmUgdGhlIHF1ZXN0aW9uIGNvbW1lbnQsIGFzIHtxdWVzdGlvbk5hbWV9ICsge2NvbW1lbnRQcmVmaXh9LlxuICAgKiBUaGUgZGVmYXVsdFxuICAgKi9cbiAgY29tbWVudFByZWZpeDogXCItQ29tbWVudFwiLFxuICAvKipcbiAgICogRW5jb2RlIHBhcmFtZXRlciBvbiBjYWxsaW5nIHJlc3RmdWxsIHdlYiBBUElcbiAgICovXG4gIHdlYnNlcnZpY2VFbmNvZGVQYXJhbWV0ZXJzOiB0cnVlLFxuICAvKipcbiAgICogQ2FjaGUgdGhlIHJlc3VsdCBmb3IgY2hvaWNlcyBnZXR0aW5nIGZyb20gd2ViIHNlcnZpY2VzLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gZGlzYWJsZSB0aGUgY2FjaGluZy5cbiAgICovXG4gIHVzZUNhY2hpbmdGb3JDaG9pY2VzUmVzdGZ1bGw6IHRydWUsXG4gIC8qKlxuICAgKiBTdXJ2ZXlKUyB3ZWIgc2VydmljZSBBUEkgdXJsXG4gICAqL1xuICBzdXJ2ZXlTZXJ2aWNlVXJsOiBcImh0dHBzOi8vYXBpLnN1cnZleWpzLmlvL3B1YmxpYy92MS9TdXJ2ZXlcIixcbiAgLyoqXG4gICAqIHNlcGFyYXRvciB0aGF0IGNhbiBhbGxvdyB0byBzZXQgdmFsdWUgYW5kIHRleHQgb2YgSXRlbVZhbHVlIG9iamVjdCBpbiBvbmUgc3RyaW5nIGFzOiBcInZhbHVlfHRleHRcIlxuICAgKi9cbiAgaXRlbVZhbHVlU2VwYXJhdG9yOiBcInxcIixcbiAgLyoqXG4gICAqIGRlZmF1bHQgbG9jYWxlIG5hbWUgZm9yIGxvY2FsaXphYmxlIHN0cmluZ3MgdGhhdCB1c2VzIGR1cmluZyBzZXJpYWxpemF0aW9uLCB7XCJkZWZhdWx0XCI6IFwiTXkgdGV4dFwiLCBcImRlXCI6IFwiTWVpbiBUZXh0XCJ9XG4gICAqL1xuICBkZWZhdWx0TG9jYWxlTmFtZTogXCJkZWZhdWx0XCIsXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJvdyBuYW1lIGZvciBtYXRyaXggKHNpbmdsZSBjaG9pY2UpXG4gICAqL1xuICBtYXRyaXhEZWZhdWx0Um93TmFtZTogXCJkZWZhdWx0XCIsXG4gIC8qKlxuICAgKiBEZWZhdWx0IGNlbGwgdHlwZSBmb3IgZHJvcGRvd24gYW5kIGR5bmFtaWMgbWF0cmljZXNcbiAgICovXG4gIG1hdHJpeERlZmF1bHRDZWxsVHlwZTogXCJkcm9wZG93blwiLFxuICAvKipcbiAgICogVG90YWwgdmFsdWUgcG9zdGZpeCBmb3IgZHJvcGRvd24gYW5kIGR5bmFtaWMgbWF0cmljZXMuIFRoZSB0b3RhbCB2YWx1ZSBzdG9yZXMgYXM6IHttYXRyaXhOYW1lfSArIHtwb3N0Zml4fVxuICAgKi9cbiAgbWF0cml4VG90YWxWYWx1ZVBvc3RGaXg6IFwiLXRvdGFsXCIsXG4gIC8qKlxuICAgKiBNYXhpbXVtIHJvdyBjb3VudCBpbiBkeW5hbWljIG1hdHJpeFxuICAgKi9cbiAgbWF0cml4TWF4aW11bVJvd0NvdW50OiAxMDAwLFxuICAvKipcbiAgICogTWF4aW11bSByb3dDb3VudCB0aGF0IHJldHVybnMgaW4gYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dCBmdW5jdGlvblxuICAgKi9cbiAgbWF0cml4TWF4Um93Q291bnRJbkNvbmRpdGlvbjogMSxcbiAgLyoqXG4gICAqIE1heGltdW0gcGFuZWwgY291bnQgaW4gZHluYW1pYyBwYW5lbFxuICAgKi9cbiAgcGFuZWxNYXhpbXVtUGFuZWxDb3VudDogMTAwLFxuICAvKipcbiAgICogTWF4aW11bSByYXRlIHZhbHVlIGNvdW50IGluIHJhdGluZyBxdWVzdGlvblxuICAgKi9cbiAgcmF0aW5nTWF4aW11bVJhdGVWYWx1ZUNvdW50OiAyMCxcbiAgLyoqXG4gICAqIERpc2FibGUgdGhlIHF1ZXN0aW9uIHdoaWxlIGNob2ljZXMgYXJlIGdldHRpbmcgZnJvbSB0aGUgd2ViIHNlcnZpY2VcbiAgICovXG4gIGRpc2FibGVPbkdldHRpbmdDaG9pY2VzRnJvbVdlYjogZmFsc2UsXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB0byBhbHdheXMgc2VyaWFsaXplIHRoZSBsb2NhbGl6YXRpb24gc3RyaW5nIGFzIG9iamVjdCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlIGZvciBkZWZhdWx0IGxvY2FsZS4gSW5zdGVhZCBvZiBzdHJpbmcgXCJNeVN0clwiIHNlcmlhbGl6ZSBhcyB7ZGVmYXVsdDogXCJNeVN0clwifVxuICAgKi9cbiAgc2VyaWFsaXplTG9jYWxpemFibGVTdHJpbmdBc09iamVjdDogZmFsc2UsXG4gIC8qKlxuICAgKiBTZXQgdG8gZmFsc2UgdG8gaGlkZSBlbXB0eSBwYWdlIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBpbiBkZXNpZ24gbW9kZVxuICAgKi9cbiAgYWxsb3dTaG93RW1wdHlUaXRsZUluRGVzaWduTW9kZTogdHJ1ZSxcbiAgLyoqXG4gICAqIFNldCB0byBmYWxzZSB0byBoaWRlIGVtcHR5IHBhZ2UgZGVzY3JpcHRpb24gaW4gZGVzaWduIG1vZGVcbiAgICovXG4gIGFsbG93U2hvd0VtcHR5RGVzY3JpcHRpb25JbkRlc2lnbk1vZGU6IHRydWUsXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIGV4ZWN1dGUgdGhlIGNvbXBsZXRlIHRyaWdnZXIgb24gdmFsdWUgY2hhbmdlIGluc3RlYWQgb2Ygb24gbmV4dCBwYWdlLlxuICAgKi9cbiAgZXhlY3V0ZUNvbXBsZXRlVHJpZ2dlck9uVmFsdWVDaGFuZ2VkOiBmYWxzZSxcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGV4ZWN1dGUgdGhlIHNraXAgdHJpZ2dlciBvbiBuZXh0IHBhZ2UgaW5zdGVhZCBvZiBvbiB2YWx1ZSBjaGFuZ2UuXG4gICAqL1xuICBleGVjdXRlU2tpcFRyaWdnZXJPblZhbHVlQ2hhbmdlZDogdHJ1ZSxcbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSByZWFkT25seUNvbW1lbnRSZW5kZXJNb2RlOiBcInRleHRhcmVhXCIgKGRlZmF1bHQpIG9yIChkaXYpXG4gICAqL1xuICByZWFkT25seUNvbW1lbnRSZW5kZXJNb2RlOiBcInRleHRhcmVhXCIsXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uLCBzZXQgeW91ciBmdW5jdGlvbiwgaWYgeW91IHdhbnQgdG8gc2hvdyB5b3VyIG93biBkaWFsb2cgY29uZmlybSB3aW5kb3cgaW5zdGVhZCBvZiBzdGFuZGFyZCBicm93c2VyIHdpbmRvdy5cbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIGNvbmZpcm1BY3Rpb25GdW5jOiBmdW5jdGlvbiAobWVzc2FnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNvbmZpcm0obWVzc2FnZSk7XG4gIH0sXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG1pbldpZHRoIGNvbnN0cmFpbnRcbiAgICovXG4gIG1pbldpZHRoOiBcIjMwMHB4XCIsXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG1pbldpZHRoIGNvbnN0cmFpbnRcbiAgICovXG4gIG1heFdpZHRoOiBcImluaXRpYWxcIixcbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgdGVsbHMgaG93IG1hbnkgdGltZXMgc3VydmV5IHJlLXJ1biBleHByZXNzaW9ucyBvbiB2YWx1ZSBjaGFuZ2VzIGR1cmluZyBjb25kaXRpb24gcnVubmluZy4gV2UgbmVlZCBpdCB0byBhdm9pZCByZWN1cnNpb25zIGluIHRoZSBleHByZXNzaW9uc1xuICAgKi9cbiAgbWF4aW11bUNvbmRpdGlvblJ1bkNvdW50T25WYWx1ZUNoYW5nZWQ6IDEwLFxuICAvKipcbiAgICogQnkgZGVmYXVsdCB2aXNpYmxlSW5kZXggZm9yIHF1ZXN0aW9uIHdpdGggdGl0bGVMb2NhdGlvbiA9IFwiaGlkZGVuXCIgaXMgLTEsIGFuZCBzdXJ2ZXkgZG9lc24ndCBjb3VudCB0aGVzZSBxdWVzdGlvbnMgd2hlbiBzZXQgcXVlc3Rpb25zIG51bWJlcnMuXG4gICAqIFNldCBpdCB0cnVlLCBhbmQgYSBxdWVzdGlvbiBuZXh0IHRvIGEgcXVlc3Rpb24gd2l0aCBoaWRkZW4gdGl0bGUgd2lsbCBpbmNyZWFzZSBpdCdzIG51bWJlci5cbiAgICovXG4gIHNldFF1ZXN0aW9uVmlzaWJsZUluZGV4Rm9ySGlkZGVuVGl0bGU6IGZhbHNlLFxuICAvKipcbiAgICogQnkgZGVmYXVsdCB2aXNpYmxlSW5kZXggZm9yIHF1ZXN0aW9uIHdpdGggaGlkZU51bWJlciA9IHRydWUgaXMgLTEsIGFuZCBzdXJ2ZXkgZG9lc24ndCBjb3VudCB0aGVzZSBxdWVzdGlvbnMgd2hlbiBzZXQgcXVlc3Rpb25zIG51bWJlcnMuXG4gICAqIFNldCBpdCB0cnVlLCBhbmQgYSBxdWVzdGlvbiBuZXh0IHRvIGEgcXVlc3Rpb24gd2l0aCBoaWRkZW4gdGl0bGUgbnVtYmVyIHdpbGwgaW5jcmVhc2UgaXQncyBudW1iZXIuXG4gICAqL1xuICBzZXRRdWVzdGlvblZpc2libGVJbmRleEZvckhpZGRlbk51bWJlcjogZmFsc2UsXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IGFsbCByb3dzIGFyZSByZW5kZXJlZCBubyBtYXR0ZXJzIHdod3RoZXIgdGhleSBhcmUgdmlzaWJsZS5cbiAgICogU2V0IGl0IHRydWUsIGFuZCBzdXJ2ZXkgbWFya3VwIHJvd3Mgd2lsbCBiZSByZW5kZXJlZCBvbmx5IGlmIHRoZXkgYXJlIHZpc2libGUgaW4gdmlld3BvcnQuXG4gICAqIFRoaXMgZmVhdHVyZSBpcyBleHBlcmltYW50YWwgYW5kIG1pZ2h0IGRvIG5vdCBzdXBwb3J0IGFsbCB0aGUgdXNlIGNhc2VzLlxuICAgKi9cbiAgbGF6eVJvd3NSZW5kZXJpbmc6IGZhbHNlLFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zZXR0aW5ncy50cyIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEpzb25PYmplY3QsIFNlcmlhbGl6ZXIsIHByb3BlcnR5IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtcbiAgU3VydmV5RXJyb3IsXG4gIFN1cnZleUVsZW1lbnQsXG4gIElFbGVtZW50LFxuICBJUXVlc3Rpb24sXG4gIElQYW5lbCxcbiAgSUNvbmRpdGlvblJ1bm5lcixcbiAgSVN1cnZleUltcGwsXG4gIElQYWdlLFxuICBFdmVudCxcbiAgSVRpdGxlT3duZXIsXG4gIElQcm9ncmVzc0luZm8sXG59IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IEFuc3dlclJlcXVpcmVkRXJyb3IsIEN1c3RvbUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IFN1cnZleVZhbGlkYXRvciwgSVZhbGlkYXRvck93bmVyLCBWYWxpZGF0b3JSdW5uZXIgfSBmcm9tIFwiLi92YWxpZGF0b3JcIjtcbmltcG9ydCB7IFRleHRQcmVQcm9jZXNzb3IsIFRleHRQcmVQcm9jZXNzb3JWYWx1ZSB9IGZyb20gXCIuL3RleHRQcmVQcm9jZXNzb3JcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkN1c3RvbVdpZGdldCB9IGZyb20gXCIuL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0c1wiO1xuaW1wb3J0IHsgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0c1wiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IFBhbmVsTW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb25kaXRpb25PYmplY3Qge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbiAgcXVlc3Rpb246IFF1ZXN0aW9uO1xufVxuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgYWxsIHF1ZXN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uXG4gIGV4dGVuZHMgU3VydmV5RWxlbWVudFxuICBpbXBsZW1lbnRzXG4gICAgSVF1ZXN0aW9uLFxuICAgIElDb25kaXRpb25SdW5uZXIsXG4gICAgSUxvY2FsaXphYmxlT3duZXIsXG4gICAgSVZhbGlkYXRvck93bmVyLFxuICAgIElUaXRsZU93bmVyIHtcbiAgW2luZGV4OiBzdHJpbmddOiBhbnk7XG4gIHByaXZhdGUgc3RhdGljIFRleHRQcmVwcm9jZXNzb3JWYWx1ZXNNYXAgPSB7XG4gICAgdGl0bGU6IFwicHJvY2Vzc2VkVGl0bGVcIixcbiAgICByZXF1aXJlOiBcInJlcXVpcmVkVGV4dFwiLFxuICB9O1xuICBwcml2YXRlIHN0YXRpYyBxdWVzdGlvbkNvdW50ZXIgPSAxMDA7XG4gIHByaXZhdGUgc3RhdGljIGdldFF1ZXN0aW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzcV9cIiArIFF1ZXN0aW9uLnF1ZXN0aW9uQ291bnRlcisrO1xuICB9XG4gIHByaXZhdGUgY29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXIgPSBudWxsO1xuICBwcml2YXRlIGlzQ3VzdG9tV2lkZ2V0UmVxdWVzdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgY3VzdG9tV2lkZ2V0VmFsdWU6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0O1xuICBjdXN0b21XaWRnZXREYXRhID0geyBpc05lZWRSZW5kZXI6IHRydWUgfTtcbiAgZm9jdXNDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgc3VydmV5TG9hZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcbiAgcHJpdmF0ZSBjb25kaXRpb25FbmFiZWxSdW5uZXI6IENvbmRpdGlvblJ1bm5lcjtcbiAgcHJpdmF0ZSBjb25kaXRpb25SZXF1aXJlZFJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICB2YWx1ZUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29tbWVudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgdmFsaWRhdGVWYWx1ZUNhbGxiYWNrOiAoKSA9PiBTdXJ2ZXlFcnJvcjtcbiAgcXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FsbGJhY2s6ICgpID0+IHN0cmluZztcbiAgYWZ0ZXJSZW5kZXJRdWVzdGlvbkNhbGxiYWNrOiAocXVlc3Rpb246IFF1ZXN0aW9uLCBlbGVtZW50OiBhbnkpID0+IGFueTtcbiAgcHJpdmF0ZSBsb2NQcm9jZXNzZWRUaXRsZTogTG9jYWxpemFibGVTdHJpbmc7XG4gIHByb3RlY3RlZCBpc1JlYWR5VmFsdWU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiBpc1JlYWR5IHByb3BlcnR5IG9mIHF1ZXN0aW9uIGlzIGNoYW5nZWQuXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gLSB0aGUgcXVlc3Rpb25cbiAgICogPGJyLz4gb3B0aW9ucy5pc1JlYWR5IC0gY3VycmVudCB2YWx1ZSBvZiBpc1JlYWR5XG4gICAqIDxici8+IG9wdGlvbnMub2xkSXNSZWFkeSAtIG9sZCB2YWx1ZSBvZiBpc1JlYWR5XG4gICAqL1xuICBwdWJsaWMgb25SZWFkeUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBRdWVzdGlvbiwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcblxuICBwdWJsaWMgaXNSZWFkT25seVJlbmRlckRpdigpIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlYWRPbmx5ICYmIHNldHRpbmdzLnJlYWRPbmx5Q29tbWVudFJlbmRlck1vZGUgPT09IFwiZGl2XCI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5pZCA9IFF1ZXN0aW9uLmdldFF1ZXN0aW9uSWQoKTtcbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInZhbGlkYXRvcnNcIiwgZnVuY3Rpb24gKHZhbGlkYXRvcjogYW55KSB7XG4gICAgICB2YWxpZGF0b3IuZXJyb3JPd25lciA9IHNlbGY7XG4gICAgfSk7XG4gICAgdmFyIGxvY1RpdGxlVmFsdWUgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIiwgdGhpcywgdHJ1ZSk7XG4gICAgbG9jVGl0bGVWYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgdGV4dCA9IHNlbGYubmFtZTtcbiAgICAgIH1cbiAgICAgIGlmICghc2VsZi5zdXJ2ZXkpIHJldHVybiB0ZXh0O1xuICAgICAgcmV0dXJuIHNlbGYuc3VydmV5LmdldFVwZGF0ZWRRdWVzdGlvblRpdGxlKHNlbGYsIHRleHQpO1xuICAgIH07XG4gICAgdGhpcy5sb2NQcm9jZXNzZWRUaXRsZSA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyh0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmxvY1Byb2Nlc3NlZFRpdGxlLnNoYXJlZERhdGEgPSBsb2NUaXRsZVZhbHVlO1xuICAgIHZhciBsb2NDb21tZW50VGV4dCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXG4gICAgICBcImNvbW1lbnRUZXh0XCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgbG9jQ29tbWVudFRleHQub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJJdGVtVGV4dFwiKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ3aWR0aFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLnVwZGF0ZUVsZW1lbnRDc3MoKTtcbiAgICAgIGlmICghIXNlbGYucGFyZW50KSB7XG4gICAgICAgIHNlbGYucGFyZW50LmVsZW1lbnRXaWR0aENoYW5nZWQoc2VsZik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiaW5kZW50XCIsIFwicmlnaHRJbmRlbnRcIl0sXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYub25JbmRlbnRDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcImhhc0NvbW1lbnRcIiwgXCJoYXNPdGhlclwiXSxcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5pbml0Q29tbWVudEZyb21TdXJ2ZXkoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZU5hbWUoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnZhbHVlTmFtZSkgcmV0dXJuIHRoaXMudmFsdWVOYW1lLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgaWYgeW91IHdhbnQgdG8gc3RvcmUgdGhlIHF1ZXN0aW9uIHJlc3VsdCBpbiB0aGUgbmFtZSBkaWZmZXJlbnQgZnJvbSB0aGUgcXVlc3Rpb24gbmFtZS5cbiAgICogUXVlc3Rpb24gbmFtZSBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSBzdXJ2ZXkgYW5kIHZhbHVlTmFtZSBjb3VsZCBiZSBub3QgdW5pcXVlLiBJdCBhbGxvd3MgdG8gc2hhcmUgZGF0YSBiZXR3ZWVuIHNldmVyYWwgcXVlc3Rpb25zIHdpdGggdGhlIHNhbWUgdmFsdWVOYW1lLlxuICAgKiBUaGUgbGlicmFyeSBzZXQgdGhlIHZhbHVlIGF1dG9tYXRpY2FsbHkgaWYgdGhlIHF1ZXN0aW9uLm5hbWUgcHJvcGVydHkgaXMgbm90IHZhbGlkLiBGb3IgZXhhbXBsZSwgaWYgaXQgY29udGFpbnMgdGhlIHBlcmlvZCAnLicgc3ltYm9sLlxuICAgKiBJbiB0aGlzIGNhc2UgaWYgeW91IHNldCB0aGUgcXVlc3Rpb24ubmFtZSBwcm9wZXJ0eSB0byAneC55JyB0aGVuIHRoZSB2YWx1ZU5hbWUgYmVjb21lcyAneCB5Jy5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbnMgd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cbiAgICogQHNlZSBuYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZU5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZU5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB2YXIgb2xkVmFsdWVOYW1lID0gdGhpcy5nZXRWYWx1ZU5hbWUoKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZU5hbWVcIiwgdmFsKTtcbiAgICB0aGlzLm9uVmFsdWVOYW1lQ2hhbmdlZChvbGRWYWx1ZU5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlTmFtZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5xdWVzdGlvblJlbmFtZWQoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5uYW1lLFxuICAgICAgISFvbGRWYWx1ZSA/IG9sZFZhbHVlIDogdGhpcy5uYW1lXG4gICAgKTtcbiAgICB0aGlzLmluaXREYXRhRnJvbVN1cnZleSgpO1xuICB9XG4gIHByb3RlY3RlZCBvbk5hbWVDaGFuZ2VkKG9sZFZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm47XG4gICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25SZW5hbWVkKFxuICAgICAgdGhpcyxcbiAgICAgIG9sZFZhbHVlLFxuICAgICAgdGhpcy52YWx1ZU5hbWUgPyB0aGlzLnZhbHVlTmFtZSA6IG9sZFZhbHVlXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZWFkeVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgaXMgcXVlc3Rpb24gcmVhZHkgdG8gdXNlXG4gICAqL1xuICBwdWJsaWMgY2hvaWNlc0xvYWRlZCgpOiB2b2lkIHt9XG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBwYWdlIHdoZXJlIHRoZSBxdWVzdGlvbiBpcyBsb2NhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlKCk6IElQYWdlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlKHRoaXMucGFyZW50KTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhZ2UodmFsOiBJUGFnZSkge1xuICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhcmVudCwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0UGFuZWwoKTogSVBhbmVsIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZGVsZXRlKCkge1xuICAgIGlmICghIXRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLnJlbW92ZVNlbGZGcm9tTGlzdCh0aGlzLnBhcmVudC5lbGVtZW50cyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaXNGbG93TGF5b3V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldExheW91dFR5cGUoKSA9PT0gXCJmbG93XCI7XG4gIH1cbiAgcHVibGljIGdldExheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldENoaWxkcmVuTGF5b3V0VHlwZSgpO1xuICAgIHJldHVybiBcInJvd1wiO1xuICB9XG4gIGlzTGF5b3V0VHlwZVN1cHBvcnRlZChsYXlvdXRUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbGF5b3V0VHlwZSAhPT0gXCJmbG93XCI7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBnZXQvc2V0IHRoZSBxdWVzdGlvbiB2aXNpYmlsaXR5LlxuICAgKiBAc2VlIHZpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsID09IHRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdmFsKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICB0aGlzLm5vdGlmeVN1cnZleVZpc2liaWxpdHlDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIHRoaXMuaXNWaXNpYmxlKTtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNDbGVhclZhbHVlT25IaWRkZW4pIHtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSAmJiB0aGlzLmVycm9ycyAmJiB0aGlzLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIGNob29zZSBob3cgb3RoZXIgcXVlc3Rpb24gdmFsdWVzIHdpbGwgYmUgcmVuZGVyZWQgaW4gdGl0bGUgaWYgcmVmZXJlbmNlZCBpbiB7fS5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCB1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidXNlRGlzcGxheVZhbHVlc0luVGl0bGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ1c2VEaXNwbGF5VmFsdWVzSW5UaXRsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIHRydWUgdGhlIFF1ZXN0aW9uIGJlY29tZXMgdmlzaWJsZSBhbmQgaWYgaXQgcmV0dXJucyBmYWxzZSB0aGUgUXVlc3Rpb24gYmVjb21lcyBpbnZpc2libGUuIFRoZSBsaWJyYXJ5IHJ1bnMgdGhlIGV4cHJlc3Npb24gb24gc3VydmV5IHN0YXJ0IGFuZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZhbHVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZW1wdHkgdGhlbiB2aXNpYmxlIHByb3BlcnR5IGlzIHVzZWQuXG4gICAqIEBzZWUgdmlzaWJsZVxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIHZhbCk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gaXMgdmlzaWJsZSBvciBzdXJ2ZXkgaXMgaW4gZGVzaWduIG1vZGUgcmlnaHQgbm93LlxuICAgKi9cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmFyZUVtcHR5RWxlbWVudHNIaWRkZW4gJiYgdGhpcy5pc0VtcHR5KCkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZSB8fCB0aGlzLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmlzaWJsZSBpbmRleCBvZiB0aGUgcXVlc3Rpb24gaW4gdGhlIHN1cnZleS4gSXQgY2FuIGJlIGZyb20gMCB0byBhbGwgdmlzaWJsZSBxdWVzdGlvbnMgY291bnQgLSAxXG4gICAqIFRoZSB2aXNpYmxlSW5kZXggaXMgLTEgaWYgdGhlIHRpdGxlIGlzICdoaWRkZW4nIG9yIGhpZGVOdW1iZXIgaXMgdHJ1ZVxuICAgKiBAc2VlIHRpdGxlTG9jYXRpb25cbiAgICogQHNlZSBoaWRlTnVtYmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgLTEpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaGlkZU51bWJlciB0byB0cnVlIHRvIHN0b3Agc2hvd2luZyB0aGUgbnVtYmVyIGZvciB0aGlzIHF1ZXN0aW9uLiBUaGUgcXVlc3Rpb24gd2lsbCBub3QgYmUgY291bnRlclxuICAgKiBAc2VlIHZpc2libGVJbmRleFxuICAgKiBAc2VlIHRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgaGlkZU51bWJlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZU51bWJlclwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoaWRlTnVtYmVyKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhpZGVOdW1iZXJcIiwgdmFsKTtcbiAgICB0aGlzLm5vdGlmeVN1cnZleVZpc2liaWxpdHlDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gbWF5IGhhdmUgYSB0aXRsZSBsb2NhdGVkIG9uIHRoZSBsZWZ0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQWxsb3dUaXRsZUxlZnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBhcyBhIHN0cmluZyBhcyBpdCByZXByZXNlbnRzIGluIHRoZSBqc29uLlxuICAgKi9cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJxdWVzdGlvblwiO1xuICB9XG4gIC8qKlxuICAgKiBNb3ZlIHF1ZXN0aW9uIHRvIGEgbmV3IGNvbnRhaW5lciBQYWdlL1BhbmVsLiBBZGQgYXMgYSBsYXN0IGVsZW1lbnQgaWYgaW5zZXJ0QmVmb3JlIHBhcmFtZXRlciBpcyBub3QgdXNlZCBvciBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBpbmRleCxcbiAgICogaWYgaW5zZXJ0IHBhcmFtZXRlciBpcyBudW1iZXIsIG9yIGJlZm9yZSB0aGUgZ2l2ZW4gZWxlbWVudCwgaWYgdGhlIGluc2VydEJlZm9yZSBwYXJhbWV0ZXIgaXMgYSBxdWVzdGlvbiBvciBwYW5lbFxuICAgKiBAcGFyYW0gY29udGFpbmVyIFBhZ2Ugb3IgUGFuZWwgdG8gd2hlcmUgYSBxdWVzdGlvbiBpcyByZWxvY2F0ZWQuXG4gICAqIEBwYXJhbSBpbnNlcnRCZWZvcmUgVXNlIGl0IGlmIHlvdSB3YW50IHRvIHNldCB0aGUgcXVlc3Rpb24gdG8gYSBzcGVjaWZpYyBwb3NpdGlvbi4gWW91IG1heSB1c2UgYSBudW1iZXIgKHVzZSAwIHRvIGluc2VydCBpbnQgdGhlIGJlZ2lubmluZykgb3IgZWxlbWVudCwgaWYgeW91IHdhbnQgdG8gaW5zZXJ0IGJlZm9yZSB0aGlzIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgbW92ZVRvKGNvbnRhaW5lcjogSVBhbmVsLCBpbnNlcnRCZWZvcmU6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG9CYXNlKHRoaXMucGFyZW50LCBjb250YWluZXIsIGluc2VydEJlZm9yZSk7XG4gIH1cbiAgcHVibGljIGdldFByb2dyZXNzSW5mbygpOiBJUHJvZ3Jlc3NJbmZvIHtcbiAgICBpZiAoIXRoaXMuaGFzSW5wdXQpIHJldHVybiBzdXBlci5nZXRQcm9ncmVzc0luZm8oKTtcbiAgICByZXR1cm4ge1xuICAgICAgcXVlc3Rpb25Db3VudDogMSxcbiAgICAgIGFuc3dlcmVkUXVlc3Rpb25Db3VudDogIXRoaXMuaXNFbXB0eSgpID8gMSA6IDAsXG4gICAgICByZXF1aXJlZFF1ZXN0aW9uQ291bnQ6IHRoaXMuaXNSZXF1aXJlZCA/IDEgOiAwLFxuICAgICAgcmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnQ6ICF0aGlzLmlzRW1wdHkoKSAmJiB0aGlzLmlzUmVxdWlyZWQgPyAxIDogMCxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9ucygpIHtcbiAgICBpZiAodGhpcy5kYXRhICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmICF0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5ydW5Db25kaXRpb24oXG4gICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCksXG4gICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgICApO1xuICAgICAgdGhpcy5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uQ3JlYXRlZCh0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZSAmJiAhdGhpcy5pc0Rlc2lnbk1vZGUpIHtcbiAgICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIH1cbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldEZpbHRlcmVkVmFsdWVzKCkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgdmFyIHByb3BzID0gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCkgOiB7fTtcbiAgICBwcm9wcy5xdWVzdGlvbiA9IHRoaXM7XG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG4gIC8qKlxuICAgKiBBIHBhcmVudCBlbGVtZW50LiBJdCBjYW4gYmUgcGFuZWwgb3IgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFyZW50KCk6IElQYW5lbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCBudWxsKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhcmVudCh2YWw6IElQYW5lbCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlRWxlbWVudENzcygpO1xuICAgIHRoaXMub25QYXJlbnRDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUGFyZW50Q2hhbmdlZCgpIHt9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBxdWVzdGlvbiBkb2Vzbid0IGhhdmUgYSB0aXRsZSBwcm9wZXJ0eSwgZm9yIGV4YW1wbGU6IFF1ZXN0aW9uSHRtbE1vZGVsLCBvciB0aXRsZUxvY2F0aW9uIHByb3BlcnR5IGVxdWFscyB0byBcImhpZGRlblwiXG4gICAqIEBzZWUgdGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgIT09IFwiaGlkZGVuXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IGRpZmZlcmVudCBmcm9tIFwiZGVmYXVsdFwiIHRvIHNldCB0aGUgc3BlY2lmaWMgcXVlc3Rpb24gdGl0bGUgbG9jYXRpb24gZm9yIHRoaXMgcGFuZWwvcGFnZS5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbnMgd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlTG9jYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0aXRsZUxvY2F0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFyIGlzVmlzaWJpbGl0eUNoYW5nZWQgPVxuICAgICAgdGhpcy50aXRsZUxvY2F0aW9uID09IFwiaGlkZGVuXCIgfHwgdmFsdWUgPT0gXCJoaWRkZW5cIjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0aXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzKCk7XG4gICAgfVxuICAgIGlmIChpc1Zpc2liaWxpdHlDaGFuZ2VkKSB7XG4gICAgICB0aGlzLm5vdGlmeVN1cnZleVZpc2liaWxpdHlDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgbm90aWZ5U3VydmV5VmlzaWJpbGl0eUNoYW5nZWQoKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgaWYgKHRoaXMuc3VydmV5LmlzQ2xlYXJWYWx1ZU9uSGlkZGVuICYmICF0aGlzLnZpc2libGUpIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0aXRsZSBsb2NhdGlvbiBiYXNlZCBvbiBxdWVzdGlvbiB0aXRsZUxvY2F0aW9uIHByb3BlcnR5IGFuZCBRdWVzdGlvblRpdGxlTG9jYXRpb24gb2YgaXQncyBwYXJlbnRzXG4gICAqIEBzZWUgdGl0bGVMb2NhdGlvblxuICAgKiBAc2VlIFBhbmVsTW9kZWxCYXNlLlF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKiBAc2VlIFN1cnZleU1vZGVsLlF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldFRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0Zsb3dMYXlvdXQpIHJldHVybiBcImhpZGRlblwiO1xuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuZ2V0VGl0bGVMb2NhdGlvbkNvcmUoKTtcbiAgICBpZiAobG9jYXRpb24gPT09IFwibGVmdFwiICYmICF0aGlzLmlzQWxsb3dUaXRsZUxlZnQpIGxvY2F0aW9uID0gXCJ0b3BcIjtcbiAgICByZXR1cm4gbG9jYXRpb247XG4gIH1cbiAgcHJvdGVjdGVkIGdldFRpdGxlTG9jYXRpb25Db3JlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudGl0bGVMb2NhdGlvbiAhPT0gXCJkZWZhdWx0XCIpIHJldHVybiB0aGlzLnRpdGxlTG9jYXRpb247XG4gICAgaWYgKCEhdGhpcy5wYXJlbnQpIHJldHVybiB0aGlzLnBhcmVudC5nZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkgcmV0dXJuIHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVMb2NhdGlvbjtcbiAgICByZXR1cm4gXCJ0b3BcIjtcbiAgfVxuICBnZXQgaGFzVGl0bGVPbkxlZnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVGl0bGUgJiYgdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgPT09IFwibGVmdFwiO1xuICB9XG4gIGdldCBoYXNUaXRsZU9uVG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1RpdGxlICYmIHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpID09PSBcInRvcFwiO1xuICB9XG4gIGdldCBoYXNUaXRsZU9uQm90dG9tKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1RpdGxlICYmIHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpID09PSBcImJvdHRvbVwiO1xuICB9XG4gIGdldCBoYXNUaXRsZU9uTGVmdFRvcCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaGFzVGl0bGUpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgbG9jYXRpb24gPSB0aGlzLmdldFRpdGxlTG9jYXRpb24oKTtcbiAgICByZXR1cm4gbG9jYXRpb24gPT09IFwibGVmdFwiIHx8IGxvY2F0aW9uID09PSBcInRvcFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgZXJyb3JMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uRXJyb3JMb2NhdGlvbiA6IFwidG9wXCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIHF1ZXN0aW9uIGRvZXNuJ3QgaGF2ZSBhbiBpbnB1dCBlbGVtZW50LCBmb3IgZXhhbXBsZTogUXVlc3Rpb25IdG1sTW9kZWxcbiAgICogQHNlZSBoYXNTaW5nbGVJbnB1dFxuICAgKi9cbiAgcHVibGljIGdldCBoYXNJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgcXVlc3Rpb24gZG9lc24ndCBoYXZlIGFuIGlucHV0IGVsZW1lbnQgb3IgaGF2ZSBtdWx0aXBsZSBpbnB1dHM6IG1hdHJpY2VzIG9yIHBhbmVsIGR5bmFtaWNcbiAgICogQHNlZSBoYXNJbnB1dFxuICAgKi9cbiAgcHVibGljIGdldCBoYXNTaW5nbGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNJbnB1dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZCArIFwiaVwiO1xuICB9XG4gIC8qKlxuICAgKiBRdWVzdGlvbiB0aXRsZS4gVXNlIHN1cnZleSBxdWVzdGlvblRpdGxlVGVtcGxhdGUgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSB0aXRsZSBxdWVzdGlvbiBpcyByZW5kZXJlZC4gSWYgaXQgaXMgZW1wdHksIHRoZW4gcXVlc3Rpb24gbmFtZSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHRoaXMubmFtZSk7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIik7XG4gIH1cbiAgLyoqXG4gICAqIFF1ZXN0aW9uIGRlc2NyaXB0aW9uLiBJdCByZW5kZXJzIHVuZGVyIHF1ZXN0aW9uIHRpdGxlIGJ5IHVzaW5nIHNtYWxsZXIgZm9udC4gVW5saWtlIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24gY2FuIGJlIGVtcHR5LlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBwcm9wZXJ0eSBpcyBoaWRkZW4gZm9yIHF1ZXN0aW9ucyB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBAcHJvcGVydHkoeyBsb2NhbGl6YWJsZTogdHJ1ZSB9KVxuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogUXVlc3Rpb24gZGVzY3JpcHRpb24gbG9jYXRpb24uIEJ5IGRlZmF1bHQsIHZhbHVlIGlzIFwiZGVmYXVsdFwiIGFuZCBpdCBkZXBlbmRzIG9uIHN1cnZleSBxdWVzdGlvbkRlc2NyaXB0aW9uTG9jYXRpb24gcHJvcGVydHlcbiAgICogWW91IG1heSBjaGFuZ2UgaXQgdG8gXCJ1bmRlcklucHV0XCIgdG8gcmVuZGVyIGl0IHVuZGVyIHF1ZXN0aW9uIGlucHV0IG9yIFwidW5kZXJUaXRsZVwiIHRvIHJlbmRlcmVkIGl0IHVuZGVyIHRpdGxlLlxuICAgKiBAc2VlIGRlc2NyaXB0aW9uXG4gICAqIEBzZWUgU3VydmV5LnF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbkxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlc2NyaXB0aW9uTG9jYXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBkZXNjcmlwdGlvbkxvY2F0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVzY3JpcHRpb25Mb2NhdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBoYXNEZXNjcmlwdGlvblVuZGVyVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVzY3JpcHRpb25Mb2NhdGlvbigpID09IFwidW5kZXJUaXRsZVwiO1xuICB9XG4gIGdldCBoYXNEZXNjcmlwdGlvblVuZGVySW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVzY3JpcHRpb25Mb2NhdGlvbigpID09IFwidW5kZXJJbnB1dFwiO1xuICB9XG4gIHByaXZhdGUgZ2V0RGVzY3JpcHRpb25Mb2NhdGlvbigpIHtcbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbkxvY2F0aW9uICE9PSBcImRlZmF1bHRcIikgcmV0dXJuIHRoaXMuZGVzY3JpcHRpb25Mb2NhdGlvbjtcbiAgICByZXR1cm4gISF0aGlzLnN1cnZleVxuICAgICAgPyB0aGlzLnN1cnZleS5xdWVzdGlvbkRlc2NyaXB0aW9uTG9jYXRpb25cbiAgICAgIDogXCJ1bmRlclRpdGxlXCI7XG4gIH1cbiAgcHVibGljIGdldCBjbGlja1RpdGxlRnVuY3Rpb24oKTogYW55IHtcbiAgICBpZiAodGhpcy5oYXNJbnB1dCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5mb2N1cygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXN0b20gdGV4dCB0aGF0IHdpbGwgYmUgc2hvd24gb24gcmVxdWlyZWQgZXJyb3IuIFVzZSB0aGlzIHByb3BlcnR5LCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc2hvdyB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBwcm9wZXJ0eSBpcyBoaWRkZW4gZm9yIHF1ZXN0aW9uIHdpdGhvdXQgaW5wdXQsIGZvciBleGFtcGxlIGh0bWwgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZEVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBnZXQgb3Igc2V0IHRoZSBjb21tZW50IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb21tZW50VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiY29tbWVudFRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlckl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbW1lbnRUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21tZW50VGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NDb21tZW50VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21tZW50VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIGNvcHkgb2YgcXVlc3Rpb24gZXJyb3JzIHN1cnZleS4gRm9yIHNvbWUgcXVlc3Rpb25zIGxpa2UgbWF0cml4IGFuZCBwYW5lbCBkeW5hbWljIGl0IGluY2x1ZGVzIHRoZSBlcnJvcnMgb2YgbmVzdGVkIHF1ZXN0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMuc2xpY2UoKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JCeVR5cGUoZXJyb3JUeXBlOiBzdHJpbmcpOiBTdXJ2ZXlFcnJvciB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZXJyb3JzW2ldLmdldEVycm9yVHlwZSgpID09PSBlcnJvclR5cGUpIHJldHVybiB0aGlzLmVycm9yc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaW5rIHRvIHRoZSBjdXN0b20gd2lkZ2V0LlxuICAgKi9cbiAgcHVibGljIGdldCBjdXN0b21XaWRnZXQoKTogUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICAgIGlmICghdGhpcy5pc0N1c3RvbVdpZGdldFJlcXVlc3RlZCAmJiAhdGhpcy5jdXN0b21XaWRnZXRWYWx1ZSkge1xuICAgICAgdGhpcy5pc0N1c3RvbVdpZGdldFJlcXVlc3RlZCA9IHRydWU7XG4gICAgICB0aGlzLnVwZGF0ZUN1c3RvbVdpZGdldCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXN0b21XaWRnZXRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ3VzdG9tV2lkZ2V0KCkge1xuICAgIHRoaXMuY3VzdG9tV2lkZ2V0VmFsdWUgPSBDdXN0b21XaWRnZXRDb2xsZWN0aW9uLkluc3RhbmNlLmdldEN1c3RvbVdpZGdldChcbiAgICAgIHRoaXNcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDb21wb3NpdGVRdWVzdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyUXVlc3Rpb25FbGVtZW50KGVsOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuc3VydmV5IHx8ICF0aGlzLmhhc1NpbmdsZUlucHV0KSByZXR1cm47XG4gICAgdGhpcy5zdXJ2ZXkuYWZ0ZXJSZW5kZXJRdWVzdGlvbklucHV0KHRoaXMsIGVsKTtcbiAgfVxuICBwdWJsaWMgYWZ0ZXJSZW5kZXIoZWw6IGFueSkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5hZnRlclJlbmRlclF1ZXN0aW9uKHRoaXMsIGVsKTtcbiAgICBpZiAoISF0aGlzLmFmdGVyUmVuZGVyUXVlc3Rpb25DYWxsYmFjaykge1xuICAgICAgdGhpcy5hZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2sodGhpcywgZWwpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYmVmb3JlRGVzdHJveVF1ZXN0aW9uRWxlbWVudChlbDogYW55KSB7fVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVuZHJlZCBxdWVzdGlvbiB0aXRsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgdmFyIHJlcyA9IHRoaXMubG9jUHJvY2Vzc2VkVGl0bGUudGV4dE9ySHRtbDtcbiAgICByZXR1cm4gcmVzID8gcmVzIDogdGhpcy5uYW1lO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0aXRsZSBhZnRlciBwcm9jZXNzaW5nIHRoZSBxdWVzdGlvbiB0ZW1wbGF0ZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblRpdGxlVGVtcGxhdGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZnVsbFRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGl0bGUucmVuZGVyZWRIdG1sO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgdGl0bGVQYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5xdWVzdGlvblRpdGxlUGF0dGVybiA6IFwibnVtVGl0bGVSZXF1aXJlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlcXVpcmVUZXh0T25TdGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkICYmIHRoaXMudGl0bGVQYXR0ZXJuID09IFwicmVxdWlyZU51bVRpdGxlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1JlcXVpcmVUZXh0QmVmb3JlVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZCAmJiB0aGlzLnRpdGxlUGF0dGVybiA9PSBcIm51bVJlcXVpcmVUaXRsZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlVGV4dEFmdGVyVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZCAmJiB0aGlzLnRpdGxlUGF0dGVybiA9PSBcIm51bVRpdGxlUmVxdWlyZVwiO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgUXVlc3Rpb24gcmVuZGVycyBvbiB0aGUgbmV3IGxpbmUgaWYgdGhlIHByb3BlcnR5IGlzIHRydWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBmYWxzZSwgdGhlIHF1ZXN0aW9uIHRyaWVzIHRvIHJlbmRlciBvbiB0aGUgc2FtZSBsaW5lL3JvdyB3aXRoIGEgcHJldmlvdXMgcXVlc3Rpb24vcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXJ0V2l0aE5ld0xpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0YXJ0V2l0aE5ld0xpbmVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzdGFydFdpdGhOZXdMaW5lKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLnN0YXJ0V2l0aE5ld0xpbmUgPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RhcnRXaXRoTmV3TGluZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBjc3MgY2xhc3NlcyB0aGF0IHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgcXVlc3Rpb24uIFlvdSBtYXkgdXNlIHN1cnZleS51cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMgZXZlbnQgdG8gb3ZlcnJpZGUgY3NzIGNsYXNzZXMgZm9yIGEgcXVlc3Rpb24uXG4gICAqIEBzZWUgU3VydmV5TW9kZWwudXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNzc0NsYXNzZXMoKTogYW55IHtcbiAgICB2YXIgY3NzID0gdGhpcy5jc3M7XG4gICAgdmFyIGNsYXNzZXMgPSB7IGVycm9yOiB7fSB9O1xuICAgIHRoaXMuY29weUNzc0NsYXNzZXMoY2xhc3NlcywgY3NzLnF1ZXN0aW9uKTtcbiAgICB0aGlzLmNvcHlDc3NDbGFzc2VzKGNsYXNzZXMuZXJyb3IsIGNzcy5lcnJvcik7XG4gICAgdGhpcy51cGRhdGVDc3NDbGFzc2VzKGNsYXNzZXMsIGNzcyk7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS51cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXModGhpcywgY2xhc3Nlcyk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRWxlbWVudENzc0NvcmUoY2xhc3Nlcyk7XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cbiAgcHVibGljIGdldCBjc3NSb290KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNzc1Jvb3RcIiwgXCJcIik7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENzc1Jvb3QodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjc3NSb290XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENzc1Jvb3QoY3NzQ2xhc3NlczogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID1cbiAgICAgIHRoaXMuaXNGbG93TGF5b3V0ICYmICF0aGlzLmlzRGVzaWduTW9kZVxuICAgICAgICA/IGNzc0NsYXNzZXMuZmxvd1Jvb3RcbiAgICAgICAgOiBjc3NDbGFzc2VzLm1haW5Sb290O1xuICAgIGlmICghcmVzKSByZXMgPSBcIlwiO1xuICAgIGlmIChcbiAgICAgICF0aGlzLmlzRmxvd0xheW91dCAmJlxuICAgICAgdGhpcy5oYXNUaXRsZU9uTGVmdCAmJlxuICAgICAgISFjc3NDbGFzc2VzLnRpdGxlTGVmdFJvb3RcbiAgICApIHtcbiAgICAgIHJlcyArPSBcIiBcIiArIGNzc0NsYXNzZXMudGl0bGVMZWZ0Um9vdDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZXJyb3JzLmxlbmd0aCA+IDAgJiYgISFjc3NDbGFzc2VzLmhhc0Vycm9yKSB7XG4gICAgICByZXMgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLmhhc0Vycm9yO1xuICAgIH1cbiAgICBpZiAoY3NzQ2xhc3Nlcy5zbWFsbCAmJiAhdGhpcy53aWR0aCkge1xuICAgICAgcmVzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5zbWFsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc0hlYWRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjc3NIZWFkZXJcIiwgXCJcIik7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENzc0hlYWRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNzc0hlYWRlclwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDc3NIZWFkZXIoY3NzQ2xhc3NlczogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gY3NzQ2xhc3Nlcy5oZWFkZXIgfHwgXCJcIjtcbiAgICBpZiAodGhpcy5oYXNUaXRsZU9uVG9wICYmICEhY3NzQ2xhc3Nlcy5oZWFkZXJUb3ApIHtcbiAgICAgIHJlcyArPSBcIiBcIiArIGNzc0NsYXNzZXMuaGVhZGVyVG9wO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNUaXRsZU9uTGVmdCAmJiAhIWNzc0NsYXNzZXMuaGVhZGVyTGVmdCkge1xuICAgICAgcmVzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5oZWFkZXJMZWZ0O1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNUaXRsZU9uQm90dG9tICYmICEhY3NzQ2xhc3Nlcy5oZWFkZXJCb3R0b20pIHtcbiAgICAgIHJlcyArPSBcIiBcIiArIGNzc0NsYXNzZXMuaGVhZGVyQm90dG9tO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzQ29udGVudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjc3NDb250ZW50XCIsIFwiXCIpO1xuICB9XG4gIHByb3RlY3RlZCBzZXRDc3NDb250ZW50KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY3NzQ29udGVudFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDc3NDb250ZW50KGNzc0NsYXNzZXM6IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IGNzc0NsYXNzZXMuY29udGVudCB8fCBcIlwiO1xuICAgIGlmICh0aGlzLmhhc1RpdGxlT25MZWZ0ICYmICEhY3NzQ2xhc3Nlcy5jb250ZW50TGVmdCkge1xuICAgICAgcmVzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5jb250ZW50TGVmdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc1RpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNzc1RpdGxlXCIsIFwiXCIpO1xuICB9XG4gIHByb3RlY3RlZCBzZXRDc3NUaXRsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNzc1RpdGxlXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENzc1RpdGxlKGNzc0NsYXNzZXM6IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIHJlc3VsdCA9IGNzc0NsYXNzZXMudGl0bGU7XG4gICAgaWYgKHRoaXMuY29udGFpbnNFcnJvcnMpIHtcbiAgICAgIGlmICghIWNzc0NsYXNzZXMudGl0bGVPbkVycm9yKSB7XG4gICAgICAgIHJlc3VsdCArPSBcIiBcIiArIGNzc0NsYXNzZXMudGl0bGVPbkVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0Fuc3dlcmVkICYmICEhY3NzQ2xhc3Nlcy50aXRsZU9uQW5zd2VyKSB7XG4gICAgICByZXN1bHQgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLnRpdGxlT25BbnN3ZXI7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldCBjc3NFcnJvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjc3NFcnJvclwiLCBcIlwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0Q3NzRXJyb3IodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjc3NFcnJvclwiLCB2YWwpO1xuICB9XG4gIC8vVE9ETyB3YXMgbm90IHJlbW92ZWQgZnJvbSBvdGhlciBwbGFjZXNcbiAgcHJvdGVjdGVkIGdldENzc0Vycm9yKGNzc0NsYXNzZXM6IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IGNzc0NsYXNzZXMuZXJyb3Iucm9vdCB8fCBcIlwiO1xuICAgIGlmICh0aGlzLmVycm9yTG9jYXRpb24gPT0gXCJ0b3BcIikge1xuICAgICAgaWYgKCEhY3NzQ2xhc3Nlcy5lcnJvci5sb2NhdGlvblRvcCkge1xuICAgICAgICByZXMgKz0gXCIgXCIgKyBjc3NDbGFzc2VzLmVycm9yLmxvY2F0aW9uVG9wO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmVycm9yTG9jYXRpb24gPT09IFwiYm90dG9tXCIgJiZcbiAgICAgICEhY3NzQ2xhc3Nlcy5lcnJvci5sb2NhdGlvbkJvdHRvbVxuICAgICkge1xuICAgICAgcmVzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5lcnJvci5sb2NhdGlvbkJvdHRvbTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgdXBkYXRlRWxlbWVudENzcygpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlRWxlbWVudENzc0NvcmUodGhpcy5jc3NDbGFzc2VzKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlRWxlbWVudENzc0NvcmUoY3NzQ2xhc3NlczogYW55KSB7XG4gICAgdGhpcy5zZXRDc3NSb290KHRoaXMuZ2V0Q3NzUm9vdChjc3NDbGFzc2VzKSk7XG4gICAgdGhpcy5zZXRDc3NIZWFkZXIodGhpcy5nZXRDc3NIZWFkZXIoY3NzQ2xhc3NlcykpO1xuICAgIHRoaXMuc2V0Q3NzQ29udGVudCh0aGlzLmdldENzc0NvbnRlbnQoY3NzQ2xhc3NlcykpO1xuICAgIHRoaXMuc2V0Q3NzVGl0bGUodGhpcy5nZXRDc3NUaXRsZShjc3NDbGFzc2VzKSk7XG4gICAgdGhpcy5zZXRDc3NFcnJvcih0aGlzLmdldENzc0Vycm9yKGNzc0NsYXNzZXMpKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQ3NzQ2xhc3NlcyhyZXM6IGFueSwgY3NzOiBhbnkpIHtcbiAgICBpZiAoIWNzcy5xdWVzdGlvbikgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzUmVxdWlyZWQpIHtcbiAgICAgIGlmICghIWNzcy5xdWVzdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICByZXMucm9vdCA9IChyZXMucm9vdCA/IHJlcy5yb290ICsgXCIgXCIgOiBcIlwiKSArIG9iakNzcztcbiAgICAgIH1cbiAgICAgIGlmIChjc3MucXVlc3Rpb24udGl0bGVSZXF1aXJlZCkge1xuICAgICAgICByZXMudGl0bGUgKz0gXCIgXCIgKyBjc3MucXVlc3Rpb24udGl0bGVSZXF1aXJlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG9iakNzcyA9IGNzc1t0aGlzLmdldENzc1R5cGUoKV07XG4gICAgaWYgKG9iakNzcyA9PT0gdW5kZWZpbmVkIHx8IG9iakNzcyA9PT0gbnVsbCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2Ygb2JqQ3NzID09PSBcInN0cmluZ1wiIHx8IG9iakNzcyBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgICAgcmVzLnJvb3QgPSAocmVzLnJvb3QgPyByZXMucm9vdCArIFwiIFwiIDogXCJcIikgKyBvYmpDc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmpDc3MpIHtcbiAgICAgICAgcmVzW2tleV0gPSBvYmpDc3Nba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldENzc1R5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUeXBlKCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY3NzKCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5nZXRDc3MoKSA6IHt9O1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gc2V0IHRoZSBzcGVjaWZpYyB3aWR0aCB0byB0aGUgcXVlc3Rpb24gbGlrZSBjc3Mgc3R5bGUgKCUsIHB4LCBlbSBldGMpLlxuICAgKi9cbiAgcHVibGljIGdldCB3aWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIHNldCB0aGUgc3BlY2lmaWMgbWluV2lkdGggY29uc3RyYWludCB0byB0aGUgcXVlc3Rpb24gbGlrZSBjc3Mgc3R5bGUgKCUsIHB4LCBlbSBldGMpLlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5XaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5XaWR0aFwiLCBzZXR0aW5ncy5taW5XaWR0aCk7XG4gIH1cbiAgcHVibGljIHNldCBtaW5XaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbldpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBzZXQgdGhlIHNwZWNpZmljIG1heFdpZHRoIGNvbnN0cmFpbnQgdG8gdGhlIHF1ZXN0aW9uIGxpa2UgY3NzIHN0eWxlICglLCBweCwgZW0gZXRjKS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4V2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4V2lkdGhcIiwgc2V0dGluZ3MubWF4V2lkdGgpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4V2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgd2lkdGggb2YgdGhlIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCByZW5kZXJXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJXaWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlbmRlcldpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IGRpZmZlcmVudCBmcm9tIDAgdG8gaW5jcmVhc2UgdGhlIGxlZnQgcGFkZGluZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImluZGVudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluZGVudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImluZGVudFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgZGlmZmVyZW50IGZyb20gMCB0byBpbmNyZWFzZSB0aGUgcmlnaHQgcGFkZGluZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmlnaHRJbmRlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmlnaHRJbmRlbnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCByaWdodEluZGVudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJpZ2h0SW5kZW50XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IHBhZGRpbmdMZWZ0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbnRMZWZ0XCIsIFwiXCIpO1xuICB9XG4gIHNldCBwYWRkaW5nTGVmdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbnRMZWZ0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IHBhZGRpbmdSaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nUmlnaHRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IHBhZGRpbmdSaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInBhZGRpbmdSaWdodFwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgb25JbmRlbnRDaGFuZ2VkKCkge1xuICAgIHRoaXMucGFkZGluZ0xlZnQgPSB0aGlzLmdldEluZGVudFNpemUodGhpcy5pbmRlbnQpO1xuICAgIHRoaXMucGFkZGluZ1JpZ2h0ID0gdGhpcy5nZXRJbmRlbnRTaXplKHRoaXMucmlnaHRJbmRlbnQpO1xuICB9XG4gIHByaXZhdGUgZ2V0SW5kZW50U2l6ZShpbmRlbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGluZGVudCA8IDEpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBpbmRlbnQgKiB0aGlzLmNzc0NsYXNzZXMuaW5kZW50ICsgXCJweFwiO1xuICB9XG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBmb2N1cyB0byB0aGUgaW5wdXQgb2YgdGhpcyBxdWVzdGlvbi5cbiAgICogQHBhcmFtIG9uRXJyb3Igc2V0IHRoaXMgcGFyYW1ldGVyIHRvIHRydWUsIHRvIGZvY3VzIHRoZSBpbnB1dCB3aXRoIHRoZSBmaXJzdCBlcnJvciwgb3RoZXIgd2lzZSB0aGUgZmlyc3QgaW5wdXQgd2lsbCBiZSBmb2N1c2VkLlxuICAgKi9cbiAgcHVibGljIGZvY3VzKG9uRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuXG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnNjcm9sbEVsZW1lbnRUb1RvcCh0aGlzLCB0aGlzLCBudWxsLCB0aGlzLmlkKTtcbiAgICB9XG4gICAgdmFyIGlkID0gIW9uRXJyb3JcbiAgICAgID8gdGhpcy5nZXRGaXJzdElucHV0RWxlbWVudElkKClcbiAgICAgIDogdGhpcy5nZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTtcbiAgICBpZiAoU3VydmV5RWxlbWVudC5Gb2N1c0VsZW1lbnQoaWQpKSB7XG4gICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmZvY3VzQ2FsbGJhY2spO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZmlyZUNhbGxiYWNrKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICB9XG4gIHB1YmxpYyBnZXRPdGhlcnNNYXhMZW5ndGgoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubWF4T3RoZXJzTGVuZ3RoID4gMCA/IHRoaXMuc3VydmV5Lm1heE90aGVyc0xlbmd0aCA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlucHV0SWQ7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0RXJyb3JJbnB1dEVsZW1lbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKSB7XG4gICAgdmFyIG5hbWUgPSB0ZXh0VmFsdWUubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9XG4gICAgICBPYmplY3Qua2V5cyhRdWVzdGlvbi5UZXh0UHJlcHJvY2Vzc29yVmFsdWVzTWFwKS5pbmRleE9mKG5hbWUpICE9PSAtMSB8fFxuICAgICAgKDxhbnk+dGhpcylbdGV4dFZhbHVlLm5hbWVdICE9PSB1bmRlZmluZWQ7XG4gICAgdGV4dFZhbHVlLnZhbHVlID0gKDxhbnk+dGhpcylbXG4gICAgICAoPGFueT5RdWVzdGlvbi5UZXh0UHJlcHJvY2Vzc29yVmFsdWVzTWFwKVtuYW1lXSB8fCB0ZXh0VmFsdWUubmFtZVxuICAgIF07XG4gIH1cbiAgcHVibGljIHN1cHBvcnRDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydE90aGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gbWFrZSB0aGUgcXVlc3Rpb24gYSByZXF1aXJlZC4gSWYgYSB1c2VyIGRvZXNuJ3QgYW5zd2VyIHRoZSBxdWVzdGlvbiB0aGVuIGEgdmFsaWRhdGlvbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZC5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzUmVxdWlyZWQodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuaXNSZXF1aXJlZCA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIHZhbCk7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyB0cnVlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIHJlcXVpcmVkIGFuZCBhbiBlbmQtdXNlciBoYXMgdG8gYW5zd2VyIGl0LlxuICAgKiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBRdWVzdGlvbiB0aGVuIGFuIGVuZC11c2VyIG1heSBub3QgYW5zd2VyIGl0IHRoZSBRdWVzdGlvbiBtYXliZSBlbXB0eS5cbiAgICogVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIGlzUmVxdWlyZWQgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKiBAc2VlIGlzUmVxdWlyZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZElmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlcXVpcmVkSWZcIiwgdmFsKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIGFkZCBhIGNvbW1lbnQgZm9yIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzQ29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGFzQ29tbWVudFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoYXNDb21tZW50KHZhbDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5zdXBwb3J0Q29tbWVudCgpKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzQ29tbWVudFwiLCB2YWwpO1xuICAgIGlmICh0aGlzLmhhc0NvbW1lbnQpIHRoaXMuaGFzT3RoZXIgPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWNhdG9yLiBJdCBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaWRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlkXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBhcmlhVGl0bGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkICsgXCJfYXJpYVRpdGxlXCI7XG4gIH1cbiAgcHVibGljIGdldCBhcmlhUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzT3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5zdXBwb3J0T3RoZXIoKSB8fCB0aGlzLmhhc090aGVyID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc090aGVyXCIsIHZhbCk7XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIHRoaXMuaGFzQ29tbWVudCA9IGZhbHNlO1xuICAgIHRoaXMuaGFzT3RoZXJDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpIHt9XG4gIHB1YmxpYyBnZXQgcmVxdWlyZVVwZGF0ZUNvbW1lbnRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNDb21tZW50IHx8IHRoaXMuaGFzT3RoZXI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiByZWFkT25seSBwcm9wZXJ0eSBpcyB0cnVlIG9yIHN1cnZleSBpcyBpbiBkaXNwbGF5IG1vZGUgb3IgcGFyZW50IHBhbmVsL3BhZ2UgaXMgcmVhZE9ubHkuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubW9kZWxcbiAgICogQHNlZSByZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCkge1xuICAgIHZhciBpc1BhcmVudFJlYWRPbmx5ID0gISF0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc1JlYWRPbmx5O1xuICAgIHZhciBpc1N1cnZleVJlYWRPbmx5ID0gISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlO1xuICAgIHJldHVybiB0aGlzLnJlYWRPbmx5IHx8IGlzUGFyZW50UmVhZE9ubHkgfHwgaXNTdXJ2ZXlSZWFkT25seTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSWYgaXQgcmV0dXJucyBmYWxzZSB0aGUgUXVlc3Rpb24gYmVjb21lcyByZWFkIG9ubHkgYW5kIGFuIGVuZC11c2VyIHdpbGwgbm90IGFibGUgdG8gYW5zd2VyIG9uIHRoZSBxdXN0aW9uLiBUaGUgbGlicmFyeSBydW5zIHRoZSBleHByZXNzaW9uIG9uIHN1cnZleSBzdGFydCBhbmQgb24gY2hhbmdpbmcgYSBxdWVzdGlvbiB2YWx1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGVtcHR5IHRoZW4gcmVhZE9ubHkgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBlbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgfVxuICAvKipcbiAgICogUnVuIHZpc2libGVJZiBhbmQgZW5hYmxlSWYgZXhwcmVzc2lvbnMuIElmIHZpc2libGVJZiBvci9hbmQgZW5hYmxlZElmIGFyZSBub3QgZW1wdHksIHRoZW4gdGhlIHJlc3VsdHMgb2YgcGVyZm9ybWluZyB0aGUgZXhwcmVzc2lvbiAodHJ1ZSBvciBmYWxzZSkgc2V0IHRvIHRoZSB2aXNpYmxlL3JlYWRPbmx5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSB2YWx1ZXMgVHlwaWNhbGx5IHN1cnZleSByZXN1bHRzXG4gICAqIEBzZWUgdmlzaWJsZVxuICAgKiBAc2VlIHZpc2libGVJZlxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqIEBzZWUgZW5hYmxlSWZcbiAgICovXG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHByb3BlcnRpZXMgPSB7fTtcbiAgICBwcm9wZXJ0aWVzW1wicXVlc3Rpb25cIl0gPSB0aGlzO1xuICAgIGlmICghdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcpIHtcbiAgICAgIHRoaXMucnVuVmlzaWJsZUlmQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICAgIHRoaXMucnVuRW5hYmxlSWZDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLnJ1blJlcXVpcmVkSWZDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1blZpc2libGVJZkNvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy52aXNpYmxlSWYpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29uZGl0aW9uUnVubmVyKVxuICAgICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMudmlzaWJsZUlmKTtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy52aXNpYmxlSWY7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIub25SdW5Db21wbGV0ZSA9IChyZXM6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMudmlzaWJsZSA9IHJlcztcbiAgICB9O1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuRW5hYmxlSWZDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlSWYpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyKVxuICAgICAgdGhpcy5jb25kaXRpb25FbmFiZWxSdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZW5hYmxlSWYpO1xuICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmVuYWJsZUlmO1xuICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnJlYWRPbmx5ID0gIXJlcztcbiAgICB9O1xuICAgIHRoaXMuY29uZGl0aW9uRW5hYmVsUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuUmVxdWlyZWRJZkNvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICkge1xuICAgIGlmICghdGhpcy5yZXF1aXJlZElmKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvblJlcXVpcmVkUnVubmVyKVxuICAgICAgdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy5yZXF1aXJlZElmKTtcbiAgICB0aGlzLmNvbmRpdGlvblJlcXVpcmVkUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLnJlcXVpcmVkSWY7XG4gICAgdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gcmVzO1xuICAgIH07XG4gICAgdGhpcy5jb25kaXRpb25SZXF1aXJlZFJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdGhlIHF1ZXN0aW9uIG51bWJlci4gSWYgcXVlc3Rpb24gaXMgaW52aXNpYmxlIHRoZW4gaXQgcmV0dXJucyBlbXB0eSBzdHJpbmcuXG4gICAqIElmIHZpc2libGVJbmRleCBpcyAxLCB0aGVuIG5vIGlzIDIsIG9yICdCJyBpZiBzdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4IGlzICdBJy5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvblN0YXJ0SW5kZXhcbiAgICovXG4gIHB1YmxpYyBnZXQgbm8oKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaGFzVGl0bGUgfHwgdGhpcy5oaWRlTnVtYmVyKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgbm8gPSBIZWxwZXJzLmdldE51bWJlckJ5SW5kZXgodGhpcy52aXNpYmxlSW5kZXgsIHRoaXMuZ2V0U3RhcnRJbmRleCgpKTtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgbm8gPSB0aGlzLnN1cnZleS5nZXRVcGRhdGVkUXVlc3Rpb25Obyh0aGlzLCBubyk7XG4gICAgfVxuICAgIHJldHVybiBubztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhcnRJbmRleCgpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMucGFyZW50KSByZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UXVlc3Rpb25TdGFydEluZGV4KCk7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHJldHVybiB0aGlzLnN1cnZleS5xdWVzdGlvblN0YXJ0SW5kZXg7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnN1cnZleUxvYWRDYWxsYmFjayk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU2V0RGF0YSgpIHtcbiAgICBzdXBlci5vblNldERhdGEoKTtcbiAgICB0aGlzLmluaXREYXRhRnJvbVN1cnZleSgpO1xuICAgIHRoaXMub25TdXJ2ZXlWYWx1ZUNoYW5nZWQodGhpcy52YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICAgIHRoaXMudXBkYXRlRWxlbWVudENzcygpO1xuICB9XG4gIHByb3RlY3RlZCBpbml0RGF0YUZyb21TdXJ2ZXkoKSB7XG4gICAgaWYgKCEhdGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh0aGlzLmRhdGEuZ2V0VmFsdWUodGhpcy5nZXRWYWx1ZU5hbWUoKSkpO1xuICAgICAgdGhpcy5pbml0Q29tbWVudEZyb21TdXJ2ZXkoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGluaXRDb21tZW50RnJvbVN1cnZleSgpIHtcbiAgICBpZiAoISF0aGlzLmRhdGEgJiYgdGhpcy5yZXF1aXJlVXBkYXRlQ29tbWVudFZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbW1lbnRGcm9tU3VydmV5KHRoaXMuZGF0YS5nZXRDb21tZW50KHRoaXMuZ2V0VmFsdWVOYW1lKCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVDb21tZW50RnJvbVN1cnZleShcIlwiKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHJ1bkV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXRoaXMuc3VydmV5IHx8ICFleHByZXNzaW9uKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5ydW5FeHByZXNzaW9uKGV4cHJlc3Npb24pO1xuICB9XG4gIHByaXZhdGUgZ2V0IHF1ZXN0aW9uVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIik7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgcXVlc3Rpb25WYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcXVlc3Rpb25Db21tZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbW1lbnRcIik7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgcXVlc3Rpb25Db21tZW50KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29tbWVudFwiLCB2YWwpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29tbWVudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIEdldC9TZXQgdGhlIHF1ZXN0aW9uIHZhbHVlLlxuICAgKiBAc2VlIFN1cnZleU1vZGUuc2V0VmFsdWVcbiAgICogQHNlZSBTdXJ2ZXlNb2RlLmdldFZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVDb3JlKCk7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWUoKSB7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgdGhpcy5jb21tZW50ID0gbnVsbDtcbiAgfVxuICBwdWJsaWMgY3JlYXRlVmFsdWVDb3B5KCk6IGFueSB7XG4gICAgcmV0dXJuIEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUodGhpcy52YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjYW5DbGVhclZhbHVlQXNJbnZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmIHRoaXMuaXNQYXJlbnRWaXNpYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCEhdGhpcy5wYWdlICYmIHRoaXMucGFnZS5pc1N0YXJ0ZWQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRoaXMuc3VydmV5IHx8ICF0aGlzLnZhbHVlTmFtZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICF0aGlzLnN1cnZleS5oYXNWaXNpYmxlUXVlc3Rpb25CeVZhbHVlTmFtZSh0aGlzLnZhbHVlTmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNQYXJlbnRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICBpZiAoIXBhcmVudC5pc1Zpc2libGUpIHJldHVybiBmYWxzZTtcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgaWYgKHRoaXMuY2FuQ2xlYXJWYWx1ZUFzSW52aXNpYmxlKCkpIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGRpc3BsYXlWYWx1ZSgpOiBhbnkge1xuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlWYWx1ZVwiLCBcIlwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlRGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5VmFsdWVcIiwgdGhpcy5nZXREaXNwbGF5VmFsdWUodHJ1ZSkpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHF1ZXN0aW9uIHZhbHVlIGFzIGEgZGlzcGxheSB0ZXh0LiBGb3IgZXhhbXBsZSwgZm9yIGRyb3Bkb3duLCBpdCB3b3VsZCByZXR1cm4gdGhlIGl0ZW0gdGV4dCBpbnN0ZWFkIG9mIGl0ZW0gdmFsdWUuXG4gICAqIEBwYXJhbSBrZXlzQXNUZXh0IFNldCB0aGlzIHZhbHVlIHRvIHRydWUsIHRvIHJldHVybiBrZXkgKGluIG1hdHJpY2VzIHF1ZXN0aW9ucykgYXMgZGlzcGxheSB0ZXh0IGFzIHdlbGwuXG4gICAqIEBwYXJhbSB2YWx1ZSB1c2UgdGhpcyBwYXJhbWV0ZXIsIGlmIHlvdSB3YW50IHRvIGdldCBkaXNwbGF5IHZhbHVlIGZvciB0aGlzIHZhbHVlIGFuZCBub3QgcXVlc3Rpb24udmFsdWUuIEl0IGlzIHVuZGVmaW5lZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcHVibGljIGdldERpc3BsYXlWYWx1ZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55ID0gdW5kZWZpbmVkKTogYW55IHtcbiAgICBpZiAodGhpcy5jdXN0b21XaWRnZXQpIHtcbiAgICAgIHZhciByZXMgPSB0aGlzLmN1c3RvbVdpZGdldC5nZXREaXNwbGF5VmFsdWUodGhpcywgdmFsdWUpO1xuICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgdmFsdWUgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyB0aGlzLmNyZWF0ZVZhbHVlQ29weSgpIDogdmFsdWU7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0LCB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5QXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSB0byB0aGUgcXVlc3Rpb24uIEl0IHdpbGwgYmUgYXNzaWduIHRvIHRoZSBxdWVzdGlvbiBvbiBsb2FkaW5nIHRoZSBzdXJ2ZXkgZnJvbSBKU09OIG9yIGFkZGluZyBhIHF1ZXN0aW9uIHRvIHRoZSBzdXJ2ZXkgb3Igb24gc2V0dGluZyB0aGlzIHByb3BlcnR5IG9mIHRoZSB2YWx1ZSBpcyBlbXB0eS5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGZvciBxdWVzdGlvbiB3aXRob3V0IGlucHV0LCBmb3IgZXhhbXBsZSBodG1sIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlKHZhbDogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUV4cHJlc3Npb24odmFsKSkge1xuICAgICAgdGhpcy5kZWZhdWx0VmFsdWVFeHByZXNzaW9uID0gdmFsLnN1YnN0cigxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIsIHRoaXMuY29udmVydERlZmF1bHRWYWx1ZSh2YWwpKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk7XG4gIH1cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWVFeHByZXNzaW9uKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUV4cHJlc3Npb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWVFeHByZXNzaW9uKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlRXhwcmVzc2lvblwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBxdWVzdGlvbiBhbnN3ZXIgZGF0YSBhcyBhIHBsYWluIG9iamVjdDogd2l0aCBxdWVzdGlvbiB0aXRsZSwgbmFtZSwgdmFsdWUgYW5kIGRpc3BsYXlWYWx1ZS5cbiAgICogRm9yIGNvbXBsZXggcXVlc3Rpb25zIChsaWtlIG1hdHJpeCwgZXRjLikgaXNOb2RlIGZsYWcgaXMgc2V0IHRvIHRydWUgYW5kIGRhdGEgY29udGFpbnMgYXJyYXkgb2YgbmVzdGVkIG9iamVjdHMgKHJvd3MpXG4gICAqIHNldCBvcHRpb25zLmluY2x1ZGVFbXB0eSB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBza2lwIGVtcHR5IGFuc3dlcnNcbiAgICovXG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVRdWVzdGlvblR5cGVzPzogYm9vbGVhbjtcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlLFxuICAgICAgaW5jbHVkZVF1ZXN0aW9uVHlwZXM6IGZhbHNlLFxuICAgIH1cbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZUVtcHR5IHx8ICF0aGlzLmlzRW1wdHkoKSkge1xuICAgICAgdmFyIHF1ZXN0aW9uUGxhaW5EYXRhID0gPGFueT57XG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgdGl0bGU6IHRoaXMubG9jVGl0bGUucmVuZGVyZWRIdG1sLFxuICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLmRpc3BsYXlWYWx1ZSxcbiAgICAgICAgaXNOb2RlOiBmYWxzZSxcbiAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiA/IEpTT04uc3RyaW5naWZ5KHZhbCkgOiB2YWwsXG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnMuaW5jbHVkZVF1ZXN0aW9uVHlwZXMgPT09IHRydWUpIHtcbiAgICAgICAgcXVlc3Rpb25QbGFpbkRhdGEucXVlc3Rpb25UeXBlID0gdGhpcy5nZXRUeXBlKCk7XG4gICAgICB9XG4gICAgICAob3B0aW9ucy5jYWxjdWxhdGlvbnMgfHwgW10pLmZvckVhY2goKGNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV0gPSB0aGlzW1xuICAgICAgICAgIGNhbGN1bGF0aW9uLnByb3BlcnR5TmFtZVxuICAgICAgICBdO1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5oYXNDb21tZW50KSB7XG4gICAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmlzTm9kZSA9IHRydWU7XG4gICAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmRhdGEgPSBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogMCxcbiAgICAgICAgICAgIGlzQ29tbWVudDogdHJ1ZSxcbiAgICAgICAgICAgIHRpdGxlOiBcIkNvbW1lbnRcIixcbiAgICAgICAgICAgIHZhbHVlOiBzZXR0aW5ncy5jb21tZW50UHJlZml4LFxuICAgICAgICAgICAgZGlzcGxheVZhbHVlOiB0aGlzLmNvbW1lbnQsXG4gICAgICAgICAgICBnZXRTdHJpbmc6ICh2YWw6IGFueSkgPT5cbiAgICAgICAgICAgICAgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiA/IEpTT04uc3RyaW5naWZ5KHZhbCkgOiB2YWwsXG4gICAgICAgICAgICBpc05vZGU6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICByZXR1cm4gcXVlc3Rpb25QbGFpbkRhdGE7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjb3JyZWN0IGFuc3dlciBvbiB0aGUgcXVlc3Rpb24uIFNldCB0aGlzIHZhbHVlIGlmIHlvdSBhcmUgZG9pbmcgYSBxdWl6LlxuICAgKiBQbGVhc2Ugbm90ZSwgdGhpcyBwcm9wZXJ0eSBpcyBoaWRkZW4gZm9yIHF1ZXN0aW9uIHdpdGhvdXQgaW5wdXQsIGZvciBleGFtcGxlIGh0bWwgcXVlc3Rpb24uXG4gICAqIEBzZWUgU3VydmV5TW9kZWwuY29ycmVjdEFuc3dlcnNcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5pbkNvcnJlY3RBbnN3ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvcnJlY3RBbnN3ZXIoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29ycmVjdEFuc3dlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvcnJlY3RBbnN3ZXIodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb3JyZWN0QW5zd2VyXCIsIHRoaXMuY29udmVydERlZmF1bHRWYWx1ZSh2YWwpKTtcbiAgfVxuICBwcm90ZWN0ZWQgY29udmVydERlZmF1bHRWYWx1ZSh2YWw6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBxdWVzdGlvbnMgY291bnQ6IDEgZm9yIHRoZSBub24tbWF0cml4IHF1ZXN0aW9ucyBhbmQgYWxsIGlubmVyIHZpc2libGUgcXVlc3Rpb25zIHRoYXQgaGFzIGlucHV0KHMpIHdpZGdldHMgZm9yIHF1ZXN0aW9uIG9mIG1hdHJpeCB0eXBlcy5cbiAgICogQHNlZSBnZXRRdWl6UXVlc3Rpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1aXpRdWVzdGlvbkNvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1Zpc2libGUgJiZcbiAgICAgIHRoaXMuaGFzSW5wdXQgJiZcbiAgICAgICFIZWxwZXJzLmlzVmFsdWVFbXB0eSh0aGlzLmNvcnJlY3RBbnN3ZXIpXG4gICAgKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVpelF1ZXN0aW9uQ291bnQoKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvcnJlY3RBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pc0VtcHR5KCkgJiYgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuY29ycmVjdEFuc3dlcikpXG4gICAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0QW5zd2VyQ291bnQoKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVpelF1ZXN0aW9uQ291bnQoKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlzVHdvVmFsdWVFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5jb3JyZWN0QW5zd2VyLCB0cnVlKSA/IDEgOiAwO1xuICB9XG4gIHB1YmxpYyBpc0Fuc3dlckNvcnJlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29ycmVjdEFuc3dlckNvdW50ID09IHRoaXMucXVpelF1ZXN0aW9uQ291bnQ7XG4gIH1cbiAgcHVibGljIHVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgICghdGhpcy5pc0Rlc2lnbk1vZGUgJiYgdGhpcy5pc0RlZmF1bHRWYWx1ZUVtcHR5KCkpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghdGhpcy5pc0Rlc2lnbk1vZGUgJiYgIXRoaXMuaXNFbXB0eSgpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpICYmIHRoaXMuaXNEZWZhdWx0VmFsdWVFbXB0eSgpKSByZXR1cm47XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNDbGVhclZhbHVlT25IaWRkZW4gJiYgIXRoaXMuaXNWaXNpYmxlKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlKCk7XG4gIH1cbiAgZ2V0UXVlc3Rpb25Gcm9tQXJyYXkobmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogSVF1ZXN0aW9uIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBpc0RlZmF1bHRWYWx1ZUVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5kZWZhdWx0VmFsdWVFeHByZXNzaW9uICYmIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFZhbHVlKCkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLmdldFZhbHVlQW5kUnVuRXhwcmVzc2lvbihcbiAgICAgIEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUodGhpcy5kZWZhdWx0VmFsdWUpLFxuICAgICAgdGhpcy5kZWZhdWx0VmFsdWVFeHByZXNzaW9uXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNWYWx1ZUV4cHJlc3Npb24odmFsOiBhbnkpIHtcbiAgICByZXR1cm4gISF2YWwgJiYgdHlwZW9mIHZhbCA9PSBcInN0cmluZ1wiICYmIHZhbC5sZW5ndGggPiAwICYmIHZhbFswXSA9PSBcIj1cIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVBbmRSdW5FeHByZXNzaW9uKHZhbDogYW55LCBleHByZXNzaW9uOiBzdHJpbmcpIHtcbiAgICBpZiAoISFleHByZXNzaW9uKSB7XG4gICAgICB2YWwgPSB0aGlzLnJ1bkV4cHJlc3Npb24oZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIGlmICghdmFsKSByZXR1cm4gdmFsO1xuICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICB2YWwgPSB2YWwudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHF1ZXN0aW9uIGNvbW1lbnQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1lbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRRdWVzdGlvbkNvbW1lbnQoKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbW1lbnQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIGlmICghIW5ld1ZhbHVlKSB7XG4gICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlLnRvU3RyaW5nKCkudHJpbSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb21tZW50ID09IG5ld1ZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5zZXRRdWVzdGlvbkNvbW1lbnQobmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvbkNvbW1lbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkNvbW1lbnQ7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uQ29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXROZXdDb21tZW50KG5ld1ZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiB2YWx1ZSBpcyBlbXB0eVxuICAgKi9cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBbnN3ZXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNBbnN3ZXJlZFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzQW5zd2VyZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNBbnN3ZXJlZFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVJc0Fuc3dlcmVkKCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzQW5zd2VyZWRcIiwgdGhpcy5nZXRJc0Fuc3dlcmVkKCkpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc0VtcHR5KCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHF1ZXN0aW9uIHZhbGlkYXRvcnMuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIHByb3BlcnR5IGlzIGhpZGRlbiBmb3IgcXVlc3Rpb24gd2l0aG91dCBpbnB1dCwgZm9yIGV4YW1wbGUgaHRtbCBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsaWRhdG9yc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbGlkYXRvcnModmFsOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsaWRhdG9yc1wiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRWYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRvcnM7XG4gIH1cbiAgcHVibGljIGdldFN1cHBvcnRlZFZhbGlkYXRvcnMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIHRoaXMuYWRkU3VwcG9ydGVkVmFsaWRhdG9ycyhyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGFkZFN1cHBvcnRlZFZhbGlkYXRvcnMoc3VwcG9ydGVkVmFsaWRhdG9yczogQXJyYXk8c3RyaW5nPikge1xuICAgIHN1cHBvcnRlZFZhbGlkYXRvcnMucHVzaChcImV4cHJlc3Npb25cIik7XG4gIH1cbiAgcHVibGljIGFkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQoXG4gICAgb2JqZWN0czogQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4sXG4gICAgY29udGV4dDogYW55XG4gICkge1xuICAgIG9iamVjdHMucHVzaCh7XG4gICAgICBuYW1lOiB0aGlzLmdldFZhbHVlTmFtZSgpLFxuICAgICAgdGV4dDogdGhpcy5wcm9jZXNzZWRUaXRsZSxcbiAgICAgIHF1ZXN0aW9uOiB0aGlzLFxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICB2YXIganNvbiA9IG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHRoaXMpO1xuICAgIGpzb25bXCJ0eXBlXCJdID0gdGhpcy5nZXRUeXBlKCk7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbGlkYXRpb24gZXJyb3IocykgaW4gdGhlIHF1ZXN0aW9uLlxuICAgKiBAcGFyYW0gZmlyZUNhbGxiYWNrIHNldCBpdCB0byB0cnVlIHRvIHNob3cgYW4gZXJyb3IgaW4gVUkuXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsIHJlYzogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIHZhciBvbGRIYXNFcnJvcnMgPSB0aGlzLmVycm9ycy5sZW5ndGggPiAwO1xuICAgIHZhciBlcnJvcnMgPSB0aGlzLmNoZWNrRm9yRXJyb3JzKCEhcmVjICYmIHJlYy5pc09uVmFsdWVDaGFuZ2VkID09PSB0cnVlKTtcbiAgICBpZiAoZmlyZUNhbGxiYWNrKSB7XG4gICAgICBpZiAoISF0aGlzLnN1cnZleSkge1xuICAgICAgICB0aGlzLnN1cnZleS5iZWZvcmVTZXR0aW5nUXVlc3Rpb25FcnJvcnModGhpcywgZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbnRhaW5zRXJyb3JzKCk7XG4gICAgaWYgKG9sZEhhc0Vycm9ycyAhPSBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzKCk7XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnMubGVuZ3RoID4gMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsaWRhdGlvbiBlcnJvcnMgY291bnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRFcnJvckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmxlbmd0aDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hhci9zdHJpbmcgZm9yIGEgcmVxdWlyZWQgcXVlc3Rpb24uXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucmVxdWlyZWRUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSAhPSBudWxsICYmIHRoaXMuaXNSZXF1aXJlZFxuICAgICAgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHRcbiAgICAgIDogXCJcIjtcbiAgfVxuICAvKipcbiAgICogQWRkIGVycm9yIGludG8gdGhlIHF1ZXN0aW9uIGVycm9yIGxpc3QuXG4gICAqIEBwYXJhbSBlcnJvclxuICAgKi9cbiAgcHVibGljIGFkZEVycm9yKGVycm9yOiBTdXJ2ZXlFcnJvciB8IHN0cmluZykge1xuICAgIGlmICghZXJyb3IpIHJldHVybjtcbiAgICBsZXQgbmV3RXJyb3I6IFN1cnZleUVycm9yID0gbnVsbDtcbiAgICBpZiAodHlwZW9mIGVycm9yID09PSBcInN0cmluZ1wiIHx8IGVycm9yIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICBuZXdFcnJvciA9IG5ldyBDdXN0b21FcnJvcig8c3RyaW5nPmVycm9yLCB0aGlzLnN1cnZleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0Vycm9yID0gPFN1cnZleUVycm9yPmVycm9yO1xuICAgIH1cbiAgICB0aGlzLmVycm9ycy5wdXNoKG5ld0Vycm9yKTtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFydGljdWxhciBlcnJvciBmcm9tIHRoZSBxdWVzdGlvbiBlcnJvciBsaXN0LlxuICAgKiBAcGFyYW0gZXJyb3JcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFcnJvcihlcnJvcjogU3VydmV5RXJyb3IpIHtcbiAgICB2YXIgZXJyb3JzID0gdGhpcy5lcnJvcnM7XG4gICAgdmFyIGluZGV4ID0gZXJyb3JzLmluZGV4T2YoZXJyb3IpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIGVycm9ycy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHByaXZhdGUgY2hlY2tGb3JFcnJvcnMoaXNPblZhbHVlQ2hhbmdlZDogYm9vbGVhbik6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHFFcnJvcnMgPSBuZXcgQXJyYXk8U3VydmV5RXJyb3I+KCk7XG4gICAgaWYgKHRoaXMuaXNWaXNpYmxlICYmICF0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHRoaXMuY29sbGVjdEVycm9ycyhxRXJyb3JzLCBpc09uVmFsdWVDaGFuZ2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIHFFcnJvcnM7XG4gIH1cbiAgcHJpdmF0ZSBjb2xsZWN0RXJyb3JzKFxuICAgIHFFcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPixcbiAgICBpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuXG4gICkge1xuICAgIHRoaXMub25DaGVja0ZvckVycm9ycyhxRXJyb3JzLCBpc09uVmFsdWVDaGFuZ2VkKTtcbiAgICBpZiAocUVycm9ycy5sZW5ndGggPiAwIHx8ICF0aGlzLmNhblJ1blZhbGlkYXRvcnMoaXNPblZhbHVlQ2hhbmdlZCkpIHJldHVybjtcbiAgICB2YXIgZXJyb3JzID0gdGhpcy5ydW5WYWxpZGF0b3JzKCk7XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAvL3ZhbGlkYXRvcnMgbWF5IGNoYW5nZSB0aGUgcXVlc3Rpb24gdmFsdWUuXG4gICAgICBxRXJyb3JzLmxlbmd0aCA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBxRXJyb3JzLnB1c2goZXJyb3JzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHFFcnJvcnMubGVuZ3RoID09IDApIHtcbiAgICAgIHZhciBlcnJvciA9IHRoaXMuZmlyZVN1cnZleVZhbGlkYXRpb24oKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBxRXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2FuUnVuVmFsaWRhdG9ycyhpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBmaXJlU3VydmV5VmFsaWRhdGlvbigpOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKHRoaXMudmFsaWRhdGVWYWx1ZUNhbGxiYWNrKSByZXR1cm4gdGhpcy52YWxpZGF0ZVZhbHVlQ2FsbGJhY2soKTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS52YWxpZGF0ZVF1ZXN0aW9uKHRoaXMpIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhcbiAgICBlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPixcbiAgICBpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuXG4gICkge1xuICAgIGlmICghaXNPblZhbHVlQ2hhbmdlZCAmJiB0aGlzLmhhc1JlcXVpcmVkRXJyb3IoKSkge1xuICAgICAgZXJyb3JzLnB1c2gobmV3IEFuc3dlclJlcXVpcmVkRXJyb3IodGhpcy5yZXF1aXJlZEVycm9yVGV4dCwgdGhpcykpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaGFzUmVxdWlyZWRFcnJvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlcXVpcmVkICYmIHRoaXMuaXNFbXB0eSgpO1xuICB9XG4gIHByaXZhdGUgdmFsaWRhdG9yUnVubmVyOiBWYWxpZGF0b3JSdW5uZXI7XG4gIHByaXZhdGUgaXNSdW5uaW5nVmFsaWRhdG9yc1ZhbHVlID0gZmFsc2U7XG4gIHB1YmxpYyBvbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9yczogKGhhc0Vycm9yczogYm9vbGVhbikgPT4gdm9pZDtcbiAgcHVibGljIGdldCBpc1J1bm5pbmdWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldElzUnVubmluZ1ZhbGlkYXRvcnMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXNSdW5uaW5nVmFsaWRhdG9ycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1J1bm5pbmdWYWxpZGF0b3JzVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHJ1blZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICBpZiAoISF0aGlzLnZhbGlkYXRvclJ1bm5lcikge1xuICAgICAgdGhpcy52YWxpZGF0b3JSdW5uZXIub25Bc3luY0NvbXBsZXRlZCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdG9yUnVubmVyID0gbmV3IFZhbGlkYXRvclJ1bm5lcigpO1xuICAgIHRoaXMuaXNSdW5uaW5nVmFsaWRhdG9yc1ZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLnZhbGlkYXRvclJ1bm5lci5vbkFzeW5jQ29tcGxldGVkID0gKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSA9PiB7XG4gICAgICB0aGlzLmRvT25Bc3luY0NvbXBsZXRlZChlcnJvcnMpO1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yUnVubmVyLnJ1bih0aGlzKTtcbiAgfVxuICBwcml2YXRlIGRvT25Bc3luY0NvbXBsZXRlZChlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yc1tpXSk7XG4gICAgfVxuICAgIHRoaXMuaXNSdW5uaW5nVmFsaWRhdG9yc1ZhbHVlID0gZmFsc2U7XG4gICAgdGhpcy5yYWlzZU9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJhaXNlT25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMoKSB7XG4gICAgaWYgKCEhdGhpcy5vbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycyAmJiAhdGhpcy5pc1J1bm5pbmdWYWxpZGF0b3JzKSB7XG4gICAgICB0aGlzLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzKHRoaXMuZ2V0QWxsRXJyb3JzKCkubGVuZ3RoID4gMCk7XG4gICAgICB0aGlzLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlQ2hhbmdlZEluU3VydmV5ID0gZmFsc2U7XG4gIHByb3RlY3RlZCBhbGxvd05vdGlmeVZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdmFyIG9sZEFuc3dlcmVkID0gdGhpcy5pc0Fuc3dlcmVkO1xuICAgIHRoaXMuc2V0TmV3VmFsdWVJbkRhdGEobmV3VmFsdWUpO1xuICAgIHRoaXMuYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQgJiYgdGhpcy5vblZhbHVlQ2hhbmdlZCgpO1xuICAgIGlmICh0aGlzLmlzQW5zd2VyZWQgIT0gb2xkQW5zd2VyZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlRWxlbWVudENzcygpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgbG9jTm90aWZpY2F0aW9uSW5EYXRhID0gZmFsc2U7XG4gIHByb3RlY3RlZCBpc1RleHRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBpc1N1cnZleUlucHV0VGV4dFVwZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LmlzVXBkYXRlVmFsdWVUZXh0T25UeXBpbmcgOiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGdldERhdGFMb2NOb3RpZmljYXRpb24oKTogYW55IHtcbiAgICBpZiAodGhpcy5sb2NOb3RpZmljYXRpb25JbkRhdGEpIHJldHVybiB0aGlzLmxvY05vdGlmaWNhdGlvbkluRGF0YTtcbiAgICByZXR1cm4gdGhpcy5pc0lucHV0VGV4dFVwZGF0ZSA/IFwidGV4dFwiIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBpc0lucHV0VGV4dFVwZGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1N1cnZleUlucHV0VGV4dFVwZGF0ZSAmJiB0aGlzLmlzVGV4dFZhbHVlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlSW5EYXRhKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBuZXdWYWx1ZSA9IHRoaXMudmFsdWVUb0RhdGEobmV3VmFsdWUpO1xuICAgIGlmICghdGhpcy5pc1ZhbHVlQ2hhbmdlZEluU3VydmV5KSB7XG4gICAgICB0aGlzLnNldFZhbHVlQ29yZShuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUNvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25WYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0VmFsdWVDb3JlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUpO1xuICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kYXRhLnNldFZhbHVlKFxuICAgICAgICB0aGlzLmdldFZhbHVlTmFtZSgpLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgdGhpcy5nZXREYXRhTG9jTm90aWZpY2F0aW9uKCksXG4gICAgICAgIHRoaXMuYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWRcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZVRvRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7fVxuICBwcm90ZWN0ZWQgc2V0TmV3Q29tbWVudChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5xdWVzdGlvbkNvbW1lbnQgPSBuZXdWYWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRDb21tZW50KFxuICAgICAgICB0aGlzLmdldFZhbHVlTmFtZSgpLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgdGhpcy5pc1N1cnZleUlucHV0VGV4dFVwZGF0ZSA/IFwidGV4dFwiIDogZmFsc2VcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRWYWxpZE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBuYW1lO1xuICAgIHJldHVybiBuYW1lLnRyaW0oKS5yZXBsYWNlKC9bXFx7XFx9XSsvZywgXCJcIik7XG4gIH1cbiAgLy9JUXVlc3Rpb25cbiAgdXBkYXRlVmFsdWVGcm9tU3VydmV5KG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBuZXdWYWx1ZSA9IEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUobmV3VmFsdWUpO1xuICAgIHRoaXMuc2V0UXVlc3Rpb25WYWx1ZSh0aGlzLnZhbHVlRnJvbURhdGEobmV3VmFsdWUpKTtcbiAgfVxuICB1cGRhdGVDb21tZW50RnJvbVN1cnZleShuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICB0aGlzLnF1ZXN0aW9uQ29tbWVudCA9IG5ld1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnksIHVwZGF0ZUlzQW5zd2VyZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgdGhpcy5xdWVzdGlvblZhbHVlID0gbmV3VmFsdWU7XG4gICAgdGhpcy5hbGxvd05vdGlmeVZhbHVlQ2hhbmdlZCAmJlxuICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy52YWx1ZUNoYW5nZWRDYWxsYmFjayk7XG4gICAgaWYgKHVwZGF0ZUlzQW5zd2VyZWQpIHRoaXMudXBkYXRlSXNBbnN3ZXJlZCgpO1xuICB9XG4gIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleCh2YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNWaXNpYmxlIHx8XG4gICAgICAoIXRoaXMuaGFzVGl0bGUgJiYgIXNldHRpbmdzLnNldFF1ZXN0aW9uVmlzaWJsZUluZGV4Rm9ySGlkZGVuVGl0bGUpIHx8XG4gICAgICAodGhpcy5oaWRlTnVtYmVyICYmICFzZXR0aW5ncy5zZXRRdWVzdGlvblZpc2libGVJbmRleEZvckhpZGRlbk51bWJlcilcbiAgICApIHtcbiAgICAgIHZhbCA9IC0xO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgdmFsKTtcbiAgICByZXR1cm4gdmFsIDwgMCA/IDAgOiAxO1xuICB9XG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlRXJyb3IoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZW1vdmUgdmFsdWVzIGZyb20gdGhlIGN1cnJlbnQgcXVlc3Rpb24sIHRoYXQgZW5kLXVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlci5cbiAgICogRm9yIGV4YW1wbGUgdGhlIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdHMgaW4gYSByYWRpZ3JvdXAvZHJvcGRvd24vY2hlY2tib3ggY2hvaWNlcyBvciBtYXRyaXggcm93cy9jb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge31cbiAgcHVibGljIGNsZWFyT25EZWxldGluZ0NvbnRhaW5lcigpIHt9XG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gY2xlYXIgYWxsIGVycm9ycyBpbiB0aGUgcXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBjbGVhckVycm9ycygpIHtcbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICB9XG4gIHB1YmxpYyBjbGVhclVudXNlZFZhbHVlcygpIHt9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge31cbiAgY2hlY2tCaW5kaW5ncyh2YWx1ZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmJpbmRpbmdzLmlzRW1wdHkoKSB8fCAhdGhpcy5kYXRhKSByZXR1cm47XG4gICAgdmFyIHByb3BzID0gdGhpcy5iaW5kaW5ncy5nZXRQcm9wZXJ0aWVzQnlWYWx1ZU5hbWUodmFsdWVOYW1lKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzW3Byb3BzW2ldXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICAvL0lMb2NhbGl6YWJsZU93bmVyXG4gIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lciA9IG51bGw7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN1cnZleSBsb2NhbGVcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5sb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlcbiAgICAgID8gKDxJTG9jYWxpemFibGVPd25lcj4oPGFueT50aGlzLnN1cnZleSkpLmdldExvY2FsZSgpXG4gICAgICA6IHRoaXMubG9jT3duZXJcbiAgICAgID8gdGhpcy5sb2NPd25lci5nZXRMb2NhbGUoKVxuICAgICAgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlcbiAgICAgID8gdGhpcy5zdXJ2ZXkuZ2V0U3VydmV5TWFya2Rvd25IdG1sKHRoaXMsIHRleHQpXG4gICAgICA6IHRoaXMubG9jT3duZXJcbiAgICAgID8gdGhpcy5sb2NPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dClcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnRleHRQcm9jZXNzb3IpXG4gICAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KHRleHQsIHRoaXMudXNlRGlzcGxheVZhbHVlc0luVGl0bGUpO1xuICAgIGlmICh0aGlzLmxvY093bmVyKSByZXR1cm4gdGhpcy5sb2NPd25lci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIC8vSVN1cnZleUVycm9yT3duZXJcbiAgZ2V0RXJyb3JDdXN0b21UZXh0KHRleHQ6IHN0cmluZywgZXJyb3I6IFN1cnZleUVycm9yKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnN1cnZleSkgcmV0dXJuIHRoaXMuc3VydmV5LmdldEVycm9yQ3VzdG9tVGV4dCh0ZXh0LCBlcnJvcik7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgLy9JVmFsaWRhdG9yT3duZXJcbiAgZ2V0VmFsaWRhdG9yVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgdmFsaWRhdGVkVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuICBzZXQgdmFsaWRhdGVkVmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsO1xuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGRpc3Bvc2UoKSB7fVxufVxuU2VyaWFsaXplci5hZGRDbGFzcyhcInF1ZXN0aW9uXCIsIFtcbiAgXCIhbmFtZVwiLFxuICB7IG5hbWU6IFwidmlzaWJsZTpzd2l0Y2hcIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwidXNlRGlzcGxheVZhbHVlc0luVGl0bGU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gIHsgbmFtZTogXCJ3aWR0aFwiIH0sXG4gIHsgbmFtZTogXCJtaW5XaWR0aFwiLCBkZWZhdWx0OiBzZXR0aW5ncy5taW5XaWR0aCB9LFxuICB7IG5hbWU6IFwibWF4V2lkdGhcIiwgZGVmYXVsdDogc2V0dGluZ3MubWF4V2lkdGggfSxcbiAgeyBuYW1lOiBcInN0YXJ0V2l0aE5ld0xpbmU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgeyBuYW1lOiBcImluZGVudDpudW1iZXJcIiwgZGVmYXVsdDogMCwgY2hvaWNlczogWzAsIDEsIDIsIDNdLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAge1xuICAgIG5hbWU6IFwicGFnZVwiLFxuICAgIGlzU2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uIChvYmo6IGFueSkge1xuICAgICAgdmFyIHN1cnZleSA9IG9iaiA/IG9iai5zdXJ2ZXkgOiBudWxsO1xuICAgICAgcmV0dXJuICFzdXJ2ZXkgfHwgc3VydmV5LnBhZ2VzLmxlbmd0aCA+IDE7XG4gICAgfSxcbiAgICBjaG9pY2VzOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgIHZhciBzdXJ2ZXkgPSBvYmogPyBvYmouc3VydmV5IDogbnVsbDtcbiAgICAgIHJldHVybiBzdXJ2ZXlcbiAgICAgICAgPyBzdXJ2ZXkucGFnZXMubWFwKChwOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBwLm5hbWUsIHRleHQ6IHAudGl0bGUgfTtcbiAgICAgICAgICB9KVxuICAgICAgICA6IFtdO1xuICAgIH0sXG4gIH0sXG4gIHsgbmFtZTogXCJ0aXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAge1xuICAgIG5hbWU6IFwidGl0bGVMb2NhdGlvblwiLFxuICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIFwiaGlkZGVuXCJdLFxuICAgIGxheW91dDogXCJyb3dcIixcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLFxuICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NEZXNjcmlwdGlvblwiLFxuICAgIGxheW91dDogXCJyb3dcIixcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiZGVzY3JpcHRpb25Mb2NhdGlvblwiLFxuICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJ1bmRlcklucHV0XCIsIFwidW5kZXJUaXRsZVwiXSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiaGlkZU51bWJlcjpib29sZWFuXCIsXG4gICAgZGVwZW5kc09uOiBcInRpdGxlTG9jYXRpb25cIixcbiAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uIChvYmo6IGFueSkge1xuICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoKDxRdWVzdGlvbj5vYmopLnRpdGxlTG9jYXRpb24gPT09IFwiaGlkZGVuXCIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHBhcmVudDogUGFuZWxNb2RlbCA9IG9iaiA/IG9iai5wYXJlbnQgOiBudWxsO1xuICAgICAgdmFyIG51bWJlcmluZ0FsbG93ZWRCeVBhcmVudCA9XG4gICAgICAgICFwYXJlbnQgfHwgcGFyZW50LnNob3dRdWVzdGlvbk51bWJlcnMgIT09IFwib2ZmXCI7XG4gICAgICBpZiAoIW51bWJlcmluZ0FsbG93ZWRCeVBhcmVudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgc3VydmV5OiBTdXJ2ZXlNb2RlbCA9IG9iaiA/IG9iai5zdXJ2ZXkgOiBudWxsO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgIXN1cnZleSB8fFxuICAgICAgICBzdXJ2ZXkuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPT0gXCJvZmZcIiB8fFxuICAgICAgICAoISFwYXJlbnQgJiYgcGFyZW50LnNob3dRdWVzdGlvbk51bWJlcnMgPT09IFwib25wYW5lbFwiKVxuICAgICAgKTtcbiAgICB9LFxuICB9LFxuICBcInZhbHVlTmFtZVwiLFxuICBcImVuYWJsZUlmOmNvbmRpdGlvblwiLFxuICBcImRlZmF1bHRWYWx1ZTp2YWx1ZVwiLFxuICB7XG4gICAgbmFtZTogXCJkZWZhdWx0VmFsdWVFeHByZXNzaW9uOmV4cHJlc3Npb25cIixcbiAgICBjYXRlZ29yeTogXCJsb2dpY1wiLFxuICB9LFxuICBcImNvcnJlY3RBbnN3ZXI6dmFsdWVcIixcbiAgXCJpc1JlcXVpcmVkOnN3aXRjaFwiLFxuICBcInJlcXVpcmVkSWY6Y29uZGl0aW9uXCIsXG4gIHtcbiAgICBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0OnRleHRcIixcbiAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUmVxdWlyZWRFcnJvclRleHRcIixcbiAgfSxcbiAgXCJyZWFkT25seTpzd2l0Y2hcIixcbiAge1xuICAgIG5hbWU6IFwidmFsaWRhdG9yczp2YWxpZGF0b3JzXCIsXG4gICAgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl2YWxpZGF0b3JcIixcbiAgICBjbGFzc05hbWVQYXJ0OiBcInZhbGlkYXRvclwiLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJiaW5kaW5nczpiaW5kaW5nc1wiLFxuICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJiaW5kaW5nc1wiLFxuICAgIHZpc2libGVJZjogZnVuY3Rpb24gKG9iajogYW55KSB7XG4gICAgICByZXR1cm4gb2JqLmJpbmRpbmdzLmdldE5hbWVzKCkubGVuZ3RoID4gMDtcbiAgICB9LFxuICB9LFxuXSk7XG5TZXJpYWxpemVyLmFkZEFsdGVyTmF0aXZlQ2xhc3NOYW1lKFwicXVlc3Rpb25cIiwgXCJxdWVzdGlvbmJhc2VcIik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb24udHMiLCJpbXBvcnQgeyBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcblxuaW1wb3J0IHsgT3BlcmFuZCwgRnVuY3Rpb25PcGVyYW5kIH0gZnJvbSBcIi4vZXhwcmVzc2lvbnMvZXhwcmVzc2lvbnNcIjtcbmltcG9ydCB7IENvbmRpdGlvbnNQYXJzZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zUGFyc2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uUnVubmVyQmFzZSB7XG4gIHByaXZhdGUgZXhwcmVzc2lvblZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgb3BlcmFuZDogT3BlcmFuZDtcbiAgcHJpdmF0ZSBwcm9jZXNzVmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gIHByaXZhdGUgcGFyc2VyID0gbmV3IENvbmRpdGlvbnNQYXJzZXIoKTtcbiAgcHJpdmF0ZSBpc0FzeW5jVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBoYXNGdW5jdGlvblZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgYXN5bmNGdW5jTGlzdDogQXJyYXk8RnVuY3Rpb25PcGVyYW5kPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25WYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZXhwcmVzc2lvbiA9PT0gdmFsdWUpIHJldHVybjtcbiAgICB0aGlzLmV4cHJlc3Npb25WYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub3BlcmFuZCA9IHRoaXMucGFyc2VyLnBhcnNlRXhwcmVzc2lvbih2YWx1ZSk7XG4gICAgdGhpcy5oYXNGdW5jdGlvblZhbHVlID0gdGhpcy5jYW5SdW4oKSA/IHRoaXMub3BlcmFuZC5oYXNGdW5jdGlvbigpIDogZmFsc2U7XG4gICAgdGhpcy5pc0FzeW5jVmFsdWUgPSB0aGlzLmhhc0Z1bmN0aW9uKClcbiAgICAgID8gdGhpcy5vcGVyYW5kLmhhc0FzeW5jRnVuY3Rpb24oKVxuICAgICAgOiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLm9wZXJhbmQpIHJldHVybiBbXTtcblxuICAgIHZhciB2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICB0aGlzLm9wZXJhbmQuc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7XG4gICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgfVxuXG4gIHB1YmxpYyBoYXNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNGdW5jdGlvblZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBc3luYygpIHtcbiAgICByZXR1cm4gdGhpcy5pc0FzeW5jVmFsdWU7XG4gIH1cblxuICBwdWJsaWMgY2FuUnVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMub3BlcmFuZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBydW5Db3JlKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4gPSBudWxsXG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLm9wZXJhbmQpIHJldHVybiBudWxsO1xuXG4gICAgdGhpcy5wcm9jZXNzVmFsdWUudmFsdWVzID0gdmFsdWVzO1xuICAgIHRoaXMucHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgIGlmICghdGhpcy5pc0FzeW5jKSByZXR1cm4gdGhpcy5ydW5WYWx1ZXMoKTtcbiAgICB0aGlzLmFzeW5jRnVuY0xpc3QgPSBbXTtcbiAgICB0aGlzLm9wZXJhbmQuYWRkVG9Bc3luY0xpc3QodGhpcy5hc3luY0Z1bmNMaXN0KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXN5bmNGdW5jTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hc3luY0Z1bmNMaXN0W2ldLm9uQXN5bmNSZWFkeSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb0FzeW5jRnVuY3Rpb25SZWFkeSgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFzeW5jRnVuY0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYXN5bmNGdW5jTGlzdFtpXS5ldmFsdWF0ZUFzeW5jKHRoaXMucHJvY2Vzc1ZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgZG9Bc3luY0Z1bmN0aW9uUmVhZHkoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFzeW5jRnVuY0xpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5hc3luY0Z1bmNMaXN0W2ldLmlzUmVhZHkpIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ydW5WYWx1ZXMoKTtcbiAgfVxuICBwcml2YXRlIHJ1blZhbHVlcygpOiBhbnkge1xuICAgIHZhciByZXMgPSB0aGlzLm9wZXJhbmQuZXZhbHVhdGUodGhpcy5wcm9jZXNzVmFsdWUpO1xuICAgIHRoaXMuZG9PbkNvbXBsZXRlKHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgZG9PbkNvbXBsZXRlKHJlczogYW55KSB7fVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uUnVubmVyIGV4dGVuZHMgRXhwcmVzc2lvblJ1bm5lckJhc2Uge1xuICBwdWJsaWMgb25SdW5Db21wbGV0ZTogKHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZDtcbiAgcHVibGljIHJ1bihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbFxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ydW5Db3JlKHZhbHVlcywgcHJvcGVydGllcykgPT0gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9PbkNvbXBsZXRlKHJlczogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5vblJ1bkNvbXBsZXRlKSB0aGlzLm9uUnVuQ29tcGxldGUocmVzID09IHRydWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uUnVubmVyIGV4dGVuZHMgRXhwcmVzc2lvblJ1bm5lckJhc2Uge1xuICBwdWJsaWMgb25SdW5Db21wbGV0ZTogKHJlc3VsdDogYW55KSA9PiB2b2lkO1xuICBwdWJsaWMgcnVuKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucnVuQ29yZSh2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByb3RlY3RlZCBkb09uQ29tcGxldGUocmVzOiBhbnkpIHtcbiAgICBpZiAoISF0aGlzLm9uUnVuQ29tcGxldGUpIHRoaXMub25SdW5Db21wbGV0ZShyZXMpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uZGl0aW9ucy50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciwgSVN1cnZleUVycm9yT3duZXIgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBBbnN3ZXJSZXF1aXJlZEVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdGV4dDogc3RyaW5nID0gbnVsbCxcbiAgICBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGxcbiAgKSB7XG4gICAgc3VwZXIodGV4dCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJlcXVpcmVkXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEVycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgT25lQW5zd2VyUmVxdWlyZWRFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZXF1aXJlb25lYW5zd2VyXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEVycm9ySW5QYW5lbFwiKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFJlcXVyZU51bWVyaWNFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHRleHQ6IHN0cmluZyA9IG51bGwsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyZXF1aXJlbnVtZXJpY1wiO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibnVtZXJpY0Vycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgRXhjZWVkU2l6ZUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1heFNpemU6IG51bWJlciwgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIobnVsbCwgZXJyb3JPd25lcik7XG4gICAgdGhpcy5sb2NUZXh0LnRleHQgPSB0aGlzLmdldFRleHQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZXhjZWVkc2l6ZVwiO1xuICB9XG4gIHB1YmxpYyBnZXREZWZhdWx0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgIC5nZXRTdHJpbmcoXCJleGNlZWRNYXhTaXplXCIpXG4gICAgICBbXCJmb3JtYXRcIl0odGhpcy5nZXRUZXh0U2l6ZSgpKTtcbiAgfVxuICBwcml2YXRlIGdldFRleHRTaXplKCkge1xuICAgIHZhciBzaXplcyA9IFtcIkJ5dGVzXCIsIFwiS0JcIiwgXCJNQlwiLCBcIkdCXCIsIFwiVEJcIl07XG4gICAgdmFyIGZpeGVkID0gWzAsIDAsIDIsIDMsIDNdO1xuICAgIGlmICh0aGlzLm1heFNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBcIjAgQnl0ZVwiO1xuICAgIH1cbiAgICB2YXIgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2codGhpcy5tYXhTaXplKSAvIE1hdGgubG9nKDEwMjQpKTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLm1heFNpemUgLyBNYXRoLnBvdygxMDI0LCBpKTtcbiAgICByZXR1cm4gdmFsdWUudG9GaXhlZChmaXhlZFtpXSkgKyBcIiBcIiArIHNpemVzW2ldO1xuICB9XG59XG5leHBvcnQgY2xhc3MgV2ViUmVxdWVzdEVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3RhdHVzOiBzdHJpbmcsXG4gICAgcHVibGljIHJlc3BvbnNlOiBzdHJpbmcsXG4gICAgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsXG4gICkge1xuICAgIHN1cGVyKG51bGwsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ3ZWJyZXF1ZXN0XCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcInVybFJlcXVlc3RFcnJvclwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMuc3RhdHVzLCB0aGlzLnJlc3BvbnNlKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFdlYlJlcXVlc3RFbXB0eUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGV4dDogc3RyaW5nLCBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGwpIHtcbiAgICBzdXBlcih0ZXh0LCBlcnJvck93bmVyKTtcbiAgfVxuICBwdWJsaWMgZ2V0RXJyb3JUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwid2VicmVxdWVzdGVtcHR5XCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ1cmxHZXRDaG9pY2VzRXJyb3JcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBPdGhlckVtcHR5RXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJvdGhlcmVtcHR5XCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlclJlcXVpcmVkRXJyb3JcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBVcGxvYWRpbmdGaWxlRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZXh0OiBzdHJpbmcsIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyID0gbnVsbCkge1xuICAgIHN1cGVyKHRleHQsIGVycm9yT3duZXIpO1xuICB9XG4gIHB1YmxpYyBnZXRFcnJvclR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ1cGxvYWRpbmdmaWxlXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ1cGxvYWRpbmdGaWxlXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgUmVxdWlyZWRJbkFsbFJvd3NFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZywgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIodGV4dCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJlcXVpcmVkaW5hbGxyb3dzZXJyb3JcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlcXVpcmVkSW5BbGxSb3dzRXJyb3JcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBNaW5Sb3dDb3VudEVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbWluUm93Q291bnQ6IG51bWJlcixcbiAgICBlcnJvck93bmVyOiBJU3VydmV5RXJyb3JPd25lciA9IG51bGxcbiAgKSB7XG4gICAgc3VwZXIobnVsbCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1pbnJvd2NvdW50ZXJyb3JcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAuZ2V0U3RyaW5nKFwibWluUm93Q291bnRFcnJvclwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMubWluUm93Q291bnQpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgS2V5RHVwbGljYXRpb25FcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZywgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIodGV4dCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImtleWR1cGxpY2F0aW9uZXJyb3JcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBDdXN0b21FcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRleHQ6IHN0cmluZywgZXJyb3JPd25lcjogSVN1cnZleUVycm9yT3duZXIgPSBudWxsKSB7XG4gICAgc3VwZXIodGV4dCwgZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIGdldEVycm9yVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImN1c3RvbVwiO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXJyb3IudHMiLCJpbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHtcbiAgSnNvbk9iamVjdCxcbiAgSnNvbk9iamVjdFByb3BlcnR5LFxuICBTZXJpYWxpemVyLFxuICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbixcbn0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbi8qKlxuICogQXJyYXkgb2YgSXRlbVZhbHVlIGlzIHVzZWQgaW4gY2hlY2tveCwgZHJvcGRvd24gYW5kIHJhZGlvZ3JvdXAgY2hvaWNlcywgbWF0cml4IGNvbHVtbnMgYW5kIHJvd3MuXG4gKiBJdCBoYXMgdHdvIG1haW4gcHJvcGVydGllczogdmFsdWUgYW5kIHRleHQuIElmIHRleHQgaXMgZW1wdHksIHZhbHVlIGlzIHVzZWQgZm9yIGRpc3BsYXlpbmcuXG4gKiBUaGUgdGV4dCBwcm9wZXJ0eSBpcyBsb2NhbGl6YWJsZSBhbmQgc3VwcG9ydCBtYXJrZG93bi5cbiAqL1xuZXhwb3J0IGNsYXNzIEl0ZW1WYWx1ZSBleHRlbmRzIEJhc2Uge1xuICBbaW5kZXg6IHN0cmluZ106IGFueTtcbiAgcHVibGljIHN0YXRpYyBnZXQgU2VwYXJhdG9yKCkge1xuICAgIHJldHVybiBzZXR0aW5ncy5pdGVtVmFsdWVTZXBhcmF0b3I7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgU2VwYXJhdG9yKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3MuaXRlbVZhbHVlU2VwYXJhdG9yID0gdmFsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlQXJyYXkobG9jT3duZXI6IElMb2NhbGl6YWJsZU93bmVyKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+ID0gW107XG4gICAgSXRlbVZhbHVlLnNldHVwQXJyYXkoaXRlbXMsIGxvY093bmVyKTtcbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXR1cEFycmF5KFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lclxuICApIHtcbiAgICBpdGVtcy5wdXNoID0gZnVuY3Rpb24gKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHZhbHVlLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaXRlbXMudW5zaGlmdCA9IGZ1bmN0aW9uICh2YWx1ZSk6IG51bWJlciB7XG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICB2YWx1ZS5sb2NPd25lciA9IGxvY093bmVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIGl0ZW1zLnNwbGljZSA9IGZ1bmN0aW9uIChcbiAgICAgIHN0YXJ0PzogbnVtYmVyLFxuICAgICAgZGVsZXRlQ291bnQ/OiBudW1iZXIsXG4gICAgICAuLi5pdGVtczogSXRlbVZhbHVlW11cbiAgICApOiBJdGVtVmFsdWVbXSB7XG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBzdGFydCxcbiAgICAgICAgZGVsZXRlQ291bnQsXG4gICAgICAgIC4uLml0ZW1zXG4gICAgICApO1xuICAgICAgaWYgKCFpdGVtcykgaXRlbXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlbXNbaV0ubG9jT3duZXIgPSBsb2NPd25lcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldERhdGEoaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sIHZhbHVlczogQXJyYXk8YW55Pikge1xuICAgIGl0ZW1zLmxlbmd0aCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgIHZhciBpdGVtOiBJdGVtVmFsdWU7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLmdldFR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpdGVtID0gU2VyaWFsaXplci5jcmVhdGVDbGFzcyh2YWx1ZS5nZXRUeXBlKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbSA9IG5ldyBJdGVtVmFsdWUobnVsbCk7XG4gICAgICB9XG4gICAgICBpdGVtLnNldERhdGEodmFsdWUpO1xuICAgICAgaWYgKCEhdmFsdWUub3JpZ2luYWxJdGVtKSB7XG4gICAgICAgIGl0ZW0ub3JpZ2luYWxJdGVtID0gdmFsdWUub3JpZ2luYWxJdGVtO1xuICAgICAgfVxuICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXREYXRhKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KTogYW55IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2goaXRlbXNbaV0uZ2V0RGF0YSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldEl0ZW1CeVZhbHVlKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCB2YWw6IGFueSk6IEl0ZW1WYWx1ZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhpdGVtc1tpXS52YWx1ZSwgdmFsKSkgcmV0dXJuIGl0ZW1zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldFRleHRPckh0bWxCeVZhbHVlKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHZhbDogYW55XG4gICk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUoaXRlbXMsIHZhbCk7XG4gICAgcmV0dXJuIGl0ZW0gIT09IG51bGwgPyBpdGVtLmxvY1RleHQudGV4dE9ySHRtbCA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBsb2NTdHJzQ2hhbmdlZChpdGVtczogQXJyYXk8SXRlbVZhbHVlPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW1zW2ldLmxvY1RleHQuc3RyQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc3RhdGljIHJ1bkNvbmRpdGlvbnNGb3JJdGVtcyhcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBmaWx0ZXJlZEl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHJ1bm5lcjogQ29uZGl0aW9uUnVubmVyLFxuICAgIHZhbHVlczogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueSxcbiAgICB1c2VJdGVtRXhwcmVzc2lvbjogYm9vbGVhbiA9IHRydWVcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5ydW5Db25kaXRpb25zRm9ySXRlbXNDb3JlKFxuICAgICAgaXRlbXMsXG4gICAgICBmaWx0ZXJlZEl0ZW1zLFxuICAgICAgcnVubmVyLFxuICAgICAgdmFsdWVzLFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIHRydWUsXG4gICAgICB1c2VJdGVtRXhwcmVzc2lvblxuICAgICk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBydW5FbmFibGVkQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHJ1bm5lcjogQ29uZGl0aW9uUnVubmVyLFxuICAgIHZhbHVlczogYW55LFxuICAgIHByb3BlcnRpZXM6IGFueVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gSXRlbVZhbHVlLnJ1bkNvbmRpdGlvbnNGb3JJdGVtc0NvcmUoXG4gICAgICBpdGVtcyxcbiAgICAgIG51bGwsXG4gICAgICBydW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgZmFsc2VcbiAgICApO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIHJ1bkNvbmRpdGlvbnNGb3JJdGVtc0NvcmUoXG4gICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgZmlsdGVyZWRJdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBydW5uZXI6IENvbmRpdGlvblJ1bm5lcixcbiAgICB2YWx1ZXM6IGFueSxcbiAgICBwcm9wZXJ0aWVzOiBhbnksXG4gICAgaXNWaXNpYmxlOiBib29sZWFuLFxuICAgIHVzZUl0ZW1FeHByZXNzaW9uOiBib29sZWFuID0gdHJ1ZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbHVlcykge1xuICAgICAgdmFsdWVzID0ge307XG4gICAgfVxuICAgIHZhciBpdGVtVmFsdWUgPSB2YWx1ZXNbXCJpdGVtXCJdO1xuICAgIHZhciBjaG9pY2VWYWx1ZSA9IHZhbHVlc1tcImNob2ljZVwiXTtcbiAgICB2YXIgaGFzQ2hhbmRlZCA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XG4gICAgICB2YWx1ZXNbXCJpdGVtXCJdID0gaXRlbS52YWx1ZTtcbiAgICAgIHZhbHVlc1tcImNob2ljZVwiXSA9IGl0ZW0udmFsdWU7XG4gICAgICB2YXIgaXRlbVJ1bm5lciA9XG4gICAgICAgIHVzZUl0ZW1FeHByZXNzaW9uICYmICEhaXRlbS5nZXRDb25kaXRpb25SdW5uZXJcbiAgICAgICAgICA/IGl0ZW0uZ2V0Q29uZGl0aW9uUnVubmVyKGlzVmlzaWJsZSlcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgaWYgKCFpdGVtUnVubmVyKSB7XG4gICAgICAgIGl0ZW1SdW5uZXIgPSBydW5uZXI7XG4gICAgICB9XG4gICAgICB2YXIgbmV3VmFsdWUgPSB0cnVlO1xuICAgICAgaWYgKGl0ZW1SdW5uZXIpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBpdGVtUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgfVxuICAgICAgaWYgKCEhZmlsdGVyZWRJdGVtcyAmJiBuZXdWYWx1ZSkge1xuICAgICAgICBmaWx0ZXJlZEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgICB2YXIgb2xkVmFsdWUgPSBpc1Zpc2libGUgPyBpdGVtLmlzVmlzaWJsZSA6IGl0ZW0uaXNFbmFibGVkO1xuICAgICAgaWYgKG5ld1ZhbHVlICE9IG9sZFZhbHVlKSB7XG4gICAgICAgIGhhc0NoYW5kZWQgPSB0cnVlO1xuICAgICAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICAgICAgaWYgKCEhaXRlbS5zZXRJc1Zpc2libGUpIGl0ZW0uc2V0SXNWaXNpYmxlKG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoISFpdGVtLnNldElzRW5hYmxlZCkgaXRlbS5zZXRJc0VuYWJsZWQobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpdGVtVmFsdWUpIHtcbiAgICAgIHZhbHVlc1tcIml0ZW1cIl0gPSBpdGVtVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZXNbXCJpdGVtXCJdO1xuICAgIH1cbiAgICBpZiAoY2hvaWNlVmFsdWUpIHtcbiAgICAgIHZhbHVlc1tcImNob2ljZVwiXSA9IGNob2ljZVZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVzW1wiY2hvaWNlXCJdO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmRlZDtcbiAgfVxuICBwdWJsaWMgb3duZXJQcm9wZXJ0eU5hbWU6IHN0cmluZyA9IFwiXCI7XG4gIHByaXZhdGUgaXRlbVZhbHVlOiBhbnk7XG4gIHByaXZhdGUgbG9jVGV4dFZhbHVlOiBMb2NhbGl6YWJsZVN0cmluZztcbiAgcHJpdmF0ZSBpc1Zpc2libGVWYWx1ZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgdmlzaWJsZUNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICBwcml2YXRlIGVuYWJsZUNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHZhbHVlOiBhbnksXG4gICAgdGV4dDogc3RyaW5nID0gbnVsbCxcbiAgICBwcm90ZWN0ZWQgdHlwZU5hbWUgPSBcIml0ZW12YWx1ZVwiXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sb2NUZXh0VmFsdWUgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcobnVsbCwgdHJ1ZSk7XG4gICAgdGhpcy5sb2NUZXh0VmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSAodHh0KSA9PiB7XG4gICAgICByZXR1cm4gdHh0ID8gdHh0IDogIXRoaXMuaXNWYWx1ZUl0ZW1FbXB0eSA/IHRoaXMudmFsdWUudG9TdHJpbmcoKSA6IG51bGw7XG4gICAgfTtcbiAgICBpZiAodGV4dCkgdGhpcy5sb2NUZXh0LnRleHQgPSB0ZXh0O1xuICAgIGlmICghIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5zZXREYXRhKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRUeXBlKCkgIT0gXCJpdGVtdmFsdWVcIikge1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydGllcyh0aGlzKTtcbiAgICB9XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gIH1cbiAgcHVibGljIG9uQ3JlYXRpbmcoKTogYW55IHt9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy50eXBlTmFtZSA/IHRoaXMudHlwZU5hbWUgOiBcIml0ZW12YWx1ZVwiO1xuICB9XG4gIHB1YmxpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0LmxvY2FsZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHRWYWx1ZTtcbiAgfVxuICBzZXRMb2NUZXh0KGxvY1RleHQ6IExvY2FsaXphYmxlU3RyaW5nKSB7XG4gICAgdGhpcy5sb2NUZXh0VmFsdWUgPSBsb2NUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jT3duZXIoKTogSUxvY2FsaXphYmxlT3duZXIge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHQub3duZXI7XG4gIH1cbiAgcHVibGljIHNldCBsb2NPd25lcih2YWx1ZTogSUxvY2FsaXphYmxlT3duZXIpIHtcbiAgICB0aGlzLmxvY1RleHQub3duZXIgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbVZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuaXRlbVZhbHVlO1xuICAgIHRoaXMuaXRlbVZhbHVlID0gbmV3VmFsdWU7XG4gICAgdGhpcy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInZhbHVlXCIsIG9sZFZhbHVlLCB0aGlzLml0ZW1WYWx1ZSk7XG4gICAgaWYgKCF0aGlzLml0ZW1WYWx1ZSkgcmV0dXJuO1xuICAgIHZhciBzdHI6IHN0cmluZyA9IHRoaXMuaXRlbVZhbHVlLnRvU3RyaW5nKCk7XG4gICAgdmFyIGluZGV4ID0gc3RyLmluZGV4T2Yoc2V0dGluZ3MuaXRlbVZhbHVlU2VwYXJhdG9yKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5pdGVtVmFsdWUgPSBzdHIuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgdGhpcy50ZXh0ID0gc3RyLnNsaWNlKGluZGV4ICsgMSk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5oYXNUZXh0KSB7XG4gICAgICB0aGlzLmxvY1RleHQub25DaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaGFzVGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0LnB1cmVUZXh0ID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHQuY2FsY3VsYXRlZFRleHQ7IC8vVE9ETzogaXQgd2lsbCBiZSBjb3JyZWN0IHRvIHVzZSB0aGlzLmxvY1RleHQudGV4dCwgaG93ZXZlciBpdCB3b3VsZCByZXF1aXJlIGEgbG90IG9mIHJld3JpdGluZyBpbiBDcmVhdG9yXG4gIH1cbiAgcHVibGljIHNldCB0ZXh0KG5ld1RleHQ6IHN0cmluZykge1xuICAgIGNvbnN0IG9sZFRleHQgPSB0aGlzLmxvY1RleHQudGV4dDtcbiAgICB0aGlzLmxvY1RleHQudGV4dCA9IG5ld1RleHQ7XG4gICAgdGhpcy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInRleHRcIiwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gIH1cbiAgcHVibGljIGdldCBjYWxjdWxhdGVkVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0LmNhbGN1bGF0ZWRUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXREYXRhKCk6IGFueSB7XG4gICAgdmFyIGpzb24gPSB0aGlzLnRvSlNPTigpO1xuICAgIGlmICghIWpzb25bXCJ2YWx1ZVwiXSAmJiAhIWpzb25bXCJ2YWx1ZVwiXVtcInBvc1wiXSkge1xuICAgICAgZGVsZXRlIGpzb25bXCJ2YWx1ZVwiXVtcInBvc1wiXTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGpzb24pLmxlbmd0aCA9PSAxICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eShqc29uW1widmFsdWVcIl0pKVxuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgcHVibGljIHRvSlNPTigpOiBhbnkge1xuICAgIHZhciByZXMgPSB7fTtcbiAgICB2YXIgcHJvcGVydGllcyA9IFNlcmlhbGl6ZXIuZ2V0UHJvcGVydGllcyh0aGlzLmdldFR5cGUoKSk7XG4gICAgaWYgKCFwcm9wZXJ0aWVzIHx8IHByb3BlcnRpZXMubGVuZ3RoID09IDApIHtcbiAgICAgIHByb3BlcnRpZXMgPSBTZXJpYWxpemVyLmdldFByb3BlcnRpZXMoXCJpdGVtdmFsdWVcIik7XG4gICAgfVxuICAgIHZhciBqc29PYmogPSBuZXcgSnNvbk9iamVjdCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAganNvT2JqLnZhbHVlVG9Kc29uKHRoaXMsIHJlcywgcHJvcGVydGllc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNldERhdGEodmFsdWU6IGFueSkge1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSkpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIHZhbHVlLnZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB2YXIganNvbiA9IHZhbHVlO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZS50b0pTT04gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBqc29uID0gKDxCYXNlPnZhbHVlKS50b0pTT04oKTtcbiAgICAgIH1cbiAgICAgIG5ldyBKc29uT2JqZWN0KCkudG9PYmplY3QoanNvbiwgdGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUlmXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWaXNpYmxlVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldElzVmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzVmlzaWJsZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0VuYWJsZWRcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldElzRW5hYmxlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0VuYWJsZWRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgYWRkVXNlZExvY2FsZXMobG9jYWxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuQWRkTG9jU3RyaW5nVG9Vc2VkTG9jYWxlcyh0aGlzLmxvY1RleHRWYWx1ZSwgbG9jYWxlcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XG4gICAgdmFyIGZ1bmNOYW1lID0gXCJpdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWRcIjtcbiAgICBpZiAoIXRoaXMubG9jT3duZXIgfHwgISg8YW55PnRoaXMubG9jT3duZXIpW2Z1bmNOYW1lXSkgcmV0dXJuO1xuICAgICg8YW55PnRoaXMubG9jT3duZXIpW2Z1bmNOYW1lXSh0aGlzLCBuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb25kaXRpb25SdW5uZXIoaXNWaXNpYmxlOiBib29sZWFuKSB7XG4gICAgaWYgKGlzVmlzaWJsZSkgcmV0dXJuIHRoaXMuZ2V0VmlzaWJsZUNvbmRpdGlvblJ1bm5lcigpO1xuICAgIHJldHVybiB0aGlzLmdldEVuYWJsZUNvbmRpdGlvblJ1bm5lcigpO1xuICB9XG4gIHByaXZhdGUgZ2V0VmlzaWJsZUNvbmRpdGlvblJ1bm5lcigpOiBDb25kaXRpb25SdW5uZXIge1xuICAgIGlmICghdGhpcy52aXNpYmxlSWYpIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyKVxuICAgICAgdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnZpc2libGVJZik7XG4gICAgdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLnZpc2libGVJZjtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29uZGl0aW9uUnVubmVyO1xuICB9XG4gIHByaXZhdGUgZ2V0RW5hYmxlQ29uZGl0aW9uUnVubmVyKCk6IENvbmRpdGlvblJ1bm5lciB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUlmKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMuZW5hYmxlQ29uZGl0aW9uUnVubmVyKVxuICAgICAgdGhpcy5lbmFibGVDb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZW5hYmxlSWYpO1xuICAgIHRoaXMuZW5hYmxlQ29uZGl0aW9uUnVubmVyLmV4cHJlc3Npb24gPSB0aGlzLmVuYWJsZUlmO1xuICAgIHJldHVybiB0aGlzLmVuYWJsZUNvbmRpdGlvblJ1bm5lcjtcbiAgfVxuICBwcml2YXRlIGdldCBpc1ZhbHVlSXRlbUVtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5pdGVtVmFsdWUgJiYgdGhpcy5pdGVtVmFsdWUgIT09IDAgJiYgdGhpcy5pdGVtVmFsdWUgIT09IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBvcmlnaW5hbEl0ZW06IGFueTtcbn1cblxuQmFzZS5jcmVhdGVJdGVtVmFsdWUgPSBmdW5jdGlvbiAoc291cmNlOiBhbnksIHR5cGU/OiBzdHJpbmcpOiBhbnkge1xuICB2YXIgaXRlbSA9IG51bGw7XG4gIGlmICghIXR5cGUpIHtcbiAgICBpdGVtID0gSnNvbk9iamVjdC5tZXRhRGF0YS5jcmVhdGVDbGFzcyh0eXBlLCB7fSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZS5nZXRUeXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBpdGVtID0gbmV3IEl0ZW1WYWx1ZShudWxsLCB1bmRlZmluZWQsIHNvdXJjZS5nZXRUeXBlKCkpO1xuICB9IGVsc2Uge1xuICAgIGl0ZW0gPSBuZXcgSXRlbVZhbHVlKG51bGwpO1xuICB9XG4gIGl0ZW0uc2V0RGF0YShzb3VyY2UpO1xuICByZXR1cm4gaXRlbTtcbn07XG5CYXNlLml0ZW1WYWx1ZUxvY1N0ckNoYW5nZWQgPSBmdW5jdGlvbiAoYXJyOiBBcnJheTxhbnk+KTogdm9pZCB7XG4gIEl0ZW1WYWx1ZS5sb2NTdHJzQ2hhbmdlZChhcnIpO1xufTtcbkpzb25PYmplY3RQcm9wZXJ0eS5nZXRJdGVtVmFsdWVzRGVmYXVsdFZhbHVlID0gZnVuY3Rpb24gKHZhbDogYW55KTogYW55IHtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheTxJdGVtVmFsdWU+KCk7XG4gIEl0ZW1WYWx1ZS5zZXREYXRhKHJlcywgdmFsIHx8IFtdKTtcbiAgcmV0dXJuIHJlcztcbn07XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiaXRlbXZhbHVlXCIsXG4gIFtcbiAgICBcInZhbHVlXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJ0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGV4dFwiLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcInZpc2libGVJZjpjb25kaXRpb25cIiwgc2hvd01vZGU6IFwiZm9ybVwiIH0sXG4gICAgeyBuYW1lOiBcImVuYWJsZUlmOmNvbmRpdGlvblwiLCBzaG93TW9kZTogXCJmb3JtXCIgfSxcbiAgXSxcbiAgKHZhbHVlOiBhbnkpID0+IG5ldyBJdGVtVmFsdWUodmFsdWUpXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2l0ZW12YWx1ZS50cyIsImV4cG9ydCB2YXIgc3VydmV5Q3NzOiBhbnkgPSB7XG4gIGN1cnJlbnRUeXBlOiBcIlwiLFxuICBnZXRDc3M6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbG9jID0gdGhpcy5jdXJyZW50VHlwZSA/IHRoaXNbdGhpcy5jdXJyZW50VHlwZV0gOiBkZWZhdWx0U3RhbmRhcmRDc3M7XG4gICAgaWYgKCFsb2MpIGxvYyA9IGRlZmF1bHRTdGFuZGFyZENzcztcbiAgICByZXR1cm4gbG9jO1xuICB9LFxufTtcblxuZXhwb3J0IHZhciBkZWZhdWx0U3RhbmRhcmRDc3MgPSB7XG4gIHJvb3Q6IFwic3ZfbWFpbiBzdl9kZWZhdWx0X2Nzc1wiLFxuICBjb250YWluZXI6IFwic3ZfY29udGFpbmVyXCIsXG4gIGhlYWRlcjogXCJzdl9oZWFkZXJcIixcbiAgYm9keTogXCJzdl9ib2R5XCIsXG4gIGJvZHlFbXB0eTogXCJzdl9ib2R5IHN2X2JvZHlfZW1wdHlcIixcbiAgZm9vdGVyOiBcInN2X25hdlwiLFxuICB0aXRsZTogXCJcIixcbiAgZGVzY3JpcHRpb246IFwiXCIsXG4gIGxvZ286IFwic3ZfbG9nb1wiLFxuICBsb2dvSW1hZ2U6IFwic3ZfbG9nb19faW1hZ2VcIixcbiAgaGVhZGVyVGV4dDogXCJzdl9oZWFkZXJfX3RleHRcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJzdl9jb21wbGV0ZWRfcGFnZVwiLFxuICBuYXZpZ2F0aW9uOiB7XG4gICAgY29tcGxldGU6IFwic3ZfY29tcGxldGVfYnRuXCIsXG4gICAgcHJldjogXCJzdl9wcmV2X2J0blwiLFxuICAgIG5leHQ6IFwic3ZfbmV4dF9idG5cIixcbiAgICBzdGFydDogXCJzdl9zdGFydF9idG5cIixcbiAgICBwcmV2aWV3OiBcInN2X3ByZXZpZXdfYnRuXCIsXG4gICAgZWRpdDogXCJzdl9lZGl0X2J0blwiLFxuICB9LFxuICBwcm9ncmVzczogXCJzdl9wcm9ncmVzc1wiLFxuICBwcm9ncmVzc0JhcjogXCJzdl9wcm9ncmVzc19iYXJcIixcbiAgcHJvZ3Jlc3NUZXh0SW5CYXI6IFwic3YtaGlkZGVuXCIsXG4gIHBhZ2U6IHtcbiAgICByb290OiBcInN2X3Bfcm9vdFwiLFxuICAgIHRpdGxlOiBcInN2X3BhZ2VfdGl0bGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJcIixcbiAgfSxcbiAgLy8gVE9ETzogbW92ZSB0byB0aGUgcGFnZSBvYmplY3RcbiAgcGFnZVRpdGxlOiBcInN2X3BhZ2VfdGl0bGVcIixcbiAgcGFnZURlc2NyaXB0aW9uOiBcIlwiLFxuICByb3c6IFwic3Zfcm93XCIsXG4gIHF1ZXN0aW9uOiB7XG4gICAgbWFpblJvb3Q6IFwic3ZfcSBzdl9xc3RuXCIsXG4gICAgZmxvd1Jvb3Q6IFwic3ZfcV9mbG93IHN2X3FzdG5cIixcbiAgICBoZWFkZXI6IFwiXCIsXG4gICAgaGVhZGVyTGVmdDogXCJ0aXRsZS1sZWZ0XCIsXG4gICAgY29udGVudDogXCJcIixcbiAgICBjb250ZW50TGVmdDogXCJjb250ZW50LWxlZnRcIixcbiAgICB0aXRsZUxlZnRSb290OiBcInN2X3FzdG5fbGVmdFwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJzdl9xX3JlcXVpcmVkX3RleHRcIixcbiAgICB0aXRsZTogXCJzdl9xX3RpdGxlXCIsXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwic3ZfcV9kZXNjcmlwdGlvblwiLFxuICAgIGNvbW1lbnQ6IFwiXCIsXG4gICAgcmVxdWlyZWQ6IFwiXCIsXG4gICAgdGl0bGVSZXF1aXJlZDogXCJcIixcbiAgICBoYXNFcnJvcjogXCJcIixcbiAgICBpbmRlbnQ6IDIwLFxuICAgIGZvb3RlcjogXCJzdl9xX2Zvb3RlclwiLFxuICAgIGZvcm1Hcm91cDogXCJmb3JtLWdyb3VwXCIsXG4gICAgYXNDZWxsOiBcInN2X21hdHJpeF9jZWxsXCIsXG4gIH0sXG4gIHBhbmVsOiB7XG4gICAgdGl0bGU6IFwic3ZfcF90aXRsZVwiLFxuICAgIHRpdGxlRXhwYW5kYWJsZTogXCJzdl9wX3RpdGxlX2V4cGFuZGFibGVcIixcbiAgICB0aXRsZU9uRXJyb3I6IFwiXCIsXG4gICAgaWNvbjogXCJzdl9wYW5lbF9pY29uXCIsXG4gICAgaWNvbkV4cGFuZGVkOiBcInN2X2V4cGFuZGVkXCIsXG4gICAgZGVzY3JpcHRpb246IFwic3ZfcF9kZXNjcmlwdGlvblwiLFxuICAgIGNvbnRhaW5lcjogXCJzdl9wX2NvbnRhaW5lclwiLFxuICAgIGZvb3RlcjogXCJzdl9wX2Zvb3RlclwiLFxuICAgIG51bWJlcjogXCJzdl9xX251bVwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJzdl9xX3JlcXVpcmVkX3RleHRcIixcbiAgfSxcbiAgZXJyb3I6IHtcbiAgICByb290OiBcInN2X3FfZXJib3hcIixcbiAgICBpY29uOiBcIlwiLFxuICAgIGl0ZW06IFwiXCIsXG4gICAgbG9jYXRpb25Ub3A6IFwic3ZfcXN0bl9lcnJvcl90b3BcIixcbiAgICBsb2NhdGlvbkJvdHRvbTogXCJzdl9xc3RuX2Vycm9yX2JvdHRvbVwiLFxuICB9LFxuXG4gIGJvb2xlYW46IHtcbiAgICByb290OiBcInN2X3FjYmMgc3ZfcWJsblwiLFxuICAgIGl0ZW06IFwic3YtYm9vbGVhblwiLFxuICAgIGNvbnRyb2w6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1ib29sZWFuLS1jaGVja2VkIGNoZWNrZWRcIixcbiAgICBpdGVtSW5kZXRlcm1pbmF0ZTogXCJzdi1ib29sZWFuLS1pbmRldGVybWluYXRlXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWJvb2xlYW4tLWRpc2FibGVkXCIsXG4gICAgc3dpdGNoOiBcInN2LWJvb2xlYW5fX3N3aXRjaFwiLFxuICAgIHNsaWRlcjogXCJzdi1ib29sZWFuX19zbGlkZXJcIixcbiAgICBsYWJlbDogXCJzdi1ib29sZWFuX19sYWJlbCBcIixcbiAgICBkaXNhYmxlZExhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiLFxuICB9LFxuICBjaGVja2JveDoge1xuICAgIHJvb3Q6IFwic3ZfcWNiYyBzdl9xY2J4XCIsXG4gICAgaXRlbTogXCJzdl9xX2NoZWNrYm94XCIsXG4gICAgaXRlbVNlbGVjdEFsbDogXCJzdl9xX2NoZWNrYm94X3NlbGVjdGFsbFwiLFxuICAgIGl0ZW1Ob25lOiBcInN2X3FfY2hlY2tib3hfbm9uZVwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtSW5saW5lOiBcInN2X3FfY2hlY2tib3hfaW5saW5lXCIsXG4gICAgbGFiZWw6IFwic3ZfcV9jaGVja2JveF9sYWJlbFwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdl9xX2NoZWNrYm94X2NvbnRyb2xfaXRlbVwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXG4gICAgY29udHJvbExhYmVsOiBcInN2X3FfY2hlY2tib3hfY29udHJvbF9sYWJlbFwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcImNoZWNrYm94LW1hdGVyaWFsXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9vdGhlciBzdl9xX2NoZWNrYm94X290aGVyXCIsXG4gICAgY29sdW1uOiBcInN2X3Ffc2VsZWN0X2NvbHVtblwiLFxuICB9LFxuICBjb21tZW50OiBcIlwiLFxuICBkcm9wZG93bjoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgY29udHJvbDogXCJzdl9xX2Ryb3Bkb3duX2NvbnRyb2xcIixcbiAgICBzZWxlY3RXcmFwcGVyOiBcInN2X3NlbGVjdF93cmFwcGVyXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9kZF9vdGhlclwiLFxuICB9LFxuICBodG1sOiB7IHJvb3Q6IFwiXCIgfSxcbiAgaW1hZ2U6IHsgcm9vdDogXCJzdl9xX2ltYWdlXCIsIGltYWdlOiBcInN2X2ltYWdlX2ltYWdlXCIgfSxcbiAgbWF0cml4OiB7XG4gICAgcm9vdDogXCJzdl9xX21hdHJpeFwiLFxuICAgIGxhYmVsOiBcInN2X3FfbV9sYWJlbFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGNlbGxUZXh0OiBcInN2X3FfbV9jZWxsX3RleHRcIixcbiAgICBjZWxsVGV4dFNlbGVjdGVkOiBcInN2X3FfbV9jZWxsX3NlbGVjdGVkXCIsXG4gICAgY2VsbExhYmVsOiBcInN2X3FfbV9jZWxsX2xhYmVsXCIsXG4gIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7IHJvb3Q6IFwic3ZfcV9tYXRyaXhfZHJvcGRvd25cIiwgY2VsbDogXCJzdl9tYXRyaXhfY2VsbFwiIH0sXG4gIG1hdHJpeGR5bmFtaWM6IHtcbiAgICByb290OiBcInN2X3FfbWF0cml4X2R5bmFtaWNcIixcbiAgICBidXR0b246IFwic3ZfbWF0cml4X2R5bmFtaWNfYnV0dG9uXCIsXG4gICAgYnV0dG9uQWRkOiBcIlwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJcIixcbiAgICBpY29uQWRkOiBcIlwiLFxuICAgIGljb25SZW1vdmU6IFwiXCIsXG4gICAgY2VsbDogXCJzdl9tYXRyaXhfY2VsbFwiLFxuICB9LFxuICBwYW5lbGR5bmFtaWM6IHtcbiAgICByb290OiBcInN2X3BhbmVsX2R5bmFtaWNcIixcbiAgICB0aXRsZTogXCJzdl9wX3RpdGxlXCIsXG4gICAgYnV0dG9uOiBcIlwiLFxuICAgIGJ1dHRvbkFkZDogXCJzdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIixcbiAgICBidXR0b25SZW1vdmU6IFwiXCIsXG4gICAgYnV0dG9uUHJldjogXCJzdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuXCIsXG4gICAgYnV0dG9uTmV4dDogXCJzdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuXCIsXG4gICAgcHJvZ3Jlc3NDb250YWluZXI6IFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy1jb250YWluZXJcIixcbiAgICBwcm9ncmVzczogXCJzdi1wcm9ncmVzc1wiLFxuICAgIHByb2dyZXNzQmFyOiBcInN2LXByb2dyZXNzX19iYXJcIixcbiAgICBwcm9ncmVzc1RleHQ6IFwic3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy10ZXh0XCIsXG4gIH0sXG4gIG11bHRpcGxldGV4dDoge1xuICAgIHJvb3Q6IFwic3ZfcV9tdFwiLFxuICAgIGl0ZW1UaXRsZTogXCJzdl9xX210X3RpdGxlXCIsXG4gICAgcm93OiBcInN2X3FfbXRfcm93XCIsXG4gICAgaXRlbVZhbHVlOiBcInN2X3FfbXRfaXRlbV92YWx1ZSBzdl9xX3RleHRfcm9vdFwiLFxuICB9LFxuICByYWRpb2dyb3VwOiB7XG4gICAgcm9vdDogXCJzdl9xY2JjXCIsXG4gICAgaXRlbTogXCJzdl9xX3JhZGlvZ3JvdXBcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbUlubGluZTogXCJzdl9xX3JhZGlvZ3JvdXBfaW5saW5lXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBsYWJlbDogXCJzdl9xX3JhZGlvZ3JvdXBfbGFiZWxcIixcbiAgICBsYWJlbENoZWNrZWQ6IFwiXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwic3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfaXRlbVwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaXJjbGVcIixcbiAgICBvdGhlcjogXCJzdl9xX290aGVyIHN2X3FfcmFkaW9ncm91cF9vdGhlclwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiLFxuICAgIGNvbHVtbjogXCJzdl9xX3NlbGVjdF9jb2x1bW5cIixcbiAgfSxcbiAgaW1hZ2VwaWNrZXI6IHtcbiAgICByb290OiBcInN2X2ltZ3NlbFwiLFxuICAgIGl0ZW06IFwic3ZfcV9pbWdzZWxcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgbGFiZWw6IFwic3ZfcV9pbWdzZWxfbGFiZWxcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdl9xX2ltZ3NlbF9jb250cm9sX2l0ZW1cIixcbiAgICBpbWFnZTogXCJzdl9xX2ltZ3NlbF9pbWFnZVwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIixcbiAgICBpdGVtVGV4dDogXCJzdl9xX2ltZ3NlbF90ZXh0XCIsXG4gICAgY2xlYXJCdXR0b246IFwic3ZfcV9yYWRpb2dyb3VwX2NsZWFyXCIsXG4gIH0sXG4gIHJhdGluZzoge1xuICAgIHJvb3Q6IFwic3ZfcV9yYXRpbmdcIixcbiAgICBpdGVtOiBcInN2X3FfcmF0aW5nX2l0ZW1cIixcbiAgICBzZWxlY3RlZDogXCJhY3RpdmVcIixcbiAgICBtaW5UZXh0OiBcInN2X3FfcmF0aW5nX21pbl90ZXh0XCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9yYXRpbmdfaXRlbV90ZXh0XCIsXG4gICAgbWF4VGV4dDogXCJzdl9xX3JhdGluZ19tYXhfdGV4dFwiLFxuICAgIGRpc2FibGVkOiBcIlwiLFxuICB9LFxuICB0ZXh0OiBcInN2X3FfdGV4dF9yb290XCIsXG4gIGV4cHJlc3Npb246IFwiXCIsXG4gIGZpbGU6IHtcbiAgICByb290OiBcInN2X3FfZmlsZVwiLFxuICAgIHBsYWNlaG9sZGVySW5wdXQ6IFwic3YtdmlzdWFsbHloaWRkZW5cIixcbiAgICBwcmV2aWV3OiBcInN2X3FfZmlsZV9wcmV2aWV3XCIsXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCIsXG4gICAgZmlsZUlucHV0OiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXG4gICAgcmVtb3ZlRmlsZTogXCJzdl9xX2ZpbGVfcmVtb3ZlXCIsXG4gICAgcmVtb3ZlRmlsZVN2ZzogXCJzdi1oaWRkZW5cIixcbiAgICBmaWxlRGVjb3JhdG9yOiBcInN2LWZpbGVfX2RlY29yYXRvclwiLFxuICAgIGZpbGVTaWduQm90dG9tOiBcInN2LWhpZGRlblwiLFxuICAgIHJlbW92ZUJ1dHRvbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcbiAgICBjaG9vc2VGaWxlOiBcInN2X3FfZmlsZV9jaG9vc2VfYnV0dG9uXCIsXG4gICAgbm9GaWxlQ2hvc2VuOiBcInN2X3FfZmlsZV9wbGFjZWhvbGRlclwiLFxuICB9LFxuICBzaWduYXR1cmVwYWQ6IHtcbiAgICByb290OiBcInN2X3Ffc2lnbmF0dXJlcGFkIHNqc19zcF9jb250YWluZXJcIixcbiAgICBjb250cm9sczogXCJzanNfc3BfY29udHJvbHNcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzanNfc3BfY2xlYXJcIixcbiAgfSxcbiAgc2F2ZURhdGE6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHNhdmluZzogXCJcIixcbiAgICBlcnJvcjogXCJcIixcbiAgICBzdWNjZXNzOiBcIlwiLFxuICAgIHNhdmVBZ2FpbkJ1dHRvbjogXCJcIixcbiAgfSxcbiAgd2luZG93OiB7XG4gICAgcm9vdDogXCJzdl93aW5kb3dcIixcbiAgICBib2R5OiBcInN2X3dpbmRvd19jb250ZW50XCIsXG4gICAgaGVhZGVyOiB7XG4gICAgICByb290OiBcInN2X3dpbmRvd190aXRsZVwiLFxuICAgICAgdGl0bGU6IFwiXCIsXG4gICAgICBidXR0b246IFwiXCIsXG4gICAgICBidXR0b25FeHBhbmRlZDogXCJcIixcbiAgICAgIGJ1dHRvbkNvbGxhcHNlZDogXCJcIixcbiAgICB9LFxuICB9LFxufTtcblxuc3VydmV5Q3NzW1wic3RhbmRhcmRcIl0gPSBkZWZhdWx0U3RhbmRhcmRDc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3NzdGFuZGFyZC50cyIsImltcG9ydCB7IEhlbHBlcnMsIEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFByb2Nlc3NWYWx1ZSB7XG4gIHB1YmxpYyB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbDtcbiAgcHVibGljIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbDtcbiAgY29uc3RydWN0b3IoKSB7fVxuICBwdWJsaWMgZ2V0Rmlyc3ROYW1lKHRleHQ6IHN0cmluZywgb2JqOiBhbnkgPSBudWxsKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiB0ZXh0O1xuICAgIHZhciByZXMgPSBcIlwiO1xuICAgIGlmICghIW9iaikge1xuICAgICAgcmVzID0gdGhpcy5nZXRGaXJzdFByb3BlcnR5TmFtZSh0ZXh0LCBvYmopO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaCA9IHRleHRbaV07XG4gICAgICBpZiAoY2ggPT0gXCIuXCIgfHwgY2ggPT0gXCJbXCIpIGJyZWFrO1xuICAgICAgcmVzICs9IGNoO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBoYXNWYWx1ZSh0ZXh0OiBzdHJpbmcsIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZXMpIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlQ29yZSh0ZXh0LCB2YWx1ZXMpO1xuICAgIHJldHVybiByZXMuaGFzVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGwpOiBhbnkge1xuICAgIGlmICghdmFsdWVzKSB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZUNvcmUodGV4dCwgdmFsdWVzKTtcbiAgICByZXR1cm4gcmVzLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShvYmo6IGFueSwgdGV4dDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgdmFyIG5vbk5lc3RlZE9iaiA9IHRoaXMuZ2V0Tm9uTmVzdGVkT2JqZWN0KG9iaiwgdGV4dCwgdHJ1ZSk7XG4gICAgaWYgKCFub25OZXN0ZWRPYmopIHJldHVybjtcbiAgICBvYmogPSBub25OZXN0ZWRPYmoudmFsdWU7XG4gICAgdGV4dCA9IG5vbk5lc3RlZE9iai50ZXh0O1xuICAgIGlmICghIW9iaiAmJiAhIXRleHQpIHtcbiAgICAgIG9ialt0ZXh0XSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWVJbmZvKHZhbHVlSW5mbzogYW55KSB7XG4gICAgaWYgKCEhdmFsdWVJbmZvLnBhdGgpIHtcbiAgICAgIHZhbHVlSW5mby52YWx1ZSA9IHRoaXMuZ2V0VmFsdWVGcm9tUGF0aCh2YWx1ZUluZm8ucGF0aCwgdGhpcy52YWx1ZXMpO1xuICAgICAgdmFsdWVJbmZvLmhhc1ZhbHVlID1cbiAgICAgICAgdmFsdWVJbmZvLnZhbHVlICE9PSBudWxsICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZUluZm8udmFsdWUpO1xuICAgICAgaWYgKFxuICAgICAgICAhdmFsdWVJbmZvLmhhc1ZhbHVlICYmXG4gICAgICAgIHZhbHVlSW5mby5wYXRoLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgdmFsdWVJbmZvLnBhdGhbdmFsdWVJbmZvLnBhdGgubGVuZ3RoIC0gMV0gPT0gXCJsZW5ndGhcIlxuICAgICAgKSB7XG4gICAgICAgIHZhbHVlSW5mby5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICAgIHZhbHVlSW5mby52YWx1ZSA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlQ29yZSh2YWx1ZUluZm8ubmFtZSwgdGhpcy52YWx1ZXMpO1xuICAgIHZhbHVlSW5mby52YWx1ZSA9IHJlcy52YWx1ZTtcbiAgICB2YWx1ZUluZm8uaGFzVmFsdWUgPSByZXMuaGFzVmFsdWU7XG4gICAgdmFsdWVJbmZvLnBhdGggPSByZXMuaGFzVmFsdWUgPyByZXMucGF0aCA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZUZyb21QYXRoKHBhdGg6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sIHZhbHVlczogYW55KTogYW55IHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlICghIXZhbHVlcyAmJiBpbmRleCA8IHBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgaW5kX25hbWUgPSBwYXRoW2luZGV4XTtcbiAgICAgIGlmIChcbiAgICAgICAgSGVscGVycy5pc051bWJlcihpbmRfbmFtZSkgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZXMpICYmXG4gICAgICAgIGluZF9uYW1lID49IHZhbHVlcy5sZW5ndGhcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB2YWx1ZXMgPSB2YWx1ZXNbaW5kX25hbWVdO1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlQ29yZSh0ZXh0OiBzdHJpbmcsIHZhbHVlczogYW55KTogYW55IHtcbiAgICB2YXIgcmVzOiBhbnkgPSB7IGhhc1ZhbHVlOiBmYWxzZSwgdmFsdWU6IG51bGwsIHBhdGg6IG51bGwgfTtcbiAgICB2YXIgY3VyVmFsdWUgPSB2YWx1ZXM7XG4gICAgaWYgKCFjdXJWYWx1ZSAmJiBjdXJWYWx1ZSAhPT0gMCAmJiBjdXJWYWx1ZSAhPT0gZmFsc2UpIHJldHVybiByZXM7XG4gICAgaWYgKFxuICAgICAgdGV4dCAmJlxuICAgICAgdGV4dC5sYXN0SW5kZXhPZihcIi5sZW5ndGhcIikgPiAtMSAmJlxuICAgICAgdGV4dC5sYXN0SW5kZXhPZihcIi5sZW5ndGhcIikgPT09IHRleHQubGVuZ3RoIC0gXCIubGVuZ3RoXCIubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXMudmFsdWUgPSAwO1xuICAgICAgcmVzLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIG5vbk5lc3RlZE9iaiA9IHRoaXMuZ2V0Tm9uTmVzdGVkT2JqZWN0KGN1clZhbHVlLCB0ZXh0LCBmYWxzZSk7XG4gICAgaWYgKCFub25OZXN0ZWRPYmopIHJldHVybiByZXM7XG4gICAgcmVzLnBhdGggPSBub25OZXN0ZWRPYmoucGF0aDtcbiAgICByZXMudmFsdWUgPSAhIW5vbk5lc3RlZE9iai50ZXh0XG4gICAgICA/IHRoaXMuZ2V0T2JqZWN0VmFsdWUobm9uTmVzdGVkT2JqLnZhbHVlLCBub25OZXN0ZWRPYmoudGV4dClcbiAgICAgIDogbm9uTmVzdGVkT2JqLnZhbHVlO1xuICAgIHJlcy5oYXNWYWx1ZSA9ICFIZWxwZXJzLmlzVmFsdWVFbXB0eShyZXMudmFsdWUpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXROb25OZXN0ZWRPYmplY3Qob2JqOiBhbnksIHRleHQ6IHN0cmluZywgY3JlYXRlUGF0aDogYm9vbGVhbik6IGFueSB7XG4gICAgdmFyIGN1ck5hbWUgPSB0aGlzLmdldEZpcnN0UHJvcGVydHlOYW1lKHRleHQsIG9iaiwgY3JlYXRlUGF0aCk7XG4gICAgdmFyIHBhdGggPSAhIWN1ck5hbWUgPyBbY3VyTmFtZV0gOiBudWxsO1xuICAgIHdoaWxlICh0ZXh0ICE9IGN1ck5hbWUgJiYgISFvYmopIHtcbiAgICAgIHZhciBpc0FycmF5ID0gdGV4dFswXSA9PSBcIltcIjtcbiAgICAgIGlmICghaXNBcnJheSkge1xuICAgICAgICBpZiAoIWN1ck5hbWUgJiYgdGV4dCA9PSB0aGlzLmdldEZpcnN0TmFtZSh0ZXh0KSlcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogb2JqLCB0ZXh0OiB0ZXh0LCBwYXRoOiBwYXRoIH07XG4gICAgICAgIG9iaiA9IHRoaXMuZ2V0T2JqZWN0VmFsdWUob2JqLCBjdXJOYW1lKTtcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KG9iaikgJiYgIWNyZWF0ZVBhdGgpIHJldHVybiBudWxsO1xuICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHIoY3VyTmFtZS5sZW5ndGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9iakluQXJyYXkgPSB0aGlzLmdldE9iakluQXJyYXkob2JqLCB0ZXh0KTtcbiAgICAgICAgaWYgKCFvYmpJbkFycmF5KSByZXR1cm4gbnVsbDtcbiAgICAgICAgb2JqID0gb2JqSW5BcnJheS52YWx1ZTtcbiAgICAgICAgdGV4dCA9IG9iakluQXJyYXkudGV4dDtcbiAgICAgICAgcGF0aC5wdXNoKG9iakluQXJyYXkuaW5kZXgpO1xuICAgICAgfVxuICAgICAgaWYgKCEhdGV4dCAmJiB0ZXh0WzBdID09IFwiLlwiKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cigxKTtcbiAgICAgIH1cbiAgICAgIGN1ck5hbWUgPSB0aGlzLmdldEZpcnN0UHJvcGVydHlOYW1lKHRleHQsIG9iaiwgY3JlYXRlUGF0aCk7XG4gICAgICBpZiAoISFjdXJOYW1lKSB7XG4gICAgICAgIHBhdGgucHVzaChjdXJOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWU6IG9iaiwgdGV4dDogdGV4dCwgcGF0aDogcGF0aCB9O1xuICB9XG4gIHByaXZhdGUgZ2V0T2JqSW5BcnJheShjdXJWYWx1ZTogYW55LCB0ZXh0OiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJWYWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHZhciBpbmRleCA9IDE7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgd2hpbGUgKGluZGV4IDwgdGV4dC5sZW5ndGggJiYgdGV4dFtpbmRleF0gIT0gXCJdXCIpIHtcbiAgICAgIHN0ciArPSB0ZXh0W2luZGV4XTtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICAgIHRleHQgPSBpbmRleCA8IHRleHQubGVuZ3RoID8gdGV4dC5zdWJzdHIoaW5kZXggKyAxKSA6IFwiXCI7XG4gICAgaW5kZXggPSB0aGlzLmdldEludFZhbHVlKHN0cik7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBjdXJWYWx1ZS5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IHZhbHVlOiBjdXJWYWx1ZVtpbmRleF0sIHRleHQ6IHRleHQsIGluZGV4OiBpbmRleCB9O1xuICB9XG4gIHByaXZhdGUgZ2V0Rmlyc3RQcm9wZXJ0eU5hbWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9iajogYW55LFxuICAgIGNyZWF0ZVByb3A6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG5hbWU7XG4gICAgaWYgKCFvYmopIG9iaiA9IHt9O1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkobmFtZSkpIHJldHVybiBuYW1lO1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIEEgPSBuYW1lWzBdO1xuICAgIHZhciBhID0gQS50b1VwcGVyQ2FzZSgpO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIHZhciBmaXJzdCA9IGtleVswXTtcbiAgICAgIGlmIChmaXJzdCA9PT0gYSB8fCBmaXJzdCA9PT0gQSkge1xuICAgICAgICB2YXIga2V5TmFtZSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoa2V5TmFtZSA9PSBuYW1lKSByZXR1cm4ga2V5O1xuICAgICAgICBpZiAobmFtZS5sZW5ndGggPD0ga2V5TmFtZS5sZW5ndGgpIGNvbnRpbnVlO1xuICAgICAgICB2YXIgY2ggPSBuYW1lW2tleU5hbWUubGVuZ3RoXTtcbiAgICAgICAgaWYgKGNoICE9IFwiLlwiICYmIGNoICE9IFwiW1wiKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGtleU5hbWUgPT0gbmFtZS5zdWJzdHIoMCwga2V5TmFtZS5sZW5ndGgpKSByZXR1cm4ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY3JlYXRlUHJvcCAmJiBuYW1lWzBdICE9PSBcIltcIikge1xuICAgICAgdmFyIGluZCA9IG5hbWUuaW5kZXhPZihcIi5cIik7XG4gICAgICBpZiAoaW5kID4gLTEpIHtcbiAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDAsIGluZCk7XG4gICAgICAgIG9ialtuYW1lXSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHByaXZhdGUgZ2V0T2JqZWN0VmFsdWUob2JqOiBhbnksIG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gb2JqW25hbWVdO1xuICB9XG4gIHByaXZhdGUgZ2V0SW50VmFsdWUoc3RyOiBhbnkpIHtcbiAgICBpZiAoc3RyID09IFwiMFwiIHx8ICgoc3RyIHwgMCkgPiAwICYmIHN0ciAlIDEgPT0gMCkpIHJldHVybiBOdW1iZXIoc3RyKTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9jb25kaXRpb25Qcm9jZXNzVmFsdWUudHMiLCJpbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElMb2NhbGl6YWJsZU93bmVyIHtcbiAgZ2V0TG9jYWxlKCk6IHN0cmluZztcbiAgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBjbGFzcyByZXByZXNlbnRzIHRoZSBzdHJpbmcgdGhhdCBzdXBwb3J0cyBtdWx0aS1sYW5ndWFnZXMgYW5kIG1hcmtkb3duLlxuICogSXQgdXNlcyBpbiBhbGwgb2JqZWN0cyB3aGVyZSBzdXBwb3J0IGZvciBtdWx0aS1sYW5ndWFnZXMgYW5kIG1hcmtkb3duIGlzIHJlcXVpcmVkLlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxpemFibGVTdHJpbmcge1xuICBwdWJsaWMgc3RhdGljIFNlcmlhbGl6ZUFzT2JqZWN0OiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGRlZmF1bHRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgZGVmYXVsdExvY2FsZSh2YWw6IHN0cmluZykge1xuICAgIHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lID0gdmFsO1xuICB9XG4gIHByaXZhdGUgdmFsdWVzID0ge307XG4gIHByaXZhdGUgaHRtbFZhbHVlcyA9IHt9O1xuICBwcml2YXRlIHJlbmRlcmVkVGV4dDogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBjYWxjdWxhdGVkVGV4dFZhbHVlOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgb25HZXRUZXh0Q2FsbGJhY2s6IChzdHI6IHN0cmluZykgPT4gc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIG9uU3RyQ2hhbmdlZDogKCkgPT4gdm9pZDtcbiAgcHVibGljIHNoYXJlZERhdGE6IExvY2FsaXphYmxlU3RyaW5nO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgb3duZXI6IElMb2NhbGl6YWJsZU93bmVyLFxuICAgIHB1YmxpYyB1c2VNYXJrZG93bjogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMub25DcmVhdGluZygpO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyICYmIHRoaXMub3duZXIuZ2V0TG9jYWxlID8gdGhpcy5vd25lci5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHN0ckNoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMucmVuZGVyZWRUZXh0ID09PSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5jYWxjdWxhdGVkVGV4dFZhbHVlID0gdGhpcy5jYWxUZXh0KCk7XG4gICAgaWYgKHRoaXMucmVuZGVyZWRUZXh0ICE9PSB0aGlzLmNhbGN1bGF0ZWRUZXh0VmFsdWUpIHtcbiAgICAgIHRoaXMucmVuZGVyZWRUZXh0ID0gbnVsbDtcbiAgICAgIHRoaXMuY2FsY3VsYXRlZFRleHRWYWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLm9uQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wdXJlVGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGNhbGN1bGF0ZWRUZXh0KCk6IHN0cmluZyB7XG4gICAgdGhpcy5yZW5kZXJlZFRleHQgPVxuICAgICAgdGhpcy5jYWxjdWxhdGVkVGV4dFZhbHVlICE9PSBudWxsXG4gICAgICAgID8gdGhpcy5jYWxjdWxhdGVkVGV4dFZhbHVlXG4gICAgICAgIDogdGhpcy5jYWxUZXh0KCk7XG4gICAgdGhpcy5jYWxjdWxhdGVkVGV4dFZhbHVlID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFRleHQ7XG4gIH1cbiAgcHJpdmF0ZSBjYWxUZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMucHVyZVRleHQ7XG4gICAgaWYgKFxuICAgICAgcmVzICYmXG4gICAgICB0aGlzLm93bmVyICYmXG4gICAgICB0aGlzLm93bmVyLmdldFByb2Nlc3NlZFRleHQgJiZcbiAgICAgIHJlcy5pbmRleE9mKFwie1wiKSA+IC0xXG4gICAgKSB7XG4gICAgICByZXMgPSB0aGlzLm93bmVyLmdldFByb2Nlc3NlZFRleHQocmVzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub25HZXRUZXh0Q2FsbGJhY2spIHJlcyA9IHRoaXMub25HZXRUZXh0Q2FsbGJhY2socmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgcHVyZVRleHQoKSB7XG4gICAgdmFyIGxvYyA9IHRoaXMubG9jYWxlO1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZShsb2MpO1xuICAgIGlmICghcmVzICYmIGxvYyA9PSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZSkge1xuICAgICAgcmVzID0gdGhpcy5nZXRWYWx1ZShzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZSk7XG4gICAgfVxuICAgIGlmICghcmVzICYmIGxvYyAhPT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpIHtcbiAgICAgIHJlcyA9IHRoaXMuZ2V0VmFsdWUoc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpO1xuICAgIH1cbiAgICBpZiAoIXJlcykgcmVzID0gXCJcIjtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzSHRtbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNIdG1sVmFsdWUoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGh0bWwoKSB7XG4gICAgaWYgKCF0aGlzLmhhc0h0bWwpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiB0aGlzLmdldEh0bWxWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZXNLZXlzKCkubGVuZ3RoID09IDA7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0T3JIdG1sKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0h0bWwgPyB0aGlzLmdldEh0bWxWYWx1ZSgpIDogdGhpcy5jYWxjdWxhdGVkVGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlbmRlcmVkSHRtbCgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0T3JIdG1sO1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGVUZXh0KHRoaXMubG9jYWxlLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldExvY2FsZVRleHQobG9jOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZShsb2MpO1xuICAgIHJldHVybiByZXMgPyByZXMgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzZXRMb2NhbGVUZXh0KGxvYzogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09IHRoaXMuZ2V0TG9jYWxlVGV4dChsb2MpKSByZXR1cm47XG4gICAgaWYgKFxuICAgICAgdmFsdWUgJiZcbiAgICAgIGxvYyAmJlxuICAgICAgbG9jICE9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lICYmXG4gICAgICAhdGhpcy5nZXRWYWx1ZShsb2MpICYmXG4gICAgICB2YWx1ZSA9PSB0aGlzLmdldExvY2FsZVRleHQoc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICBkZWxldGUgKDxhbnk+dGhpcykuaHRtbFZhbHVlc1tsb2NdO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmdldFZhbHVlKGxvYykpIHRoaXMuZGVsZXRlVmFsdWUobG9jKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbG9jICE9IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lICYmXG4gICAgICAgICAgdmFsdWUgPT0gdGhpcy5nZXRMb2NhbGVUZXh0KHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnNldExvY2FsZVRleHQobG9jLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlKGxvYywgdmFsdWUpO1xuICAgICAgICAgIGlmIChsb2MgPT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlVmFsdWVzRXF1YWxzVG9EZWZhdWx0KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdHJDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGhhc05vbkRlZmF1bHRUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHZhciBrZXlzID0gdGhpcy5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09IDApIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4ga2V5cy5sZW5ndGggPiAxIHx8IGtleXNbMF0gIT0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gIH1cbiAgcHVibGljIGdldExvY2FsZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIGtleXMgPSB0aGlzLmdldFZhbHVlc0tleXMoKTtcbiAgICBpZiAoa2V5cy5sZW5ndGggPT0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBrZXlzO1xuICB9XG4gIHB1YmxpYyBnZXRKc29uKCk6IGFueSB7XG4gICAgaWYgKCEhdGhpcy5zaGFyZWREYXRhKSByZXR1cm4gdGhpcy5zaGFyZWREYXRhLmdldEpzb24oKTtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoXG4gICAgICBrZXlzLmxlbmd0aCA9PSAxICYmXG4gICAgICBrZXlzWzBdID09IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lICYmXG4gICAgICAhc2V0dGluZ3Muc2VyaWFsaXplTG9jYWxpemFibGVTdHJpbmdBc09iamVjdFxuICAgIClcbiAgICAgIHJldHVybiAoPGFueT50aGlzKS52YWx1ZXNba2V5c1swXV07XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzO1xuICB9XG4gIHB1YmxpYyBzZXRKc29uKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoISF0aGlzLnNoYXJlZERhdGEpIHtcbiAgICAgIHRoaXMuc2hhcmVkRGF0YS5zZXRKc29uKHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YWx1ZXMgPSB7fTtcbiAgICB0aGlzLmh0bWxWYWx1ZXMgPSB7fTtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5zZXRMb2NhbGVUZXh0KG51bGwsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0TG9jYWxlVGV4dChrZXksIHZhbHVlW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0ckNoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgZXF1YWxzKG9iajogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCEhdGhpcy5zaGFyZWREYXRhKSByZXR1cm4gdGhpcy5zaGFyZWREYXRhLmVxdWFscyhvYmopO1xuICAgIGlmICghb2JqIHx8ICFvYmoudmFsdWVzKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLnZhbHVlcywgb2JqLnZhbHVlcyk7XG4gIH1cbiAgcHVibGljIG9uQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5vblN0ckNoYW5nZWQpIHRoaXMub25TdHJDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcml2YXRlIGhhc0h0bWxWYWx1ZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMub3duZXIgfHwgIXRoaXMudXNlTWFya2Rvd24pIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcmVuZGVyZWRUZXh0ID0gdGhpcy5jYWxjdWxhdGVkVGV4dDtcbiAgICBpZiAoIXJlbmRlcmVkVGV4dCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICBpZiAoIWxvYykgbG9jID0gc2V0dGluZ3MuZGVmYXVsdExvY2FsZU5hbWU7XG4gICAgKDxhbnk+dGhpcykuaHRtbFZhbHVlc1tsb2NdID0gdGhpcy5vd25lci5nZXRNYXJrZG93bkh0bWwocmVuZGVyZWRUZXh0KTtcbiAgICByZXR1cm4gKDxhbnk+dGhpcykuaHRtbFZhbHVlc1tsb2NdID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgZ2V0SHRtbFZhbHVlKCk6IHN0cmluZyB7XG4gICAgdmFyIGxvYyA9IHRoaXMubG9jYWxlO1xuICAgIGlmICghbG9jKSBsb2MgPSBzZXR0aW5ncy5kZWZhdWx0TG9jYWxlTmFtZTtcbiAgICByZXR1cm4gKDxhbnk+dGhpcykuaHRtbFZhbHVlc1tsb2NdO1xuICB9XG4gIHByaXZhdGUgZGVsZXRlVmFsdWVzRXF1YWxzVG9EZWZhdWx0KGRlZmF1bHRWYWx1ZTogc3RyaW5nKSB7XG4gICAgdmFyIGtleXMgPSB0aGlzLmdldFZhbHVlc0tleXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChrZXlzW2ldID09IHNldHRpbmdzLmRlZmF1bHRMb2NhbGVOYW1lKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLmdldFZhbHVlKGtleXNbaV0pID09IGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICB0aGlzLmRlbGV0ZVZhbHVlKGtleXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFZhbHVlKGxvYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnNoYXJlZERhdGEpIHJldHVybiB0aGlzLnNoYXJlZERhdGEuZ2V0VmFsdWUobG9jKTtcbiAgICByZXR1cm4gKDxhbnk+dGhpcykudmFsdWVzW2xvY107XG4gIH1cbiAgcHJpdmF0ZSBzZXRWYWx1ZShsb2M6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGlmICghIXRoaXMuc2hhcmVkRGF0YSkgdGhpcy5zaGFyZWREYXRhLnNldFZhbHVlKGxvYywgdmFsdWUpO1xuICAgIGVsc2UgKDxhbnk+dGhpcykudmFsdWVzW2xvY10gPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIGRlbGV0ZVZhbHVlKGxvYzogc3RyaW5nKSB7XG4gICAgaWYgKCEhdGhpcy5zaGFyZWREYXRhKSB0aGlzLnNoYXJlZERhdGEuZGVsZXRlVmFsdWUobG9jKTtcbiAgICBlbHNlIGRlbGV0ZSAoPGFueT50aGlzKS52YWx1ZXNbbG9jXTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlc0tleXMoKTogc3RyaW5nW10ge1xuICAgIGlmICghIXRoaXMuc2hhcmVkRGF0YSkgcmV0dXJuIHRoaXMuc2hhcmVkRGF0YS5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudmFsdWVzKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphYmxlc3RyaW5nLnRzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCwgU3VydmV5RXJyb3IsIEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25Db21tZW50SXRlbSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25jb21tZW50XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50QmFzZSwgUmVhY3RTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IFN1cnZleUN1c3RvbVdpZGdldCB9IGZyb20gXCIuL2N1c3RvbS13aWRnZXRcIjtcbmltcG9ydCB7IFJlYWN0RWxlbWVudEZhY3RvcnkgfSBmcm9tIFwiLi9lbGVtZW50LWZhY3RvcnlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5Q3JlYXRvciB7XG4gIGNyZWF0ZVF1ZXN0aW9uRWxlbWVudChxdWVzdGlvbjogUXVlc3Rpb24pOiBKU1guRWxlbWVudDtcbiAgcmVuZGVyRXJyb3Ioa2V5OiBzdHJpbmcsIGVycm9yOiBTdXJ2ZXlFcnJvciwgY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQ7XG4gIHF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmc7XG4gIHF1ZXN0aW9uRXJyb3JMb2NhdGlvbigpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbiBleHRlbmRzIFN1cnZleUVsZW1lbnRCYXNlIHtcbiAgcHVibGljIHN0YXRpYyByZW5kZXJRdWVzdGlvbkJvZHkoXG4gICAgY3JlYXRvcjogSVN1cnZleUNyZWF0b3IsXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uXG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXF1ZXN0aW9uLnZpc2libGUpIHJldHVybiBudWxsO1xuICAgIHZhciBjdXN0b21XaWRnZXQgPSBxdWVzdGlvbi5jdXN0b21XaWRnZXQ7XG4gICAgaWYgKCFjdXN0b21XaWRnZXQpIHtcbiAgICAgIHJldHVybiBjcmVhdG9yLmNyZWF0ZVF1ZXN0aW9uRWxlbWVudChxdWVzdGlvbik7XG4gICAgfVxuICAgIHJldHVybiA8U3VydmV5Q3VzdG9tV2lkZ2V0IGNyZWF0b3I9e2NyZWF0b3J9IHF1ZXN0aW9uPXtxdWVzdGlvbn0gLz47XG4gIH1cbiAgcHJpdmF0ZSByb290UmVmOiBSZWFjdC5SZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQ+O1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMucm9vdFJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRTdGF0ZUVsZW1lbnQoKTogQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb247XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZWxlbWVudDtcbiAgfVxuICBwcml2YXRlIGdldCBjcmVhdG9yKCk6IElTdXJ2ZXlDcmVhdG9yIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jcmVhdG9yO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgaWYgKCEhdGhpcy5xdWVzdGlvbikge1xuICAgICAgdGhpcy5xdWVzdGlvbltcInJlYWN0XCJdID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5kb0FmdGVyUmVuZGVyKCk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICBpZiAoISF0aGlzLnF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uW1wicmVhY3RcIl0gPSBudWxsO1xuICAgIH1cbiAgICB2YXIgZWwgPSB0aGlzLnJvb3RSZWYuY3VycmVudDtcbiAgICBpZiAoISFlbCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1yZW5kZXJlZFwiKTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogYW55LCBwcmV2U3RhdGU6IGFueSkge1xuICAgIHN1cGVyLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgdGhpcy5kb0FmdGVyUmVuZGVyKCk7XG4gIH1cbiAgcHJpdmF0ZSBkb0FmdGVyUmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLnJvb3RSZWYuY3VycmVudDtcbiAgICAgIGlmIChlbCAmJiBlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXJlbmRlcmVkXCIpICE9PSBcInJcIikge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXJlbmRlcmVkXCIsIFwiclwiKTtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKFwibmFtZVwiLCB0aGlzLnF1ZXN0aW9uLm5hbWUpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLmFmdGVyUmVuZGVyKGVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNhblJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuY2FuUmVuZGVyKCkgJiZcbiAgICAgICEhdGhpcy5xdWVzdGlvbiAmJlxuICAgICAgISF0aGlzLmNyZWF0b3IgJiZcbiAgICAgIHRoaXMucXVlc3Rpb24uaXNWaXNpYmxlXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRWxlbWVudCgpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbjtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgdmFyIHF1ZXN0aW9uUmVuZGVyID0gdGhpcy5yZW5kZXJRdWVzdGlvbigpO1xuICAgIHZhciBoZWFkZXIgPSB0aGlzLnJlbmRlckhlYWRlcihxdWVzdGlvbik7XG4gICAgdmFyIGhlYWRlclRvcCA9IHF1ZXN0aW9uLmhhc1RpdGxlT25MZWZ0VG9wID8gaGVhZGVyIDogbnVsbDtcbiAgICB2YXIgaGVhZGVyQm90dG9tID0gcXVlc3Rpb24uaGFzVGl0bGVPbkJvdHRvbSA/IGhlYWRlciA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0aW9uVW5kZXJJbnB1dCA9IHF1ZXN0aW9uLmhhc0Rlc2NyaXB0aW9uVW5kZXJJbnB1dFxuICAgICAgPyB0aGlzLnJlbmRlckRlc2NyaXB0aW9uKGNzc0NsYXNzZXMsIHRydWUpXG4gICAgICA6IG51bGw7XG4gICAgbGV0IHF1ZXN0aW9uUm9vdENsYXNzID0gcXVlc3Rpb24uY3NzUm9vdDtcblxuICAgIHZhciBjb21tZW50ID1cbiAgICAgIHF1ZXN0aW9uICYmIHF1ZXN0aW9uLmhhc0NvbW1lbnQgPyB0aGlzLnJlbmRlckNvbW1lbnQoY3NzQ2xhc3NlcykgOiBudWxsO1xuICAgIHZhciBlcnJvcnNUb3AgPVxuICAgICAgdGhpcy5jcmVhdG9yLnF1ZXN0aW9uRXJyb3JMb2NhdGlvbigpID09PSBcInRvcFwiXG4gICAgICAgID8gdGhpcy5yZW5kZXJFcnJvcnMoY3NzQ2xhc3NlcywgXCJ0b3BcIilcbiAgICAgICAgOiBudWxsO1xuICAgIHZhciBlcnJvcnNCb3R0b20gPVxuICAgICAgdGhpcy5jcmVhdG9yLnF1ZXN0aW9uRXJyb3JMb2NhdGlvbigpID09PSBcImJvdHRvbVwiXG4gICAgICAgID8gdGhpcy5yZW5kZXJFcnJvcnMoY3NzQ2xhc3NlcywgXCJib3R0b21cIilcbiAgICAgICAgOiBudWxsO1xuICAgIGxldCByb290U3R5bGU6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGlmIChxdWVzdGlvbi5yZW5kZXJXaWR0aCkge1xuICAgICAgcm9vdFN0eWxlW1wid2lkdGhcIl0gPSBxdWVzdGlvbi5yZW5kZXJXaWR0aDtcbiAgICAgIHJvb3RTdHlsZVtcImZsZXhHcm93XCJdID0gMTtcbiAgICAgIHJvb3RTdHlsZVtcImZsZXhTaHJpbmtcIl0gPSAxO1xuICAgICAgcm9vdFN0eWxlW1wiZmxleEJhc2lzXCJdID0gcXVlc3Rpb24ucmVuZGVyV2lkdGg7XG4gICAgICByb290U3R5bGVbXCJtaW5XaWR0aFwiXSA9IHF1ZXN0aW9uLm1pbldpZHRoO1xuICAgICAgcm9vdFN0eWxlW1wibWF4V2lkdGhcIl0gPSBxdWVzdGlvbi5tYXhXaWR0aDtcbiAgICB9XG4gICAgaWYgKCEhcXVlc3Rpb24ucGFkZGluZ0xlZnQpIHJvb3RTdHlsZVtcInBhZGRpbmdMZWZ0XCJdID0gcXVlc3Rpb24ucGFkZGluZ0xlZnQ7XG4gICAgaWYgKCEhcXVlc3Rpb24ucGFkZGluZ1JpZ2h0KVxuICAgICAgcm9vdFN0eWxlW1wicGFkZGluZ1JpZ2h0XCJdID0gcXVlc3Rpb24ucGFkZGluZ1JpZ2h0O1xuXG4gICAgaWYgKHF1ZXN0aW9uLmlzUmVhZE9ubHkpIHtcbiAgICAgIHF1ZXN0aW9uUm9vdENsYXNzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5kaXNhYmxlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICByZWY9e3RoaXMucm9vdFJlZn1cbiAgICAgICAgaWQ9e3F1ZXN0aW9uLmlkfVxuICAgICAgICBjbGFzc05hbWU9e3F1ZXN0aW9uUm9vdENsYXNzfVxuICAgICAgICBzdHlsZT17cm9vdFN0eWxlfVxuICAgICAgICByb2xlPXtxdWVzdGlvbi5hcmlhUm9sZX1cbiAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PXtxdWVzdGlvbi5oYXNUaXRsZSA/IHF1ZXN0aW9uLmFyaWFUaXRsZUlkIDogbnVsbH1cbiAgICAgID5cbiAgICAgICAge2hlYWRlclRvcH1cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3F1ZXN0aW9uLmNzc0NvbnRlbnR9PlxuICAgICAgICAgIHtlcnJvcnNUb3B9XG4gICAgICAgICAge3F1ZXN0aW9uUmVuZGVyfVxuICAgICAgICAgIHtjb21tZW50fVxuICAgICAgICAgIHtlcnJvcnNCb3R0b219XG4gICAgICAgICAge2Rlc2NyaXB0aW9uVW5kZXJJbnB1dH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHtoZWFkZXJCb3R0b219XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJRdWVzdGlvbigpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIFN1cnZleVF1ZXN0aW9uLnJlbmRlclF1ZXN0aW9uQm9keSh0aGlzLmNyZWF0b3IsIHRoaXMucXVlc3Rpb24pO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJUaXRsZShjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIHNwYW5zID0gdGhpcy5yZW5kZXJUaXRsZVNwYW5zKHRoaXMucXVlc3Rpb24sIGNzc0NsYXNzZXMpO1xuICAgIHJldHVybiAoXG4gICAgICA8aDVcbiAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc1RpdGxlfVxuICAgICAgICBhcmlhLWxhYmVsPXt0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH1cbiAgICAgICAgaWQ9e3RoaXMucXVlc3Rpb24uYXJpYVRpdGxlSWR9XG4gICAgICA+XG4gICAgICAgIHtzcGFuc31cbiAgICAgIDwvaDU+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRGVzY3JpcHRpb24oXG4gICAgY3NzQ2xhc3NlczogYW55LFxuICAgIGlzVW5kZXJJbnB1dDogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgZGVzY3JpcHRpb25UZXh0ID0gU3VydmV5RWxlbWVudEJhc2UucmVuZGVyTG9jU3RyaW5nKFxuICAgICAgdGhpcy5xdWVzdGlvbi5sb2NEZXNjcmlwdGlvblxuICAgICk7XG4gICAgdmFyIGNsYXNzTmFtZSA9IGlzVW5kZXJJbnB1dFxuICAgICAgPyBjc3NDbGFzc2VzLmRlc2NyaXB0aW9uVW5kZXJJbnB1dFxuICAgICAgOiBjc3NDbGFzc2VzLmRlc2NyaXB0aW9uO1xuICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT57ZGVzY3JpcHRpb25UZXh0fTwvZGl2PjtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyQ29tbWVudChjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgLy8gdmFyIGNvbW1lbnRUZXh0ID0gU3VydmV5RWxlbWVudEJhc2UucmVuZGVyTG9jU3RyaW5nKFxuICAgIC8vICAgdGhpcy5xdWVzdGlvbi5sb2NDb21tZW50VGV4dFxuICAgIC8vICk7XG4gICAgdmFyIGNvbW1lbnRUZXh0ID0gdGhpcy5xdWVzdGlvbi5jb21tZW50VGV4dDtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5mb3JtR3JvdXB9PlxuICAgICAgICA8ZGl2Pntjb21tZW50VGV4dH08L2Rpdj5cbiAgICAgICAgPFN1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW1cbiAgICAgICAgICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn1cbiAgICAgICAgICBjc3NDbGFzc2VzPXtjc3NDbGFzc2VzfVxuICAgICAgICAgIG90aGVyQ3NzPXtjc3NDbGFzc2VzLm90aGVyfVxuICAgICAgICAgIGlzRGlzcGxheU1vZGU9e3RoaXMucXVlc3Rpb24uaXNSZWFkT25seX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckhlYWRlcihxdWVzdGlvbjogUXVlc3Rpb24pOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGNzc0NsYXNzZXMgPSBxdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciB0aXRsZSA9IHF1ZXN0aW9uLmhhc1RpdGxlID8gdGhpcy5yZW5kZXJUaXRsZShjc3NDbGFzc2VzKSA6IG51bGw7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gcXVlc3Rpb24uaGFzRGVzY3JpcHRpb25VbmRlclRpdGxlXG4gICAgICA/IHRoaXMucmVuZGVyRGVzY3JpcHRpb24oY3NzQ2xhc3NlcylcbiAgICAgIDogbnVsbDtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e3F1ZXN0aW9uLmNzc0hlYWRlcn0gb25DbGljaz17cXVlc3Rpb24uY2xpY2tUaXRsZUZ1bmN0aW9ufT5cbiAgICAgICAge3RpdGxlfVxuICAgICAgICB7ZGVzY3JpcHRpb259XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFcnJvcnMoY3NzQ2xhc3NlczogYW55LCBsb2NhdGlvbjogc3RyaW5nKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAoXG4gICAgICA8U3VydmV5RWxlbWVudEVycm9yc1xuICAgICAgICBlbGVtZW50PXt0aGlzLnF1ZXN0aW9ufVxuICAgICAgICBjc3NDbGFzc2VzPXtjc3NDbGFzc2VzfVxuICAgICAgICBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9XG4gICAgICAgIGxvY2F0aW9uPXtsb2NhdGlvbn1cbiAgICAgICAgaWQ9e3RoaXMucXVlc3Rpb24uaWQgKyBcIl9lcnJvcnNcIn1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5SZWFjdEVsZW1lbnRGYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyRWxlbWVudChcInF1ZXN0aW9uXCIsIChwcm9wcykgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbiwgcHJvcHMpO1xufSk7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFbGVtZW50RXJyb3JzIGV4dGVuZHMgUmVhY3RTdXJ2ZXlFbGVtZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pZDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGVsZW1lbnQoKTogU3VydmV5RWxlbWVudCB7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLnByb3BzLmVsZW1lbnQ7XG4gICAgcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBTdXJ2ZXlFbGVtZW50ID8gZWxlbWVudCA6IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY3JlYXRvcigpOiBJU3VydmV5Q3JlYXRvciB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY3JlYXRvcjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMubG9jYXRpb247XG4gIH1cbiAgcHJpdmF0ZSBnZXRTdGF0ZShwcmV2U3RhdGU6IGFueSA9IG51bGwpIHtcbiAgICByZXR1cm4gIXByZXZTdGF0ZSA/IHsgZXJyb3I6IDAgfSA6IHsgZXJyb3I6IHByZXZTdGF0ZS5lcnJvciArIDEgfTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVuZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZWxlbWVudCAmJiB0aGlzLmVsZW1lbnQuZXJyb3JzLmxlbmd0aCA+IDA7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudC5lcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBcImVycm9yXCIgKyBpO1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIHRoaXMuY3JlYXRvci5yZW5kZXJFcnJvcihrZXksIHRoaXMuZWxlbWVudC5lcnJvcnNbaV0sIHRoaXMuY3NzQ2xhc3NlcylcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciBjbGFzc2VzID0gdGhpcy5jc3NDbGFzc2VzLmVycm9yLnJvb3Q7XG5cbiAgICBpZiAodGhpcy5sb2NhdGlvbiA9PT0gXCJ0b3BcIikge1xuICAgICAgY2xhc3NlcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5lcnJvci5sb2NhdGlvblRvcDtcbiAgICB9IGVsc2UgaWYgKHRoaXMubG9jYXRpb24gPT09IFwiYm90dG9tXCIpIHtcbiAgICAgIGNsYXNzZXMgKz0gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuZXJyb3IubG9jYXRpb25Cb3R0b207XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCIgY2xhc3NOYW1lPXtjbGFzc2VzfSBpZD17dGhpcy5pZH0+XG4gICAgICAgIHtlcnJvcnN9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkFuZEVycm9yc0NlbGwgZXh0ZW5kcyBSZWFjdFN1cnZleUVsZW1lbnQge1xuICBbaW5kZXg6IHN0cmluZ106IGFueTtcbiAgcHJvdGVjdGVkIGNlbGxSZWY6IFJlYWN0LlJlZk9iamVjdDxIVE1MVGFibGVDZWxsRWxlbWVudD47XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5jZWxsUmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0YXRlRWxlbWVudCgpOiBCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRRdWVzdGlvbigpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgY3JlYXRvcigpOiBJU3VydmV5Q3JlYXRvciB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY3JlYXRvcjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb24oKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnF1ZXN0aW9uO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgdGhpcy5kb0FmdGVyUmVuZGVyKCk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICBpZiAodGhpcy5xdWVzdGlvbikge1xuICAgICAgdmFyIGVsID0gdGhpcy5jZWxsUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoISFlbCkge1xuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLXJlbmRlcmVkXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBhbnksIHByZXZTdGF0ZTogYW55KSB7XG4gICAgc3VwZXIuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKTtcbiAgICB0aGlzLmRvQWZ0ZXJSZW5kZXIoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9BZnRlclJlbmRlcigpIHt9XG4gIHByb3RlY3RlZCBnZXRDZWxsQ2xhc3MoKTogYW55IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVuZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb247XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBlcnJvcnNMb2NhdGlvbiA9IHRoaXMuY3JlYXRvci5xdWVzdGlvbkVycm9yTG9jYXRpb24oKTtcbiAgICB2YXIgZXJyb3JzID0gdGhpcy5nZXRTaG93RXJyb3JzKCkgPyAoXG4gICAgICA8U3VydmV5RWxlbWVudEVycm9yc1xuICAgICAgICBlbGVtZW50PXt0aGlzLnF1ZXN0aW9ufVxuICAgICAgICBjc3NDbGFzc2VzPXt0aGlzLmNzc0NsYXNzZXN9XG4gICAgICAgIGNyZWF0b3I9e3RoaXMuY3JlYXRvcn1cbiAgICAgICAgbG9jYXRpb249e2Vycm9yc0xvY2F0aW9ufVxuICAgICAgLz5cbiAgICApIDogbnVsbDtcbiAgICB2YXIgZXJyb3JzVG9wID0gZXJyb3JzTG9jYXRpb24gPT09IFwidG9wXCIgPyBlcnJvcnMgOiBudWxsO1xuICAgIHZhciBlcnJvcnNCb3R0b20gPSBlcnJvcnNMb2NhdGlvbiA9PT0gXCJib3R0b21cIiA/IGVycm9ycyA6IG51bGw7XG4gICAgdmFyIHJlbmRlcmVkQ2VsbCA9IHRoaXMucmVuZGVyUXVlc3Rpb24oKTtcbiAgICB2YXIgc3R5bGUgPSB0aGlzLmdldENlbGxTdHlsZSgpO1xuICAgIHJldHVybiAoXG4gICAgICA8dGRcbiAgICAgICAgcmVmPXt0aGlzLmNlbGxSZWZ9XG4gICAgICAgIGNsYXNzTmFtZT17dGhpcy5nZXRDZWxsQ2xhc3MoKSArIFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLmNlbGx9XG4gICAgICAgIGhlYWRlcnM9e3RoaXMucXVlc3Rpb24uaXNWaXNpYmxlID8gdGhpcy5nZXRIZWFkZXJUZXh0KCkgOiBcIlwifVxuICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICA+XG4gICAgICAgIHtlcnJvcnNUb3B9XG4gICAgICAgIHtyZW5kZXJlZENlbGx9XG4gICAgICAgIHtlcnJvcnNCb3R0b219XG4gICAgICA8L3RkPlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFNob3dFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uaXNWaXNpYmxlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDZWxsU3R5bGUoKTogYW55IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyUXVlc3Rpb24oKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiBTdXJ2ZXlRdWVzdGlvbi5yZW5kZXJRdWVzdGlvbkJvZHkodGhpcy5jcmVhdG9yLCB0aGlzLnF1ZXN0aW9uKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SGVhZGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXNbXCJjZWxsXCJdID8gdGhpc1tcImNlbGxcIl0uY29sdW1uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCA6IFwiXCI7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgUmVhY3RTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlRdWVzdGlvblVuY29udHJvbGxlZEVsZW1lbnQsXG59IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ29tbWVudE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2NvbW1lbnRcIjtcbmltcG9ydCB7IFJlYWN0UXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uQ29tbWVudCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uVW5jb250cm9sbGVkRWxlbWVudDxcbiAgUXVlc3Rpb25Db21tZW50TW9kZWxcbj4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB2YXIgb25CbHVyID0gIXRoaXMucXVlc3Rpb24uaXNJbnB1dFRleHRVcGRhdGVcbiAgICAgID8gdGhpcy51cGRhdGVWYWx1ZU9uRXZlbnRcbiAgICAgIDogbnVsbDtcbiAgICB2YXIgb25JbnB1dCA9IHRoaXMucXVlc3Rpb24uaXNJbnB1dFRleHRVcGRhdGVcbiAgICAgID8gdGhpcy51cGRhdGVWYWx1ZU9uRXZlbnRcbiAgICAgIDogbnVsbDtcbiAgICB2YXIgcGxhY2VIb2xkZXIgPSB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkgPyBcIlwiIDogdGhpcy5xdWVzdGlvbi5wbGFjZUhvbGRlcjtcbiAgICBpZiAodGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5UmVuZGVyRGl2KCkpIHtcbiAgICAgIHJldHVybiA8ZGl2Pnt0aGlzLnF1ZXN0aW9uLnZhbHVlfTwvZGl2PjtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDx0ZXh0YXJlYVxuICAgICAgICBpZD17dGhpcy5xdWVzdGlvbi5pbnB1dElkfVxuICAgICAgICBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH1cbiAgICAgICAgZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgcmVmPXsodGV0eGFyZWEpID0+ICh0aGlzLmNvbnRyb2wgPSB0ZXR4YXJlYSl9XG4gICAgICAgIG1heExlbmd0aD17dGhpcy5xdWVzdGlvbi5nZXRNYXhMZW5ndGgoKX1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlSG9sZGVyfVxuICAgICAgICBvbkJsdXI9e29uQmx1cn1cbiAgICAgICAgb25JbnB1dD17b25JbnB1dH1cbiAgICAgICAgY29scz17dGhpcy5xdWVzdGlvbi5jb2xzfVxuICAgICAgICByb3dzPXt0aGlzLnF1ZXN0aW9uLnJvd3N9XG4gICAgICAgIGFyaWEtcmVxdWlyZWQ9e3RoaXMucXVlc3Rpb24uaXNSZXF1aXJlZH1cbiAgICAgICAgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9XG4gICAgICAgIGFyaWEtaW52YWxpZD17dGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMH1cbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT17XG4gICAgICAgICAgdGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMCA/IHRoaXMucXVlc3Rpb24uaWQgKyBcIl9lcnJvcnNcIiA6IG51bGxcbiAgICAgICAgfVxuICAgICAgLz5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtIGV4dGVuZHMgUmVhY3RTdXJ2ZXlFbGVtZW50IHtcbiAgcHJvdGVjdGVkIGNhblJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnByb3BzLnF1ZXN0aW9uO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICBsZXQgcXVlc3Rpb24gPSB0aGlzLnByb3BzLnF1ZXN0aW9uO1xuICAgIGxldCBjbGFzc05hbWUgPSB0aGlzLnByb3BzLm90aGVyQ3NzIHx8IHRoaXMuY3NzQ2xhc3Nlcy5jb21tZW50O1xuICAgIGxldCBoYW5kbGVPbkNoYW5nZSA9IChldmVudDogYW55KSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgY29tbWVudDogZXZlbnQudGFyZ2V0LnZhbHVlIH0pO1xuICAgIH07XG4gICAgbGV0IHVwZGF0ZVZhbHVlT25FdmVudCA9IChldmVudDogYW55KSA9PiB7XG4gICAgICBxdWVzdGlvbi5jb21tZW50ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIH07XG4gICAgdmFyIG9uQmx1ciA9ICFxdWVzdGlvbi5pc0lucHV0VGV4dFVwZGF0ZSA/IHVwZGF0ZVZhbHVlT25FdmVudCA6IG51bGw7XG4gICAgdmFyIG9uSW5wdXQgPSBxdWVzdGlvbi5pc0lucHV0VGV4dFVwZGF0ZSA/IHVwZGF0ZVZhbHVlT25FdmVudCA6IG51bGw7XG5cbiAgICBsZXQgY29tbWVudCA9XG4gICAgICAhIXRoaXMuc3RhdGUgJiYgdGhpcy5zdGF0ZS5jb21tZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLnN0YXRlLmNvbW1lbnRcbiAgICAgICAgOiBxdWVzdGlvbi5jb21tZW50IHx8IFwiXCI7XG4gICAgaWYgKHF1ZXN0aW9uLmlzUmVhZE9ubHlSZW5kZXJEaXYoKSkge1xuICAgICAgcmV0dXJuIDxkaXY+e2NvbW1lbnR9PC9kaXY+O1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPHRleHRhcmVhXG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICB2YWx1ZT17Y29tbWVudH1cbiAgICAgICAgZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgbWF4TGVuZ3RoPXtxdWVzdGlvbi5nZXRPdGhlcnNNYXhMZW5ndGgoKX1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3F1ZXN0aW9uLm90aGVyUGxhY2VIb2xkZXJ9XG4gICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVPbkNoYW5nZX1cbiAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgIG9uSW5wdXQ9e29uSW5wdXR9XG4gICAgICAgIGFyaWEtcmVxdWlyZWQ9e3F1ZXN0aW9uLmlzUmVxdWlyZWR9XG4gICAgICAgIGFyaWEtbGFiZWw9e3F1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY29tbWVudFwiLCAocHJvcHMpID0+IHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25Db21tZW50LCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uY29tbWVudC50c3giLCJpbXBvcnQgeyBIYXNoVGFibGUgfSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgUmVhY3RFbGVtZW50RmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IFJlYWN0RWxlbWVudEZhY3RvcnkgPSBuZXcgUmVhY3RFbGVtZW50RmFjdG9yeSgpO1xuICBwcml2YXRlIGNyZWF0b3JIYXNoOiBIYXNoVGFibGU8KG5hbWU6IHN0cmluZykgPT4gSlNYLkVsZW1lbnQ+ID0ge307XG5cbiAgcHVibGljIHJlZ2lzdGVyRWxlbWVudChcbiAgICBlbGVtZW50VHlwZTogc3RyaW5nLFxuICAgIGVsZW1lbnRDcmVhdG9yOiAobmFtZTogc3RyaW5nKSA9PiBKU1guRWxlbWVudFxuICApIHtcbiAgICB0aGlzLmNyZWF0b3JIYXNoW2VsZW1lbnRUeXBlXSA9IGVsZW1lbnRDcmVhdG9yO1xuICB9XG4gIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jcmVhdG9ySGFzaCkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gIH1cbiAgcHVibGljIGlzRWxlbWVudFJlZ2lzZ2VyZWQoZWxlbWVudFR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiAhIXRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVFbGVtZW50KGVsZW1lbnRUeXBlOiBzdHJpbmcsIHBhcmFtczogYW55KTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBjcmVhdG9yID0gdGhpcy5jcmVhdG9ySGFzaFtlbGVtZW50VHlwZV07XG4gICAgaWYgKGNyZWF0b3IgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGNyZWF0b3IocGFyYW1zKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L2VsZW1lbnQtZmFjdG9yeS50c3giLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgQmFzZSwgU3VydmV5RXJyb3IsIElTdXJ2ZXlJbXBsIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBIZWxwZXJzLCBIYXNoVGFibGUgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBPdGhlckVtcHR5RXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgQ2hvaWNlc1Jlc3RmdWxsIH0gZnJvbSBcIi4vY2hvaWNlc1Jlc3RmdWxsXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbi8qKlxuICogSXQgaXMgYSBiYXNlIGNsYXNzIGZvciBjaGVja2JveCwgZHJvcGRvd24gYW5kIHJhZGlvZ3JvdXAgcXVlc3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25TZWxlY3RCYXNlIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBwdWJsaWMgdmlzaWJsZUNob2ljZXNDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgZmlsdGVyZWRDaG9pY2VzVmFsdWU6IEFycmF5PEl0ZW1WYWx1ZT4gPSBudWxsO1xuICBwcml2YXRlIGNvbmRpdGlvbkNob2ljZXNWaXNpYmxlSWZSdW5uZXI6IENvbmRpdGlvblJ1bm5lcjtcbiAgcHJpdmF0ZSBjb25kaXRpb25DaG9pY2VzRW5hYmxlSWZSdW5uZXI6IENvbmRpdGlvblJ1bm5lcjtcbiAgcHJpdmF0ZSBjb21tZW50VmFsdWU6IHN0cmluZztcbiAgcHJpdmF0ZSBwcmV2Q29tbWVudFZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgb3RoZXJJdGVtVmFsdWU6IEl0ZW1WYWx1ZSA9IG5ldyBJdGVtVmFsdWUoXCJvdGhlclwiKTtcbiAgcHJpdmF0ZSBjaG9pY2VzRnJvbVVybDogQXJyYXk8SXRlbVZhbHVlPiA9IG51bGw7XG4gIHByaXZhdGUgY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0czogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBpc0Nob2ljZXNMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBlbmFibGVPbkxvYWRpbmdDaG9pY2VzOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBmaWxsIHRoZSBjaG9pY2VzIGZyb20gYSByZXN0ZnVsIHNlcnZpY2UuXG4gICAqIEBzZWUgY2hvaWNlc1xuICAgKi9cbiAgcHVibGljIGNob2ljZXNCeVVybDogQ2hvaWNlc1Jlc3RmdWxsO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwiY2hvaWNlc1wiKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiY2hvaWNlc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNlbGYuZmlsdGVySXRlbXMoKSkge1xuICAgICAgICBzZWxmLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwiaGlkZUlmQ2hvaWNlc0VtcHR5XCIsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYudXBkYXRlVmlzaWJpbGl0eUJhc2VkT25DaG9pY2VzKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwidmlzaWJsZUNob2ljZXNcIik7XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwgPSB0aGlzLmNyZWF0ZVJlc3RmdWxsKCk7XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwub3duZXIgPSB0aGlzO1xuICAgIHZhciBsb2NPdGhlclRleHQgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJvdGhlckVycm9yVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLm90aGVySXRlbVZhbHVlLmxvY093bmVyID0gdGhpcztcbiAgICB0aGlzLm90aGVySXRlbVZhbHVlLnNldExvY1RleHQobG9jT3RoZXJUZXh0KTtcbiAgICBsb2NPdGhlclRleHQub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJJdGVtVGV4dFwiKTtcbiAgICB9O1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsLmJlZm9yZVNlbmRSZXF1ZXN0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLm9uQmVmb3JlU2VuZFJlcXVlc3QoKTtcbiAgICB9O1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsLmdldFJlc3VsdENhbGxiYWNrID0gZnVuY3Rpb24gKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KSB7XG4gICAgICBzZWxmLm9uTG9hZENob2ljZXNGcm9tVXJsKGl0ZW1zKTtcbiAgICB9O1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsLnVwZGF0ZVJlc3VsdENhbGxiYWNrID0gZnVuY3Rpb24gKFxuICAgICAgaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgICBzZXJ2ZXJSZXN1bHQ6IGFueVxuICAgICk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgICAgaWYgKHNlbGYuc3VydmV5KSB7XG4gICAgICAgIHJldHVybiBzZWxmLnN1cnZleS51cGRhdGVDaG9pY2VzRnJvbVNlcnZlcihzZWxmLCBpdGVtcywgc2VydmVyUmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9O1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJvdGhlclBsYWNlSG9sZGVyXCIsIHRoaXMpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic2VsZWN0YmFzZVwiO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUVycm9yKCkge1xuICAgIHJldHVybiAhdGhpcy5pc090aGVyU2VsZWN0ZWQgfHwgISF0aGlzLmNvbW1lbnQ7XG4gIH1cbiAgaXNMYXlvdXRUeXBlU3VwcG9ydGVkKGxheW91dFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBvdGhlciBpdGVtLiBCeSB1c2luZyB0aGlzIHByb3BlcnR5LCB5b3UgbWF5IGNoYW5nZSBwcm9ncmFtbWF0aWNhbGx5IGl0J3MgdmFsdWUgYW5kIHRleHQuXG4gICAqIEBzZWUgaGFzT3RoZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgb3RoZXJJdGVtKCk6IEl0ZW1WYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJJdGVtVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIHVzZXIgc2VsZWN0IHRoZSAnb3RoZXInIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzT3RoZXJTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNPdGhlciAmJiB0aGlzLmdldEhhc090aGVyKHRoaXMucmVuZGVyZWRWYWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIEl0IHJ1bnMgYWdhaW5zdCBlYWNoIGNob2ljZXMgaXRlbSBhbmQgaWYgZm9yIHRoaXMgaXRlbSBpdCByZXR1cm5zIHRydWUsIHRoZW4gdGhlIGl0ZW0gaXMgdmlzaWJsZSBvdGhlcndpc2UgdGhlIGl0ZW0gYmVjb21lcyBpbnZpc2libGUuIFBsZWFzZSB1c2Uge2l0ZW19IHRvIGdldCB0aGUgY3VycmVudCBpdGVtIHZhbHVlIGluIHRoZSBleHByZXNzaW9uLlxuICAgKiBAc2VlIHZpc2libGVJZlxuICAgKiBAc2VlIGNob2ljZXNFbmFibGVJZlxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzVmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNWaXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzVmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1Zpc2libGVJZlwiLCB2YWwpO1xuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgfVxuICAvKipcbiAgICogQW4gZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgdHJ1ZSBvciBmYWxzZS4gSXQgcnVucyBhZ2FpbnN0IGVhY2ggY2hvaWNlcyBpdGVtIGFuZCBpZiBmb3IgdGhpcyBpdGVtIGl0IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgaXRlbSBpcyBlbmFibGVkIG90aGVyd2lzZSB0aGUgaXRlbSBiZWNvbWVzIGRpc2FibGVkLiBQbGVhc2UgdXNlIHtpdGVtfSB0byBnZXQgdGhlIGN1cnJlbnQgaXRlbSB2YWx1ZSBpbiB0aGUgZXhwcmVzc2lvbi5cbiAgICogQHNlZSBjaG9pY2VzVmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNFbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzRW5hYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzRW5hYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzRW5hYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuSXRlbXNFbmFibGVDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLnJ1bkl0ZW1zQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzVGV4dFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlOyAvL2ZvciBjb21tZW50cyBhbmQgb3RoZXJzXG4gIH1cbiAgcHJpdmF0ZSBpc1NldHRpbmdEZWZhdWx0VmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICB0aGlzLmlzU2V0dGluZ0RlZmF1bHRWYWx1ZSA9XG4gICAgICAhdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpICYmXG4gICAgICB0aGlzLmhhc1Vua25vd25WYWx1ZSh0aGlzLmRlZmF1bHRWYWx1ZSk7XG4gICAgc3VwZXIuc2V0RGVmYXVsdFZhbHVlKCk7XG4gICAgdGhpcy5pc1NldHRpbmdEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXNNdWx0aXBsZVZhbHVlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgY29udmVydERlZmF1bHRWYWx1ZSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbCA9PSB1bmRlZmluZWQpIHJldHVybiB2YWw7XG4gICAgaWYgKHRoaXMuZ2V0SXNNdWx0aXBsZVZhbHVlKCkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gW3ZhbF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgdmFsLmxlbmd0aCA+IDApIHJldHVybiB2YWxbMF07XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIGZpbHRlckl0ZW1zKCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgICF0aGlzLmRhdGEgfHxcbiAgICAgIHRoaXMuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLmdldERhdGFGaWx0ZXJlZFZhbHVlcygpO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgdGhpcy5ydW5JdGVtc0VuYWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHJldHVybiB0aGlzLnJ1bkl0ZW1zQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHJvdGVjdGVkIHJ1bkl0ZW1zQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdGhpcy5zZXRDb25kaXRpb25hbENob2ljZXNSdW5uZXIoKTtcbiAgICB2YXIgaGFzQ2hhbmdlcyA9IHRoaXMucnVuQ29uZGl0aW9uc0Zvckl0ZW1zKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlICYmXG4gICAgICB0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlLmxlbmd0aCA9PT0gdGhpcy5hY3RpdmVDaG9pY2VzLmxlbmd0aFxuICAgICkge1xuICAgICAgdGhpcy5maWx0ZXJlZENob2ljZXNWYWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VzO1xuICB9XG4gIHByb3RlY3RlZCBydW5JdGVtc0VuYWJsZUNvbmRpdGlvbihcbiAgICB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LFxuICAgIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+XG4gICk6IGFueSB7XG4gICAgdGhpcy5zZXRDb25kaXRpb25hbEVuYWJsZUNob2ljZXNSdW5uZXIoKTtcbiAgICB2YXIgaGFzQ2hhbmdlZCA9IEl0ZW1WYWx1ZS5ydW5FbmFibGVkQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgICAgdGhpcy5hY3RpdmVDaG9pY2VzLFxuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzRW5hYmxlSWZSdW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzXG4gICAgKTtcbiAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5jbGVhckRpc2FibGVkVmFsdWVzKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2V0Q29uZGl0aW9uYWxDaG9pY2VzUnVubmVyKCkge1xuICAgIGlmICh0aGlzLmNob2ljZXNWaXNpYmxlSWYpIHtcbiAgICAgIGlmICghdGhpcy5jb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyKSB7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc1Zpc2libGVJZlJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIoXG4gICAgICAgICAgdGhpcy5jaG9pY2VzVmlzaWJsZUlmXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNWaXNpYmxlSWZSdW5uZXIuZXhwcmVzc2lvbiA9IHRoaXMuY2hvaWNlc1Zpc2libGVJZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzVmlzaWJsZUlmUnVubmVyID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZXRDb25kaXRpb25hbEVuYWJsZUNob2ljZXNSdW5uZXIoKSB7XG4gICAgaWYgKHRoaXMuY2hvaWNlc0VuYWJsZUlmKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyKSB7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uQ2hvaWNlc0VuYWJsZUlmUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcihcbiAgICAgICAgICB0aGlzLmNob2ljZXNFbmFibGVJZlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5jb25kaXRpb25DaG9pY2VzRW5hYmxlSWZSdW5uZXIuZXhwcmVzc2lvbiA9IHRoaXMuY2hvaWNlc0VuYWJsZUlmO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmRpdGlvbkNob2ljZXNFbmFibGVJZlJ1bm5lciA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdGhpcy5maWx0ZXJlZENob2ljZXNWYWx1ZSA9IFtdO1xuICAgIHJldHVybiBJdGVtVmFsdWUucnVuQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgICAgdGhpcy5hY3RpdmVDaG9pY2VzLFxuICAgICAgdGhpcy5maWx0ZXJlZENob2ljZXMsXG4gICAgICB0aGlzLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZ1xuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB0aGlzLmNvbmRpdGlvbkNob2ljZXNWaXNpYmxlSWZSdW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgIXRoaXMuc3VydmV5IHx8ICF0aGlzLnN1cnZleS5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmdcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXRIYXNPdGhlcih2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWwgPT09IHRoaXMub3RoZXJJdGVtLnZhbHVlO1xuICB9XG4gIGdldCB2YWxpZGF0ZWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnJlbmRyZWRWYWx1ZVRvRGF0YUNvcmUodGhpcy52YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlc3RmdWxsKCk6IENob2ljZXNSZXN0ZnVsbCB7XG4gICAgcmV0dXJuIG5ldyBDaG9pY2VzUmVzdGZ1bGwoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UXVlc3Rpb25Db21tZW50KCk6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5jb21tZW50VmFsdWUpIHJldHVybiB0aGlzLmNvbW1lbnRWYWx1ZTtcbiAgICBpZiAodGhpcy5oYXNDb21tZW50IHx8IHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSlcbiAgICAgIHJldHVybiBzdXBlci5nZXRRdWVzdGlvbkNvbW1lbnQoKTtcbiAgICByZXR1cm4gdGhpcy5jb21tZW50VmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc1NldHRpbmdDb21tZW50OiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvbkNvbW1lbnQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmhhc0NvbW1lbnQgfHwgdGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKVxuICAgICAgc3VwZXIuc2V0UXVlc3Rpb25Db21tZW50KG5ld1ZhbHVlKTtcbiAgICBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5pc1NldHRpbmdDb21tZW50ICYmIG5ld1ZhbHVlICE9IHRoaXMuY29tbWVudFZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXNTZXR0aW5nQ29tbWVudCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29tbWVudFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmlzT3RoZXJTZWxlY3RlZCAmJiAhdGhpcy5pc1JlbmRlcmVkVmFsdWVTZXR0aW5nKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucmVuZHJlZFZhbHVlVG9EYXRhKHRoaXMucmVuZGVyZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1NldHRpbmdDb21tZW50ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJlZFZhbHVlXCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVuZGVyZWRWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcmVkVmFsdWVcIiwgdmFsKTtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5yZW5kcmVkVmFsdWVUb0RhdGEodmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZTogYW55LCB1cGRhdGVJc0Fuc3dlcmVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgIEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLnZhbHVlLCBuZXdWYWx1ZSlcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSwgdXBkYXRlSXNBbnN3ZXJlZCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRWYWx1ZVwiLCB0aGlzLnJlbmRyZWRWYWx1ZUZyb21EYXRhKG5ld1ZhbHVlKSk7XG4gICAgaWYgKHRoaXMuaGFzQ29tbWVudCkgcmV0dXJuO1xuICAgIHZhciBpc090aGVyU2VsID0gdGhpcy5pc090aGVyU2VsZWN0ZWQ7XG4gICAgaWYgKGlzT3RoZXJTZWwgJiYgISF0aGlzLnByZXZDb21tZW50VmFsdWUpIHtcbiAgICAgIHZhciBvbGRDb21tZW50ID0gdGhpcy5wcmV2Q29tbWVudFZhbHVlO1xuICAgICAgdGhpcy5wcmV2Q29tbWVudFZhbHVlID0gXCJcIjtcbiAgICAgIHRoaXMuY29tbWVudCA9IG9sZENvbW1lbnQ7XG4gICAgfVxuICAgIGlmICghaXNPdGhlclNlbCAmJiAhIXRoaXMuY29tbWVudCkge1xuICAgICAgaWYgKHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSkge1xuICAgICAgICB0aGlzLnByZXZDb21tZW50VmFsdWUgPSB0aGlzLmNvbW1lbnQ7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbW1lbnQgPSBcIlwiO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIG5ld1ZhbHVlID0gdGhpcy52YWx1ZUZyb21EYXRhKG5ld1ZhbHVlKTtcbiAgICBpZiAoXG4gICAgICAoIXRoaXMuY2hvaWNlc0J5VXJsLmlzUnVubmluZyAmJlxuICAgICAgICAhdGhpcy5jaG9pY2VzQnlVcmwuaXNXYWl0aW5nRm9yUGFyYW1ldGVycykgfHxcbiAgICAgICF0aGlzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICBzdXBlci5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGxldCBjaG9pY2VpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMuYWN0aXZlQ2hvaWNlcywgdmFsKTtcbiAgICBpZiAoISFjaG9pY2VpdGVtKSB7XG4gICAgICByZXR1cm4gY2hvaWNlaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnZhbHVlRnJvbURhdGEodmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZHJlZFZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZWRWYWx1ZUZyb21EYXRhQ29yZSh2YWwpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kcmVkVmFsdWVUb0RhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkpIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHRoaXMucmVuZHJlZFZhbHVlVG9EYXRhQ29yZSh2YWwpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJlZFZhbHVlRnJvbURhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoIXRoaXMuaGFzVW5rbm93blZhbHVlKHZhbCwgdHJ1ZSkpIHJldHVybiB0aGlzLnZhbHVlRnJvbURhdGEodmFsKTtcbiAgICB0aGlzLmNvbW1lbnQgPSB2YWw7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJJdGVtLnZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kcmVkVmFsdWVUb0RhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlICYmIHRoaXMuZ2V0UXVlc3Rpb25Db21tZW50KCkpIHtcbiAgICAgIHZhbCA9IHRoaXMuZ2V0UXVlc3Rpb25Db21tZW50KCk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc1Vua25vd25WYWx1ZSh2YWw6IGFueSwgaW5jbHVkZU90aGVyOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmNsdWRlT3RoZXIgJiYgdmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLmZpbHRlcmVkQ2hvaWNlcywgdmFsKSA9PSBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBpc1ZhbHVlRGlzYWJsZWQodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICB2YXIgaXRlbVZhbHVlID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMuZmlsdGVyZWRDaG9pY2VzLCB2YWwpO1xuICAgIHJldHVybiAhIWl0ZW1WYWx1ZSAmJiAhaXRlbVZhbHVlLmlzRW5hYmxlZDtcbiAgfVxuICAvKipcbiAgICogSWYgdGhlIGNsZWFySW5jb3JyZWN0VmFsdWVzQ2FsbGJhY2sgaXMgc2V0LCBpdCBpcyB1c2VkIHRvIGNsZWFyIGluY29ycmVjdCB2YWx1ZXMgaW5zdGVhZCBvZiBkZWZhdWx0IGJlaGF2aW91ci5cbiAgICovXG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlc0NhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgaXRlbXMuIEV2ZXJ5IGl0ZW0gaGFzIHZhbHVlIGFuZCB0ZXh0LiBJZiB0ZXh0IGlzIGVtcHR5LCB0aGUgdmFsdWUgaXMgcmVuZGVyZWQuIFRoZSBpdGVtIHRleHQgc3VwcG9ydHMgbWFya2Rvd24uXG4gICAqIEBzZWUgY2hvaWNlc0J5VXJsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1wiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUgdG8gaGlkZSB0aGUgcXVlc3Rpb24gaWYgdGhlcmUgaXMgbm8gdmlzaWJsZSBjaG9pY2VzLlxuICAgKi9cbiAgcHVibGljIGdldCBoaWRlSWZDaG9pY2VzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhpZGVJZkNob2ljZXNFbXB0eVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoaWRlSWZDaG9pY2VzRW1wdHkodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZUlmQ2hvaWNlc0VtcHR5XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBrZWVwSW5jb3JyZWN0VmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJrZWVwSW5jb3JyZWN0VmFsdWVzXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGtlZXBJbmNvcnJlY3RWYWx1ZXModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwia2VlcEluY29ycmVjdFZhbHVlc1wiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsZWFzZSB1c2Ugc3VydmV5LnN0b3JlT3RoZXJzQXNDb21tZW50IHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb24gdGhlIHN1cnZleSBsZXZlbC4gVGhpcyBwcm9wZXJ0eSBpcyBkZXByaWNhdGVkIGFuZCBpbnZpc2libGUgaW4gU3VydmV5IENyZWF0b3IuXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGVudGVyZWQgdGV4dCBpbiB0aGUgb3RoZXJzIGlucHV0IGluIHRoZSBjaGVja2JveC9yYWRpb2dyb3VwL2Ryb3Bkb3duIGFyZSBzdG9yZWQgYXMgXCJxdWVzdGlvbiBuYW1lIFwiICsgXCItQ29tbWVudFwiLiBUaGUgdmFsdWUgaXRzZWxmIGlzIFwicXVlc3Rpb24gbmFtZVwiOiBcIm90aGVyc1wiLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gc3RvcmUgdGhlIGVudGVyZWQgdGV4dCBkaXJlY3RseSBpbiB0aGUgXCJxdWVzdGlvbiBuYW1lXCIga2V5LlxuICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBcImRlZmF1bHRcIiwgdHJ1ZSwgZmFsc2VcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5zdG9yZU90aGVyc0FzQ29tbWVudFxuICAgKi9cbiAgcHVibGljIGdldCBzdG9yZU90aGVyc0FzQ29tbWVudCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCBcImRlZmF1bHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBzdG9yZU90aGVyc0FzQ29tbWVudCh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpIHtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHJlbmRlciBpdGVtcyBpbiBhIHNwZWNpZmljIG9yZGVyOiBcImFzY1wiLCBcImRlc2NcIiwgXCJyYW5kb21cIi4gRGVmYXVsdCB2YWx1ZSBpcyBcIm5vbmVcIi5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc09yZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNPcmRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNPcmRlcih2YWw6IHN0cmluZykge1xuICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWwgPT0gdGhpcy5jaG9pY2VzT3JkZXIpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzT3JkZXJcIiwgdmFsKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgZGlmZmVyZW50IHRleHQgZm9yIG90aGVyIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3RoZXJUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJJdGVtVGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBvdGhlclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyVGV4dFwiLCB2YWwpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgfVxuICBnZXQgbG9jT3RoZXJUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgcGxhY2UgaG9sZGVyIHRleHQgZm9yIG90aGVyIG9yIGNvbW1lbnQgZmllbGQgIC5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3RoZXJQbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyUGxhY2VIb2xkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBvdGhlclBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvdGhlclBsYWNlSG9sZGVyXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY090aGVyUGxhY2VIb2xkZXIoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJQbGFjZUhvbGRlclwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRleHQgdGhhdCBzaG93cyB3aGVuIHRoZSBvdGhlciBpdGVtIGlzIGNob29zZWQgYnkgdGhlIG90aGVyIGlucHV0IGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBvdGhlckVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3RoZXJFcnJvclRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlclJlcXVpcmVkRXJyb3JcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgb3RoZXJFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyRXJyb3JUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY090aGVyRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyRXJyb3JUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBpdGVtcyBhcyB0aGV5IHdpbGwgYmUgcmVuZGVyZWQuIElmIG5lZWRlZCBpdGVtcyBhcmUgc29ydGVkIGFuZCB0aGUgb3RoZXIgaXRlbSBpcyBhZGRlZC5cbiAgICogQHNlZSBoYXNPdGhlclxuICAgKiBAc2VlIGNob2ljZXNPcmRlclxuICAgKiBAc2VlIGVuYWJsZWRDaG9pY2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlQ2hvaWNlc1wiLCBbXSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGVuYWJsZWQgaXRlbXMgYXMgdGhleSB3aWxsIGJlIHJlbmRlcmVkLiBUaGUgZGlzYWJsZWQgaXRlbXMgYXJlIG5vdCBpbmNsdWRlZFxuICAgKiBAc2VlIGhhc090aGVyXG4gICAqIEBzZWUgY2hvaWNlc09yZGVyXG4gICAqIEBzZWUgdmlzaWJsZUNob2ljZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgZW5hYmxlZENob2ljZXMoKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBpdGVtcyA9IHRoaXMudmlzaWJsZUNob2ljZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGl0ZW1zW2ldLmlzRW5hYmxlZCkgcmVzLnB1c2goaXRlbXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVWaXNpYmxlQ2hvaWNlcygpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZSA9IG5ldyBBcnJheTxJdGVtVmFsdWU+KCk7XG4gICAgdmFyIGNhbGNWYWx1ZSA9IHRoaXMuY2FsY1Zpc2libGVDaG9pY2VzKCk7XG4gICAgaWYgKCFjYWxjVmFsdWUpIGNhbGNWYWx1ZSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsY1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuZXdWYWx1ZS5wdXNoKGNhbGNWYWx1ZVtpXSk7XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVDaG9pY2VzXCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNhbGNWaXNpYmxlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICBpZiAodGhpcy5jYW5Vc2VGaWx0ZXJlZENob2ljZXMoKSkgcmV0dXJuIHRoaXMuZmlsdGVyZWRDaG9pY2VzO1xuICAgIHZhciByZXMgPSB0aGlzLnNvcnRWaXNpYmxlQ2hvaWNlcyh0aGlzLmZpbHRlcmVkQ2hvaWNlcy5zbGljZSgpKTtcbiAgICB0aGlzLmFkZFRvVmlzaWJsZUNob2ljZXMocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBjYW5Vc2VGaWx0ZXJlZENob2ljZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmhhc090aGVyICYmIHRoaXMuY2hvaWNlc09yZGVyID09IFwibm9uZVwiO1xuICB9XG4gIHByb3RlY3RlZCBhZGRUb1Zpc2libGVDaG9pY2VzKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KSB7XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIHtcbiAgICAgIGl0ZW1zLnB1c2godGhpcy5vdGhlckl0ZW0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0UGxhaW5EYXRhKFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGluY2x1ZGVFbXB0eT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlUXVlc3Rpb25UeXBlcz86IGJvb2xlYW47XG4gICAgICBjYWxjdWxhdGlvbnM/OiBBcnJheTx7XG4gICAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgfSA9IHtcbiAgICAgIGluY2x1ZGVFbXB0eTogdHJ1ZSxcbiAgICAgIGluY2x1ZGVRdWVzdGlvblR5cGVzOiBmYWxzZSxcbiAgICB9XG4gICkge1xuICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IHN1cGVyLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICBpZiAoISFxdWVzdGlvblBsYWluRGF0YSkge1xuICAgICAgdmFyIHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgPyB0aGlzLnZhbHVlIDogW3RoaXMudmFsdWVdO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuaXNOb2RlID0gdHJ1ZTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmRhdGEgPSAocXVlc3Rpb25QbGFpbkRhdGEuZGF0YSB8fCBbXSkuY29uY2F0KFxuICAgICAgICB2YWx1ZXMubWFwKChkYXRhVmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgdmFyIGNob2ljZSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCBkYXRhVmFsdWUpO1xuICAgICAgICAgIHZhciBjaG9pY2VEYXRhSXRlbSA9IDxhbnk+e1xuICAgICAgICAgICAgbmFtZTogaW5kZXgsXG4gICAgICAgICAgICB0aXRsZTogXCJDaG9pY2VcIixcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhVmFsdWUsXG4gICAgICAgICAgICBkaXNwbGF5VmFsdWU6IHRoaXMuZ2V0Q2hvaWNlc0Rpc3BsYXlWYWx1ZShcbiAgICAgICAgICAgICAgdGhpcy52aXNpYmxlQ2hvaWNlcyxcbiAgICAgICAgICAgICAgZGF0YVZhbHVlXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeSh2YWwpIDogdmFsLFxuICAgICAgICAgICAgaXNOb2RlOiBmYWxzZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICghIWNob2ljZSkge1xuICAgICAgICAgICAgKG9wdGlvbnMuY2FsY3VsYXRpb25zIHx8IFtdKS5mb3JFYWNoKChjYWxjdWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgICBjaG9pY2VEYXRhSXRlbVtjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVdID1cbiAgICAgICAgICAgICAgICBjaG9pY2VbY2FsY3VsYXRpb24ucHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5pc090aGVyU2VsZWN0ZWQgJiYgdGhpcy5vdGhlckl0ZW1WYWx1ZSA9PT0gY2hvaWNlKSB7XG4gICAgICAgICAgICBjaG9pY2VEYXRhSXRlbS5pc090aGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGNob2ljZURhdGFJdGVtLmRpc3BsYXlWYWx1ZSA9IHRoaXMuY29tbWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNob2ljZURhdGFJdGVtO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBjdXJyZW50IHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgbnVsbCB0aGVuIHJldHVybnMgZW1wdHkgc3RyaW5nLiBJZiAnb3RoZXInIGlzIHNlbGVjdGVkIHRoZW4gcmV0dXJucyB0aGUgdGV4dCBmb3Igb3RoZXIgdmFsdWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDaG9pY2VzRGlzcGxheVZhbHVlKHRoaXMudmlzaWJsZUNob2ljZXMsIHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q2hvaWNlc0Rpc3BsYXlWYWx1ZShpdGVtczogSXRlbVZhbHVlW10sIHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodmFsID09IHRoaXMub3RoZXJJdGVtVmFsdWUudmFsdWUpXG4gICAgICByZXR1cm4gdGhpcy5jb21tZW50ID8gdGhpcy5jb21tZW50IDogdGhpcy5sb2NPdGhlclRleHQudGV4dE9ySHRtbDtcbiAgICB2YXIgc3RyID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKGl0ZW1zLCB2YWwpO1xuICAgIHJldHVybiBzdHIgPT0gXCJcIiAmJiB2YWwgPyB2YWwgOiBzdHI7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgZmlsdGVyZWRDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkQ2hvaWNlc1ZhbHVlXG4gICAgICA/IHRoaXMuZmlsdGVyZWRDaG9pY2VzVmFsdWVcbiAgICAgIDogdGhpcy5hY3RpdmVDaG9pY2VzO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgYWN0aXZlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5jaG9pY2VzRnJvbVVybCA/IHRoaXMuY2hvaWNlc0Zyb21VcmwgOiB0aGlzLmdldENob2ljZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5jaG9pY2VzO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0Q29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydE90aGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKFxuICAgIGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+LFxuICAgIGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMsIGlzT25WYWx1ZUNoYW5nZWQpO1xuICAgIGlmICghdGhpcy5oYXNPdGhlciB8fCAhdGhpcy5pc090aGVyU2VsZWN0ZWQgfHwgdGhpcy5jb21tZW50KSByZXR1cm47XG4gICAgZXJyb3JzLnB1c2gobmV3IE90aGVyRW1wdHlFcnJvcih0aGlzLm90aGVyRXJyb3JUZXh0LCB0aGlzKSk7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgdGhpcy5ydW5DaG9pY2VzQnlVcmwoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSB7XG4gICAgaWYgKHRoaXMuaXNTZXR0aW5nRGVmYXVsdFZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RvcmVPdGhlcnNBc0NvbW1lbnQgPT09IHRydWUgfHxcbiAgICAgICh0aGlzLnN0b3JlT3RoZXJzQXNDb21tZW50ID09IFwiZGVmYXVsdFwiICYmXG4gICAgICAgICh0aGlzLnN1cnZleSAhPSBudWxsID8gdGhpcy5zdXJ2ZXkuc3RvcmVPdGhlcnNBc0NvbW1lbnQgOiB0cnVlKSkgfHxcbiAgICAgICghdGhpcy5jaG9pY2VzQnlVcmwuaXNFbXB0eSAmJiAhdGhpcy5jaG9pY2VzRnJvbVVybClcbiAgICApO1xuICB9XG4gIG9uU3VydmV5TG9hZCgpIHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICB0aGlzLnJ1bkNob2ljZXNCeVVybCgpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgfVxuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlci5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICBpZiAobmFtZSAhPSB0aGlzLmdldFZhbHVlTmFtZSgpKSB7XG4gICAgICB0aGlzLnJ1bkNob2ljZXNCeVVybCgpO1xuICAgIH1cbiAgfVxuICB1cGRhdGVWYWx1ZUZyb21TdXJ2ZXkobmV3VmFsdWU6IGFueSkge1xuICAgIHZhciBuZXdDb21tZW50ID0gXCJcIjtcbiAgICBpZiAoXG4gICAgICB0aGlzLmhhc090aGVyICYmXG4gICAgICB0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkgJiZcbiAgICAgIHRoaXMuaGFzVW5rbm93blZhbHVlKG5ld1ZhbHVlKSAmJlxuICAgICAgIXRoaXMuZ2V0SGFzT3RoZXIobmV3VmFsdWUpXG4gICAgKSB7XG4gICAgICBuZXdDb21tZW50ID0gdGhpcy5nZXRDb21tZW50RnJvbVZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy5zZXRPdGhlclZhbHVlSW50b1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgc3VwZXIudXBkYXRlVmFsdWVGcm9tU3VydmV5KG5ld1ZhbHVlKTtcbiAgICBpZiAoISFuZXdDb21tZW50KSB7XG4gICAgICB0aGlzLnNldE5ld0NvbW1lbnQobmV3Q29tbWVudCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRDb21tZW50RnJvbVZhbHVlKG5ld1ZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0T3RoZXJWYWx1ZUludG9WYWx1ZShuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5vdGhlckl0ZW0udmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc1J1bm5pbmdDaG9pY2VzOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcnVuQ2hvaWNlc0J5VXJsKCkge1xuICAgIGlmICghdGhpcy5jaG9pY2VzQnlVcmwgfHwgdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCB0aGlzLmlzUnVubmluZ0Nob2ljZXMpXG4gICAgICByZXR1cm47XG4gICAgdmFyIHByb2Nlc3NvciA9IHRoaXMuc3VydmV5SW1wbFxuICAgICAgPyB0aGlzLnN1cnZleUltcGwuZ2V0VGV4dFByb2Nlc3NvcigpXG4gICAgICA6IHRoaXMudGV4dFByb2Nlc3NvcjtcbiAgICBpZiAoIXByb2Nlc3NvcikgcHJvY2Vzc29yID0gdGhpcy5zdXJ2ZXk7XG4gICAgaWYgKCFwcm9jZXNzb3IpIHJldHVybjtcbiAgICB0aGlzLmlzUmVhZHlWYWx1ZSA9IHRoaXMuaXNDaG9pY2VzTG9hZGVkIHx8IHRoaXMuY2hvaWNlc0J5VXJsLmlzRW1wdHk7XG4gICAgdGhpcy5pc1J1bm5pbmdDaG9pY2VzID0gdHJ1ZTtcbiAgICB0aGlzLmNob2ljZXNCeVVybC5ydW4ocHJvY2Vzc29yKTtcbiAgICB0aGlzLmlzUnVubmluZ0Nob2ljZXMgPSBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGlzRmlyc3RMb2FkQ2hvaWNlc0Zyb21VcmwgPSB0cnVlO1xuICBwcm90ZWN0ZWQgb25CZWZvcmVTZW5kUmVxdWVzdCgpIHtcbiAgICBpZiAoc2V0dGluZ3MuZGlzYWJsZU9uR2V0dGluZ0Nob2ljZXNGcm9tV2ViID09PSB0cnVlICYmICF0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHRoaXMuZW5hYmxlT25Mb2FkaW5nQ2hvaWNlcyA9IHRydWU7XG4gICAgICB0aGlzLnJlYWRPbmx5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9hZENob2ljZXNGcm9tVXJsKGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KSB7XG4gICAgaWYgKHRoaXMuZW5hYmxlT25Mb2FkaW5nQ2hvaWNlcykge1xuICAgICAgdGhpcy5yZWFkT25seSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNSZWFkT25seSkge1xuICAgICAgdmFyIGVycm9ycyA9IFtdO1xuICAgICAgaWYgKHRoaXMuY2hvaWNlc0J5VXJsICYmIHRoaXMuY2hvaWNlc0J5VXJsLmVycm9yKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHRoaXMuY2hvaWNlc0J5VXJsLmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIH1cbiAgICB2YXIgbmV3Q2hvaWNlcyA9IG51bGw7XG4gICAgdmFyIGNoZWNrQ2FjaGVkVmFsdWVzT25FeGlzdGluZyA9IHRydWU7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0ZpcnN0TG9hZENob2ljZXNGcm9tVXJsICYmXG4gICAgICAhdGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzICYmXG4gICAgICB0aGlzLmRlZmF1bHRWYWx1ZVxuICAgICkge1xuICAgICAgdGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgICBjaGVja0NhY2hlZFZhbHVlc09uRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cykpIHtcbiAgICAgIHRoaXMuY2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyA9IHRoaXMudmFsdWU7XG4gICAgfVxuICAgIHRoaXMuaXNGaXJzdExvYWRDaG9pY2VzRnJvbVVybCA9IGZhbHNlO1xuICAgIHZhciBjYWNoZWRWYWx1ZXMgPSB0aGlzLmNyZWF0ZUNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMoXG4gICAgICB0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMsXG4gICAgICBjaGVja0NhY2hlZFZhbHVlc09uRXhpc3RpbmdcbiAgICApO1xuICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdDaG9pY2VzID0gbmV3IEFycmF5PEl0ZW1WYWx1ZT4oKTtcbiAgICAgIEl0ZW1WYWx1ZS5zZXREYXRhKG5ld0Nob2ljZXMsIGFycmF5KTtcbiAgICB9XG4gICAgdGhpcy5jaG9pY2VzRnJvbVVybCA9IG5ld0Nob2ljZXM7XG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgICBpZiAobmV3Q2hvaWNlcykge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy51cGRhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKFxuICAgICAgICBjYWNoZWRWYWx1ZXMsXG4gICAgICAgIG5ld0Nob2ljZXNcbiAgICAgICk7XG4gICAgICBpZiAoISFuZXdWYWx1ZSAmJiAhdGhpcy5pc1JlYWRPbmx5KSB7XG4gICAgICAgIHZhciBoYXNDaGFuZ2VkID0gIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh0aGlzLnZhbHVlLCBuZXdWYWx1ZS52YWx1ZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZS52YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubG9jTm90aWZpY2F0aW9uSW5EYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLmxvY05vdGlmaWNhdGlvbkluRGF0YSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkID0gaGFzQ2hhbmdlZDtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWUudmFsdWU7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5hbGxvd05vdGlmeVZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaG9pY2VzTG9hZGVkKCk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKFxuICAgIHZhbDogYW55LFxuICAgIGNoZWNrT25FeGlzdGluZzogYm9vbGVhblxuICApOiBhbnkge1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICB2YXIgcmVzID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXMucHVzaCh0aGlzLmNyZWF0ZUNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHModmFsW2ldLCB0cnVlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICB2YXIgaXNFeGlzdHMgPSBjaGVja09uRXhpc3RpbmcgPyAhdGhpcy5oYXNVbmtub3duVmFsdWUodmFsKSA6IHRydWU7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHZhbCwgaXNFeGlzdHM6IGlzRXhpc3RzIH07XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVDYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzKFxuICAgIHZhbDogYW55LFxuICAgIG5ld0Nob2ljZXM6IEFycmF5PEl0ZW1WYWx1ZT5cbiAgKTogYW55IHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdmFyIHJlcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHVwZGF0ZWRWYWx1ZSA9IHRoaXMudXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhcbiAgICAgICAgICB2YWxbaV0sXG4gICAgICAgICAgbmV3Q2hvaWNlc1xuICAgICAgICApO1xuICAgICAgICBpZiAodXBkYXRlZFZhbHVlICYmICF0aGlzLmlzVmFsdWVFbXB0eSh1cGRhdGVkVmFsdWUudmFsdWUpKSB7XG4gICAgICAgICAgdmFyIG5ld1ZhbHVlID0gdXBkYXRlZFZhbHVlLnZhbHVlO1xuICAgICAgICAgIHZhciBpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKG5ld0Nob2ljZXMsIHVwZGF0ZWRWYWx1ZS52YWx1ZSk7XG4gICAgICAgICAgaWYgKCEhaXRlbSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpdGVtLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXMucHVzaChuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHZhbHVlOiByZXMgfTtcbiAgICB9XG4gICAgdmFyIHZhbHVlID1cbiAgICAgIHZhbC5pc0V4aXN0cyAmJiB0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWwudmFsdWUpID8gbnVsbCA6IHZhbC52YWx1ZTtcbiAgICB2YXIgaXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZShuZXdDaG9pY2VzLCB2YWx1ZSk7XG4gICAgaWYgKCEhaXRlbSkge1xuICAgICAgdmFsdWUgPSBpdGVtLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVDaG9pY2VzKCk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5QmFzZWRPbkNob2ljZXMoKTtcbiAgICBpZiAoISF0aGlzLnZpc2libGVDaG9pY2VzQ2hhbmdlZENhbGxiYWNrKVxuICAgICAgdGhpcy52aXNpYmxlQ2hvaWNlc0NoYW5nZWRDYWxsYmFjaygpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlVmlzaWJpbGl0eUJhc2VkT25DaG9pY2VzKCkge1xuICAgIGlmICh0aGlzLmhpZGVJZkNob2ljZXNFbXB0eSkge1xuICAgICAgdGhpcy52aXNpYmxlID0gIXRoaXMuZmlsdGVyZWRDaG9pY2VzIHx8IHRoaXMuZmlsdGVyZWRDaG9pY2VzLmxlbmd0aCA+IDA7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc29ydFZpc2libGVDaG9pY2VzKGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIG9yZGVyID0gdGhpcy5jaG9pY2VzT3JkZXIudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3JkZXIgPT0gXCJhc2NcIikgcmV0dXJuIHRoaXMuc29ydEFycmF5KGFycmF5LCAxKTtcbiAgICBpZiAob3JkZXIgPT0gXCJkZXNjXCIpIHJldHVybiB0aGlzLnNvcnRBcnJheShhcnJheSwgLTEpO1xuICAgIGlmIChvcmRlciA9PSBcInJhbmRvbVwiKSByZXR1cm4gdGhpcy5yYW5kb21pemVBcnJheShhcnJheSk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIHByaXZhdGUgc29ydEFycmF5KGFycmF5OiBBcnJheTxJdGVtVmFsdWU+LCBtdWx0OiBudW1iZXIpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgaWYgKGEuY2FsY3VsYXRlZFRleHQgPCBiLmNhbGN1bGF0ZWRUZXh0KSByZXR1cm4gLTEgKiBtdWx0O1xuICAgICAgaWYgKGEuY2FsY3VsYXRlZFRleHQgPiBiLmNhbGN1bGF0ZWRUZXh0KSByZXR1cm4gMSAqIG11bHQ7XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHJhbmRvbWl6ZUFycmF5KGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgcmV0dXJuIEhlbHBlcnMucmFuZG9taXplQXJyYXk8SXRlbVZhbHVlPihhcnJheSk7XG4gIH1cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge1xuICAgIGlmICh0aGlzLmtlZXBJbmNvcnJlY3RWYWx1ZXMpIHJldHVybjtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuc3VydmV5ICYmXG4gICAgICB0aGlzLnN1cnZleS5xdWVzdGlvbkNvdW50QnlWYWx1ZU5hbWUodGhpcy5nZXRWYWx1ZU5hbWUoKSkgPiAxXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGlmKCEhdGhpcy5jaG9pY2VzQnlVcmwgJiYgIXRoaXMuY2hvaWNlc0J5VXJsLmlzRW1wdHkpIHJldHVybjtcbiAgICBpZiAodGhpcy5jbGVhckluY29ycmVjdFZhbHVlc0NhbGxiYWNrKSB7XG4gICAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzQ2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhckluY29ycmVjdFZhbHVlc0NvcmUoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpIHtcbiAgICBzdXBlci5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBpdGVtIGlzIHNlbGVjdGVkXG4gICAqIEBwYXJhbSBpdGVtIGNoZWNrYm94IG9yIHJhZGlvIGl0ZW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZChpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXRlbS52YWx1ZSA9PT0gdGhpcy52YWx1ZTtcbiAgfVxuICBwcml2YXRlIGNsZWFyRGlzYWJsZWRWYWx1ZXMoKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSB8fCAhdGhpcy5zdXJ2ZXkuY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zKSByZXR1cm47XG4gICAgdGhpcy5jbGVhckRpc2FibGVkVmFsdWVzQ29yZSgpO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhckluY29ycmVjdFZhbHVlc0NvcmUoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKHRoaXMuY2FuQ2xlYXJWYWx1ZUFuVW5rbm93KHZhbCkpIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2FuQ2xlYXJWYWx1ZUFuVW5rbm93KHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkgJiYgdGhpcy5pc090aGVyU2VsZWN0ZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5oYXNVbmtub3duVmFsdWUodmFsLCB0cnVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJEaXNhYmxlZFZhbHVlc0NvcmUoKSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZURpc2FibGVkKHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgY2xlYXJVbnVzZWRWYWx1ZXMoKSB7XG4gICAgc3VwZXIuY2xlYXJVbnVzZWRWYWx1ZXMoKTtcbiAgICBpZiAoIXRoaXMuaXNPdGhlclNlbGVjdGVkICYmICF0aGlzLmhhc0NvbW1lbnQpIHtcbiAgICAgIHRoaXMuY29tbWVudCA9IFwiXCI7XG4gICAgfVxuICB9XG4gIGdldENvbHVtbkNsYXNzKCkge1xuICAgIHZhciBjb2x1bW5DbGFzcyA9IHRoaXMuY3NzQ2xhc3Nlcy5jb2x1bW47XG4gICAgaWYgKHRoaXMuaGFzQ29sdW1ucykge1xuICAgICAgY29sdW1uQ2xhc3MgKz0gXCIgc3YtcS1jb2x1bW4tXCIgKyB0aGlzLmNvbENvdW50O1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uQ2xhc3M7XG4gIH1cbiAgZ2V0TGFiZWxDbGFzcyhpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICB2YXIgbGFiZWxDbGFzcyA9IHRoaXMuY3NzQ2xhc3Nlcy5sYWJlbDtcbiAgICBpZiAodGhpcy5pc0l0ZW1TZWxlY3RlZChpdGVtKSkge1xuICAgICAgbGFiZWxDbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5sYWJlbENoZWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiBsYWJlbENsYXNzO1xuICB9XG4gIGdldENvbnRyb2xMYWJlbENsYXNzKGl0ZW06IEl0ZW1WYWx1ZSkge1xuICAgIHZhciBjb250cm9sTGFiZWxDbGFzcyA9IHRoaXMuY3NzQ2xhc3Nlcy5jb250cm9sTGFiZWw7XG4gICAgaWYgKHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSkpIHtcbiAgICAgIGNvbnRyb2xMYWJlbENsYXNzICs9IFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLmNvbnRyb2xMYWJlbENoZWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sTGFiZWxDbGFzcztcbiAgfVxuICBnZXQgY29sdW1ucygpIHtcbiAgICB2YXIgY29sdW1ucyA9IFtdO1xuICAgIHZhciBjb2xDb3VudCA9IHRoaXMuY29sQ291bnQ7XG4gICAgaWYgKHRoaXMuaGFzQ29sdW1ucyAmJiB0aGlzLnZpc2libGVDaG9pY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sQ291bnQ7IGkrKykge1xuICAgICAgICB2YXIgY29sdW1uID0gW107XG4gICAgICAgIGZvciAodmFyIGogPSBpOyBqIDwgdGhpcy52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7IGogKz0gY29sQ291bnQpIHtcbiAgICAgICAgICBjb2x1bW4ucHVzaCh0aGlzLnZpc2libGVDaG9pY2VzW2pdKTtcbiAgICAgICAgfVxuICAgICAgICBjb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cbiAgZ2V0IGhhc0NvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29sQ291bnQgPiAxO1xuICB9XG4gIHB1YmxpYyBjaG9pY2VzTG9hZGVkKCk6IHZvaWQge1xuICAgIHRoaXMuaXNDaG9pY2VzTG9hZGVkID0gdHJ1ZTtcbiAgICBsZXQgb2xkSXNSZWFkeTogYm9vbGVhbiA9IHRoaXMuaXNSZWFkeVZhbHVlO1xuICAgIHRoaXMuaXNSZWFkeVZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLm9uUmVhZHlDaGFuZ2VkICYmXG4gICAgICB0aGlzLm9uUmVhZHlDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgICBxdWVzdGlvbjogdGhpcyxcbiAgICAgICAgaXNSZWFkeTogdHJ1ZSxcbiAgICAgICAgb2xkSXNSZWFkeTogb2xkSXNSZWFkeSxcbiAgICAgIH0pO1xuICB9XG59XG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgY2hlY2tib3ggYW5kIHJhZGlvZ3JvdXAgcXVlc3Rpb25zLiBJdCBpbnRyb2R1Y2VkIGEgY29sQ291bnQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNoZWNrYm94QmFzZSBleHRlbmRzIFF1ZXN0aW9uU2VsZWN0QmFzZSB7XG4gIGNvbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgcmFkaW9ncm91cCBhbmQgY2hlY2tib3ggcXVlc3Rpb25zLiBJdGVtcyBhcmUgcmVuZHJlZCBpbiBvbmUgbGluZSBpZiB0aGUgdmFsdWUgaXMgMC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29sQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdGhpcy5pc0Zsb3dMYXlvdXQgPyAwIDogMSk7XG4gIH1cbiAgcHVibGljIHNldCBjb2xDb3VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDUgfHwgdGhpcy5pc0Zsb3dMYXlvdXQpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCB2YWx1ZSk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgZ2V0SXRlbUluZGV4KGl0ZW06IGFueSkge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVDaG9pY2VzLmluZGV4T2YoaXRlbSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUGFyZW50Q2hhbmdlZCgpIHtcbiAgICBzdXBlci5vblBhcmVudENoYW5nZWQoKTtcbiAgICBpZiAodGhpcy5pc0Zsb3dMYXlvdXQpIHtcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJzZWxlY3RiYXNlXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwiaGFzQ29tbWVudDpzd2l0Y2hcIiwgbGF5b3V0OiBcInJvd1wiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb21tZW50VGV4dFwiLFxuICAgICAgZGVwZW5kc09uOiBcImhhc0NvbW1lbnRcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24gKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBvYmouaGFzQ29tbWVudDtcbiAgICAgIH0sXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tbWVudFRleHRcIixcbiAgICAgIGxheW91dDogXCJyb3dcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlczppdGVtdmFsdWVbXVwiLFxuICAgICAgYmFzZVZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2hvaWNlc19JdGVtXCIpO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlc09yZGVyXCIsXG4gICAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJhc2NcIiwgXCJkZXNjXCIsIFwicmFuZG9tXCJdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjaG9pY2VzQnlVcmw6cmVzdGZ1bGxcIixcbiAgICAgIGNsYXNzTmFtZTogXCJDaG9pY2VzUmVzdGZ1bGxcIixcbiAgICAgIG9uR2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmNob2ljZXNCeVVybC5nZXREYXRhKCk7XG4gICAgICB9LFxuICAgICAgb25TZXRWYWx1ZTogZnVuY3Rpb24gKG9iajogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIG9iai5jaG9pY2VzQnlVcmwuc2V0RGF0YSh2YWx1ZSk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgXCJoaWRlSWZDaG9pY2VzRW1wdHk6Ym9vbGVhblwiLFxuICAgIFwiY2hvaWNlc1Zpc2libGVJZjpjb25kaXRpb25cIixcbiAgICBcImNob2ljZXNFbmFibGVJZjpjb25kaXRpb25cIixcbiAgICBcImhhc090aGVyOmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcIm90aGVyUGxhY2VIb2xkZXJcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPdGhlclBsYWNlSG9sZGVyXCIsXG4gICAgICBkZXBlbmRzT246IFwiaGFzT3RoZXJcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24gKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBvYmouaGFzT3RoZXI7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJvdGhlclRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPdGhlclRleHRcIixcbiAgICAgIGRlcGVuZHNPbjogXCJoYXNPdGhlclwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIG9iai5oYXNPdGhlcjtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm90aGVyRXJyb3JUZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jT3RoZXJFcnJvclRleHRcIixcbiAgICAgIGRlcGVuZHNPbjogXCJoYXNPdGhlclwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIG9iai5oYXNPdGhlcjtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgdHJ1ZSwgZmFsc2VdLFxuICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgfSxcbiAgXSxcbiAgbnVsbCxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImNoZWNrYm94YmFzZVwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIixcbiAgICAgIGRlZmF1bHQ6IDEsXG4gICAgICBjaG9pY2VzOiBbMCwgMSwgMiwgMywgNCwgNV0sXG4gICAgICBsYXlvdXQ6IFwicm93XCIsXG4gICAgfSxcbiAgXSxcbiAgbnVsbCxcbiAgXCJzZWxlY3RiYXNlXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fYmFzZXNlbGVjdC50cyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudEVycm9ycyB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25cIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnRCYXNlIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IFJlYWN0RWxlbWVudEZhY3RvcnkgfSBmcm9tIFwiLi9lbGVtZW50LWZhY3RvcnlcIjtcblxuaW1wb3J0IHsgU3VydmV5UGFuZWxCYXNlIH0gZnJvbSBcIi4vcGFuZWwtYmFzZVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCIuLi9wYW5lbFwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UGFuZWwgZXh0ZW5kcyBTdXJ2ZXlQYW5lbEJhc2Uge1xuICBwcml2YXRlIGhhc0JlZW5FeHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlRWRpdENsaWNrID0gdGhpcy5oYW5kbGVFZGl0Q2xpY2suYmluZCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnBhbmVsQmFzZSBhcyBQYW5lbE1vZGVsO1xuICB9XG4gIGhhbmRsZUVkaXRDbGljayhldmVudDogYW55KSB7XG4gICAgdGhpcy5wYW5lbC5jYW5jZWxQcmV2aWV3KCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNhblJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuY2FuUmVuZGVyKCkgJiZcbiAgICAgICEhdGhpcy5zdXJ2ZXkgJiZcbiAgICAgICEhdGhpcy5wYW5lbEJhc2UgJiZcbiAgICAgIHRoaXMucGFuZWxCYXNlLmlzVmlzaWJsZVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciB0aXRsZSA9IHRoaXMucmVuZGVyVGl0bGUoKTtcbiAgICB2YXIgZGVzY3JpcHRpb24gPSB0aGlzLnJlbmRlckRlc2NyaXB0aW9uKCk7XG4gICAgdmFyIGVycm9ycyA9IChcbiAgICAgIDxTdXJ2ZXlFbGVtZW50RXJyb3JzXG4gICAgICAgIGVsZW1lbnQ9e3RoaXMucGFuZWxCYXNlfVxuICAgICAgICBjc3NDbGFzc2VzPXt0aGlzLnBhbmVsQmFzZS5jc3NDbGFzc2VzfVxuICAgICAgICBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9XG4gICAgICAvPlxuICAgICk7XG4gICAgdmFyIHN0eWxlID0ge1xuICAgICAgcGFkZGluZ0xlZnQ6IHRoaXMucGFuZWwuaW5uZXJQYWRkaW5nTGVmdCxcbiAgICAgIGRpc3BsYXk6ICF0aGlzLnBhbmVsLmlzQ29sbGFwc2VkID8gXCJibG9ja1wiIDogXCJub25lXCIsXG4gICAgfTtcbiAgICB2YXIgY29udGVudCA9IG51bGw7XG4gICAgaWYgKCF0aGlzLnBhbmVsLmlzQ29sbGFwc2VkIHx8IHRoaXMuaGFzQmVlbkV4cGFuZGVkKSB7XG4gICAgICB0aGlzLmhhc0JlZW5FeHBhbmRlZCA9IHRydWU7XG4gICAgICB2YXIgcm93cyA9IHRoaXMucmVuZGVyUm93cyh0aGlzLnBhbmVsQmFzZS5jc3NDbGFzc2VzKTtcbiAgICAgIHZhciBjbGFzc05hbWUgPSB0aGlzLnBhbmVsQmFzZS5jc3NDbGFzc2VzLnBhbmVsLmNvbnRlbnQ7XG4gICAgICBjb250ZW50ID0gdGhpcy5yZW5kZXJDb250ZW50KHN0eWxlLCByb3dzLCBjbGFzc05hbWUpO1xuICAgIH1cbiAgICB2YXIgcm9vdFN0eWxlOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBpZiAodGhpcy5wYW5lbC5yZW5kZXJXaWR0aCkge1xuICAgICAgcm9vdFN0eWxlW1wid2lkdGhcIl0gPSB0aGlzLnBhbmVsLnJlbmRlcldpZHRoO1xuICAgICAgcm9vdFN0eWxlW1wiZmxleEdyb3dcIl0gPSAxO1xuICAgICAgcm9vdFN0eWxlW1wiZmxleFNocmlua1wiXSA9IDE7XG4gICAgICByb290U3R5bGVbXCJmbGV4QmFzaXNcIl0gPSB0aGlzLnBhbmVsLnJlbmRlcldpZHRoO1xuICAgICAgcm9vdFN0eWxlW1wibWluV2lkdGhcIl0gPSB0aGlzLnBhbmVsW1wibWluV2lkdGhcIl07XG4gICAgICByb290U3R5bGVbXCJtYXhXaWR0aFwiXSA9IHRoaXMucGFuZWxbXCJtYXhXaWR0aFwiXTtcbiAgICB9XG4gICAgdmFyIGJvdHRvbSA9IHRoaXMucmVuZGVyQm90dG9tKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgcmVmPXt0aGlzLnJvb3RSZWZ9XG4gICAgICAgIGNsYXNzTmFtZT17dGhpcy5wYW5lbEJhc2UuY3NzQ2xhc3Nlcy5wYW5lbC5jb250YWluZXJ9XG4gICAgICAgIHN0eWxlPXtyb290U3R5bGV9XG4gICAgICA+XG4gICAgICAgIHt0aXRsZX1cbiAgICAgICAge2Rlc2NyaXB0aW9ufVxuICAgICAgICB7ZXJyb3JzfVxuICAgICAgICB7Y29udGVudH1cbiAgICAgICAge2JvdHRvbX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckNvbnRlbnQoXG4gICAgc3R5bGU6IGFueSxcbiAgICByb3dzOiBKU1guRWxlbWVudFtdLFxuICAgIGNsYXNzTmFtZTogc3RyaW5nXG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBzdHlsZT17c3R5bGV9IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgICAge3Jvd3N9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJUaXRsZSgpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsQmFzZS50aXRsZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHNwYW5zID0gdGhpcy5yZW5kZXJUaXRsZVNwYW5zKHRoaXMucGFuZWwsIHRoaXMucGFuZWwuY3NzQ2xhc3Nlcyk7XG5cbiAgICB2YXIgZXhwYW5kQ29sbGFwc2UgPSBudWxsO1xuICAgIHZhciB0aXRsZVN0eWxlID0gdGhpcy5wYW5lbC5jc3NDbGFzc2VzLnBhbmVsLnRpdGxlO1xuICAgIGlmICh0aGlzLnBhbmVsLmlzQ29sbGFwc2VkIHx8IHRoaXMucGFuZWwuaXNFeHBhbmRlZCkge1xuICAgICAgdGl0bGVTdHlsZSArPSBcIiBcIiArIHRoaXMucGFuZWwuY3NzQ2xhc3Nlcy5wYW5lbC50aXRsZUV4cGFuZGFibGU7XG4gICAgICB2YXIgaWNvbkNzcyA9IHRoaXMucGFuZWwuY3NzQ2xhc3Nlcy5wYW5lbC5pY29uO1xuICAgICAgaWYgKCF0aGlzLnBhbmVsLmlzQ29sbGFwc2VkKVxuICAgICAgICBpY29uQ3NzICs9IFwiIFwiICsgdGhpcy5wYW5lbC5jc3NDbGFzc2VzLnBhbmVsLmljb25FeHBhbmRlZDtcbiAgICAgIHZhciBjaGFuZ2VFeHBhbmRlZCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGFuZWwuaXNDb2xsYXBzZWQpIHtcbiAgICAgICAgICB0aGlzLnBhbmVsLmV4cGFuZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucGFuZWwuY29sbGFwc2UoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBwcmVzc0V4cGFuZCA9IChldmVudDogYW55KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5rZXlDb2RlID09IDEzKSBjaGFuZ2VFeHBhbmRlZCgpO1xuICAgICAgfTtcbiAgICAgIGV4cGFuZENvbGxhcHNlID0gKFxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2ljb25Dc3N9IHRhYkluZGV4PXswfSBvbktleVVwPXtwcmVzc0V4cGFuZH0gLz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFuZWwuY29udGFpbnNFcnJvcnMpIHtcbiAgICAgIHRpdGxlU3R5bGUgKz0gXCIgXCIgKyB0aGlzLnBhbmVsLmNzc0NsYXNzZXMucGFuZWwudGl0bGVPbkVycm9yO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8aDQgY2xhc3NOYW1lPXt0aXRsZVN0eWxlfSBvbkNsaWNrPXtjaGFuZ2VFeHBhbmRlZH0+XG4gICAgICAgIHtzcGFuc31cbiAgICAgICAge2V4cGFuZENvbGxhcHNlfVxuICAgICAgPC9oND5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJEZXNjcmlwdGlvbigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsQmFzZS5kZXNjcmlwdGlvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIHRleHQgPSBTdXJ2ZXlFbGVtZW50QmFzZS5yZW5kZXJMb2NTdHJpbmcodGhpcy5wYW5lbEJhc2UubG9jRGVzY3JpcHRpb24pO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wYW5lbC5jc3NDbGFzc2VzLnBhbmVsLmRlc2NyaXB0aW9ufT57dGV4dH08L2Rpdj5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJCb3R0b20oKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5wYW5lbC5oYXNFZGl0QnV0dG9uIHx8ICF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wYW5lbC5jc3NDbGFzc2VzLnBhbmVsLmZvb3Rlcn0+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5zdXJ2ZXkuY3NzTmF2aWdhdGlvbkVkaXR9XG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVFZGl0Q2xpY2t9XG4gICAgICAgICAgdmFsdWU9e3RoaXMuc3VydmV5LmVkaXRUZXh0fVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5SZWFjdEVsZW1lbnRGYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyRWxlbWVudChcInBhbmVsXCIsIChwcm9wcykgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlQYW5lbCwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcGFuZWwudHN4IiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gIEJhc2UsXG4gIElTdXJ2ZXlJbXBsLFxuICBJUGFnZSxcbiAgSVBhbmVsLFxuICBJQ29uZGl0aW9uUnVubmVyLFxuICBJRWxlbWVudCxcbiAgSVN1cnZleUVsZW1lbnQsXG4gIElRdWVzdGlvbixcbiAgU3VydmV5RWxlbWVudCxcbiAgU3VydmV5RXJyb3IsXG4gIElTdXJ2ZXlFcnJvck93bmVyLFxuICBJVGl0bGVPd25lcixcbiAgSVByb2dyZXNzSW5mbyxcbn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgT25lQW5zd2VyUmVxdWlyZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi9wYWdlXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBmaW5kU2Nyb2xsYWJsZVBhcmVudCwgaXNFbGVtZW50VmlzaWJsZSB9IGZyb20gXCIuL3V0aWxzL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBEcmFnRHJvcEluZm8ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc291cmNlOiBJRWxlbWVudCxcbiAgICBwdWJsaWMgdGFyZ2V0OiBJRWxlbWVudCxcbiAgICBwdWJsaWMgbmVzdGVkUGFuZWxEZXB0aDogbnVtYmVyID0gLTFcbiAgKSB7fVxuICBwdWJsaWMgZGVzdGluYXRpb246IElTdXJ2ZXlFbGVtZW50O1xuICBwdWJsaWMgaXNCb3R0b206IGJvb2xlYW47XG4gIHB1YmxpYyBpc0VkZ2U6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJvd01vZGVsIGV4dGVuZHMgQmFzZSB7XG4gIHByaXZhdGUgX3Njcm9sbGFibGVQYXJlbnQ6IGFueSA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdXBkYXRlVmlzaWJpbGl0eTogYW55ID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgc3RhcnRMYXp5UmVuZGVyaW5nKHJvd0NvbnRhaW5lckRpdjogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLl9zY3JvbGxhYmxlUGFyZW50ID0gZmluZFNjcm9sbGFibGVQYXJlbnQocm93Q29udGFpbmVyRGl2KTtcbiAgICB0aGlzLl91cGRhdGVWaXNpYmlsaXR5ID0gKCkgPT4ge1xuICAgICAgdmFyIGlzUm93Q29udGFpbmVyRGl2VmlzaWJsZSA9IGlzRWxlbWVudFZpc2libGUocm93Q29udGFpbmVyRGl2LCA1MCk7XG4gICAgICBpZiAoIXRoaXMuaXNOZWVkUmVuZGVyICYmIGlzUm93Q29udGFpbmVyRGl2VmlzaWJsZSkge1xuICAgICAgICB0aGlzLmlzTmVlZFJlbmRlciA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RvcExhenlSZW5kZXJpbmcoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fc2Nyb2xsYWJsZVBhcmVudC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHRoaXMuX3VwZGF0ZVZpc2liaWxpdHkpO1xuICAgICAgdGhpcy5fdXBkYXRlVmlzaWJpbGl0eSgpO1xuICAgIH0sIDEwKTtcbiAgfVxuICBwdWJsaWMgc3RvcExhenlSZW5kZXJpbmcoKSB7XG4gICAgaWYgKCEhdGhpcy5fc2Nyb2xsYWJsZVBhcmVudCAmJiAhIXRoaXMuX3VwZGF0ZVZpc2liaWxpdHkpIHtcbiAgICAgIHRoaXMuX3Njcm9sbGFibGVQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJzY3JvbGxcIixcbiAgICAgICAgdGhpcy5fdXBkYXRlVmlzaWJpbGl0eVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fc2Nyb2xsYWJsZVBhcmVudCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl91cGRhdGVWaXNpYmlsaXR5ID0gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYW5lbDogUGFuZWxNb2RlbEJhc2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaXNOZWVkUmVuZGVyID0gIXNldHRpbmdzLmxhenlSb3dzUmVuZGVyaW5nO1xuICAgIHRoaXMudmlzaWJsZSA9IHBhbmVsLmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZztcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwiZWxlbWVudHNcIik7XG4gIH1cbiAgcHVibGljIGdldCBlbGVtZW50cygpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlbGVtZW50c1wiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzTmVlZFJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNuZWVkcmVuZGVyXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNOZWVkUmVuZGVyKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzbmVlZHJlbmRlclwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZUVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuZmlsdGVyKChlKSA9PiBlLmlzVmlzaWJsZSk7XG4gIH1cbiAgcHVibGljIHVwZGF0ZVZpc2libGUoKSB7XG4gICAgdGhpcy52aXNpYmxlID0gdGhpcy5jYWxjVmlzaWJsZSgpO1xuICAgIHRoaXMuc2V0V2lkdGgoKTtcbiAgfVxuICBwdWJsaWMgYWRkRWxlbWVudChxOiBJRWxlbWVudCkge1xuICAgIHRoaXMuZWxlbWVudHMucHVzaChxKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGUoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWwucm93cy5pbmRleE9mKHRoaXMpO1xuICB9XG4gIHByaXZhdGUgc2V0V2lkdGgoKSB7XG4gICAgdmFyIHZpc0NvdW50ID0gdGhpcy52aXNpYmxlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICh2aXNDb3VudCA9PSAwKSByZXR1cm47XG4gICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgIHZhciBwcmVTZXRXaWR0aEVsZW1lbnRzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgdGhpcy5zZXRFbGVtZW50TWF4TWluV2lkdGgoZWwpO1xuXG4gICAgICBpZiAoZWwuaXNWaXNpYmxlKSB7XG4gICAgICAgIHZhciB3aWR0aCA9IHRoaXMuZ2V0RWxlbWVudFdpZHRoKGVsKTtcbiAgICAgICAgaWYgKCEhd2lkdGgpIHtcbiAgICAgICAgICBlbC5yZW5kZXJXaWR0aCA9IHRoaXMuZ2V0UmVuZGVyZWRXaWR0aEZyb21XaWR0aCh3aWR0aCk7XG4gICAgICAgICAgcHJlU2V0V2lkdGhFbGVtZW50cy5wdXNoKGVsKTtcbiAgICAgICAgfVxuICAgICAgICBlbC5yaWdodEluZGVudCA9IGNvdW50ZXIgPCB2aXNDb3VudCAtIDEgPyAxIDogMDtcbiAgICAgICAgY291bnRlcisrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwucmVuZGVyV2lkdGggPSBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICBpZiAoIWVsLmlzVmlzaWJsZSB8fCBwcmVTZXRXaWR0aEVsZW1lbnRzLmluZGV4T2YoZWwpID4gLTEpIGNvbnRpbnVlO1xuICAgICAgaWYgKHByZVNldFdpZHRoRWxlbWVudHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgZWwucmVuZGVyV2lkdGggPSAoMTAwIC8gdmlzQ291bnQpLnRvRml4ZWQoNikgKyBcIiVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsLnJlbmRlcldpZHRoID0gdGhpcy5nZXRSZW5kZXJlZENhbGNXaWR0aChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBwcmVTZXRXaWR0aEVsZW1lbnRzLFxuICAgICAgICAgIHZpc0NvdW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXRFbGVtZW50TWF4TWluV2lkdGgoZWw6IElFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgZWwud2lkdGggJiZcbiAgICAgIHR5cGVvZiBlbC53aWR0aCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgZWwud2lkdGguaW5kZXhPZihcIiVcIikgPT09IC0xXG4gICAgKSB7XG4gICAgICBlbC5taW5XaWR0aCA9IGVsLndpZHRoO1xuICAgICAgZWwubWF4V2lkdGggPSBlbC53aWR0aDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFJlbmRlcmVkQ2FsY1dpZHRoKFxuICAgIGVsOiBJRWxlbWVudCxcbiAgICBwcmVTZXRXaWR0aEVsZW1lbnRzOiBBcnJheTxJRWxlbWVudD4sXG4gICAgdmlzQ291bnQ6IG51bWJlclxuICApOiBzdHJpbmcge1xuICAgIHZhciBleHByZXNzaW9uID0gXCIxMDAlXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVTZXRXaWR0aEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBleHByZXNzaW9uICs9IFwiIC0gXCIgKyBwcmVTZXRXaWR0aEVsZW1lbnRzW2ldLnJlbmRlcldpZHRoO1xuICAgIH1cbiAgICB2YXIgY2FsY1dpZHRoRWwgPSB2aXNDb3VudCAtIHByZVNldFdpZHRoRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmIChjYWxjV2lkdGhFbCA+IDEpIHtcbiAgICAgIGV4cHJlc3Npb24gPSBcIihcIiArIGV4cHJlc3Npb24gKyBcIikvXCIgKyBjYWxjV2lkdGhFbC50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gXCJjYWxjKFwiICsgZXhwcmVzc2lvbiArIFwiKVwiO1xuICB9XG4gIHByaXZhdGUgZ2V0RWxlbWVudFdpZHRoKGVsOiBJRWxlbWVudCk6IHN0cmluZyB7XG4gICAgdmFyIHdpZHRoID0gZWwud2lkdGg7XG4gICAgaWYgKCF3aWR0aCB8fCB0eXBlb2Ygd2lkdGggIT09IFwic3RyaW5nXCIpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiB3aWR0aC50cmltKCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRSZW5kZXJlZFdpZHRoRnJvbVdpZHRoKHdpZHRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBIZWxwZXJzLmlzTnVtYmVyKHdpZHRoKSA/IHdpZHRoICsgXCJweFwiIDogd2lkdGg7XG4gIH1cbiAgcHJpdmF0ZSBjYWxjVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlRWxlbWVudHMubGVuZ3RoID4gMDtcbiAgfVxufVxuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgYSBQYW5lbCBhbmQgUGFnZSBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgUGFuZWxNb2RlbEJhc2VcbiAgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50XG4gIGltcGxlbWVudHMgSVBhbmVsLCBJQ29uZGl0aW9uUnVubmVyLCBJTG9jYWxpemFibGVPd25lciwgSVN1cnZleUVycm9yT3duZXIge1xuICBwcml2YXRlIHN0YXRpYyBwYW5lbENvdW50ZXIgPSAxMDA7XG4gIHByaXZhdGUgc3RhdGljIGdldFBhbmVsSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzcF9cIiArIFBhbmVsTW9kZWxCYXNlLnBhbmVsQ291bnRlcisrO1xuICB9XG5cbiAgcHJpdmF0ZSBlbGVtZW50c1ZhbHVlOiBBcnJheTxJRWxlbWVudD47XG4gIHByaXZhdGUgaXNRdWVzdGlvbnNSZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHF1ZXN0aW9uc1ZhbHVlOiBBcnJheTxRdWVzdGlvbj4gPSBuZXcgQXJyYXk8UXVlc3Rpb24+KCk7XG4gIGFkZEVsZW1lbnRDYWxsYmFjazogKGVsZW1lbnQ6IElFbGVtZW50KSA9PiB2b2lkO1xuICByZW1vdmVFbGVtZW50Q2FsbGJhY2s6IChlbGVtZW50OiBJRWxlbWVudCkgPT4gdm9pZDtcbiAgb25HZXRRdWVzdGlvblRpdGxlTG9jYXRpb246ICgpID0+IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJyb3dzXCIpO1xuICAgIHRoaXMuZWxlbWVudHNWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3QXJyYXkoXG4gICAgICBcImVsZW1lbnRzXCIsXG4gICAgICB0aGlzLm9uQWRkRWxlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5vblJlbW92ZUVsZW1lbnQuYmluZCh0aGlzKVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsXG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQuYmluZCh0aGlzKVxuICAgICk7XG4gICAgdGhpcy5pZCA9IFBhbmVsTW9kZWxCYXNlLmdldFBhbmVsSWQoKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImRlc2NyaXB0aW9uXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhbmVsYmFzZVwiO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIH1cbiAgfVxuICBlbmRMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgc3VwZXIuZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgdGhpcy5tYXJrUXVlc3Rpb25MaXN0RGlydHkoKTtcbiAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogUGFuZWxNb2RlbCBvciBQYWdlTW9kZWwgdGl0bGUgcHJvcGVydHkuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIpO1xuICB9XG4gIGdldCBfc2hvd1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAoKDxhbnk+dGhpcy5zdXJ2ZXkpLnNob3dQYWdlVGl0bGVzICYmIHRoaXMudGl0bGUubGVuZ3RoID4gMCkgfHxcbiAgICAgICh0aGlzLmlzRGVzaWduTW9kZSAmJiBzZXR0aW5ncy5hbGxvd1Nob3dFbXB0eVRpdGxlSW5EZXNpZ25Nb2RlKVxuICAgICk7XG4gIH1cbiAgZ2V0IF9zaG93RGVzY3JpcHRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICgoPGFueT50aGlzLnN1cnZleSkuc2hvd1BhZ2VUaXRsZXMgJiYgdGhpcy5kZXNjcmlwdGlvbi5sZW5ndGggPiAwKSB8fFxuICAgICAgKHRoaXMuaXNEZXNpZ25Nb2RlICYmXG4gICAgICAgIHNldHRpbmdzLmFsbG93U2hvd0VtcHR5VGl0bGVJbkRlc2lnbk1vZGUgJiZcbiAgICAgICAgc2V0dGluZ3MuYWxsb3dTaG93RW1wdHlEZXNjcmlwdGlvbkluRGVzaWduTW9kZSlcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBQYW5lbE1vZGVsIG9yIFBhZ2VNb2RlbCBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4gSXQgcmVuZGVycyB1bmRlciB0aXRsZSBieSB1c2luZyBzbWFsbGVyIGZvbnQuIFVubGlrZSB0aGUgdGl0bGUsIGRlc2NyaXB0aW9uIGNhbiBiZSBlbXB0eS5cbiAgICogQHNlZSB0aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImRlc2NyaXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVzY3JpcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImRlc2NyaXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0Rlc2NyaXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImRlc2NyaXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hhci9zdHJpbmcgZm9yIGEgcmVxdWlyZWQgcGFuZWwuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucmVxdWlyZWRUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSAhPSBudWxsICYmIHRoaXMuaXNSZXF1aXJlZFxuICAgICAgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHRcbiAgICAgIDogXCJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHRpdGxlUGF0dGVybigpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucXVlc3Rpb25UaXRsZVBhdHRlcm4gOiBcIm51bVRpdGxlUmVxdWlyZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlVGV4dE9uU3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZCAmJiB0aGlzLnRpdGxlUGF0dGVybiA9PSBcInJlcXVpcmVOdW1UaXRsZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlVGV4dEJlZm9yZVRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWQgJiYgdGhpcy50aXRsZVBhdHRlcm4gPT0gXCJudW1SZXF1aXJlVGl0bGVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZVRleHRBZnRlclRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWQgJiYgdGhpcy50aXRsZVBhdHRlcm4gPT0gXCJudW1UaXRsZVJlcXVpcmVcIjtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1c3RvbSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBvbiByZXF1aXJlZCBlcnJvci4gVXNlIHRoaXMgcHJvcGVydHksIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBkZWZhdWx0IHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZEVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicmVxdWlyZWRFcnJvclRleHRcIik7XG4gIH1cbiAgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5XG4gICAgICA/ICg8SUxvY2FsaXphYmxlT3duZXI+KDxhbnk+dGhpcy5zdXJ2ZXkpKS5nZXRMb2NhbGUoKVxuICAgICAgOiBcIlwiO1xuICB9XG4gIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5nZXRTdXJ2ZXlNYXJrZG93bkh0bWwodGhpcywgdGV4dCkgOiBudWxsO1xuICB9XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yXG4gICAgICA/IHRoaXMudGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dCh0ZXh0LCB0cnVlKVxuICAgICAgOiB0ZXh0O1xuICB9XG4gIC8qKlxuICAgKiBBIHBhcmVudCBlbGVtZW50LiBJdCBpcyBhbHdheXMgbnVsbCBmb3IgdGhlIFBhZ2Ugb2JqZWN0IGFuZCBhbHdheXMgbm90IG51bGwgZm9yIHRoZSBQYW5lbCBvYmplY3QuIFBhbmVsIG9iamVjdCBtYXkgY29udGFpbiBRdWVzdGlvbnMgYW5kIG90aGVyIFBhbmVscy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFyZW50KCk6IFBhbmVsTW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFyZW50KHZhbDogUGFuZWxNb2RlbEJhc2UpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYXJlbnRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRlcHRoKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHJldHVybiAwO1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5kZXB0aCArIDE7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgdHJ1ZSB0aGUgUGFuZWwgYmVjb21lcyB2aXNpYmxlIGFuZCBpZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBQYW5lbCBiZWNvbWVzIGludmlzaWJsZS4gVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIHZpc2libGUgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSB2aXNpYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc0NsYXNzZXMoKTogYW55IHtcbiAgICB2YXIgY2xhc3NlcyA9IHsgcGFuZWw6IHt9LCBlcnJvcjoge30sIHJvdzogXCJcIiB9O1xuICAgIHRoaXMuY29weUNzc0NsYXNzZXMoY2xhc3Nlcy5wYW5lbCwgdGhpcy5jc3MucGFuZWwpO1xuICAgIHRoaXMuY29weUNzc0NsYXNzZXMoY2xhc3Nlcy5lcnJvciwgdGhpcy5jc3MuZXJyb3IpO1xuICAgIGlmICghIXRoaXMuY3NzLnJvdykge1xuICAgICAgY2xhc3Nlcy5yb3cgPSB0aGlzLmNzcy5yb3c7XG4gICAgfVxuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkudXBkYXRlUGFuZWxDc3NDbGFzc2VzKHRoaXMsIGNsYXNzZXMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGNzcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkuZ2V0Q3NzKCkgOiB7fTtcbiAgfVxuICAvKipcbiAgICogQSB1bmlxdWUgZWxlbWVudCBpZGVudGlmaWNhdG9yLiBJdCBpcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaWRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBvYmplY3QgaXMgUGFuZWwuIFJldHVybnMgZmFsc2UgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhZ2UgKGEgcm9vdCBQYW5lbCkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRQYW5lbCgpOiBJUGFuZWwge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldExheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyb3dcIjtcbiAgfVxuICBpc0xheW91dFR5cGVTdXBwb3J0ZWQobGF5b3V0VHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGxheW91dFR5cGUgIT09IFwiZmxvd1wiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBxdWVzdGlvbnMgbG9jYXRlZCBpbiB0aGUgUGFuZWwvUGFnZSwgaW5jbHVkaW5nIGluIHRoZSBuZXN0ZWQgUGFuZWxzLlxuICAgKiBAc2VlIFF1ZXN0aW9uXG4gICAqIEBzZWUgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zKCk6IEFycmF5PFF1ZXN0aW9uPiB7XG4gICAgaWYgKCF0aGlzLmlzUXVlc3Rpb25zUmVhZHkpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICAgIHZhciBxcyA9ICg8UGFuZWxNb2RlbD5lbCkucXVlc3Rpb25zO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaChxc1tqXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaCg8UXVlc3Rpb24+ZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmlzUXVlc3Rpb25zUmVhZHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uc1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWxpZE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoISFuYW1lKSByZXR1cm4gbmFtZS50cmltKCk7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHF1ZXN0aW9uIGJ5IGl0cyBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIHRoZSBxdWVzdGlvbiBuYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHF1ZXN0aW9uc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiBxdWVzdGlvbnNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGJ5IGl0cyBuYW1lLiBJdCB3b3JrcyByZWN1cnNpdmVseS5cbiAgICogQHBhcmFtIG5hbWUgdGhlIGVsZW1lbnQgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldEVsZW1lbnRCeU5hbWUobmFtZTogc3RyaW5nKTogSUVsZW1lbnQge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWwubmFtZSA9PSBuYW1lKSByZXR1cm4gZWw7XG4gICAgICB2YXIgcG5sID0gZWwuZ2V0UGFuZWwoKTtcbiAgICAgIGlmICghIXBubCkge1xuICAgICAgICB2YXIgcmVzID0gKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmdldEVsZW1lbnRCeU5hbWUobmFtZSk7XG4gICAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpID09IHZhbHVlTmFtZSkgcmV0dXJuIHF1ZXN0aW9uc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgcXVlc3Rpb24gdmFsdWVzIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRWYWx1ZSgpOiBhbnkge1xuICAgIHZhciBkYXRhID0ge307XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKHEuaXNFbXB0eSgpKSBjb250aW51ZTtcbiAgICAgIHZhciB2YWx1ZU5hbWUgPSBxLmdldFZhbHVlTmFtZSgpO1xuICAgICAgKDxhbnk+ZGF0YSlbdmFsdWVOYW1lXSA9IHEudmFsdWU7XG4gICAgICBpZiAoISF0aGlzLmRhdGEpIHtcbiAgICAgICAgdmFyIGNvbW1lbnQgPSB0aGlzLmRhdGEuZ2V0Q29tbWVudCh2YWx1ZU5hbWUpO1xuICAgICAgICBpZiAoISFjb21tZW50KSB7XG4gICAgICAgICAgKDxhbnk+ZGF0YSlbdmFsdWVOYW1lICsgc2V0dGluZ3MuY29tbWVudFByZWZpeF0gPSBjb21tZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHF1ZXN0aW9uIGNvbW1lbnRzIG9uIHRoZSBjdXJyZW50IHBhZ2VcbiAgICovXG4gIHB1YmxpYyBnZXRDb21tZW50cygpOiBhbnkge1xuICAgIHZhciBjb21tZW50cyA9IHt9O1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm4gY29tbWVudHM7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIHZhciBjb21tZW50ID0gdGhpcy5kYXRhLmdldENvbW1lbnQocS5nZXRWYWx1ZU5hbWUoKSk7XG4gICAgICBpZiAoISFjb21tZW50KSB7XG4gICAgICAgICg8YW55PmNvbW1lbnRzKVtxLmdldFZhbHVlTmFtZSgpXSA9IGNvbW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21tZW50cztcbiAgfVxuICAvKipcbiAgICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHJlbW92ZSBhbGwgcXVlc3Rpb24gdmFsdWVzIGZyb20gdGhlIGN1cnJlbnQgcGFnZS9wYW5lbCwgdGhhdCBlbmQtdXNlciB3aWxsIG5vdCBiZSBhYmxlIHRvIGVudGVyLlxuICAgKiBGb3IgZXhhbXBsZSB0aGUgdmFsdWUgdGhhdCBkb2Vzbid0IGV4aXN0cyBpbiBhIHJhZGlncm91cC9kcm9wZG93bi9jaGVja2JveCBjaG9pY2VzIG9yIG1hdHJpeCByb3dzL2NvbHVtbnMuXG4gICAqIFBsZWFzZSBub3RlLCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2xlYXIgdmFsdWVzIGZvciBpbnZpc2libGUgcXVlc3Rpb25zIG9yIHZhbHVlcyB0aGF0IGRvZXNuJ3QgYXNzb2NpYXRlZCB3aXRoIHF1ZXN0aW9ucy5cbiAgICogQHNlZSBRdWVzdGlvbi5jbGVhckluY29ycmVjdFZhbHVlc1xuICAgKi9cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNsZWFyIGFsbCBlcnJvcnMgaW4gdGhlIHBhbmVsIC8gcGFnZSBhbmQgYWxsIGl0cyBjaGlsZCBlbGVtZW50cyAocGFuZWxzIGFuZCBxdWVzdGlvbnMpXG4gICAqL1xuICBwdWJsaWMgY2xlYXJFcnJvcnMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLmNsZWFyRXJyb3JzKCk7XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzID0gW107XG4gIH1cbiAgcHJpdmF0ZSBtYXJrUXVlc3Rpb25MaXN0RGlydHkoKSB7XG4gICAgdGhpcy5pc1F1ZXN0aW9uc1JlYWR5ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMucGFyZW50KSB0aGlzLnBhcmVudC5tYXJrUXVlc3Rpb25MaXN0RGlydHkoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIG9iamVjdCwgUGFuZWwvUGFnZS4gRWxlbWVudHMgY2FuIGJlIHF1ZXN0aW9ucyBvciBwYW5lbHMuIFRoZSBmdW5jdGlvbiBkb2Vzbid0IHJldHVybiBlbGVtZW50cyBpbiB0aGUgbmVzdGVkIFBhbmVscy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50c1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBlbGVtZW50IGJlbG9uZ3MgdG8gdGhlIFBhbmVsL1BhZ2UuIEl0IGxvb2tzIGluIG5lc3RlZCBQYW5lbHMgYXMgd2VsbC5cbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgY29udGFpbnNFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWw6IGFueSA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWwgPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7XG4gICAgICB2YXIgcG5sID0gZWwuZ2V0UGFuZWwoKTtcbiAgICAgIGlmICghIXBubCkge1xuICAgICAgICBpZiAoKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmNvbnRhaW5zRWxlbWVudChlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gcmVxdWlyZSB0aGUgYW5zd2VyIGF0IGxlYXN0IGluIG9uZSBxdWVzdGlvbiBpbiB0aGUgcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzUmVxdWlyZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlcXVpcmVkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgdHJ1ZSB0aGUgUGFuZWwvUGFnZSBiZWNvbWVzIHJlcXVpcmVkLlxuICAgKiBUaGUgbGlicmFyeSBydW5zIHRoZSBleHByZXNzaW9uIG9uIHN1cnZleSBzdGFydCBhbmQgb24gY2hhbmdpbmcgYSBxdWVzdGlvbiB2YWx1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGVtcHR5IHRoZW4gaXNSZXF1aXJlZCBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIGlzUmVxdWlyZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZXF1aXJlZElmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlcXVpcmVkSWZcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiB0aGVyZSBpcyBhbiBlcnJvciBvbiB0aGlzIFBhZ2Ugb3IgaW5zaWRlIHRoZSBjdXJyZW50IFBhbmVsXG4gICAqIEBwYXJhbSBmaXJlQ2FsbGJhY2sgc2V0IGl0IHRvIHRydWUsIHRvIHNob3cgZXJyb3JzIGluIFVJXG4gICAqIEBwYXJhbSBmb2N1c09uRmlyc3RFcnJvciBzZXQgaXQgdG8gdHJ1ZSB0byBmb2N1cyBvbiB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBkb2Vzbid0IHBhc3MgdGhlIHZhbGlkYXRpb25cbiAgICovXG4gIHB1YmxpYyBoYXNFcnJvcnMoXG4gICAgZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSxcbiAgICBmb2N1c09uRmlyc3RFcnJvcjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIHJlYzogYW55ID0gbnVsbFxuICApOiBib29sZWFuIHtcbiAgICByZWMgPSAhIXJlY1xuICAgICAgPyByZWNcbiAgICAgIDoge1xuICAgICAgICAgIGZpcmVDYWxsYmFjazogZmlyZUNhbGxiYWNrLFxuICAgICAgICAgIGZvY3VzZU9uRmlyc3RFcnJvcjogZm9jdXNPbkZpcnN0RXJyb3IsXG4gICAgICAgICAgZmlyc3RFcnJvclF1ZXN0aW9uOiA8YW55Pm51bGwsXG4gICAgICAgICAgcmVzdWx0OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB0aGlzLmhhc0Vycm9yc0NvcmUocmVjKTtcbiAgICBpZiAocmVjLmZpcnN0RXJyb3JRdWVzdGlvbikge1xuICAgICAgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbi5mb2N1cyh0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYy5yZXN1bHQ7XG4gIH1cbiAgcHJpdmF0ZSBoYXNFcnJvcnNJblBhbmVscyhyZWM6IGFueSkge1xuICAgIHZhciBlcnJvcnMgPSA8QXJyYXk8YW55Pj5bXTtcbiAgICB0aGlzLmhhc1JlcXVpcmVkRXJyb3IocmVjLCBlcnJvcnMpO1xuICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgdmFyIGN1c3RvbUVycm9yID0gdGhpcy5zdXJ2ZXkudmFsaWRhdGVQYW5lbCh0aGlzKTtcbiAgICAgIGlmIChjdXN0b21FcnJvcikge1xuICAgICAgICBlcnJvcnMucHVzaChjdXN0b21FcnJvcik7XG4gICAgICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISFyZWMuZmlyZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IGVycm9ycztcbiAgICB9XG4gIH1cbiAgLy9JU3VydmV5RXJyb3JPd25lclxuICBnZXRFcnJvckN1c3RvbVRleHQodGV4dDogc3RyaW5nLCBlcnJvcjogU3VydmV5RXJyb3IpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMuc3VydmV5KSByZXR1cm4gdGhpcy5zdXJ2ZXkuZ2V0RXJyb3JDdXN0b21UZXh0KHRleHQsIGVycm9yKTtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgaGFzUmVxdWlyZWRFcnJvcihyZWM6IGFueSwgZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBpZiAoIXRoaXMuaXNSZXF1aXJlZCkgcmV0dXJuO1xuICAgIHZhciB2aXNRdWVzdGlvbnMgPSA8QXJyYXk8YW55Pj5bXTtcbiAgICB0aGlzLmFkZFF1ZXN0aW9uc1RvTGlzdCh2aXNRdWVzdGlvbnMsIHRydWUpO1xuICAgIGlmICh2aXNRdWVzdGlvbnMubGVuZ3RoID09IDApIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc1F1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF2aXNRdWVzdGlvbnNbaV0uaXNFbXB0eSgpKSByZXR1cm47XG4gICAgfVxuICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgIGVycm9ycy5wdXNoKG5ldyBPbmVBbnN3ZXJSZXF1aXJlZEVycm9yKHRoaXMucmVxdWlyZWRFcnJvclRleHQsIHRoaXMpKTtcbiAgICBpZiAocmVjLmZvY3VzZU9uRmlyc3RFcnJvciAmJiAhcmVjLmZpcnN0RXJyb3JRdWVzdGlvbikge1xuICAgICAgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbiA9IHZpc1F1ZXN0aW9uc1swXTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGhhc0Vycm9yc0NvcmUocmVjOiBhbnkpIHtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIHZhciBlbGVtZW50ID0gbnVsbDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcblxuICAgICAgaWYgKCFlbGVtZW50LmlzVmlzaWJsZSkgY29udGludWU7XG5cbiAgICAgIGlmIChlbGVtZW50LmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbGVtZW50KSkuaGFzRXJyb3JzQ29yZShyZWMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gPFF1ZXN0aW9uPmVsZW1lbnQ7XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc1JlYWRPbmx5KSBjb250aW51ZTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmhhc0Vycm9ycyhyZWMuZmlyZUNhbGxiYWNrLCByZWMpKSB7XG4gICAgICAgICAgaWYgKHJlYy5mb2N1c2VPbkZpcnN0RXJyb3IgJiYgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZWMuZmlyc3RFcnJvclF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaGFzRXJyb3JzSW5QYW5lbHMocmVjKTtcbiAgICB0aGlzLnVwZGF0ZUNvbnRhaW5zRXJyb3JzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5nZXRDb250YWluc0Vycm9ycygpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZWxlbWVudHNbaV0uY29udGFpbnNFcnJvcnMpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdXBkYXRlRWxlbWVudFZpc2liaWxpdHkoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgKDxCYXNlPig8YW55PmVsKSkuc2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCBlbC5pc1Zpc2libGUpO1xuICAgICAgaWYgKGVsLmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbCkpLnVwZGF0ZUVsZW1lbnRWaXNpYmlsaXR5KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKHdpdGhFcnJvcjogYm9vbGVhbiA9IGZhbHNlKTogUXVlc3Rpb24ge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoIWVsLmlzVmlzaWJsZSkgY29udGludWU7XG4gICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICB2YXIgcmVzID0gKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbCkpLmdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKFxuICAgICAgICAgIHdpdGhFcnJvclxuICAgICAgICApO1xuICAgICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcSA9IDxRdWVzdGlvbj5lbDtcbiAgICAgICAgaWYgKHEuaGFzSW5wdXQgJiYgKCF3aXRoRXJyb3IgfHwgcS5jdXJyZW50RXJyb3JDb3VudCA+IDApKSByZXR1cm4gcTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gZm9jdXMgdGhlIGlucHV0IG9uIHRoZSBmaXJzdCBxdWVzdGlvblxuICAgKi9cbiAgcHVibGljIGZvY3VzRmlyc3RRdWVzdGlvbigpIHtcbiAgICB2YXIgcSA9IHRoaXMuZ2V0Rmlyc3RRdWVzdGlvblRvRm9jdXMoKTtcbiAgICBpZiAoISFxKSB7XG4gICAgICBxLmZvY3VzKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIGl0IHRvIGZvY3VzIHRoZSBpbnB1dCBvZiB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBoYXMgYW4gZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgZm9jdXNGaXJzdEVycm9yUXVlc3Rpb24oKSB7XG4gICAgdmFyIHEgPSB0aGlzLmdldEZpcnN0UXVlc3Rpb25Ub0ZvY3VzKHRydWUpO1xuICAgIGlmICghIXEpIHtcbiAgICAgIHEuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEZpbGwgbGlzdCBhcnJheSB3aXRoIHRoZSBxdWVzdGlvbnMuXG4gICAqIEBwYXJhbSBsaXN0XG4gICAqIEBwYXJhbSB2aXNpYmxlT25seSBzZXQgaXQgdG8gdHJ1ZSB0byBnZXQgdmlzaWJsZSBxdWVzdGlvbnMgb25seVxuICAgKi9cbiAgcHVibGljIGFkZFF1ZXN0aW9uc1RvTGlzdChcbiAgICBsaXN0OiBBcnJheTxJUXVlc3Rpb24+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3QobGlzdCwgdmlzaWJsZU9ubHksIGluY2x1ZGluZ0Rlc2lnblRpbWUsIGZhbHNlKTtcbiAgfVxuICAvKipcbiAgICogRmlsbCBsaXN0IGFycmF5IHdpdGggdGhlIHBhbmVscy5cbiAgICogQHBhcmFtIGxpc3RcbiAgICovXG4gIHB1YmxpYyBhZGRQYW5lbHNJbnRvTGlzdChcbiAgICBsaXN0OiBBcnJheTxJUGFuZWw+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3QoXG4gICAgICA8QXJyYXk8SUVsZW1lbnQ+Pig8QXJyYXk8YW55Pj5saXN0KSxcbiAgICAgIHZpc2libGVPbmx5LFxuICAgICAgaW5jbHVkaW5nRGVzaWduVGltZSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG4gIHByaXZhdGUgYWRkRWxlbWVudHNUb0xpc3QoXG4gICAgbGlzdDogQXJyYXk8SUVsZW1lbnQ+LFxuICAgIHZpc2libGVPbmx5OiBib29sZWFuLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4sXG4gICAgaXNQYW5lbDogYm9vbGVhblxuICApIHtcbiAgICBpZiAodmlzaWJsZU9ubHkgJiYgIXRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3RDb3JlKFxuICAgICAgbGlzdCxcbiAgICAgIHRoaXMuZWxlbWVudHMsXG4gICAgICB2aXNpYmxlT25seSxcbiAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWUsXG4gICAgICBpc1BhbmVsXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGFkZEVsZW1lbnRzVG9MaXN0Q29yZShcbiAgICBsaXN0OiBBcnJheTxJRWxlbWVudD4sXG4gICAgZWxlbWVudHM6IEFycmF5PElFbGVtZW50PixcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbixcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuLFxuICAgIGlzUGFuZWw6IGJvb2xlYW5cbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAodmlzaWJsZU9ubHkgJiYgIWVsLnZpc2libGUpIGNvbnRpbnVlO1xuICAgICAgaWYgKChpc1BhbmVsICYmIGVsLmlzUGFuZWwpIHx8ICghaXNQYW5lbCAmJiAhZWwuaXNQYW5lbCkpIHtcbiAgICAgICAgbGlzdC5wdXNoKGVsKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbC5pc1BhbmVsKSB7XG4gICAgICAgICg8UGFuZWxNb2RlbD5lbCkuYWRkRWxlbWVudHNUb0xpc3RDb3JlKFxuICAgICAgICAgIGxpc3QsXG4gICAgICAgICAgKDxQYW5lbE1vZGVsPmVsKS5lbGVtZW50cyxcbiAgICAgICAgICB2aXNpYmxlT25seSxcbiAgICAgICAgICBpbmNsdWRpbmdEZXNpZ25UaW1lLFxuICAgICAgICAgIGlzUGFuZWxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpbmNsdWRpbmdEZXNpZ25UaW1lKSB7XG4gICAgICAgICAgdGhpcy5hZGRFbGVtZW50c1RvTGlzdENvcmUoXG4gICAgICAgICAgICBsaXN0LFxuICAgICAgICAgICAgKDxTdXJ2ZXlFbGVtZW50Pig8YW55PmVsKSkuZ2V0RWxlbWVudHNJbkRlc2lnbihmYWxzZSksXG4gICAgICAgICAgICB2aXNpYmxlT25seSxcbiAgICAgICAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWUsXG4gICAgICAgICAgICBpc1BhbmVsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IG9iamVjdCBpcyBQYWdlIGFuZCBpdCBpcyB0aGUgY3VycmVudCBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0FjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuc3VydmV5IHx8IDxQYWdlTW9kZWw+dGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2UgPT0gdGhpcy5yb290O1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXRzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBkaWZmZXJlbnQgZnJvbSBcImRlZmF1bHRcIiB0byBzZXQgdGhlIHNwZWNpZmljIHF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uIGZvciB0aGlzIHBhbmVsL3BhZ2UuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvblRpdGxlTG9jYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICBnZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vbkdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbilcbiAgICAgIHJldHVybiB0aGlzLm9uR2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk7XG4gICAgaWYgKHRoaXMucXVlc3Rpb25UaXRsZUxvY2F0aW9uICE9IFwiZGVmYXVsdFwiKVxuICAgICAgcmV0dXJuIHRoaXMucXVlc3Rpb25UaXRsZUxvY2F0aW9uO1xuICAgIGlmICh0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpO1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVMb2NhdGlvbiA6IFwidG9wXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0YXJ0SW5kZXgoKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkgcmV0dXJuIHRoaXMucGFyZW50LmdldFF1ZXN0aW9uU3RhcnRJbmRleCgpO1xuICAgIGlmICghIXRoaXMuc3VydmV5KSByZXR1cm4gdGhpcy5zdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4O1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIGdldFF1ZXN0aW9uU3RhcnRJbmRleCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFN0YXJ0SW5kZXgoKTtcbiAgfVxuICBnZXRDaGlsZHJlbkxheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyb3dcIjtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvZ3Jlc3NJbmZvKCk6IElQcm9ncmVzc0luZm8ge1xuICAgIHJldHVybiBTdXJ2ZXlFbGVtZW50LmdldFByb2dyZXNzSW5mb0J5RWxlbWVudHMoXG4gICAgICA8QXJyYXk8U3VydmV5RWxlbWVudD4+KDxhbnk+dGhpcy5lbGVtZW50cyksXG4gICAgICB0aGlzLmlzUmVxdWlyZWRcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcm9vdCgpOiBQYW5lbE1vZGVsQmFzZSB7XG4gICAgdmFyIHJlcyA9IDxQYW5lbE1vZGVsQmFzZT50aGlzO1xuICAgIHdoaWxlIChyZXMucGFyZW50KSByZXMgPSByZXMucGFyZW50O1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGNoaWxkVmlzaWJpbGl0eUNoYW5nZWQoKSB7XG4gICAgdmFyIG5ld0lzVmlzaWJsZVZhbHVlID0gdGhpcy5nZXRJc1BhZ2VWaXNpYmxlKG51bGwpO1xuICAgIHZhciBvbGRJc1Zpc2libGVWYWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCB0cnVlKTtcbiAgICBpZiAobmV3SXNWaXNpYmxlVmFsdWUgIT09IG9sZElzVmlzaWJsZVZhbHVlKSB7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJvdygpOiBRdWVzdGlvblJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUm93TW9kZWwodGhpcyk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0ub25TdXJ2ZXlMb2FkKCk7XG4gICAgfVxuICAgIHRoaXMub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gIH1cbiAgcHVibGljIG9uRmlyc3RSZW5kZXJpbmcoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICB9XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgZ2V0IHJvd3MoKTogQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUm93c0NoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIsIHRoaXMuYnVpbGRSb3dzKCkpO1xuICB9XG4gIHByb3RlY3RlZCBvbkFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICBlbGVtZW50LnNldFN1cnZleUltcGwodGhpcy5zdXJ2ZXlJbXBsKTtcbiAgICBlbGVtZW50LnBhcmVudCA9IHRoaXM7XG4gICAgdGhpcy5tYXJrUXVlc3Rpb25MaXN0RGlydHkoKTtcbiAgICB0aGlzLnVwZGF0ZVJvd3NPbkVsZW1lbnRBZGRlZChlbGVtZW50LCBpbmRleCk7XG4gICAgaWYgKGVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgdmFyIHAgPSA8UGFuZWxNb2RlbD5lbGVtZW50O1xuICAgICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICAgIHRoaXMuc3VydmV5LnBhbmVsQWRkZWQocCwgaW5kZXgsIHRoaXMsIHRoaXMucm9vdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgICB2YXIgcSA9IDxRdWVzdGlvbj5lbGVtZW50O1xuICAgICAgICB0aGlzLnN1cnZleS5xdWVzdGlvbkFkZGVkKHEsIGluZGV4LCB0aGlzLCB0aGlzLnJvb3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISF0aGlzLmFkZEVsZW1lbnRDYWxsYmFjaykgdGhpcy5hZGRFbGVtZW50Q2FsbGJhY2soZWxlbWVudCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcInZpc2libGVcIiwgXCJpc1Zpc2libGVcIl0sXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQoZWxlbWVudCk7XG4gICAgICB9LFxuICAgICAgdGhpcy5pZFxuICAgICk7XG4gICAgKDxCYXNlPig8YW55PmVsZW1lbnQpKS5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwic3RhcnRXaXRoTmV3TGluZVwiLFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLm9uRWxlbWVudFN0YXJ0V2l0aE5ld0xpbmVDaGFuZ2VkKGVsZW1lbnQpO1xuICAgICAgfSxcbiAgICAgIHRoaXMuaWRcbiAgICApO1xuICAgIHRoaXMub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGVsZW1lbnQucGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLm1hcmtRdWVzdGlvbkxpc3REaXJ0eSgpO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkudW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1widmlzaWJsZVwiLCBcImlzVmlzaWJsZVwiLCBcInN0YXJ0V2l0aE5ld0xpbmVcIl0sXG4gICAgICB0aGlzLmlkXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVJvd3NPbkVsZW1lbnRSZW1vdmVkKGVsZW1lbnQpO1xuICAgIGlmICghZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LnF1ZXN0aW9uUmVtb3ZlZCg8UXVlc3Rpb24+ZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnN1cnZleSkgdGhpcy5zdXJ2ZXkucGFuZWxSZW1vdmVkKGVsZW1lbnQpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLnJlbW92ZUVsZW1lbnRDYWxsYmFjaykgdGhpcy5yZW1vdmVFbGVtZW50Q2FsbGJhY2soZWxlbWVudCk7XG4gICAgdGhpcy5vbkVsZW1lbnRWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzKTtcbiAgfVxuICBwcml2YXRlIG9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKGVsZW1lbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVSb3dzVmlzaWJpbGl0eShlbGVtZW50KTtcbiAgICB0aGlzLmNoaWxkVmlzaWJpbGl0eUNoYW5nZWQoKTtcbiAgICBpZiAoISF0aGlzLnBhcmVudCkge1xuICAgICAgdGhpcy5wYXJlbnQub25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQodGhpcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgb25FbGVtZW50U3RhcnRXaXRoTmV3TGluZUNoYW5nZWQoZWxlbWVudDogYW55KSB7XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVSb3dzVmlzaWJpbGl0eShlbGVtZW50OiBhbnkpIHtcbiAgICB2YXIgcm93cyA9IHRoaXMucm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgaWYgKHJvdy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpID4gLTEpIHtcbiAgICAgICAgcm93LnVwZGF0ZVZpc2libGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2FuQnVpbGRSb3dzKCkge1xuICAgIHJldHVybiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB0aGlzLmdldENoaWxkcmVuTGF5b3V0VHlwZSgpID09IFwicm93XCI7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZFJvd3MoKTogQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4ge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuIFtdO1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICB2YXIgaXNOZXdSb3cgPSBpID09IDAgfHwgZWwuc3RhcnRXaXRoTmV3TGluZTtcbiAgICAgIHZhciByb3cgPSBpc05ld1JvdyA/IHRoaXMuY3JlYXRlUm93KCkgOiByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKGlzTmV3Um93KSByZXN1bHQucHVzaChyb3cpO1xuICAgICAgcm93LmFkZEVsZW1lbnQoZWwpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W2ldLnVwZGF0ZVZpc2libGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVJvd3NPbkVsZW1lbnRBZGRlZChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuO1xuICAgIHZhciBkcmFnRHJvcEluZm8gPSBuZXcgRHJhZ0Ryb3BJbmZvKG51bGwsIGVsZW1lbnQpO1xuICAgIGRyYWdEcm9wSW5mby50YXJnZXQgPSBlbGVtZW50O1xuICAgIGRyYWdEcm9wSW5mby5pc0VkZ2UgPSB0aGlzLmVsZW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgaWYgKHRoaXMuZWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmlzQm90dG9tID0gaW5kZXggPiAwO1xuICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uID0gdGhpcy5lbGVtZW50c1sxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbiA9IHRoaXMuZWxlbWVudHNbaW5kZXggLSAxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcmFnRHJvcEFkZFRhcmdldFRvUm93KGRyYWdEcm9wSW5mbywgbnVsbCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVSb3dzT25FbGVtZW50UmVtb3ZlZChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5jYW5CdWlsZFJvd3MoKSkgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlUm93c1JlbW92ZUVsZW1lbnRGcm9tUm93KFxuICAgICAgZWxlbWVudCxcbiAgICAgIHRoaXMuZmluZFJvd0J5RWxlbWVudChlbGVtZW50KVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyhcbiAgICBlbGVtZW50OiBJRWxlbWVudCxcbiAgICByb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKSB7XG4gICAgaWYgKCFyb3cgfHwgIXJvdy5wYW5lbCkgcmV0dXJuO1xuICAgIHZhciBlbEluZGV4ID0gcm93LmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7XG4gICAgaWYgKGVsSW5kZXggPCAwKSByZXR1cm47XG4gICAgcm93LmVsZW1lbnRzLnNwbGljZShlbEluZGV4LCAxKTtcbiAgICBpZiAocm93LmVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyb3cuaW5kZXggPj0gMCkge1xuICAgICAgICByb3cucGFuZWwucm93cy5zcGxpY2Uocm93LmluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaW5kUm93QnlFbGVtZW50KGVsOiBJRWxlbWVudCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHZhciByb3dzID0gdGhpcy5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJvd3NbaV0uZWxlbWVudHMuaW5kZXhPZihlbCkgPiAtMSkgcmV0dXJuIHJvd3NbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGVsZW1lbnRXaWR0aENoYW5nZWQoZWw6IElFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGVsKTtcbiAgICBpZiAoISFyb3cpIHtcbiAgICAgIHJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlbmRlcmVkIHRpdGxlIHRleHQgb3IgaHRtbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkVGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVuZGVyZWRUaXRsZSh0aGlzLmxvY1RpdGxlLnRleHRPckh0bWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRSZW5kZXJlZFRpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yICE9IG51bGxcbiAgICAgID8gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KHN0ciwgdHJ1ZSlcbiAgICAgIDogc3RyO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZ2V0L3NldCB0aGUgb2JqZWN0IHZpc2liaWxpdHkuXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnZpc2libGUpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHZhbHVlKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWaXNpYmxlXCIsIHRoaXMuaXNWaXNpYmxlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIG9iamVjdCBpcyB2aXNpYmxlIG9yIHN1cnZleSBpcyBpbiBkZXNpZ24gbW9kZSByaWdodCBub3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcgfHwgdGhpcy5nZXRJc1BhZ2VWaXNpYmxlKG51bGwpO1xuICB9XG4gIGdldElzUGFnZVZpc2libGUoZXhjZXB0aW9uUXVlc3Rpb246IElRdWVzdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy52aXNpYmxlKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXSA9PSBleGNlcHRpb25RdWVzdGlvbikgY29udGludWU7XG4gICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5pc1Zpc2libGUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlIHx8IGluZGV4IDwgMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHNbaV0uc2V0VmlzaWJsZUluZGV4KC0xKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB2YXIgc3RhcnRJbmRleCA9IGluZGV4O1xuICAgIGluZGV4ICs9IHRoaXMuYmVmb3JlU2V0VmlzaWJsZUluZGV4KGluZGV4KTtcbiAgICB2YXIgcGFuZWxTdGFydEluZGV4ID0gdGhpcy5nZXRQYW5lbFN0YXJ0SW5kZXgoaW5kZXgpO1xuICAgIHZhciBwYW5lbEluZGV4ID0gcGFuZWxTdGFydEluZGV4O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFuZWxJbmRleCArPSB0aGlzLmVsZW1lbnRzW2ldLnNldFZpc2libGVJbmRleChwYW5lbEluZGV4KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNDb250aW51ZU51bWJlcmluZygpKSB7XG4gICAgICBpbmRleCArPSBwYW5lbEluZGV4IC0gcGFuZWxTdGFydEluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXggLSBzdGFydEluZGV4O1xuICB9XG4gIHByb3RlY3RlZCBiZWZvcmVTZXRWaXNpYmxlSW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFBhbmVsU3RhcnRJbmRleChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbiAgcHJvdGVjdGVkIGlzQ29udGludWVOdW1iZXJpbmcoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiByZWFkT25seSBwcm9wZXJ0eSBpcyB0cnVlIG9yIHN1cnZleSBpcyBpbiBkaXNwbGF5IG1vZGUgb3IgcGFyZW50IHBhbmVsL3BhZ2UgaXMgcmVhZE9ubHkuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubW9kZWxcbiAgICogQHNlZSByZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHZhciBpc1BhcmVudFJlYWRPbmx5ID0gISF0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc1JlYWRPbmx5O1xuICAgIHZhciBpc1N1cnZleVJlYWRPbmx5ID0gISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rpc3BsYXlNb2RlO1xuICAgIHJldHVybiB0aGlzLnJlYWRPbmx5IHx8IGlzUGFyZW50UmVhZE9ubHkgfHwgaXNTdXJ2ZXlSZWFkT25seTtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSA8U3VydmV5RWxlbWVudD4oPGFueT50aGlzLmVsZW1lbnRzW2ldKTtcbiAgICAgIGVsLnNldFByb3BlcnR5VmFsdWUoXCJpc1JlYWRPbmx5XCIsIGVsLmlzUmVhZE9ubHkpO1xuICAgIH1cbiAgICBzdXBlci5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVFbGVtZW50Q3NzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gPFN1cnZleUVsZW1lbnQ+KDxhbnk+dGhpcy5lbGVtZW50c1tpXSk7XG4gICAgICBlbC51cGRhdGVFbGVtZW50Q3NzKCk7XG4gICAgfVxuICAgIHN1cGVyLnVwZGF0ZUVsZW1lbnRDc3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBQYW5lbC9QYWdlIGJlY29tZXMgcmVhZCBvbmx5IGFuZCBhbiBlbmQtdXNlciB3aWxsIG5vdCBhYmxlIHRvIGFuc3dlciBvbiBxdXN0aW9ucyBpbnNpZGUgaXQuXG4gICAqIFRoZSBsaWJyYXJ5IHJ1bnMgdGhlIGV4cHJlc3Npb24gb24gc3VydmV5IHN0YXJ0IGFuZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZhbHVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZW1wdHkgdGhlbiByZWFkT25seSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBlbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGFuIGVsZW1lbnQgaW50byBQYW5lbCBvciBQYWdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgYWRkZWQgc3VjY2Vzc2Z1bGx5LiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS5cbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwdWJsaWMgYWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlciA9IC0xKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZEVsZW1lbnQoZWxlbWVudCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAwLCBlbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNhbkFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFlbGVtZW50ICYmIGVsZW1lbnQuaXNMYXlvdXRUeXBlU3VwcG9ydGVkKHRoaXMuZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCkpXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcXVlc3Rpb24gaW50byBQYW5lbCBvciBQYWdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIGFkZGVkIHN1Y2Nlc3NmdWxseS4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuXG4gICAqIEBwYXJhbSBxdWVzdGlvblxuICAgKiBAcGFyYW0gaW5kZXggZWxlbWVudCBpbmRleCBpbiB0aGUgZWxlbWVudHMgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBhZGRRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24sIGluZGV4OiBudW1iZXIgPSAtMSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZEVsZW1lbnQocXVlc3Rpb24sIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcGFuZWwgaW50byBQYW5lbCBvciBQYWdlLiAgUmV0dXJucyB0cnVlIGlmIHRoZSBwYW5lbCBhZGRlZCBzdWNjZXNzZnVsbHkuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLlxuICAgKiBAcGFyYW0gcGFuZWxcbiAgICogQHBhcmFtIGluZGV4IGVsZW1lbnQgaW5kZXggaW4gdGhlIGVsZW1lbnRzIGFycmF5XG4gICAqL1xuICBwdWJsaWMgYWRkUGFuZWwocGFuZWw6IFBhbmVsTW9kZWwsIGluZGV4OiBudW1iZXIgPSAtMSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkZEVsZW1lbnQocGFuZWwsIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBxdWVzdGlvbiBhbmQgYWRkcyBpdCBhdCBsb2NhdGlvbiBvZiBpbmRleCwgYnkgZGVmYXVsdCB0aGUgZW5kIG9mIHRoZSBlbGVtZW50cyBsaXN0LiBSZXR1cm5zIG51bGwsIGlmIHRoZSBxdWVzdGlvbiBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciBjb3VsZCBub3QgYmUgYWRkZWQgaW50byBwYWdlIG9yIHBhbmVsLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25UeXBlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBcInRleHRcIiwgXCJjaGVja2JveFwiLCBcImRyb3Bkb3duXCIsIFwibWF0cml4XCIsIFwiaHRtbFwiLCBcIm1hdHJpeGR5bmFtaWNcIiwgXCJtYXRyaXhkcm9wZG93blwiIGFuZCBzbyBvbi5cbiAgICogQHBhcmFtIG5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBpbmRleCBlbGVtZW50IGluZGV4IGluIHRoZSBlbGVtZW50cyBhcnJheVxuICAgKi9cbiAgcHVibGljIGFkZE5ld1F1ZXN0aW9uKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgaW5kZXg6IG51bWJlciA9IC0xXG4gICk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb24gPSBRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UuY3JlYXRlUXVlc3Rpb24ocXVlc3Rpb25UeXBlLCBuYW1lKTtcbiAgICBpZiAoIXRoaXMuYWRkUXVlc3Rpb24ocXVlc3Rpb24sIGluZGV4KSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBhbmVsIGFuZCBhZGRzIGl0IGludG8gdGhlIGVuZCBvZiB0aGUgZWxlbWVudHMgbGlzdC4gUmV0dXJucyBudWxsLCBpZiB0aGUgcGFuZWwgY291bGQgbm90IGJlIGNyZWF0ZWQgb3IgY291bGQgbm90IGJlIGFkZGVkIGludG8gcGFnZSBvciBwYW5lbC5cbiAgICogQHBhcmFtIG5hbWUgYSBwYW5lbCBuYW1lXG4gICAqL1xuICBwdWJsaWMgYWRkTmV3UGFuZWwobmFtZTogc3RyaW5nID0gbnVsbCk6IFBhbmVsTW9kZWwge1xuICAgIHZhciBwYW5lbCA9IHRoaXMuY3JlYXRlTmV3UGFuZWwobmFtZSk7XG4gICAgaWYgKCF0aGlzLmFkZFBhbmVsKHBhbmVsKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHBhbmVsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBlbGVtZW50IHBhcmFtZXRlciBpbiB0aGUgZWxlbWVudHMgbGlzdC5cbiAgICogQHBhcmFtIGVsZW1lbnQgcXVlc3Rpb24gb3IgcGFuZWxcbiAgICovXG4gIHB1YmxpYyBpbmRleE9mKGVsZW1lbnQ6IElFbGVtZW50KTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbChuYW1lOiBzdHJpbmcpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFBhbmVsTW9kZWwobmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBlbGVtZW50IChQYW5lbCBvciBRdWVzdGlvbikgZnJvbSB0aGUgZWxlbWVudHMgbGlzdC5cbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICogQHNlZSBlbGVtZW50c1xuICAgKi9cbiAgcHVibGljIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmVsZW1lbnRzLmluZGV4T2YoZWxlbWVudCk7XG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnRzW2ldLnJlbW92ZUVsZW1lbnQoZWxlbWVudCkpIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSBxdWVzdGlvbiAgZnJvbSB0aGUgZWxlbWVudHMgbGlzdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uXG4gICAqIEBzZWUgZWxlbWVudHNcbiAgICogQHNlZSByZW1vdmVFbGVtZW50XG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgdGhpcy5yZW1vdmVFbGVtZW50KHF1ZXN0aW9uKTtcbiAgfVxuICBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzLnNsaWNlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgZWxlbWVudHNbaV0ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmcpIHtcbiAgICAgIHRoaXMucnVuVmlzaWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLnJ1bkVuYWJsZUNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuUmVxdWlyZWRDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1blZpc2libGVDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMudmlzaWJsZUlmKSByZXR1cm47XG4gICAgdmFyIGNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy52aXNpYmxlSWYpO1xuICAgIGNvbmRpdGlvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy52aXNpYmxlID0gcmVzO1xuICAgIH07XG4gICAgY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcnVuRW5hYmxlQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLmVuYWJsZUlmKSByZXR1cm47XG4gICAgdmFyIGNvbmRpdGlvblJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy5lbmFibGVJZik7XG4gICAgY29uZGl0aW9uUnVubmVyLm9uUnVuQ29tcGxldGUgPSAocmVzOiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnJlYWRPbmx5ID0gIXJlcztcbiAgICB9O1xuICAgIGNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1blJlcXVpcmVkQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKSB7XG4gICAgaWYgKCF0aGlzLnJlcXVpcmVkSWYpIHJldHVybjtcbiAgICB2YXIgY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnJlcXVpcmVkSWYpO1xuICAgIGNvbmRpdGlvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy5pc1JlcXVpcmVkID0gcmVzO1xuICAgIH07XG4gICAgY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIHZhciBlbHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlbHNbaV0ub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgfVxuICB9XG4gIGNoZWNrQmluZGluZ3ModmFsdWVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgZWxzID0gdGhpcy5lbGVtZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgKDxCYXNlPig8YW55PmVsc1tpXSkpLmNoZWNrQmluZGluZ3ModmFsdWVOYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBkcmFnRHJvcEFkZFRhcmdldChkcmFnRHJvcEluZm86IERyYWdEcm9wSW5mbykge1xuICAgIHZhciBwcmV2Um93ID0gdGhpcy5kcmFnRHJvcEZpbmRSb3coZHJhZ0Ryb3BJbmZvLnRhcmdldCk7XG4gICAgaWYgKHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb1JvdyhkcmFnRHJvcEluZm8sIHByZXZSb3cpKSB7XG4gICAgICB0aGlzLnVwZGF0ZVJvd3NSZW1vdmVFbGVtZW50RnJvbVJvdyhkcmFnRHJvcEluZm8udGFyZ2V0LCBwcmV2Um93KTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGRyYWdEcm9wRmluZFJvdyhmaW5kRWxlbWVudDogSVN1cnZleUVsZW1lbnQpOiBRdWVzdGlvblJvd01vZGVsIHtcbiAgICBpZiAoIWZpbmRFbGVtZW50IHx8IGZpbmRFbGVtZW50LmlzUGFnZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGVsZW1lbnQgPSA8SUVsZW1lbnQ+ZmluZEVsZW1lbnQ7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocm93c1tpXS5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpID4gLTEpIHJldHVybiByb3dzW2ldO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwbmwgPSB0aGlzLmVsZW1lbnRzW2ldLmdldFBhbmVsKCk7XG4gICAgICBpZiAoIXBubCkgY29udGludWU7XG4gICAgICB2YXIgcm93ID0gKDxQYW5lbE1vZGVsQmFzZT5wbmwpLmRyYWdEcm9wRmluZFJvdyhlbGVtZW50KTtcbiAgICAgIGlmICghIXJvdykgcmV0dXJuIHJvdztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcEFkZFRhcmdldFRvUm93KFxuICAgIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvLFxuICAgIHByZXZSb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkcmFnRHJvcEluZm8uZGVzdGluYXRpb24pIHJldHVybiB0cnVlO1xuICAgIGlmICh0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsKGRyYWdEcm9wSW5mbykpIHJldHVybiB0cnVlO1xuICAgIHZhciBkZXN0ID0gZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uO1xuICAgIHZhciBkZXN0Um93ID0gdGhpcy5kcmFnRHJvcEZpbmRSb3coZGVzdCk7XG4gICAgaWYgKCFkZXN0Um93KSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWRyYWdEcm9wSW5mby50YXJnZXQuc3RhcnRXaXRoTmV3TGluZSlcbiAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FeGlzdGluZ1JvdyhcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLFxuICAgICAgICBkZXN0Um93LFxuICAgICAgICBwcmV2Um93XG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9OZXdSb3coZHJhZ0Ryb3BJbmZvLCBkZXN0Um93LCBwcmV2Um93KTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsKGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvKTogYm9vbGVhbiB7XG4gICAgaWYgKGRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbi5pc1BhZ2UpIHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0VtcHR5UGFuZWxDb3JlKFxuICAgICAgICB0aGlzLnJvb3QsXG4gICAgICAgIGRyYWdEcm9wSW5mby50YXJnZXQsXG4gICAgICAgIGRyYWdEcm9wSW5mby5pc0JvdHRvbVxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgZGVzdCA9IDxJRWxlbWVudD5kcmFnRHJvcEluZm8uZGVzdGluYXRpb247XG4gICAgaWYgKGRlc3QuaXNQYW5lbCAmJiAhZHJhZ0Ryb3BJbmZvLmlzRWRnZSkge1xuICAgICAgdmFyIHBhbmVsID0gPFBhbmVsTW9kZWxCYXNlPig8YW55PmRlc3QpO1xuICAgICAgaWYgKCg8YW55PmRyYWdEcm9wSW5mby50YXJnZXQpW1widGVtcGxhdGVcIl0gPT09IGRlc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBkcmFnRHJvcEluZm8ubmVzdGVkUGFuZWxEZXB0aCA8IDAgfHxcbiAgICAgICAgZHJhZ0Ryb3BJbmZvLm5lc3RlZFBhbmVsRGVwdGggPj0gcGFuZWwuZGVwdGhcbiAgICAgICkge1xuICAgICAgICB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsQ29yZShcbiAgICAgICAgICA8UGFuZWxNb2RlbEJhc2U+KDxhbnk+ZGVzdCksXG4gICAgICAgICAgZHJhZ0Ryb3BJbmZvLnRhcmdldCxcbiAgICAgICAgICBkcmFnRHJvcEluZm8uaXNCb3R0b21cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9FeGlzdGluZ1JvdyhcbiAgICBkcmFnRHJvcEluZm86IERyYWdEcm9wSW5mbyxcbiAgICBkZXN0Um93OiBRdWVzdGlvblJvd01vZGVsLFxuICAgIHByZXZSb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIGluZGV4ID0gZGVzdFJvdy5lbGVtZW50cy5pbmRleE9mKDxJRWxlbWVudD5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24pO1xuICAgIGlmIChcbiAgICAgIGluZGV4ID09IDAgJiZcbiAgICAgICFkcmFnRHJvcEluZm8uaXNCb3R0b20gJiZcbiAgICAgIGRlc3RSb3cuZWxlbWVudHNbMF0uc3RhcnRXaXRoTmV3TGluZVxuICAgICkge1xuICAgICAgaWYgKGRlc3RSb3cuaW5kZXggPiAwKSB7XG4gICAgICAgIGRyYWdEcm9wSW5mby5pc0JvdHRvbSA9IHRydWU7XG4gICAgICAgIGRlc3RSb3cgPSBkZXN0Um93LnBhbmVsLnJvd3NbZGVzdFJvdy5pbmRleCAtIDFdO1xuICAgICAgICBkcmFnRHJvcEluZm8uZGVzdGluYXRpb24gPVxuICAgICAgICAgIGRlc3RSb3cuZWxlbWVudHNbZGVzdFJvdy5lbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BBZGRUYXJnZXRUb0V4aXN0aW5nUm93KFxuICAgICAgICAgIGRyYWdEcm9wSW5mbyxcbiAgICAgICAgICBkZXN0Um93LFxuICAgICAgICAgIHByZXZSb3dcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyYWdEcm9wQWRkVGFyZ2V0VG9OZXdSb3coZHJhZ0Ryb3BJbmZvLCBkZXN0Um93LCBwcmV2Um93KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHByZXZSb3dJbmRleCA9IC0xO1xuICAgIGlmIChwcmV2Um93ID09IGRlc3RSb3cpIHtcbiAgICAgIHByZXZSb3dJbmRleCA9IGRlc3RSb3cuZWxlbWVudHMuaW5kZXhPZihkcmFnRHJvcEluZm8udGFyZ2V0KTtcbiAgICB9XG4gICAgaWYgKGRyYWdEcm9wSW5mby5pc0JvdHRvbSkgaW5kZXgrKztcbiAgICB2YXIgc3JjUm93ID0gdGhpcy5maW5kUm93QnlFbGVtZW50KGRyYWdEcm9wSW5mby5zb3VyY2UpO1xuICAgIGlmIChcbiAgICAgIHNyY1JvdyA9PSBkZXN0Um93ICYmXG4gICAgICBzcmNSb3cuZWxlbWVudHMuaW5kZXhPZihkcmFnRHJvcEluZm8uc291cmNlKSA9PSBpbmRleFxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaW5kZXggPT0gcHJldlJvd0luZGV4KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHByZXZSb3dJbmRleCA+IC0xKSB7XG4gICAgICBkZXN0Um93LmVsZW1lbnRzLnNwbGljZShwcmV2Um93SW5kZXgsIDEpO1xuICAgICAgaWYgKHByZXZSb3dJbmRleCA8IGluZGV4KSBpbmRleC0tO1xuICAgIH1cbiAgICBkZXN0Um93LmVsZW1lbnRzLnNwbGljZShpbmRleCwgMCwgZHJhZ0Ryb3BJbmZvLnRhcmdldCk7XG4gICAgZGVzdFJvdy51cGRhdGVWaXNpYmxlKCk7XG4gICAgcmV0dXJuIHByZXZSb3dJbmRleCA8IDA7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcEFkZFRhcmdldFRvTmV3Um93KFxuICAgIGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvLFxuICAgIGRlc3RSb3c6IFF1ZXN0aW9uUm93TW9kZWwsXG4gICAgcHJldlJvdzogUXVlc3Rpb25Sb3dNb2RlbFxuICApOiBib29sZWFuIHtcbiAgICB2YXIgdGFyZ2V0Um93ID0gZGVzdFJvdy5wYW5lbC5jcmVhdGVSb3coKTtcbiAgICB0YXJnZXRSb3cuYWRkRWxlbWVudChkcmFnRHJvcEluZm8udGFyZ2V0KTtcbiAgICB2YXIgaW5kZXggPSBkZXN0Um93LmluZGV4O1xuICAgIGlmIChkcmFnRHJvcEluZm8uaXNCb3R0b20pIHtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICAgIC8vc2FtZSByb3dcbiAgICBpZiAoISFwcmV2Um93ICYmIHByZXZSb3cucGFuZWwgPT0gdGFyZ2V0Um93LnBhbmVsICYmIHByZXZSb3cuaW5kZXggPT0gaW5kZXgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHNyY1JvdyA9IHRoaXMuZmluZFJvd0J5RWxlbWVudChkcmFnRHJvcEluZm8uc291cmNlKTtcbiAgICBpZiAoXG4gICAgICAhIXNyY1JvdyAmJlxuICAgICAgc3JjUm93LnBhbmVsID09IHRhcmdldFJvdy5wYW5lbCAmJlxuICAgICAgc3JjUm93LmVsZW1lbnRzLmxlbmd0aCA9PSAxICYmXG4gICAgICBzcmNSb3cuaW5kZXggPT0gaW5kZXhcbiAgICApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgZGVzdFJvdy5wYW5lbC5yb3dzLnNwbGljZShpbmRleCwgMCwgdGFyZ2V0Um93KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQWRkVGFyZ2V0VG9FbXB0eVBhbmVsQ29yZShcbiAgICBwYW5lbDogUGFuZWxNb2RlbEJhc2UsXG4gICAgdGFyZ2V0OiBJRWxlbWVudCxcbiAgICBpc0JvdHRvbTogYm9vbGVhblxuICApIHtcbiAgICB2YXIgdGFyZ2V0Um93ID0gcGFuZWwuY3JlYXRlUm93KCk7XG4gICAgdGFyZ2V0Um93LmFkZEVsZW1lbnQodGFyZ2V0KTtcbiAgICBpZiAocGFuZWwuZWxlbWVudHMubGVuZ3RoID09IDAgfHwgaXNCb3R0b20pIHtcbiAgICAgIHBhbmVsLnJvd3MucHVzaCh0YXJnZXRSb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYW5lbC5yb3dzLnNwbGljZSgwLCAwLCB0YXJnZXRSb3cpO1xuICAgIH1cbiAgfVxuICBkcmFnRHJvcE1vdmVFbGVtZW50KHNyYzogSUVsZW1lbnQsIHRhcmdldDogSUVsZW1lbnQsIHRhcmdldEluZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgc3JjSW5kZXggPSAoPFBhbmVsTW9kZWxCYXNlPnNyYy5wYXJlbnQpLmVsZW1lbnRzLmluZGV4T2Yoc3JjKTtcbiAgICBpZiAodGFyZ2V0SW5kZXggPiBzcmNJbmRleCkge1xuICAgICAgdGFyZ2V0SW5kZXgtLTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVFbGVtZW50KHNyYyk7XG4gICAgdGhpcy5hZGRFbGVtZW50KHRhcmdldCwgdGFyZ2V0SW5kZXgpO1xuICB9XG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuZWxlbWVudHMuc3BsaWNlKDAsIHRoaXMuZWxlbWVudHMubGVuZ3RoKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgY29udGFpbmVyIGVsZW1lbnQsIHNpbWlsYXIgdG8gdGhlIFBhZ2Ugb2JqZWN0cy4gSG93ZXZlciwgdW5saWtlIHRoZSBQYWdlLCBQYW5lbCBjYW4ndCBiZSBhIHJvb3QuXG4gKiBJdCBtYXkgY29udGFpbiBxdWVzdGlvbnMgYW5kIG90aGVyIHBhbmVscy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBhbmVsTW9kZWxcbiAgZXh0ZW5kcyBQYW5lbE1vZGVsQmFzZVxuICBpbXBsZW1lbnRzIElFbGVtZW50LCBJVGl0bGVPd25lciB7XG4gIHN0YXRlQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgbWluV2lkdGg/OiBzdHJpbmc7XG4gIHB1YmxpYyBtYXhXaWR0aD86IHN0cmluZztcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInN0YXRlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLnN0YXRlQ2hhbmdlZENhbGxiYWNrKSBzZWxmLnN0YXRlQ2hhbmdlZENhbGxiYWNrKCk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcIndpZHRoXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghIXNlbGYucGFyZW50KSB7XG4gICAgICAgIHNlbGYucGFyZW50LmVsZW1lbnRXaWR0aENoYW5nZWQoc2VsZik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiaW5kZW50XCIsIFwiaW5uZXJJbmRlbnRcIiwgXCJyaWdodEluZGVudFwiXSxcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5vbkluZGVudENoYW5nZWQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicGFuZWxcIjtcbiAgfVxuICBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5vbkluZGVudENoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHBhZ2Ugd2hlcmUgdGhlIHBhbmVsIGlzIGxvY2F0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2UoKTogSVBhZ2Uge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2UodGhpcy5wYXJlbnQpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFnZSh2YWw6IElQYWdlKSB7XG4gICAgdGhpcy5zZXRQYWdlKHRoaXMucGFyZW50LCB2YWwpO1xuICB9XG4gIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgaWYgKCEhdGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucmVtb3ZlU2VsZkZyb21MaXN0KHRoaXMucGFyZW50LmVsZW1lbnRzKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIFwiY29sbGFwc2VkXCIgdG8gcmVuZGVyIG9ubHkgUGFuZWwgdGl0bGUgYW5kIGV4cGFuZGVkIGJ1dHRvbiBhbmQgdG8gXCJleHBhbmRlZFwiIHRvIHJlbmRlciB0aGUgY29sbGFwc2VkIGJ1dHRvbiBpbiB0aGUgUGFuZWwgY2FwdGlvblxuICAgKi9cbiAgcHVibGljIGdldCBzdGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdGF0ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXRlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RhdGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBQYW5lbCBpcyBpbiB0aGUgY29sbGFwc2VkIHN0YXRlXG4gICAqIEBzZWUgc3RhdGVcbiAgICogQHNlZSBjb2xsYXBzZVxuICAgKiBAc2VlIGlzRXhwYW5kZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNDb2xsYXBzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUgPT0gXCJjb2xsYXBzZWRcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBQYW5lbCBpcyBpbiB0aGUgZXhwYW5kZWQgc3RhdGVcbiAgICogQHNlZSBzdGF0ZVxuICAgKiBAc2VlIGV4cGFuZFxuICAgKiBAc2VlIGlzQ29sbGFwc2VkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRXhwYW5kZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUgPT0gXCJleHBhbmRlZFwiO1xuICB9XG4gIC8qKlxuICAgKiBDb2xsYXBzZSB0aGUgUGFuZWxcbiAgICogQHNlZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGNvbGxhcHNlKCkge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIHRoaXMuc3RhdGUgPSBcImNvbGxhcHNlZFwiO1xuICB9XG4gIC8qKlxuICAgKiBFeHBhbmQgdGhlIFBhbmVsXG4gICAqIEBzZWUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBleHBhbmQoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IFwiZXhwYW5kZWRcIjtcbiAgfVxuICAvKipcbiAgICogTW92ZSBwYW5lbCB0byBhIG5ldyBjb250YWluZXIgUGFnZS9QYW5lbC4gQWRkIGFzIGEgbGFzdCBlbGVtZW50IGlmIGluc2VydEJlZm9yZSBwYXJhbWV0ZXIgaXMgbm90IHVzZWQgb3IgaW5zZXJ0ZWQgaW50byB0aGUgZ2l2ZW4gaW5kZXgsXG4gICAqIGlmIGluc2VydCBwYXJhbWV0ZXIgaXMgbnVtYmVyLCBvciBiZWZvcmUgdGhlIGdpdmVuIGVsZW1lbnQsIGlmIHRoZSBpbnNlcnRCZWZvcmUgcGFyYW1ldGVyIGlzIGEgcXVlc3Rpb24gb3IgcGFuZWxcbiAgICogQHBhcmFtIGNvbnRhaW5lciBQYWdlIG9yIFBhbmVsIHRvIHdoZXJlIGEgcXVlc3Rpb24gaXMgcmVsb2NhdGVkLlxuICAgKiBAcGFyYW0gaW5zZXJ0QmVmb3JlIFVzZSBpdCBpZiB5b3Ugd2FudCB0byBzZXQgdGhlIHBhbmVsIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24uIFlvdSBtYXkgdXNlIGEgbnVtYmVyICh1c2UgMCB0byBpbnNlcnQgaW50IHRoZSBiZWdpbm5pbmcpIG9yIGVsZW1lbnQsIGlmIHlvdSB3YW50IHRvIGluc2VydCBiZWZvcmUgdGhpcyBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIG1vdmVUbyhjb250YWluZXI6IElQYW5lbCwgaW5zZXJ0QmVmb3JlOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW92ZVRvQmFzZSh0aGlzLnBhcmVudCwgY29udGFpbmVyLCBpbnNlcnRCZWZvcmUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2aXNpYmxlIGluZGV4IG9mIHRoZSBwYW5lbCBpbiB0aGUgc3VydmV5LiBDb21tb25seSBpdCBpcyAtMSBhbmQgaXQgZG9lc24ndCBzaG93LlxuICAgKiBZb3UgaGF2ZSB0byBzZXQgc2hvd051bWJlciB0byB0cnVlIHRvIHNob3cgaW5kZXgvbnVtYmVyaW5nIGZvciB0aGUgUGFuZWxcbiAgICogQHNlZSBzaG93TnVtYmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgLTEpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgc2hvd051bWJlciB0byB0cnVlIHRvIHN0YXJ0IHNob3dpbmcgdGhlIG51bWJlciBmb3IgdGhpcyBwYW5lbC5cbiAgICogQHNlZSB2aXNpYmxlSW5kZXhcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd051bWJlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd051bWJlclwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93TnVtYmVyKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dOdW1iZXJcIiwgdmFsKTtcbiAgICB0aGlzLm5vdGlmeVN1cnZleU9uVmlzaWJpbGl0eUNoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgdGhhdCBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50cyBudW1iZXJzIGluc2lkZSBwYW5lbCBhcmUgZGlzcGxheWVkLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgZGVmYXVsdGAgLSBkaXNwbGF5IHF1ZXN0aW9ucyBudW1iZXJzIGFzIGRlZmluZWQgaW4gcGFyZW50IHBhbmVsIG9yIHN1cnZleVxuICAgKiAtIGBvbnBhbmVsYCAtIGRpc3BsYXkgcXVlc3Rpb25zIG51bWJlcnMsIHN0YXJ0IG51bWJlcmluZyBmcm9tIGJlZ2lubmluZyBvZiB0aGlzIHBhZ2VcbiAgICogLSBgb2ZmYCAtIHR1cm4gb2ZmIHRoZSBudW1iZXJpbmcgZm9yIHF1ZXN0aW9ucyB0aXRsZXNcbiAgICogQHNlZSBzaG93TnVtYmVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dRdWVzdGlvbk51bWJlcnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCBcImRlZmF1bHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsIHZhbHVlKTtcbiAgICB0aGlzLm5vdGlmeVN1cnZleU9uVmlzaWJpbGl0eUNoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBmaXJzdCBxdWVzdGlvbiBpbmRleCBmb3IgZWxlbWVudHMgaW5zaWRlIHRoZSBwYW5lbC4gVGhlIGZpcnN0IHF1ZXN0aW9uIGluZGV4IGlzICcxLicgYnkgZGVmYXVsdCBhbmQgaXQgaXMgdGFrZW4gZnJvbSBzdXJ2ZXkucXVlc3Rpb25TdGFydEluZGV4IHByb3BlcnR5LlxuICAgKiBZb3UgbWF5IHN0YXJ0IGl0IGZyb20gJzEwMCcgb3IgZnJvbSAnQScsIGJ5IHNldHRpbmcgJzEwMCcgb3IgJ0EnIHRvIHRoaXMgcHJvcGVydHkuXG4gICAqIFlvdSBjYW4gc2V0IHRoZSBzdGFydCBpbmRleCB0byBcIigxKVwiIG9yIFwiIyBBKVwiIG9yIFwiYSlcIiB0byByZW5kZXIgcXVlc3Rpb24gbnVtYmVyIGFzICgxKSwgIyBBKSBhbmQgYSkgYWNjb3JkaW5nbHkuXG4gICAqIEBzZWUgc3VydmV5LnF1ZXN0aW9uU3RhcnRJbmRleFxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvblN0YXJ0SW5kZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25TdGFydEluZGV4XCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25TdGFydEluZGV4KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25TdGFydEluZGV4XCIsIHZhbCk7XG4gIH1cbiAgZ2V0UXVlc3Rpb25TdGFydEluZGV4KCk6IHN0cmluZyB7XG4gICAgaWYgKCEhdGhpcy5xdWVzdGlvblN0YXJ0SW5kZXgpIHJldHVybiB0aGlzLnF1ZXN0aW9uU3RhcnRJbmRleDtcbiAgICByZXR1cm4gc3VwZXIuZ2V0UXVlc3Rpb25TdGFydEluZGV4KCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSByZXR1cm5zIHRoZSBxdWVzdGlvbiBudW1iZXIuIElmIHF1ZXN0aW9uIGlzIGludmlzaWJsZSB0aGVuIGl0IHJldHVybnMgZW1wdHkgc3RyaW5nLlxuICAgKiBJZiB2aXNpYmxlSW5kZXggaXMgMSwgdGhlbiBubyBpcyAyLCBvciAnQicgaWYgc3VydmV5LnF1ZXN0aW9uU3RhcnRJbmRleCBpcyAnQScuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25TdGFydEluZGV4XG4gICAqL1xuICBwdWJsaWMgZ2V0IG5vKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5vXCIsIFwiXCIpO1xuICB9XG4gIHByb3RlY3RlZCBzZXRObyh2aXNpYmxlSW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcbiAgICAgIFwibm9cIixcbiAgICAgIEhlbHBlcnMuZ2V0TnVtYmVyQnlJbmRleCh0aGlzLnZpc2libGVJbmRleCwgdGhpcy5nZXRTdGFydEluZGV4KCkpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgYmVmb3JlU2V0VmlzaWJsZUluZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCB2aXNpYmxlSW5kZXggPSAtMTtcbiAgICBpZiAodGhpcy5zaG93TnVtYmVyICYmICh0aGlzLmlzRGVzaWduTW9kZSB8fCAhdGhpcy5sb2NUaXRsZS5pc0VtcHR5KSkge1xuICAgICAgdmlzaWJsZUluZGV4ID0gaW5kZXg7XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJbmRleFwiLCB2aXNpYmxlSW5kZXgpO1xuICAgIHRoaXMuc2V0Tm8odmlzaWJsZUluZGV4KTtcbiAgICByZXR1cm4gdmlzaWJsZUluZGV4IDwgMCA/IDAgOiAxO1xuICB9XG4gIHByb3RlY3RlZCBnZXRQYW5lbFN0YXJ0SW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9mZlwiKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9ucGFuZWxcIikgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG4gIHByb3RlY3RlZCBpc0NvbnRpbnVlTnVtYmVyaW5nKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgIT0gXCJvZmZcIiAmJiB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgIT0gXCJvbnBhbmVsXCJcbiAgICApO1xuICB9XG4gIHByaXZhdGUgbm90aWZ5U3VydmV5T25WaXNpYmlsaXR5Q2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5zdXJ2ZXkgIT0gbnVsbCAmJiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5zdXJ2ZXkucGFuZWxWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBoYXNFcnJvcnNDb3JlKHJlYzogYW55KSB7XG4gICAgc3VwZXIuaGFzRXJyb3JzQ29yZShyZWMpO1xuICAgIGlmICh0aGlzLmlzQ29sbGFwc2VkICYmIHJlYy5yZXN1bHQgJiYgcmVjLmZpcmVDYWxsYmFjaykge1xuICAgICAgdGhpcy5leHBhbmQoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJlbmRlcmVkVGl0bGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghc3RyKSB7XG4gICAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCB8fCB0aGlzLmlzRXhwYW5kZWQpIHJldHVybiB0aGlzLm5hbWU7XG4gICAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiBcIltcIiArIHRoaXMubmFtZSArIFwiXVwiO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuZ2V0UmVuZGVyZWRUaXRsZShzdHIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgUGFuZWwgd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgd2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGVmdCBpbmRlbnQuIFNldCB0aGlzIHByb3BlcnR5IHRvIGluY3JlYXNlIHRoZSBwYW5lbCBsZWZ0IGluZGVudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImluZGVudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluZGVudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImluZGVudFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5uZXIgaW5kZW50LiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBpbmNyZWFzZSB0aGUgcGFuZWwgY29udGVudCBtYXJnaW4uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlubmVySW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlubmVySW5kZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5uZXJJbmRlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbm5lckluZGVudFwiLCB2YWwpO1xuICB9XG4gIGdldCByZW5kZXJXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJXaWR0aFwiKTtcbiAgfVxuICBzZXQgcmVuZGVyV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgUGFuZWwgcmVuZGVycyBvbiB0aGUgbmV3IGxpbmUgaWYgdGhlIHByb3BlcnR5IGlzIHRydWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBmYWxzZSwgdGhlIHBhbmVsIHRyaWVzIHRvIHJlbmRlciBvbiB0aGUgc2FtZSBsaW5lL3JvdyB3aXRoIGEgcHJldmlvdXMgcXVlc3Rpb24vcGFuZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXJ0V2l0aE5ld0xpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0YXJ0V2l0aE5ld0xpbmVcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzdGFydFdpdGhOZXdMaW5lKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RhcnRXaXRoTmV3TGluZVwiLCB2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSByaWdodCBpbmRlbnQgb2YgdGhlIFBhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCByaWdodEluZGVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyaWdodEluZGVudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJpZ2h0SW5kZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmlnaHRJbmRlbnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgcGFkZGluZ0xlZnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ0xlZnRcIiwgXCJcIik7XG4gIH1cbiAgc2V0IHBhZGRpbmdMZWZ0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ0xlZnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgaW5uZXJQYWRkaW5nTGVmdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbm5lclBhZGRpbmdMZWZ0XCIsIFwiXCIpO1xuICB9XG4gIHNldCBpbm5lclBhZGRpbmdMZWZ0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5uZXJQYWRkaW5nTGVmdFwiLCB2YWwpO1xuICB9XG4gIGdldCBwYWRkaW5nUmlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZ1JpZ2h0XCIsIFwiXCIpO1xuICB9XG4gIHNldCBwYWRkaW5nUmlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nUmlnaHRcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIG9uSW5kZW50Q2hhbmdlZCgpIHtcbiAgICB0aGlzLmlubmVyUGFkZGluZ0xlZnQgPSB0aGlzLmdldEluZGVudFNpemUodGhpcy5pbm5lckluZGVudCk7XG4gICAgdGhpcy5wYWRkaW5nTGVmdCA9IHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLmluZGVudCk7XG4gICAgdGhpcy5wYWRkaW5nUmlnaHQgPSB0aGlzLmdldEluZGVudFNpemUodGhpcy5yaWdodEluZGVudCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRJbmRlbnRTaXplKGluZGVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoaW5kZW50IDwgMSkgcmV0dXJuIFwiXCI7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybiBcIlwiO1xuICAgIHZhciBjc3MgPSAoPGFueT50aGlzKS5zdXJ2ZXlbXCJjc3NcIl07XG4gICAgaWYgKCFjc3MpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBpbmRlbnQgKiBjc3MucXVlc3Rpb24uaW5kZW50ICsgXCJweFwiO1xuICB9XG4gIHB1YmxpYyBjbGVhck9uRGVsZXRpbmdDb250YWluZXIoKSB7XG4gICAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFF1ZXN0aW9uIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQYW5lbE1vZGVsKSB7XG4gICAgICAgIGVsZW1lbnQuY2xlYXJPbkRlbGV0aW5nQ29udGFpbmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNFZGl0QnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5zdGF0ZSA9PSBcInByZXZpZXdcIikgcmV0dXJuIHRoaXMuZGVwdGggPT0gMTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGNhbmNlbFByZXZpZXcoKSB7XG4gICAgaWYgKCF0aGlzLmhhc0VkaXRCdXR0b24pIHJldHVybjtcbiAgICB0aGlzLnN1cnZleS5jYW5jZWxQcmV2aWV3QnlQYWdlKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIHRoaXMubm90aWZ5U3VydmV5T25WaXNpYmlsaXR5Q2hhbmdlZCgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicGFuZWxiYXNlXCIsXG4gIFtcbiAgICBcIm5hbWVcIixcbiAgICB7XG4gICAgICBuYW1lOiBcImVsZW1lbnRzXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwicXVlc3Rpb25zXCIsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiBcInF1ZXN0aW9uXCIsXG4gICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgIGlzTGlnaHRTZXJpYWxpemFibGU6IGZhbHNlLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcInZpc2libGU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJlbmFibGVJZjpjb25kaXRpb25cIixcbiAgICBcInJlcXVpcmVkSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJyZWFkT25seTpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJoaWRkZW5cIl0sXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidGl0bGVcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7IG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGVzY3JpcHRpb25cIiB9LFxuICBdLFxuICBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBQYW5lbE1vZGVsQmFzZSgpO1xuICB9XG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInBhbmVsXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcInN0YXRlXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJjb2xsYXBzZWRcIiwgXCJleHBhbmRlZFwiXSxcbiAgICB9LFxuICAgIFwiaXNSZXF1aXJlZDpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJyZXF1aXJlZEVycm9yVGV4dDp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUmVxdWlyZWRFcnJvclRleHRcIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJzdGFydFdpdGhOZXdMaW5lOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIFwid2lkdGhcIixcbiAgICB7IG5hbWU6IFwiaW5uZXJJbmRlbnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIGNob2ljZXM6IFswLCAxLCAyLCAzXSB9LFxuICAgIHsgbmFtZTogXCJpbmRlbnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIGNob2ljZXM6IFswLCAxLCAyLCAzXSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGFnZVwiLFxuICAgICAgaXNTZXJpYWxpemFibGU6IGZhbHNlLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgICAgdmFyIHN1cnZleSA9IG9iaiA/IG9iai5zdXJ2ZXkgOiBudWxsO1xuICAgICAgICByZXR1cm4gIXN1cnZleSB8fCBzdXJ2ZXkucGFnZXMubGVuZ3RoID4gMTtcbiAgICAgIH0sXG4gICAgICBjaG9pY2VzOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgICAgdmFyIHN1cnZleSA9IG9iaiA/IG9iai5zdXJ2ZXkgOiBudWxsO1xuICAgICAgICByZXR1cm4gc3VydmV5XG4gICAgICAgICAgPyBzdXJ2ZXkucGFnZXMubWFwKChwOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHAubmFtZSwgdGV4dDogcC50aXRsZSB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IFtdO1xuICAgICAgfSxcbiAgICB9LFxuICAgIFwic2hvd051bWJlcjpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJvbnBhbmVsXCIsIFwib2ZmXCJdLFxuICAgIH0sXG4gICAgXCJxdWVzdGlvblN0YXJ0SW5kZXhcIixcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbCgpO1xuICB9LFxuICBcInBhbmVsYmFzZVwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BhbmVsLnRzIiwiaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFRleHRQcmVQcm9jZXNzb3JJdGVtIHtcbiAgcHVibGljIHN0YXJ0OiBudW1iZXI7XG4gIHB1YmxpYyBlbmQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFRleHRQcmVQcm9jZXNzb3JWYWx1ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzRXhpc3RzID0gZmFsc2U7XG4gICAgdGhpcy5jYW5Qcm9jZXNzID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgdmFsdWU6IGFueTtcbiAgcHVibGljIGlzRXhpc3RzOiBib29sZWFuO1xuICBwdWJsaWMgY2FuUHJvY2VzczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFRleHRQcmVQcm9jZXNzb3Ige1xuICBwcml2YXRlIGhhc0FsbFZhbHVlc09uTGFzdFJ1blZhbHVlOiBib29sZWFuO1xuICBwdWJsaWMgb25Qcm9jZXNzOiAodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpID0+IHZvaWQ7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgcHVibGljIHByb2Nlc3MoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGRvRW5jb2Rpbmc6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBzdHJpbmcge1xuICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSB0cnVlO1xuICAgIGlmICghdGV4dCkgcmV0dXJuIHRleHQ7XG4gICAgaWYgKCF0aGlzLm9uUHJvY2VzcykgcmV0dXJuIHRleHQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5nZXRJdGVtcyh0ZXh0KTtcbiAgICBmb3IgKHZhciBpID0gaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBpdGVtID0gaXRlbXNbaV07XG4gICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0TmFtZSh0ZXh0LnN1YnN0cmluZyhpdGVtLnN0YXJ0ICsgMSwgaXRlbS5lbmQpKTtcbiAgICAgIGlmICghbmFtZSkgY29udGludWU7XG4gICAgICB2YXIgdGV4dFZhbHVlID0gbmV3IFRleHRQcmVQcm9jZXNzb3JWYWx1ZShuYW1lLCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgICAgdGhpcy5vblByb2Nlc3ModGV4dFZhbHVlKTtcbiAgICAgIGlmICghdGV4dFZhbHVlLmlzRXhpc3RzKSB7XG4gICAgICAgIGlmICh0ZXh0VmFsdWUuY2FuUHJvY2Vzcykge1xuICAgICAgICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh0ZXh0VmFsdWUudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXBsYWNlZFZhbHVlID0gIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRleHRWYWx1ZS52YWx1ZSlcbiAgICAgICAgPyB0ZXh0VmFsdWUudmFsdWVcbiAgICAgICAgOiBcIlwiO1xuICAgICAgaWYgKGRvRW5jb2RpbmcpIHtcbiAgICAgICAgcmVwbGFjZWRWYWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudChyZXBsYWNlZFZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHRleHQgPVxuICAgICAgICB0ZXh0LnN1YnN0cigwLCBpdGVtLnN0YXJ0KSArIHJlcGxhY2VkVmFsdWUgKyB0ZXh0LnN1YnN0cihpdGVtLmVuZCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0FsbFZhbHVlc09uTGFzdFJ1bigpIHtcbiAgICByZXR1cm4gISF0aGlzLmhhc0FsbFZhbHVlc09uTGFzdFJ1blZhbHVlO1xuICB9XG4gIHByaXZhdGUgZ2V0SXRlbXModGV4dDogc3RyaW5nKTogQXJyYXk8VGV4dFByZVByb2Nlc3Nvckl0ZW0+IHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB2YXIgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XG4gICAgdmFyIHN0YXJ0ID0gLTE7XG4gICAgdmFyIGNoID0gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBjaCA9IHRleHRbaV07XG4gICAgICBpZiAoY2ggPT0gXCJ7XCIpIHN0YXJ0ID0gaTtcbiAgICAgIGlmIChjaCA9PSBcIn1cIikge1xuICAgICAgICBpZiAoc3RhcnQgPiAtMSkge1xuICAgICAgICAgIHZhciBpdGVtID0gbmV3IFRleHRQcmVQcm9jZXNzb3JJdGVtKCk7XG4gICAgICAgICAgaXRlbS5zdGFydCA9IHN0YXJ0O1xuICAgICAgICAgIGl0ZW0uZW5kID0gaTtcbiAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0ID0gLTE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuICBwcml2YXRlIGdldE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICByZXR1cm4gbmFtZS50cmltKCk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy90ZXh0UHJlUHJvY2Vzc29yLnRzIiwiaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi8uLi9zZXR0aW5nc1wiO1xuZnVuY3Rpb24gY29tcGFyZVZlcnNpb25zKGE6IGFueSwgYjogYW55KSB7XG4gIHZhciBpLCBkaWZmO1xuICB2YXIgcmVnRXhTdHJpcDAgPSAvKFxcLjArKSskLztcbiAgdmFyIHNlZ21lbnRzQSA9IGEucmVwbGFjZShyZWdFeFN0cmlwMCwgXCJcIikuc3BsaXQoXCIuXCIpO1xuICB2YXIgc2VnbWVudHNCID0gYi5yZXBsYWNlKHJlZ0V4U3RyaXAwLCBcIlwiKS5zcGxpdChcIi5cIik7XG4gIHZhciBsID0gTWF0aC5taW4oc2VnbWVudHNBLmxlbmd0aCwgc2VnbWVudHNCLmxlbmd0aCk7XG5cbiAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIGRpZmYgPSBwYXJzZUludChzZWdtZW50c0FbaV0sIDEwKSAtIHBhcnNlSW50KHNlZ21lbnRzQltpXSwgMTApO1xuICAgIGlmIChkaWZmKSB7XG4gICAgICByZXR1cm4gZGlmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNlZ21lbnRzQS5sZW5ndGggLSBzZWdtZW50c0IubGVuZ3RoO1xufVxuZnVuY3Rpb24gY29uZmlybUFjdGlvbihtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCEhc2V0dGluZ3MgJiYgISFzZXR0aW5ncy5jb25maXJtQWN0aW9uRnVuYylcbiAgICByZXR1cm4gc2V0dGluZ3MuY29uZmlybUFjdGlvbkZ1bmMobWVzc2FnZSk7XG4gIHJldHVybiBjb25maXJtKG1lc3NhZ2UpO1xufVxuZnVuY3Rpb24gZGV0ZWN0SUVCcm93c2VyKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICB2YXIgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgdmFyIG9sZEllID0gdWEuaW5kZXhPZihcIk1TSUUgXCIpO1xuICB2YXIgZWxldmVuSWUgPSB1YS5pbmRleE9mKFwiVHJpZGVudC9cIik7XG5cbiAgcmV0dXJuIG9sZEllID4gLTEgfHwgZWxldmVuSWUgPiAtMTtcbn1cbmZ1bmN0aW9uIGRldGVjdElFT3JFZGdlKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mICg8YW55PmRldGVjdElFT3JFZGdlKS5pc0lFT3JFZGdlID09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcbiAgICB2YXIgbXNpZSA9IHVhLmluZGV4T2YoXCJNU0lFIFwiKTtcbiAgICB2YXIgdHJpZGVudCA9IHVhLmluZGV4T2YoXCJUcmlkZW50L1wiKTtcbiAgICB2YXIgZWRnZSA9IHVhLmluZGV4T2YoXCJFZGdlL1wiKTtcbiAgICAoPGFueT5kZXRlY3RJRU9yRWRnZSkuaXNJRU9yRWRnZSA9IGVkZ2UgPiAwIHx8IHRyaWRlbnQgPiAwIHx8IG1zaWUgPiAwO1xuICB9XG4gIHJldHVybiAoPGFueT5kZXRlY3RJRU9yRWRnZSkuaXNJRU9yRWRnZTtcbn1cbmZ1bmN0aW9uIGxvYWRGaWxlRnJvbUJhc2U2NChiNjREYXRhOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYnl0ZVN0cmluZyA9IGF0b2IoYjY0RGF0YS5zcGxpdChcIixcIilbMV0pO1xuXG4gICAgLy8gc2VwYXJhdGUgb3V0IHRoZSBtaW1lIGNvbXBvbmVudFxuICAgIHZhciBtaW1lU3RyaW5nID0gYjY0RGF0YS5zcGxpdChcIixcIilbMF0uc3BsaXQoXCI6XCIpWzFdLnNwbGl0KFwiO1wiKVswXTtcblxuICAgIC8vIHdyaXRlIHRoZSBieXRlcyBvZiB0aGUgc3RyaW5nIHRvIGFuIEFycmF5QnVmZmVyXG4gICAgdmFyIGFiID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmcubGVuZ3RoKTtcbiAgICB2YXIgaWEgPSBuZXcgVWludDhBcnJheShhYik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlU3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpYVtpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgLy8gd3JpdGUgdGhlIEFycmF5QnVmZmVyIHRvIGEgYmxvYiwgYW5kIHlvdSdyZSBkb25lXG4gICAgdmFyIGJiID0gbmV3IEJsb2IoW2FiXSwgeyB0eXBlOiBtaW1lU3RyaW5nIH0pO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgIHdpbmRvdy5uYXZpZ2F0b3IgJiZcbiAgICAgIHdpbmRvdy5uYXZpZ2F0b3IubXNTYXZlQmxvYlxuICAgICkge1xuICAgICAgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKGJiLCBmaWxlTmFtZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHt9XG59XG5mdW5jdGlvbiBpc01vYmlsZSgpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiB3aW5kb3cub3JpZW50YXRpb24gIT09IFwidW5kZWZpbmVkXCJcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudFZpc2libGUoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICB0aHJlc2hvbGQ6IG51bWJlciA9IDAsXG4gIG1vZGU6IFwidmlzaWJsZVwiIHwgXCJhYm92ZVwiIHwgXCJiZWxvd1wiID0gXCJ2aXNpYmxlXCJcbikge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZmFsc2U7XG4gIHZhciBlbGVtZW50UmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciB2aWV3SGVpZ2h0ID0gTWF0aC5tYXgoXG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxcbiAgICB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgKTtcbiAgdmFyIGlzQWJvdmUgPSBlbGVtZW50UmVjdC5ib3R0b20gLSB0aHJlc2hvbGQgPCAwO1xuICB2YXIgaXNCZWxvdyA9IGVsZW1lbnRSZWN0LnRvcCAtIHZpZXdIZWlnaHQgKyB0aHJlc2hvbGQgPj0gMDtcblxuICByZXR1cm4gbW9kZSA9PT0gXCJhYm92ZVwiXG4gICAgPyBpc0Fib3ZlXG4gICAgOiBtb2RlID09PSBcImJlbG93XCJcbiAgICA/IGlzQmVsb3dcbiAgICA6ICFpc0Fib3ZlICYmICFpc0JlbG93O1xufVxuZnVuY3Rpb24gZmluZFNjcm9sbGFibGVQYXJlbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiA8YW55PndpbmRvdztcbiAgfVxuICBpZiAoXG4gICAgZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBlbGVtZW50LmNsaWVudEhlaWdodCAmJlxuICAgIChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLm92ZXJmbG93WSA9PT0gXCJzY3JvbGxcIiB8fFxuICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5vdmVyZmxvd1kgPT09IFwiYXV0b1wiKVxuICApIHtcbiAgICBpZihlbGVtZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gPGFueT53aW5kb3c7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaW5kU2Nyb2xsYWJsZVBhcmVudChlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICB9XG59XG5leHBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIGNvbmZpcm1BY3Rpb24sXG4gIGRldGVjdElFT3JFZGdlLFxuICBkZXRlY3RJRUJyb3dzZXIsXG4gIGxvYWRGaWxlRnJvbUJhc2U2NCxcbiAgaXNNb2JpbGUsXG4gIGlzRWxlbWVudFZpc2libGUsXG4gIGZpbmRTY3JvbGxhYmxlUGFyZW50LFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy91dGlscy91dGlscy50cyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vc3VydmV5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlOYXZpZ2F0aW9uQmFzZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxhbnksIGFueT4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7IHVwZGF0ZTogMCB9O1xuICB9XG4gIHByb3RlY3RlZCBnZXQgc3VydmV5KCk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5zdXJ2ZXk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBjc3MoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jc3M7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0ZUZ1bmN0aW9uOiBhbnkgPSBudWxsO1xuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHRoaXMudXBkYXRlU3RhdGVGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLnNldFN0YXRlKHsgdXBkYXRlOiBzZWxmLnN0YXRlLnVwZGF0ZSArIDEgfSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5zdXJ2ZXkub25QYWdlVmlzaWJsZUNoYW5nZWQuYWRkKHRoaXMudXBkYXRlU3RhdGVGdW5jdGlvbik7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnVwZGF0ZVN0YXRlRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuc3VydmV5Lm9uUGFnZVZpc2libGVDaGFuZ2VkLnJlbW92ZSh0aGlzLnVwZGF0ZVN0YXRlRnVuY3Rpb24pO1xuICAgICAgdGhpcy51cGRhdGVTdGF0ZUZ1bmN0aW9uID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdFN1cnZleU5hdmlnYXRpb25CYXNlLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgUmVhY3RTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlLFxufSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgSVN1cnZleUNyZWF0b3IsXG4gIFN1cnZleVF1ZXN0aW9uLFxuICBTdXJ2ZXlRdWVzdGlvbkFuZEVycm9yc0NlbGwsXG59IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25cIjtcbmltcG9ydCB7XG4gIE1hdHJpeERyb3Bkb3duQ2VsbCxcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyxcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCxcbn0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uQ2hlY2tib3hJdGVtIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmNoZWNrYm94XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvblJhZGlvSXRlbSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25yYWRpb2dyb3VwXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbk1hdHJpeERyb3Bkb3duQmFzZSBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZTtcbiAgfVxuICBwcml2YXRlIGdldFN0YXRlKHByZXZTdGF0ZTogYW55ID0gbnVsbCkge1xuICAgIHJldHVybiB7IHJvd0NvdW50ZXI6ICFwcmV2U3RhdGUgPyAwIDogcHJldlN0YXRlLnJvd0NvdW50ZXIgKyAxIH07XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzQ2hhbmdlZENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTdGF0ZU9uQ2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgcmVuZGVyZWRUYWJsZVJlc2V0Q2FsbGJhY2soKSB7XG4gICAgdGhpcy5xdWVzdGlvbi5vblJlbmRlcmVkVGFibGVSZXNldENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVTdGF0ZU9uQ2FsbGJhY2soKTtcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgdXBkYXRlU3RhdGVPbkNhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLmlzUmVuZGVyaW5nKSByZXR1cm47XG4gICAgdGhpcy5zZXRTdGF0ZSh0aGlzLmdldFN0YXRlKHRoaXMuc3RhdGUpKTtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZVJvd3NDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbmRlcmVkVGFibGVSZXNldENhbGxiYWNrKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnJlbmRlclRhYmxlRGl2KCk7XG4gIH1cbiAgcmVuZGVyVGFibGVEaXYoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBoZWFkZXIgPSB0aGlzLnJlbmRlckhlYWRlcigpO1xuICAgIHZhciBmb290ZXJzID0gdGhpcy5yZW5kZXJGb290ZXIoKTtcbiAgICB2YXIgcm93cyA9IHRoaXMucmVuZGVyUm93cygpO1xuICAgIHZhciBkaXZTdHlsZSA9IHRoaXMucXVlc3Rpb24uaG9yaXpvbnRhbFNjcm9sbFxuICAgICAgPyAoeyBvdmVyZmxvd1g6IFwic2Nyb2xsXCIgfSBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzKVxuICAgICAgOiAoe30gYXMgUmVhY3QuQ1NTUHJvcGVydGllcyk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgc3R5bGU9e2RpdlN0eWxlfT5cbiAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLnJvb3R9PlxuICAgICAgICAgIHtoZWFkZXJ9XG4gICAgICAgICAge3Jvd3N9XG4gICAgICAgICAge2Zvb3RlcnN9XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHJlbmRlckhlYWRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIHRhYmxlID0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlO1xuICAgIGlmICghdGFibGUuc2hvd0hlYWRlcikgcmV0dXJuIG51bGw7XG4gICAgdmFyIGhlYWRlcnM6IGFueVtdID0gW107XG4gICAgdmFyIGNlbGxzID0gdGFibGUuaGVhZGVyUm93LmNlbGxzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjZWxsID0gY2VsbHNbaV07XG4gICAgICB2YXIga2V5ID0gXCJjb2x1bW5cIiArIGk7XG4gICAgICB2YXIgY29sdW1uU3R5bGU6IGFueSA9IHt9O1xuICAgICAgaWYgKCEhY2VsbC53aWR0aCkge1xuICAgICAgICBjb2x1bW5TdHlsZS53aWR0aCA9IGNlbGwud2lkdGg7XG4gICAgICB9XG4gICAgICBpZiAoISFjZWxsLm1pbldpZHRoKSB7XG4gICAgICAgIGNvbHVtblN0eWxlLm1pbldpZHRoID0gY2VsbC5taW5XaWR0aDtcbiAgICAgIH1cbiAgICAgIHZhciBjb2x1bW5UaXRsZSA9IHRoaXMucmVuZGVyTG9jU3RyaW5nKGNlbGwubG9jVGl0bGUpO1xuICAgICAgdmFyIHJlcXVpcmVkU3BhY2UgPSAhIWNlbGwucmVxdWlyZWRUZXh0ID8gPHNwYW4+Jm5ic3A7PC9zcGFuPiA6IG51bGw7XG4gICAgICB2YXIgcmVxdWlyZWRUZXh0ID0gISFjZWxsLnJlcXVpcmVkVGV4dCA/IChcbiAgICAgICAgPHNwYW4+e2NlbGwucmVxdWlyZWRUZXh0fTwvc3Bhbj5cbiAgICAgICkgOiBudWxsO1xuICAgICAgaGVhZGVycy5wdXNoKFxuICAgICAgICA8dGhcbiAgICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5oZWFkZXJDZWxsfVxuICAgICAgICAgIGtleT17a2V5fVxuICAgICAgICAgIHN0eWxlPXtjb2x1bW5TdHlsZX1cbiAgICAgICAgPlxuICAgICAgICAgIHtjb2x1bW5UaXRsZX1cbiAgICAgICAgICB7cmVxdWlyZWRTcGFjZX1cbiAgICAgICAgICB7cmVxdWlyZWRUZXh0fVxuICAgICAgICA8L3RoPlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPntoZWFkZXJzfTwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgICk7XG4gIH1cbiAgcmVuZGVyRm9vdGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgdGFibGUgPSB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGU7XG4gICAgaWYgKCF0YWJsZS5zaG93Rm9vdGVyKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcm93ID0gdGhpcy5yZW5kZXJSb3coXG4gICAgICBcImZvb3RlclwiLFxuICAgICAgdGFibGUuZm9vdGVyUm93LFxuICAgICAgdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzXG4gICAgKTtcbiAgICByZXR1cm4gPHRmb290Pntyb3d9PC90Zm9vdD47XG4gIH1cbiAgcmVuZGVyUm93cygpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgdmFyIHJvd3MgPSBbXTtcbiAgICB2YXIgcmVuZGVyZWRSb3dzID0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLnJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZW5kZXJlZFJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJvd3MucHVzaChcbiAgICAgICAgdGhpcy5yZW5kZXJSb3cocmVuZGVyZWRSb3dzW2ldLmlkLCByZW5kZXJlZFJvd3NbaV0sIGNzc0NsYXNzZXMpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gPHRib2R5Pntyb3dzfTwvdGJvZHk+O1xuICB9XG4gIHJlbmRlclJvdyhcbiAgICBrZXlWYWx1ZTogYW55LFxuICAgIHJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93LFxuICAgIGNzc0NsYXNzZXM6IGFueVxuICApOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIG1hdHJpeHJvdyA9IFtdO1xuICAgIHZhciBjZWxscyA9IHJvdy5jZWxscztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBtYXRyaXhyb3cucHVzaCh0aGlzLnJlbmRlckNlbGwoY2VsbHNbaV0sIGksIGNzc0NsYXNzZXMpKTtcbiAgICB9XG4gICAgdmFyIGtleSA9IFwicm93XCIgKyBrZXlWYWx1ZTtcbiAgICByZXR1cm4gPHRyIGtleT17a2V5fT57bWF0cml4cm93fTwvdHI+O1xuICB9XG4gIHJlbmRlckNlbGwoXG4gICAgY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGNzc0NsYXNzZXM6IGFueVxuICApOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGtleSA9IFwiY2VsbFwiICsgaW5kZXg7XG4gICAgaWYgKGNlbGwuaGFzUXVlc3Rpb24pIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTdXJ2ZXlRdWVzdGlvbk1hdHJpeERyb3Bkb3duQ2VsbFxuICAgICAgICAgIGtleT17a2V5fVxuICAgICAgICAgIGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9XG4gICAgICAgICAgY2VsbD17Y2VsbH1cbiAgICAgICAgICBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgY2VsbENvbnRlbnQgPSBudWxsO1xuICAgIHZhciByZXF1aXJlZFNwYWNlID0gbnVsbDtcbiAgICB2YXIgcmVxdWlyZWRUZXh0ID0gbnVsbDtcbiAgICB2YXIgY2VsbFN0eWxlOiBhbnkgPSBudWxsO1xuICAgIGlmICghIWNlbGwud2lkdGggfHwgISFjZWxsLm1pbldpZHRoKSB7XG4gICAgICBjZWxsU3R5bGUgPSB7fTtcbiAgICAgIGlmICghIWNlbGwud2lkdGgpIGNlbGxTdHlsZS53aWR0aCA9IGNlbGwud2lkdGg7XG4gICAgICBpZiAoISFjZWxsLm1pbldpZHRoKSBjZWxsU3R5bGUubWluV2lkdGggPSBjZWxsLm1pbldpZHRoO1xuICAgIH1cbiAgICBpZiAoY2VsbC5oYXNUaXRsZSkge1xuICAgICAgY2VsbENvbnRlbnQgPSB0aGlzLnJlbmRlckxvY1N0cmluZyhjZWxsLmxvY1RpdGxlKTtcbiAgICAgIGlmIChjZWxsLnJlcXVpcmVkVGV4dCkge1xuICAgICAgICByZXF1aXJlZFNwYWNlID0gPHNwYW4+Jm5ic3A7PC9zcGFuPjtcbiAgICAgICAgcmVxdWlyZWRUZXh0ID0gPHNwYW4+e2NlbGwucmVxdWlyZWRUZXh0fTwvc3Bhbj47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjZWxsLmlzUmVtb3ZlUm93KSB7XG4gICAgICBjZWxsQ29udGVudCA9IHRoaXMucmVuZGVyUmVtb3ZlQnV0dG9uKGNlbGwucm93KTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDx0ZCBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuY2VsbH0ga2V5PXtrZXl9IHN0eWxlPXtjZWxsU3R5bGV9PlxuICAgICAgICB7Y2VsbENvbnRlbnR9XG4gICAgICAgIHtyZXF1aXJlZFNwYWNlfVxuICAgICAgICB7cmVxdWlyZWRUZXh0fVxuICAgICAgPC90ZD5cbiAgICApO1xuICB9XG4gIHJlbmRlclJlbW92ZUJ1dHRvbihyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbk1hdHJpeERyb3Bkb3duQ2VsbCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uQW5kRXJyb3JzQ2VsbCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY2VsbCgpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jZWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvbigpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHEgPSBzdXBlci5nZXRRdWVzdGlvbigpO1xuICAgIGlmICghIXEpIHJldHVybiBxO1xuICAgIHJldHVybiAhIXRoaXMuY2VsbCA/IHRoaXMuY2VsbC5xdWVzdGlvbiA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGRvQWZ0ZXJSZW5kZXIoKSB7XG4gICAgdmFyIGVsID0gdGhpcy5jZWxsUmVmLmN1cnJlbnQ7XG4gICAgaWYgKFxuICAgICAgZWwgJiZcbiAgICAgIHRoaXMuY2VsbCAmJlxuICAgICAgdGhpcy5xdWVzdGlvbiAmJlxuICAgICAgdGhpcy5xdWVzdGlvbi5zdXJ2ZXkgJiZcbiAgICAgIGVsLmdldEF0dHJpYnV0ZShcImRhdGEtcmVuZGVyZWRcIikgIT09IFwiclwiXG4gICAgKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXJlbmRlcmVkXCIsIFwiclwiKTtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBjZWxsOiB0aGlzLmNlbGwsXG4gICAgICAgIGNlbGxRdWVzdGlvbjogdGhpcy5xdWVzdGlvbixcbiAgICAgICAgaHRtbEVsZW1lbnQ6IGVsLFxuICAgICAgICByb3c6IHRoaXMuY2VsbC5yb3csXG4gICAgICAgIGNvbHVtbjogdGhpcy5jZWxsLmNlbGwuY29sdW1uLFxuICAgICAgfTtcbiAgICAgIHRoaXMucXVlc3Rpb24uc3VydmV5Lm1hdHJpeEFmdGVyQ2VsbFJlbmRlcih0aGlzLnF1ZXN0aW9uLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldFNob3dFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucXVlc3Rpb24uaXNWaXNpYmxlICYmXG4gICAgICAoIXRoaXMuY2VsbC5pc0Nob2ljZSB8fCB0aGlzLmNlbGwuaXNGaXJzdENob2ljZSlcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDZWxsQ2xhc3MoKTogYW55IHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmNlbGwucXVlc3Rpb247XG5cbiAgICB2YXIgY2VsbENsYXNzID0gdGhpcy5jZWxsLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbVZhbHVlO1xuXG4gICAgaWYgKHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggIT09IDApXG4gICAgICBjZWxsQ2xhc3MgKz0gXCIgXCIgKyBxdWVzdGlvbi5jc3NDbGFzc2VzLmhhc0Vycm9yO1xuXG4gICAgY2VsbENsYXNzICs9IFwiIFwiICsgcXVlc3Rpb24uY3NzQ2xhc3Nlcy5hc0NlbGw7XG5cbiAgICByZXR1cm4gY2VsbENsYXNzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDZWxsU3R5bGUoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuY2VsbC5pc0Nob2ljZSkge1xuICAgICAgdmFyIHJlczogYW55ID0gc3VwZXIuZ2V0Q2VsbFN0eWxlKCk7XG4gICAgICBpZiAoISF0aGlzLmNlbGwud2lkdGggfHwgISF0aGlzLmNlbGwubWluV2lkdGgpIHtcbiAgICAgICAgaWYgKCFyZXMpIHJlcyA9IHt9O1xuICAgICAgICBpZiAoISF0aGlzLmNlbGwud2lkdGgpIHJlcy53aWR0aCA9IHRoaXMuY2VsbC53aWR0aDtcbiAgICAgICAgaWYgKCEhdGhpcy5jZWxsLm1pbldpZHRoKSByZXMubWluV2lkdGggPSB0aGlzLmNlbGwubWluV2lkdGg7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiB7IHRleHRBbGlnbjogXCJjZW50ZXJcIiB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEhlYWRlclRleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgY29sdW1uID0gdGhpcy5jZWxsLmNlbGwgJiYgdGhpcy5jZWxsLmNlbGwuY29sdW1uO1xuICAgIHJldHVybiAhIShjb2x1bW4gJiYgY29sdW1uLmxvY1RpdGxlKSA/IGNvbHVtbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwgOiBcIlwiO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJRdWVzdGlvbigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLmNlbGwuaXNDaG9pY2UpXG4gICAgICByZXR1cm4gU3VydmV5UXVlc3Rpb24ucmVuZGVyUXVlc3Rpb25Cb2R5KHRoaXMuY3JlYXRvciwgdGhpcy5xdWVzdGlvbik7XG4gICAgaWYgKHRoaXMuY2VsbC5pc0NoZWNrYm94KSByZXR1cm4gdGhpcy5yZW5kZXJDZWxsQ2hlY2tib3hCdXR0b24oKTtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJDZWxsUmFkaW9ncm91cEJ1dHRvbigpO1xuICB9XG4gIHByaXZhdGUgcmVuZGVyQ2VsbENoZWNrYm94QnV0dG9uKCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIga2V5ID0gdGhpcy5jZWxsLnF1ZXN0aW9uLmlkICsgXCJpdGVtXCIgKyB0aGlzLmNlbGwuY2hvaWNlSW5kZXg7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdXJ2ZXlRdWVzdGlvbkNoZWNrYm94SXRlbVxuICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgcXVlc3Rpb249e3RoaXMuY2VsbC5xdWVzdGlvbn1cbiAgICAgICAgY3NzQ2xhc3Nlcz17dGhpcy5jZWxsLnF1ZXN0aW9uLmNzc0NsYXNzZXN9XG4gICAgICAgIGlzRGlzcGxheU1vZGU9e3RoaXMuY2VsbC5xdWVzdGlvbi5pc0Rpc3BsYXlNb2RlfVxuICAgICAgICBpdGVtPXt0aGlzLmNlbGwuaXRlbX1cbiAgICAgICAgaXNGaXJzdD17dGhpcy5jZWxsLmlzRmlyc3RDaG9pY2V9XG4gICAgICAgIGluZGV4PXt0aGlzLmNlbGwuY2hvaWNlSW5kZXgudG9TdHJpbmcoKX1cbiAgICAgICAgaGlkZUNhcHRpb249e3RydWV9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSByZW5kZXJDZWxsUmFkaW9ncm91cEJ1dHRvbigpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGtleSA9IHRoaXMuY2VsbC5xdWVzdGlvbi5pZCArIFwiaXRlbVwiICsgdGhpcy5jZWxsLmNob2ljZUluZGV4O1xuICAgIHJldHVybiAoXG4gICAgICA8U3VydmV5UXVlc3Rpb25SYWRpb0l0ZW1cbiAgICAgICAga2V5PXtrZXl9XG4gICAgICAgIHF1ZXN0aW9uPXt0aGlzLmNlbGwucXVlc3Rpb259XG4gICAgICAgIGNzc0NsYXNzZXM9e3RoaXMuY2VsbC5xdWVzdGlvbi5jc3NDbGFzc2VzfVxuICAgICAgICBpc0Rpc3BsYXlNb2RlPXt0aGlzLmNlbGwucXVlc3Rpb24uaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgaXRlbT17dGhpcy5jZWxsLml0ZW19XG4gICAgICAgIGluZGV4PXt0aGlzLmNlbGwuY2hvaWNlSW5kZXgudG9TdHJpbmcoKX1cbiAgICAgICAgaXNDaGVja2VkPXt0aGlzLmNlbGwucXVlc3Rpb24udmFsdWUgPT09IHRoaXMuY2VsbC5pdGVtLnZhbHVlfVxuICAgICAgICBpc0Rpc2FibGVkPXt0aGlzLmNlbGwucXVlc3Rpb24uaXNSZWFkT25seSB8fCAhdGhpcy5jZWxsLml0ZW0uaXNFbmFibGVkfVxuICAgICAgICBoaWRlQ2FwdGlvbj17dHJ1ZX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkcm9wZG93bmJhc2UudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IFN1cnZleVdpbmRvd01vZGVsIH0gZnJvbSBcIi4uL3N1cnZleVdpbmRvd1wiO1xuXG5leHBvcnQgY2xhc3MgUmVhY3RTdXJ2ZXlNb2RlbCBleHRlbmRzIFN1cnZleU1vZGVsIHtcbiAgcmVuZGVyQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIGNvbnN0cnVjdG9yKGpzb25PYmo6IGFueSA9IG51bGwpIHtcbiAgICBzdXBlcihqc29uT2JqKTtcbiAgfVxuICBwdWJsaWMgcmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnJlbmRlckNhbGxiYWNrKSB7XG4gICAgICB0aGlzLnJlbmRlckNhbGxiYWNrKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBtZXJnZUNzcyhzcmM6IGFueSwgZGVzdDogYW55KSB7XG4gICAgdGhpcy5tZXJnZVZhbHVlcyhzcmMsIGRlc3QpO1xuICB9XG4gIHB1YmxpYyBkb0FmdGVyUmVuZGVyU3VydmV5KGVsOiBhbnkpIHtcbiAgICB0aGlzLmFmdGVyUmVuZGVyU3VydmV5KGVsKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Mb2FkU3VydmV5RnJvbVNlcnZpY2UoKSB7XG4gICAgaWYgKCEhdGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZS5zZXRXYXNTaG93bihmYWxzZSk7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Mb2FkaW5nU3VydmV5RnJvbVNlcnZpY2UoKSB7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuICBwdWJsaWMgc2V0Q29tcGxldGVkU3RhdGUodmFsdWU6IHN0cmluZywgdGV4dDogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0Q29tcGxldGVkU3RhdGUodmFsdWUsIHRleHQpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gIH1cbiAgcHVibGljIHN0YXJ0KCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5zdGFydCgpO1xuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVhY3RXaW5kb3dNb2RlbCBleHRlbmRzIFN1cnZleVdpbmRvd01vZGVsIHtcbiAgY29uc3RydWN0b3IoanNvbk9iajogYW55ID0gbnVsbCwgbW9kZWw6IFJlYWN0U3VydmV5TW9kZWwgPSBudWxsKSB7XG4gICAgc3VwZXIoanNvbk9iaiwgbW9kZWwpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXkoanNvbk9iajogYW55KTogU3VydmV5TW9kZWwge1xuICAgIHJldHVybiBuZXcgUmVhY3RTdXJ2ZXlNb2RlbChqc29uT2JqKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlbmRlckNhbGxiYWNrKCk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5yZW5kZXJDYWxsYmFjaztcbiAgfVxuICBwdWJsaWMgc2V0IHJlbmRlckNhbGxiYWNrKHZhbDogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMuc3VydmV5LnJlbmRlckNhbGxiYWNrID0gdmFsO1xuICB9XG59XG5cblN1cnZleU1vZGVsLnBsYXRmb3JtID0gXCJyZWFjdFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0c3VydmV5bW9kZWwudHN4IiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7IEZ1bmN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9mdW5jdGlvbnNmYWN0b3J5XCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQgeyBlcXVhbCB9IGZyb20gXCJhc3NlcnRcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9wZXJhbmQge1xuICBwdWJsaWMgdG9TdHJpbmcoZnVuYzogKG9wOiBPcGVyYW5kKSA9PiBzdHJpbmcgPSB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHB1YmxpYyBhYnN0cmFjdCBnZXRUeXBlKCk6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IGV2YWx1YXRlKHByb2Nlc3NWYWx1ZT86IFByb2Nlc3NWYWx1ZSk6IGFueTtcbiAgcHVibGljIGFic3RyYWN0IHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pOiBhbnk7XG4gIHB1YmxpYyBoYXNGdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGhhc0FzeW5jRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBhZGRUb0FzeW5jTGlzdChsaXN0OiBBcnJheTxGdW5jdGlvbk9wZXJhbmQ+KTogdm9pZCB7fVxufVxuXG5leHBvcnQgY2xhc3MgQmluYXJ5T3BlcmFuZCBleHRlbmRzIE9wZXJhbmQge1xuICBwcml2YXRlIGNvbnN1bWVyOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBpc0FyaXRobWV0aWNWYWx1ZTogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBvcGVyYXRvck5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIGxlZnQ6IGFueSA9IG51bGwsXG4gICAgcHJpdmF0ZSByaWdodDogYW55ID0gbnVsbCxcbiAgICBpc0FyaXRobWV0aWNPcDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5pc0FyaXRobWV0aWNWYWx1ZSA9IGlzQXJpdGhtZXRpY09wO1xuICAgIGlmIChpc0FyaXRobWV0aWNPcCkge1xuICAgICAgdGhpcy5jb25zdW1lciA9IE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnNbXCJhcml0aG1ldGljT3BcIl0oXG4gICAgICAgIG9wZXJhdG9yTmFtZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25zdW1lciA9IE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnNbb3BlcmF0b3JOYW1lXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25zdW1lciA9PSBudWxsKSB7XG4gICAgICBPcGVyYW5kTWFrZXIudGhyb3dJbnZhbGlkT3BlcmF0b3JFcnJvcihvcGVyYXRvck5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImJpbmFyeVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBcml0aG1ldGljKCkge1xuICAgIHJldHVybiB0aGlzLmlzQXJpdGhtZXRpY1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDb25qdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvck5hbWUgPT0gXCJvclwiIHx8IHRoaXMub3BlcmF0b3JOYW1lID09IFwiYW5kXCI7XG4gIH1cbiAgcHVibGljIGdldCBjb25qdW5jdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlzQ29uanVuY3Rpb24gPyB0aGlzLm9wZXJhdG9yTmFtZSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGdldCBvcGVyYXRvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yTmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxlZnRPcGVyYW5kKCkge1xuICAgIHJldHVybiB0aGlzLmxlZnQ7XG4gIH1cbiAgcHVibGljIGdldCByaWdodE9wZXJhbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmlnaHQ7XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlUGFyYW0oeDogYW55LCBwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBhbnkge1xuICAgIHJldHVybiB4ID09IG51bGwgPyBudWxsIDogeC5ldmFsdWF0ZShwcm9jZXNzVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGV2YWx1YXRlKHByb2Nlc3NWYWx1ZT86IFByb2Nlc3NWYWx1ZSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3VtZXIuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLmV2YWx1YXRlUGFyYW0odGhpcy5sZWZ0LCBwcm9jZXNzVmFsdWUpLFxuICAgICAgdGhpcy5ldmFsdWF0ZVBhcmFtKHRoaXMucmlnaHQsIHByb2Nlc3NWYWx1ZSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nID0gdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoISFmdW5jKSB7XG4gICAgICB2YXIgcmVzID0gZnVuYyh0aGlzKTtcbiAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIFwiKFwiICtcbiAgICAgIE9wZXJhbmRNYWtlci5zYWZlVG9TdHJpbmcodGhpcy5sZWZ0LCBmdW5jKSArXG4gICAgICBcIiBcIiArXG4gICAgICBPcGVyYW5kTWFrZXIub3BlcmF0b3JUb1N0cmluZyh0aGlzLm9wZXJhdG9yTmFtZSkgK1xuICAgICAgXCIgXCIgK1xuICAgICAgT3BlcmFuZE1ha2VyLnNhZmVUb1N0cmluZyh0aGlzLnJpZ2h0LCBmdW5jKSArXG4gICAgICBcIilcIlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIGlmICh0aGlzLmxlZnQgIT0gbnVsbCkgdGhpcy5sZWZ0LnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuICAgIGlmICh0aGlzLnJpZ2h0ICE9IG51bGwpIHRoaXMucmlnaHQuc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7XG4gIH1cblxuICBwdWJsaWMgaGFzRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICghIXRoaXMubGVmdCAmJiB0aGlzLmxlZnQuaGFzRnVuY3Rpb24oKSkgfHxcbiAgICAgICghIXRoaXMucmlnaHQgJiYgdGhpcy5yaWdodC5oYXNGdW5jdGlvbigpKVxuICAgICk7XG4gIH1cbiAgcHVibGljIGhhc0FzeW5jRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICghIXRoaXMubGVmdCAmJiB0aGlzLmxlZnQuaGFzQXN5bmNGdW5jdGlvbigpKSB8fFxuICAgICAgKCEhdGhpcy5yaWdodCAmJiB0aGlzLnJpZ2h0Lmhhc0FzeW5jRnVuY3Rpb24oKSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBhZGRUb0FzeW5jTGlzdChsaXN0OiBBcnJheTxGdW5jdGlvbk9wZXJhbmQ+KSB7XG4gICAgaWYgKCEhdGhpcy5sZWZ0KSB0aGlzLmxlZnQuYWRkVG9Bc3luY0xpc3QobGlzdCk7XG4gICAgaWYgKCEhdGhpcy5yaWdodCkgdGhpcy5yaWdodC5hZGRUb0FzeW5jTGlzdChsaXN0KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5hcnlPcGVyYW5kIGV4dGVuZHMgT3BlcmFuZCB7XG4gIHByaXZhdGUgY29uc3VtZXI6IEZ1bmN0aW9uO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4cHJlc3Npb25WYWx1ZTogT3BlcmFuZCwgcHJpdmF0ZSBvcGVyYXRvck5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25zdW1lciA9IE9wZXJhbmRNYWtlci51bmFyeUZ1bmN0aW9uc1tvcGVyYXRvck5hbWVdO1xuICAgIGlmICh0aGlzLmNvbnN1bWVyID09IG51bGwpIHtcbiAgICAgIE9wZXJhbmRNYWtlci50aHJvd0ludmFsaWRPcGVyYXRvckVycm9yKG9wZXJhdG9yTmFtZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgb3BlcmF0b3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvck5hbWU7XG4gIH1cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IE9wZXJhbmQge1xuICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25WYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInVuYXJ5XCI7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nID0gdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoISFmdW5jKSB7XG4gICAgICB2YXIgcmVzID0gZnVuYyh0aGlzKTtcbiAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIE9wZXJhbmRNYWtlci5vcGVyYXRvclRvU3RyaW5nKHRoaXMub3BlcmF0b3JOYW1lKSArXG4gICAgICBcIiBcIiArXG4gICAgICB0aGlzLmV4cHJlc3Npb24udG9TdHJpbmcoZnVuYylcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGV2YWx1YXRlKHByb2Nlc3NWYWx1ZT86IFByb2Nlc3NWYWx1ZSk6IGJvb2xlYW4ge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuZXhwcmVzc2lvbi5ldmFsdWF0ZShwcm9jZXNzVmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmNvbnN1bWVyLmNhbGwodGhpcywgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLmV4cHJlc3Npb24uc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFycmF5T3BlcmFuZCBleHRlbmRzIE9wZXJhbmQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWVzOiBBcnJheTxPcGVyYW5kPikge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJhcnJheVwiO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZyhmdW5jOiAob3A6IE9wZXJhbmQpID0+IHN0cmluZyA9IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICBcIltcIiArXG4gICAgICB0aGlzLnZhbHVlc1xuICAgICAgICAubWFwKGZ1bmN0aW9uIChlbDogT3BlcmFuZCkge1xuICAgICAgICAgIHJldHVybiBlbC50b1N0cmluZyhmdW5jKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKSArXG4gICAgICBcIl1cIlxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZXZhbHVhdGUocHJvY2Vzc1ZhbHVlPzogUHJvY2Vzc1ZhbHVlKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzLm1hcChmdW5jdGlvbiAoZWw6IE9wZXJhbmQpIHtcbiAgICAgIHJldHVybiBlbC5ldmFsdWF0ZShwcm9jZXNzVmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICB0aGlzLnZhbHVlcy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZWwuc2V0VmFyaWFibGVzKHZhcmlhYmxlcyk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaGFzRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzLnNvbWUoKG9wZXJhbmQpID0+IG9wZXJhbmQuaGFzRnVuY3Rpb24oKSk7XG4gIH1cbiAgcHVibGljIGhhc0FzeW5jRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzLnNvbWUoKG9wZXJhbmQpID0+IG9wZXJhbmQuaGFzQXN5bmNGdW5jdGlvbigpKTtcbiAgfVxuICBwdWJsaWMgYWRkVG9Bc3luY0xpc3QobGlzdDogQXJyYXk8RnVuY3Rpb25PcGVyYW5kPikge1xuICAgIHRoaXMudmFsdWVzLmZvckVhY2goKG9wZXJhbmQpID0+IG9wZXJhbmQuYWRkVG9Bc3luY0xpc3QobGlzdCkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb25zdCBleHRlbmRzIE9wZXJhbmQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHZhbHVlOiBhbnkpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY29uc3RcIjtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoZnVuYzogKG9wOiBPcGVyYW5kKSA9PiBzdHJpbmcgPSB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICghIWZ1bmMpIHtcbiAgICAgIHZhciByZXMgPSBmdW5jKHRoaXMpO1xuICAgICAgaWYgKCEhcmVzKSByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWx1ZS50b1N0cmluZygpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29ycmVjdFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29ycmVjdFZhbHVlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGV2YWx1YXRlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29ycmVjdFZhbHVlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgcHVibGljIHNldFZhcmlhYmxlcyh2YXJpYWJsZXM6IEFycmF5PHN0cmluZz4pIHt9XG4gIHByb3RlY3RlZCBnZXRDb3JyZWN0VmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh0aGlzLmlzQm9vbGVhblZhbHVlKHZhbHVlKSkgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgIGlmIChcbiAgICAgIHZhbHVlLmxlbmd0aCA+IDEgJiZcbiAgICAgIHRoaXMuaXNRdW90ZSh2YWx1ZVswXSkgJiZcbiAgICAgIHRoaXMuaXNRdW90ZSh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSlcbiAgICApXG4gICAgICByZXR1cm4gdmFsdWUuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpO1xuICAgIGlmIChPcGVyYW5kTWFrZXIuaXNOdW1lcmljKHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlLmluZGV4T2YoXCIweFwiKSA9PSAwKSByZXR1cm4gcGFyc2VJbnQodmFsdWUpO1xuICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDEgJiYgdmFsdWVbMF0gPT0gXCIwXCIpIHJldHVybiB2YWx1ZTtcbiAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHByaXZhdGUgaXNRdW90ZShjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNoID09IFwiJ1wiIHx8IGNoID09ICdcIic7XG4gIH1cbiAgcHJpdmF0ZSBpc0Jvb2xlYW5WYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlICYmXG4gICAgICAodmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCIgfHwgdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJmYWxzZVwiKVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZhcmlhYmxlIGV4dGVuZHMgQ29uc3Qge1xuICBzdGF0aWMgRGlzYWJsZUNvbnZlcnNpb25DaGFyID0gXCIjXCI7XG4gIHByaXZhdGUgdmFsdWVJbmZvOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSB1c2VWYWx1ZUFzSXRJczogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHZhcmlhYmxlTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodmFyaWFibGVOYW1lKTtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMudmFyaWFibGVOYW1lICYmXG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZS5sZW5ndGggPiAxICYmXG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZVswXSA9PT0gVmFyaWFibGUuRGlzYWJsZUNvbnZlcnNpb25DaGFyXG4gICAgKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZSA9IHRoaXMudmFyaWFibGVOYW1lLnN1YnN0cigxKTtcbiAgICAgIHRoaXMudXNlVmFsdWVBc0l0SXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInZhcmlhYmxlXCI7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nID0gdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoISFmdW5jKSB7XG4gICAgICB2YXIgcmVzID0gZnVuYyh0aGlzKTtcbiAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgdmFyIHByZWZpeCA9IHRoaXMudXNlVmFsdWVBc0l0SXMgPyBWYXJpYWJsZS5EaXNhYmxlQ29udmVyc2lvbkNoYXIgOiBcIlwiO1xuICAgIHJldHVybiBcIntcIiArIHByZWZpeCArIHRoaXMudmFyaWFibGVOYW1lICsgXCJ9XCI7XG4gIH1cbiAgcHVibGljIGdldCB2YXJpYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy52YXJpYWJsZU5hbWU7XG4gIH1cbiAgcHVibGljIGV2YWx1YXRlKHByb2Nlc3NWYWx1ZT86IFByb2Nlc3NWYWx1ZSk6IGFueSB7XG4gICAgdGhpcy52YWx1ZUluZm8ubmFtZSA9IHRoaXMudmFyaWFibGVOYW1lO1xuICAgIHByb2Nlc3NWYWx1ZS5nZXRWYWx1ZUluZm8odGhpcy52YWx1ZUluZm8pO1xuICAgIHJldHVybiB0aGlzLnZhbHVlSW5mby5oYXNWYWx1ZVxuICAgICAgPyB0aGlzLmdldENvcnJlY3RWYWx1ZSh0aGlzLnZhbHVlSW5mby52YWx1ZSlcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgc2V0VmFyaWFibGVzKHZhcmlhYmxlczogQXJyYXk8c3RyaW5nPikge1xuICAgIHZhcmlhYmxlcy5wdXNoKHRoaXMudmFyaWFibGVOYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29ycmVjdFZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh0aGlzLnVzZVZhbHVlQXNJdElzKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIHN1cGVyLmdldENvcnJlY3RWYWx1ZSh2YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uT3BlcmFuZCBleHRlbmRzIE9wZXJhbmQge1xuICBwcml2YXRlIGlzUmVhZHlWYWx1ZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBhc3luUmVzdWx0OiBhbnk7XG4gIHB1YmxpYyBvbkFzeW5jUmVhZHk6ICgpID0+IHZvaWQ7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgb3JpZ2lvbmFsVmFsdWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHBhcmFtZXRlcnM6IEFycmF5T3BlcmFuZFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaXNSZWFkeVZhbHVlID0gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1ldGVycykgJiYgcGFyYW1ldGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMucGFyYW1ldGVycyA9IG5ldyBBcnJheU9wZXJhbmQoW10pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZ1bmN0aW9uXCI7XG4gIH1cbiAgcHVibGljIGV2YWx1YXRlQXN5bmMocHJvY2Vzc1ZhbHVlOiBQcm9jZXNzVmFsdWUpIHtcbiAgICB0aGlzLmlzUmVhZHlWYWx1ZSA9IGZhbHNlO1xuICAgIHZhciBhc3luY1Byb2Nlc3NWYWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKTtcbiAgICBhc3luY1Byb2Nlc3NWYWx1ZS52YWx1ZXMgPSBIZWxwZXJzLmNyZWF0ZUNvcHkocHJvY2Vzc1ZhbHVlLnZhbHVlcyk7XG4gICAgYXN5bmNQcm9jZXNzVmFsdWUucHJvcGVydGllcyA9IEhlbHBlcnMuY3JlYXRlQ29weShwcm9jZXNzVmFsdWUucHJvcGVydGllcyk7XG4gICAgYXN5bmNQcm9jZXNzVmFsdWUucHJvcGVydGllcy5yZXR1cm5SZXN1bHQgPSAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYXN5blJlc3VsdCA9IHJlc3VsdDtcbiAgICAgIHRoaXMuaXNSZWFkeVZhbHVlID0gdHJ1ZTtcbiAgICAgIHRoaXMub25Bc3luY1JlYWR5KCk7XG4gICAgfTtcbiAgICB0aGlzLmV2YWx1YXRlQ29yZShhc3luY1Byb2Nlc3NWYWx1ZSk7XG4gIH1cbiAgcHVibGljIGV2YWx1YXRlKHByb2Nlc3NWYWx1ZT86IFByb2Nlc3NWYWx1ZSk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNSZWFkeSkgcmV0dXJuIHRoaXMuYXN5blJlc3VsdDtcbiAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZUNvcmUocHJvY2Vzc1ZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGV2YWx1YXRlQ29yZShwcm9jZXNzVmFsdWU/OiBQcm9jZXNzVmFsdWUpOiBhbnkge1xuICAgIHJldHVybiBGdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucnVuKFxuICAgICAgdGhpcy5vcmlnaW9uYWxWYWx1ZSxcbiAgICAgIHRoaXMucGFyYW1ldGVycy5ldmFsdWF0ZShwcm9jZXNzVmFsdWUpLFxuICAgICAgcHJvY2Vzc1ZhbHVlLnByb3BlcnRpZXNcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nID0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCEhZnVuYykge1xuICAgICAgdmFyIHJlcyA9IGZ1bmModGhpcyk7XG4gICAgICBpZiAoISFyZXMpIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm9yaWdpb25hbFZhbHVlICsgXCIoXCIgKyB0aGlzLnBhcmFtZXRlcnMudG9TdHJpbmcoZnVuYykgKyBcIilcIjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgdGhpcy5wYXJhbWV0ZXJzLnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1JlYWR5VmFsdWU7XG4gIH1cbiAgcHVibGljIGhhc0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBoYXNBc3luY0Z1bmN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBGdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UuaXNBc3luY0Z1bmN0aW9uKHRoaXMub3JpZ2lvbmFsVmFsdWUpO1xuICB9XG4gIHB1YmxpYyBhZGRUb0FzeW5jTGlzdChsaXN0OiBBcnJheTxGdW5jdGlvbk9wZXJhbmQ+KSB7XG4gICAgaWYgKHRoaXMuaGFzQXN5bmNGdW5jdGlvbigpKSB7XG4gICAgICBsaXN0LnB1c2godGhpcyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPcGVyYW5kTWFrZXIge1xuICBzdGF0aWMgdGhyb3dJbnZhbGlkT3BlcmF0b3JFcnJvcihvcDogc3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBvcGVyYXRvcjogJ1wiICsgb3AgKyBcIidcIik7XG4gIH1cblxuICBzdGF0aWMgc2FmZVRvU3RyaW5nKG9wZXJhbmQ6IE9wZXJhbmQsIGZ1bmM6IChvcDogT3BlcmFuZCkgPT4gc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gb3BlcmFuZCA9PSBudWxsID8gXCJcIiA6IG9wZXJhbmQudG9TdHJpbmcoZnVuYyk7XG4gIH1cblxuICBzdGF0aWMgdG9PcGVyYW5kU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChcbiAgICAgICEhdmFsdWUgJiZcbiAgICAgICFPcGVyYW5kTWFrZXIuaXNOdW1lcmljKHZhbHVlKSAmJlxuICAgICAgIU9wZXJhbmRNYWtlci5pc0Jvb2xlYW5WYWx1ZSh2YWx1ZSlcbiAgICApXG4gICAgICB2YWx1ZSA9IFwiJ1wiICsgdmFsdWUgKyBcIidcIjtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzdGF0aWMgaXNTcGFjZVN0cmluZyhzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXN0ciAmJiAhc3RyLnJlcGxhY2UoXCIgXCIsIFwiXCIpO1xuICB9XG5cbiAgc3RhdGljIGlzTnVtZXJpYyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgISF2YWx1ZSAmJlxuICAgICAgKHZhbHVlLmluZGV4T2YoXCItXCIpID4gLTEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIitcIikgPiAxIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCIqXCIpID4gLTEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIl5cIikgPiAtMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiL1wiKSA+IC0xIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCIlXCIpID4gLTEpXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChPcGVyYW5kTWFrZXIuaXNTcGFjZVN0cmluZyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gSGVscGVycy5pc051bWJlcih2YWx1ZSk7XG4gIH1cblxuICBzdGF0aWMgaXNCb29sZWFuVmFsdWUodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhIXZhbHVlICYmXG4gICAgICAodmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCIgfHwgdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJmYWxzZVwiKVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgdW5hcnlGdW5jdGlvbnM6IEhhc2hUYWJsZTxGdW5jdGlvbj4gPSB7XG4gICAgZW1wdHk6IGZ1bmN0aW9uICh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpO1xuICAgIH0sXG4gICAgbm90ZW1wdHk6IGZ1bmN0aW9uICh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gIU9wZXJhbmRNYWtlci51bmFyeUZ1bmN0aW9ucy5lbXB0eSh2YWx1ZSk7XG4gICAgfSxcbiAgICBuZWdhdGU6IGZ1bmN0aW9uICh2YWx1ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICF2YWx1ZTtcbiAgICB9LFxuICB9O1xuXG4gIHN0YXRpYyBiaW5hcnlGdW5jdGlvbnM6IEhhc2hUYWJsZTxGdW5jdGlvbj4gPSB7XG4gICAgYXJpdGhtZXRpY09wKG9wZXJhdG9yTmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGE6IGFueSwgYjogYW55KTogYW55IHtcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KGEpICYmICFPcGVyYW5kTWFrZXIuaXNTcGFjZVN0cmluZyhhKSkge1xuICAgICAgICAgIGEgPSB0eXBlb2YgYiA9PT0gXCJzdHJpbmdcIiA/IFwiXCIgOiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShiKSAmJiAhT3BlcmFuZE1ha2VyLmlzU3BhY2VTdHJpbmcoYikpIHtcbiAgICAgICAgICBiID0gdHlwZW9mIGEgPT09IFwic3RyaW5nXCIgPyBcIlwiIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb25zdW1lciA9IE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnNbb3BlcmF0b3JOYW1lXTtcbiAgICAgICAgcmV0dXJuIGNvbnN1bWVyID09IG51bGwgPyBudWxsIDogY29uc3VtZXIuY2FsbCh0aGlzLCBhLCBiKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBhbmQ6IGZ1bmN0aW9uIChhOiBib29sZWFuLCBiOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gYSAmJiBiO1xuICAgIH0sXG4gICAgb3I6IGZ1bmN0aW9uIChhOiBib29sZWFuLCBiOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gYSB8fCBiO1xuICAgIH0sXG4gICAgcGx1czogZnVuY3Rpb24gKGE6IGFueSwgYjogYW55KTogYW55IHtcbiAgICAgIHJldHVybiBhICsgYjtcbiAgICB9LFxuICAgIG1pbnVzOiBmdW5jdGlvbiAoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIGEgLSBiO1xuICAgIH0sXG4gICAgbXVsOiBmdW5jdGlvbiAoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgcmV0dXJuIGEgKiBiO1xuICAgIH0sXG4gICAgZGl2OiBmdW5jdGlvbiAoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgaWYgKCFiKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBhIC8gYjtcbiAgICB9LFxuICAgIG1vZDogZnVuY3Rpb24gKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIGlmICghYikgcmV0dXJuIG51bGw7XG4gICAgICByZXR1cm4gYSAlIGI7XG4gICAgfSxcbiAgICBwb3dlcjogZnVuY3Rpb24gKGE6IG51bWJlciwgYjogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgIHJldHVybiBNYXRoLnBvdyhhLCBiKTtcbiAgICB9LFxuICAgIGdyZWF0ZXI6IGZ1bmN0aW9uIChsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGxlZnQgPiByaWdodDtcbiAgICB9LFxuICAgIGxlc3M6IGZ1bmN0aW9uIChsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGxlZnQgPCByaWdodDtcbiAgICB9LFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBmdW5jdGlvbiAobGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAoT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5lcXVhbChsZWZ0LCByaWdodCkpIHJldHVybiB0cnVlO1xuICAgICAgcmV0dXJuIE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuZ3JlYXRlcihsZWZ0LCByaWdodCk7XG4gICAgfSxcbiAgICBsZXNzb3JlcXVhbDogZnVuY3Rpb24gKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKE9wZXJhbmRNYWtlci5iaW5hcnlGdW5jdGlvbnMuZXF1YWwobGVmdCwgcmlnaHQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmxlc3MobGVmdCwgcmlnaHQpO1xuICAgIH0sXG4gICAgZXF1YWw6IGZ1bmN0aW9uIChsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuaXNUd29WYWx1ZUVxdWFscyhsZWZ0LCByaWdodCk7XG4gICAgfSxcbiAgICBub3RlcXVhbDogZnVuY3Rpb24gKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuICFPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmVxdWFsKGxlZnQsIHJpZ2h0KTtcbiAgICB9LFxuICAgIGNvbnRhaW5zOiBmdW5jdGlvbiAobGVmdDogYW55LCByaWdodDogYW55KTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5jb250YWluc0NvcmUobGVmdCwgcmlnaHQsIHRydWUpO1xuICAgIH0sXG4gICAgbm90Y29udGFpbnM6IGZ1bmN0aW9uIChsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmICghbGVmdCAmJiAhSGVscGVycy5pc1ZhbHVlRW1wdHkocmlnaHQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zQ29yZShsZWZ0LCByaWdodCwgZmFsc2UpO1xuICAgIH0sXG4gICAgYW55b2Y6IGZ1bmN0aW9uIChsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpOiBib29sZWFuIHtcbiAgICAgIGlmICghbGVmdCAmJiBIZWxwZXJzLmlzVmFsdWVFbXB0eShyaWdodCkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKCFsZWZ0IHx8ICghQXJyYXkuaXNBcnJheShsZWZ0KSAmJiBsZWZ0Lmxlbmd0aCA9PT0gMCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShyaWdodCkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxlZnQpKVxuICAgICAgICByZXR1cm4gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5jb250YWlucyhyaWdodCwgbGVmdCk7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmlnaHQpKVxuICAgICAgICByZXR1cm4gT3BlcmFuZE1ha2VyLmJpbmFyeUZ1bmN0aW9ucy5jb250YWlucyhsZWZ0LCByaWdodCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJpZ2h0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zKGxlZnQsIHJpZ2h0W2ldKSkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBhbGxvZjogZnVuY3Rpb24gKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgaWYgKCFsZWZ0ICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eShyaWdodCkpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyaWdodCkpXG4gICAgICAgIHJldHVybiBPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zKGxlZnQsIHJpZ2h0KTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmlnaHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFPcGVyYW5kTWFrZXIuYmluYXJ5RnVuY3Rpb25zLmNvbnRhaW5zKGxlZnQsIHJpZ2h0W2ldKSlcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGNvbnRhaW5zQ29yZTogZnVuY3Rpb24gKGxlZnQ6IGFueSwgcmlnaHQ6IGFueSwgaXNDb250YWluczogYW55KTogYm9vbGVhbiB7XG4gICAgICBpZiAoIWxlZnQpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghbGVmdC5sZW5ndGgpIHtcbiAgICAgICAgbGVmdCA9IGxlZnQudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbGVmdCA9PT0gXCJzdHJpbmdcIiB8fCBsZWZ0IGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgIGlmICghcmlnaHQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmlnaHQgPSByaWdodC50b1N0cmluZygpO1xuICAgICAgICB2YXIgZm91bmQgPSBsZWZ0LmluZGV4T2YocmlnaHQpID4gLTE7XG4gICAgICAgIHJldHVybiBpc0NvbnRhaW5zID8gZm91bmQgOiAhZm91bmQ7XG4gICAgICB9XG4gICAgICB2YXIgcmlnaHRBcnJheSA9IEFycmF5LmlzQXJyYXkocmlnaHQpID8gcmlnaHQgOiBbcmlnaHRdO1xuICAgICAgZm9yICh2YXIgckluZGV4ID0gMDsgckluZGV4IDwgcmlnaHRBcnJheS5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgcmlnaHQgPSByaWdodEFycmF5W3JJbmRleF07XG4gICAgICAgIGZvciAoOyBpIDwgbGVmdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChPcGVyYW5kTWFrZXIuaXNUd29WYWx1ZUVxdWFscyhsZWZ0W2ldLCByaWdodCkpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID09IGxlZnQubGVuZ3RoKSByZXR1cm4gIWlzQ29udGFpbnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNDb250YWlucztcbiAgICB9LFxuICB9O1xuXG4gIHN0YXRpYyBpc1R3b1ZhbHVlRXF1YWxzKHg6IGFueSwgeTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHggPT09IFwidW5kZWZpbmVkXCIpIHggPSB1bmRlZmluZWQ7XG4gICAgaWYgKHkgPT09IFwidW5kZWZpbmVkXCIpIHkgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh4LCB5LCB0cnVlKTtcbiAgfVxuXG4gIHN0YXRpYyBvcGVyYXRvclRvU3RyaW5nKG9wZXJhdG9yTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgb3BTdHIgPSBPcGVyYW5kTWFrZXIuc2lnbnNbb3BlcmF0b3JOYW1lXTtcbiAgICByZXR1cm4gb3BTdHIgPT0gbnVsbCA/IG9wZXJhdG9yTmFtZSA6IG9wU3RyO1xuICB9XG5cbiAgc3RhdGljIHNpZ25zOiBIYXNoVGFibGU8c3RyaW5nPiA9IHtcbiAgICBsZXNzOiBcIjxcIixcbiAgICBsZXNzb3JlcXVhbDogXCI8PVwiLFxuICAgIGdyZWF0ZXI6IFwiPlwiLFxuICAgIGdyZWF0ZXJvcmVxdWFsOiBcIj49XCIsXG4gICAgZXF1YWw6IFwiPT1cIixcbiAgICBub3RlcXVhbDogXCIhPVwiLFxuICAgIHBsdXM6IFwiK1wiLFxuICAgIG1pbnVzOiBcIi1cIixcbiAgICBtdWw6IFwiKlwiLFxuICAgIGRpdjogXCIvXCIsXG4gICAgYW5kOiBcImFuZFwiLFxuICAgIG9yOiBcIm9yXCIsXG4gICAgcG93ZXI6IFwiXlwiLFxuICAgIG1vZDogXCIlXCIsXG4gICAgbmVnYXRlOiBcIiFcIixcbiAgfTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9leHByZXNzaW9ucy9leHByZXNzaW9ucy50cyIsImltcG9ydCB7IEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uRmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IEZ1bmN0aW9uRmFjdG9yeSA9IG5ldyBGdW5jdGlvbkZhY3RvcnkoKTtcbiAgcHJpdmF0ZSBmdW5jdGlvbkhhc2g6IEhhc2hUYWJsZTwocGFyYW1zOiBhbnlbXSkgPT4gYW55PiA9IHt9O1xuICBwcml2YXRlIGlzQXN5bmNIYXNoOiBIYXNoVGFibGU8Ym9vbGVhbj4gPSB7fTtcblxuICBwdWJsaWMgcmVnaXN0ZXIoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZ1bmM6IChwYXJhbXM6IGFueVtdKSA9PiBhbnksXG4gICAgaXNBc3luYzogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMuZnVuY3Rpb25IYXNoW25hbWVdID0gZnVuYztcbiAgICBpZiAoaXNBc3luYykgdGhpcy5pc0FzeW5jSGFzaFtuYW1lXSA9IHRydWU7XG4gIH1cbiAgcHVibGljIHVucmVnaXN0ZXIobmFtZTogc3RyaW5nKSB7XG4gICAgZGVsZXRlIHRoaXMuZnVuY3Rpb25IYXNoW25hbWVdO1xuICAgIGRlbGV0ZSB0aGlzLmlzQXN5bmNIYXNoW25hbWVdO1xuICB9XG4gIHB1YmxpYyBoYXNGdW5jdGlvbihuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmZ1bmN0aW9uSGFzaFtuYW1lXTtcbiAgfVxuICBwdWJsaWMgaXNBc3luY0Z1bmN0aW9uKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuaXNBc3luY0hhc2hbbmFtZV07XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5mdW5jdGlvbkhhc2ggPSB7fTtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5mdW5jdGlvbkhhc2gpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc29ydCgpO1xuICB9XG4gIHB1YmxpYyBydW4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogYW55W10sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4gPSBudWxsXG4gICk6IGFueSB7XG4gICAgdmFyIGZ1bmMgPSB0aGlzLmZ1bmN0aW9uSGFzaFtuYW1lXTtcbiAgICBpZiAoIWZ1bmMpIHJldHVybiBudWxsO1xuICAgIGxldCBjbGFzc1J1bm5lciA9IHtcbiAgICAgIGZ1bmM6IGZ1bmMsXG4gICAgfTtcblxuICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcGVydGllcykge1xuICAgICAgICAoPGFueT5jbGFzc1J1bm5lcilba2V5XSA9IHByb3BlcnRpZXNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzUnVubmVyLmZ1bmMocGFyYW1zKTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIHJlZ2lzdGVyRnVuY3Rpb24gPSBGdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXI7XG5cbmZ1bmN0aW9uIGdldFBhcmFtc0FzQXJyYXkodmFsdWU6IGFueSwgYXJyOiBhbnlbXSkge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBnZXRQYXJhbXNBc0FycmF5KHZhbHVlW2ldLCBhcnIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhcnIucHVzaCh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3VtKHBhcmFtczogYW55W10pOiBhbnkge1xuICB2YXIgYXJyOiBhbnlbXSA9IFtdO1xuICBnZXRQYXJhbXNBc0FycmF5KHBhcmFtcywgYXJyKTtcbiAgdmFyIHJlcyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzICs9IGFycltpXTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwic3VtXCIsIHN1bSk7XG5cbmZ1bmN0aW9uIG1pbl9tYXgocGFyYW1zOiBhbnlbXSwgaXNNaW46IGJvb2xlYW4pOiBhbnkge1xuICB2YXIgYXJyOiBhbnlbXSA9IFtdO1xuICBnZXRQYXJhbXNBc0FycmF5KHBhcmFtcywgYXJyKTtcbiAgdmFyIHJlcyA9IHVuZGVmaW5lZDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcyA9IGFycltpXTtcbiAgICB9XG4gICAgaWYgKGlzTWluKSB7XG4gICAgICBpZiAocmVzID4gYXJyW2ldKSByZXMgPSBhcnJbaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZXMgPCBhcnJbaV0pIHJlcyA9IGFycltpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gbWluKHBhcmFtczogYW55W10pOiBhbnkge1xuICByZXR1cm4gbWluX21heChwYXJhbXMsIHRydWUpO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwibWluXCIsIG1pbik7XG5cbmZ1bmN0aW9uIG1heChwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgcmV0dXJuIG1pbl9tYXgocGFyYW1zLCBmYWxzZSk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJtYXhcIiwgbWF4KTtcblxuZnVuY3Rpb24gY291bnQocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciBhcnI6IGFueVtdID0gW107XG4gIGdldFBhcmFtc0FzQXJyYXkocGFyYW1zLCBhcnIpO1xuICByZXR1cm4gYXJyLmxlbmd0aDtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImNvdW50XCIsIGNvdW50KTtcblxuZnVuY3Rpb24gYXZnKHBhcmFtczogYW55W10pOiBhbnkge1xuICB2YXIgYXJyOiBhbnlbXSA9IFtdO1xuICBnZXRQYXJhbXNBc0FycmF5KHBhcmFtcywgYXJyKTtcbiAgdmFyIHJlcyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzICs9IGFycltpXTtcbiAgfVxuICByZXR1cm4gYXJyLmxlbmd0aCA+IDAgPyByZXMgLyBhcnIubGVuZ3RoIDogMDtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImF2Z1wiLCBhdmcpO1xuXG5mdW5jdGlvbiBnZXRJbkFycmF5UGFyYW1zKHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAocGFyYW1zLmxlbmd0aCAhPSAyKSByZXR1cm4gbnVsbDtcbiAgdmFyIGFyciA9IHBhcmFtc1swXTtcbiAgaWYgKCFhcnIpIHJldHVybiBudWxsO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyKSAmJiAhQXJyYXkuaXNBcnJheShPYmplY3Qua2V5cyhhcnIpKSkgcmV0dXJuIG51bGw7XG4gIHZhciBuYW1lID0gcGFyYW1zWzFdO1xuICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIgJiYgIShuYW1lIGluc3RhbmNlb2YgU3RyaW5nKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB7IGRhdGE6IGFyciwgbmFtZTogbmFtZSB9O1xufVxuXG5mdW5jdGlvbiBjYWxjSW5BcnJheShcbiAgcGFyYW1zOiBhbnlbXSxcbiAgZnVuYzogKHJlczogbnVtYmVyLCB2YWw6IG51bWJlcikgPT4gbnVtYmVyXG4pOiBhbnkge1xuICB2YXIgdiA9IGdldEluQXJyYXlQYXJhbXMocGFyYW1zKTtcbiAgaWYgKCF2KSByZXR1cm4gdW5kZWZpbmVkO1xuICB2YXIgcmVzID0gdW5kZWZpbmVkO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2LmRhdGEpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2LmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdi5kYXRhW2ldO1xuICAgICAgaWYgKCEhaXRlbSAmJiBpdGVtWzxzdHJpbmc+di5uYW1lXSkge1xuICAgICAgICByZXMgPSBmdW5jKHJlcywgaXRlbVs8c3RyaW5nPnYubmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdi5kYXRhKSB7XG4gICAgICB2YXIgaXRlbSA9IHYuZGF0YVtrZXldO1xuICAgICAgaWYgKCEhaXRlbSAmJiBpdGVtWzxzdHJpbmc+di5uYW1lXSkge1xuICAgICAgICByZXMgPSBmdW5jKHJlcywgaXRlbVs8c3RyaW5nPnYubmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBzdW1JbkFycmF5KHBhcmFtczogYW55W10pOiBhbnkge1xuICB2YXIgcmVzID0gY2FsY0luQXJyYXkocGFyYW1zLCBmdW5jdGlvbiAocmVzOiBudW1iZXIsIHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmVzID09IHVuZGVmaW5lZCkgcmVzID0gMDtcbiAgICByZXR1cm4gK3JlcyArICt2YWw7XG4gIH0pO1xuICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgPyByZXMgOiAwO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwic3VtSW5BcnJheVwiLCBzdW1JbkFycmF5KTtcblxuZnVuY3Rpb24gbWluSW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgcmV0dXJuIGNhbGNJbkFycmF5KHBhcmFtcywgZnVuY3Rpb24gKHJlczogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHJlcyA9PSB1bmRlZmluZWQpIHJldHVybiB2YWw7XG4gICAgcmV0dXJuIHJlcyA8IHZhbCA/IHJlcyA6IHZhbDtcbiAgfSk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJtaW5JbkFycmF5XCIsIG1pbkluQXJyYXkpO1xuXG5mdW5jdGlvbiBtYXhJbkFycmF5KHBhcmFtczogYW55W10pOiBhbnkge1xuICByZXR1cm4gY2FsY0luQXJyYXkocGFyYW1zLCBmdW5jdGlvbiAocmVzOiBudW1iZXIsIHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAocmVzID09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbDtcbiAgICByZXR1cm4gcmVzID4gdmFsID8gcmVzIDogdmFsO1xuICB9KTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcIm1heEluQXJyYXlcIiwgbWF4SW5BcnJheSk7XG5cbmZ1bmN0aW9uIGNvdW50SW5BcnJheShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgdmFyIHJlcyA9IGNhbGNJbkFycmF5KHBhcmFtcywgZnVuY3Rpb24gKHJlczogbnVtYmVyLCB2YWw6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHJlcyA9PSB1bmRlZmluZWQpIHJlcyA9IDA7XG4gICAgcmV0dXJuIHJlcyArIDE7XG4gIH0pO1xuICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgPyByZXMgOiAwO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiY291bnRJbkFycmF5XCIsIGNvdW50SW5BcnJheSk7XG5cbmZ1bmN0aW9uIGF2Z0luQXJyYXkocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciBjb3VudCA9IGNvdW50SW5BcnJheShwYXJhbXMpO1xuICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIDA7XG4gIHJldHVybiBzdW1JbkFycmF5KHBhcmFtcykgLyBjb3VudDtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImF2Z0luQXJyYXlcIiwgYXZnSW5BcnJheSk7XG5cbmZ1bmN0aW9uIGlpZihwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBwYXJhbXNbMF0gPyBwYXJhbXNbMV0gOiBwYXJhbXNbMl07XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJpaWZcIiwgaWlmKTtcblxuZnVuY3Rpb24gZ2V0RGF0ZShwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFwYXJhbXMgJiYgcGFyYW1zLmxlbmd0aCA8IDEpIHJldHVybiBudWxsO1xuICBpZiAoIXBhcmFtc1swXSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBuZXcgRGF0ZShwYXJhbXNbMF0pO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiZ2V0RGF0ZVwiLCBnZXREYXRlKTtcblxuZnVuY3Rpb24gYWdlKHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAoIXBhcmFtcyAmJiBwYXJhbXMubGVuZ3RoIDwgMSkgcmV0dXJuIG51bGw7XG4gIGlmICghcGFyYW1zWzBdKSByZXR1cm4gbnVsbDtcbiAgdmFyIGJpcnRoRGF5ID0gbmV3IERhdGUocGFyYW1zWzBdKTtcbiAgdmFyIGFnZURpZk1zID0gRGF0ZS5ub3coKSAtIGJpcnRoRGF5LmdldFRpbWUoKTtcbiAgdmFyIGFnZURhdGUgPSBuZXcgRGF0ZShhZ2VEaWZNcyk7IC8vIG1pbGlzZWNvbmRzIGZyb20gZXBvY2hcbiAgcmV0dXJuIChcbiAgICBNYXRoLmFicyhhZ2VEYXRlLmdldFVUQ0Z1bGxZZWFyKCkgLSAxOTcwKSAqIChhZ2VEaWZNcyAvIE1hdGguYWJzKGFnZURpZk1zKSlcbiAgKTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImFnZVwiLCBhZ2UpO1xuXG5mdW5jdGlvbiBpc0NvbnRhaW5lclJlYWR5KHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAoIXBhcmFtcyAmJiBwYXJhbXMubGVuZ3RoIDwgMSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXBhcmFtc1swXSB8fCAhdGhpcy5zdXJ2ZXkpIHJldHVybiBmYWxzZTtcbiAgdmFyIG5hbWUgPSBwYXJhbXNbMF07XG4gIHZhciBjb250YWluZXIgPSB0aGlzLnN1cnZleS5nZXRQYWdlQnlOYW1lKG5hbWUpO1xuICBpZiAoIWNvbnRhaW5lcikgY29udGFpbmVyID0gdGhpcy5zdXJ2ZXkuZ2V0UGFuZWxCeU5hbWUobmFtZSk7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm4gZmFsc2U7XG4gIHZhciBxdWVzdGlvbnMgPSBjb250YWluZXIucXVlc3Rpb25zO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChxdWVzdGlvbnNbaV0uaGFzRXJyb3JzKGZhbHNlKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwiaXNDb250YWluZXJSZWFkeVwiLCBpc0NvbnRhaW5lclJlYWR5KTtcblxuZnVuY3Rpb24gaXNEaXNwbGF5TW9kZSgpIHtcbiAgcmV0dXJuIHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGlzcGxheU1vZGU7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJpc0Rpc3BsYXlNb2RlXCIsIGlzRGlzcGxheU1vZGUpO1xuXG5mdW5jdGlvbiBjdXJyZW50RGF0ZSgpIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJjdXJyZW50RGF0ZVwiLCBjdXJyZW50RGF0ZSk7XG5cbmZ1bmN0aW9uIHRvZGF5KHBhcmFtczogYW55W10pIHtcbiAgdmFyIHJlcyA9IG5ldyBEYXRlKCk7XG4gIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcykgJiYgcGFyYW1zLmxlbmd0aCA9PSAxKSB7XG4gICAgcmVzLnNldERhdGUocmVzLmdldERhdGUoKSArIHBhcmFtc1swXSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcInRvZGF5XCIsIHRvZGF5KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mdW5jdGlvbnNmYWN0b3J5LnRzIiwiaW1wb3J0IHtcbiAgSnNvbk9iamVjdCxcbiAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24sXG4gIEpzb25PYmplY3RQcm9wZXJ0eSxcbiAgU2VyaWFsaXplcixcbn0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhCYXNlTW9kZWwgfSBmcm9tIFwiLi9tYXJ0aXhCYXNlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICBCYXNlLFxuICBJUXVlc3Rpb24sXG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5LFxuICBJU3VydmV5SW1wbCxcbiAgSVRleHRQcm9jZXNzb3IsXG4gIFN1cnZleUVycm9yLFxuICBJUHJvZ3Jlc3NJbmZvLFxuICBTdXJ2ZXlFbGVtZW50LFxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yLCBUZXh0UHJlUHJvY2Vzc29yVmFsdWUgfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25TZWxlY3RCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgU3VydmV5VmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBnZXRDdXJyZWN5Q29kZXMgfSBmcm9tIFwiLi9xdWVzdGlvbl9leHByZXNzaW9uXCI7XG5pbXBvcnQgeyBGdW5jdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9mdW5jdGlvbnNmYWN0b3J5XCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeERyb3Bkb3duRGF0YSB7XG4gIHZhbHVlOiBhbnk7XG4gIG9uUm93Q2hhbmdlZChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICBuZXdSb3dWYWx1ZTogYW55LFxuICAgIGlzRGVsZXRpbmdWYWx1ZTogYm9vbGVhblxuICApOiB2b2lkO1xuICBvblJvd0NoYW5naW5nKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogYW55O1xuICBnZXRSb3dJbmRleChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogbnVtYmVyO1xuICB2YWxpZGF0ZUNlbGwoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93VmFsdWU6IGFueVxuICApOiBTdXJ2ZXlFcnJvcjtcbiAgY29sdW1uczogQXJyYXk8TWF0cml4RHJvcGRvd25Db2x1bW4+O1xuICBjcmVhdGVRdWVzdGlvbihcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgKTogUXVlc3Rpb247XG4gIGdldExvY2FsZSgpOiBzdHJpbmc7XG4gIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRTaGFyZWRRdWVzdGlvbkJ5TmFtZShcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBRdWVzdGlvbjtcbiAgb25Ub3RhbFZhbHVlQ2hhbmdlZCgpOiBhbnk7XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhDb2x1bW5Pd25lciBleHRlbmRzIElMb2NhbGl6YWJsZU93bmVyIHtcbiAgZ2V0UmVxdWlyZWRUZXh0KCk6IHN0cmluZztcbiAgb25Db2x1bW5Qcm9wZXJ0eUNoYW5nZWQoXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueVxuICApOiB2b2lkO1xuICBvblNob3dJbk11bHRpcGxlQ29sdW1uc0NoYW5nZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IHZvaWQ7XG4gIGdldENlbGxUeXBlKCk6IHN0cmluZztcbiAgb25Db2x1bW5DZWxsVHlwZUNoYW5nZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihcbiAgY2VsbFF1ZXN0aW9uOiBRdWVzdGlvblNlbGVjdEJhc2UsXG4gIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLFxuICBkYXRhOiBhbnlcbikge1xuICBjZWxsUXVlc3Rpb24uc3RvcmVPdGhlcnNBc0NvbW1lbnQgPSAhIXF1ZXN0aW9uXG4gICAgPyBxdWVzdGlvbi5zdG9yZU90aGVyc0FzQ29tbWVudFxuICAgIDogZmFsc2U7XG4gIGlmIChcbiAgICAoIWNlbGxRdWVzdGlvbi5jaG9pY2VzIHx8IGNlbGxRdWVzdGlvbi5jaG9pY2VzLmxlbmd0aCA9PSAwKSAmJlxuICAgIGNlbGxRdWVzdGlvbi5jaG9pY2VzQnlVcmwuaXNFbXB0eVxuICApIHtcbiAgICBjZWxsUXVlc3Rpb24uY2hvaWNlcyA9IHF1ZXN0aW9uLmNob2ljZXM7XG4gIH1cbiAgaWYgKCFjZWxsUXVlc3Rpb24uY2hvaWNlc0J5VXJsLmlzRW1wdHkpIHtcbiAgICBjZWxsUXVlc3Rpb24uY2hvaWNlc0J5VXJsLnJ1bihkYXRhKTtcbiAgfVxufVxuZXhwb3J0IHZhciBtYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzID0ge1xuICBkcm9wZG93bjoge1xuICAgIHByb3BlcnRpZXM6IFtcbiAgICAgIFwiY2hvaWNlc1wiLFxuICAgICAgXCJjaG9pY2VzT3JkZXJcIixcbiAgICAgIFwiY2hvaWNlc0J5VXJsXCIsXG4gICAgICBcIm9wdGlvbnNDYXB0aW9uXCIsXG4gICAgICBcIm90aGVyVGV4dFwiLFxuICAgICAgXCJjaG9pY2VzVmlzaWJsZUlmXCIsXG4gICAgXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHtcbiAgICAgIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb24sIGNvbHVtbiwgcXVlc3Rpb24sIGRhdGEpO1xuICAgICAgaWYgKCEhY2VsbFF1ZXN0aW9uLmxvY09wdGlvbnNDYXB0aW9uICYmXG4gICAgICAgIGNlbGxRdWVzdGlvbi5sb2NPcHRpb25zQ2FwdGlvbi5pc0VtcHR5ICYmXG4gICAgICAgICFxdWVzdGlvbi5sb2NPcHRpb25zQ2FwdGlvbi5pc0VtcHR5XG4gICAgICApIHtcbiAgICAgICAgY2VsbFF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uID0gcXVlc3Rpb24ub3B0aW9uc0NhcHRpb247XG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgY2hlY2tib3g6IHtcbiAgICBwcm9wZXJ0aWVzOiBbXG4gICAgICBcImNob2ljZXNcIixcbiAgICAgIFwiY2hvaWNlc09yZGVyXCIsXG4gICAgICBcImNob2ljZXNCeVVybFwiLFxuICAgICAgXCJvdGhlclRleHRcIixcbiAgICAgIFwiY2hvaWNlc1Zpc2libGVJZlwiLFxuICAgICAgXCJoYXNTZWxlY3RBbGxcIixcbiAgICAgIFwiaGFzTm9uZVwiLFxuICAgIF0sXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxuICAgICAgY29sdW1uOiBhbnksXG4gICAgICBxdWVzdGlvbjogYW55LFxuICAgICAgZGF0YTogYW55XG4gICAgKSA9PiB7XG4gICAgICBvblVwZGF0ZVNlbGVjdEJhc2VDZWxsUXVlc3Rpb24oY2VsbFF1ZXN0aW9uLCBjb2x1bW4sIHF1ZXN0aW9uLCBkYXRhKTtcbiAgICAgIGNlbGxRdWVzdGlvbi5jb2xDb3VudCA9XG4gICAgICAgIGNvbHVtbi5jb2xDb3VudCA+IC0xID8gY29sdW1uLmNvbENvdW50IDogcXVlc3Rpb24uY29sdW1uQ29sQ291bnQ7XG4gICAgfSxcbiAgfSxcbiAgcmFkaW9ncm91cDoge1xuICAgIHByb3BlcnRpZXM6IFtcbiAgICAgIFwiY2hvaWNlc1wiLFxuICAgICAgXCJjaG9pY2VzT3JkZXJcIixcbiAgICAgIFwiY2hvaWNlc0J5VXJsXCIsXG4gICAgICBcIm90aGVyVGV4dFwiLFxuICAgICAgXCJjaG9pY2VzVmlzaWJsZUlmXCIsXG4gICAgXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHtcbiAgICAgIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb24sIGNvbHVtbiwgcXVlc3Rpb24sIGRhdGEpO1xuICAgICAgY2VsbFF1ZXN0aW9uLmNvbENvdW50ID1cbiAgICAgICAgY29sdW1uLmNvbENvdW50ID4gLTEgPyBjb2x1bW4uY29sQ291bnQgOiBxdWVzdGlvbi5jb2x1bW5Db2xDb3VudDtcbiAgICB9LFxuICB9LFxuICB0ZXh0OiB7XG4gICAgcHJvcGVydGllczogW1wicGxhY2VIb2xkZXJcIiwgXCJpbnB1dFR5cGVcIiwgXCJtYXhMZW5ndGhcIiwgXCJtaW5cIiwgXCJtYXhcIiwgXCJzdGVwXCJdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoXG4gICAgICBjZWxsUXVlc3Rpb246IGFueSxcbiAgICAgIGNvbHVtbjogYW55LFxuICAgICAgcXVlc3Rpb246IGFueSxcbiAgICAgIGRhdGE6IGFueVxuICAgICkgPT4ge30sXG4gIH0sXG4gIGNvbW1lbnQ6IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJwbGFjZUhvbGRlclwiLCBcInJvd3NcIiwgXCJtYXhMZW5ndGhcIl0sXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxuICAgICAgY29sdW1uOiBhbnksXG4gICAgICBxdWVzdGlvbjogYW55LFxuICAgICAgZGF0YTogYW55XG4gICAgKSA9PiB7fSxcbiAgfSxcbiAgYm9vbGVhbjoge1xuICAgIHByb3BlcnRpZXM6IFtcImRlZmF1bHRWYWx1ZVwiXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKFxuICAgICAgY2VsbFF1ZXN0aW9uOiBhbnksXG4gICAgICBjb2x1bW46IGFueSxcbiAgICAgIHF1ZXN0aW9uOiBhbnksXG4gICAgICBkYXRhOiBhbnlcbiAgICApID0+IHtcbiAgICAgIGNlbGxRdWVzdGlvbi5zaG93VGl0bGUgPSB0cnVlO1xuICAgIH0sXG4gIH0sXG4gIGV4cHJlc3Npb246IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJleHByZXNzaW9uXCIsIFwiZGlzcGxheVN0eWxlXCIsIFwiY3VycmVuY3lcIl0sXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChcbiAgICAgIGNlbGxRdWVzdGlvbjogYW55LFxuICAgICAgY29sdW1uOiBhbnksXG4gICAgICBxdWVzdGlvbjogYW55LFxuICAgICAgZGF0YTogYW55XG4gICAgKSA9PiB7fSxcbiAgfSxcbiAgcmF0aW5nOiB7XG4gICAgcHJvcGVydGllczogW1wicmF0ZVZhbHVlc1wiXSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93bkNvbHVtbiBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBJTG9jYWxpemFibGVPd25lciB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0Q29sdW1uVHlwZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBtYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzKSB7XG4gICAgICByZXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgdGVtcGxhdGVRdWVzdGlvblZhbHVlOiBRdWVzdGlvbjtcbiAgcHJpdmF0ZSBjb2xPd25lclZhbHVlOiBJTWF0cml4Q29sdW1uT3duZXIgPSBudWxsO1xuICBwcml2YXRlIGluZGV4VmFsdWUgPSAtMTtcbiAgcHJpdmF0ZSBfaXNWaXNpYmxlID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfaGFzVmlzaWJsZUNlbGwgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidG90YWxGb3JtYXRcIiwgdGhpcyk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwic2hvd0luTXVsdGlwbGVDb2x1bW5zXCIsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuZG9TaG93SW5NdWx0aXBsZUNvbHVtbnNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIGlmICh0aXRsZSkgdGhpcy50aXRsZSA9IHRpdGxlO1xuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uZW5kTG9hZGluZ0Zyb21Kc29uKCk7XG4gIH1cbiAgZ2V0RHluYW1pY1Byb3BlcnR5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNlbGxUeXBlXCI7XG4gIH1cbiAgZ2V0RHluYW1pY1R5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jYWxjQ2VsbFF1ZXN0aW9uVHlwZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29sT3duZXIoKTogSU1hdHJpeENvbHVtbk93bmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb2xPd25lclZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sT3duZXIodmFsdWU6IElNYXRyaXhDb2x1bW5Pd25lcikge1xuICAgIHRoaXMuY29sT3duZXJWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlVGVtcGxhdGVRdWVzdGlvbigpO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHRoaXMubG9jVGl0bGUuc3RyQ2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBhZGRVc2VkTG9jYWxlcyhsb2NhbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgc3VwZXIuYWRkVXNlZExvY2FsZXMobG9jYWxlcyk7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmFkZFVzZWRMb2NhbGVzKGxvY2FsZXMpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXhWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0SW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLmluZGV4VmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNlbGxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2VsbFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICB2YWwgPSB2YWwudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjZWxsVHlwZVwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlVGVtcGxhdGVRdWVzdGlvbigpO1xuICAgIGlmICghIXRoaXMuY29sT3duZXIpIHtcbiAgICAgIHRoaXMuY29sT3duZXIub25Db2x1bW5DZWxsVHlwZUNoYW5nZWQodGhpcyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVRdWVzdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm5hbWU7XG4gIH1cbiAgcHVibGljIGdldCBpc1Zpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVmlzaWJsZTtcbiAgfVxuICBwdWJsaWMgc2V0SXNWaXNpYmxlKG5ld1ZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzVmlzaWJsZSA9IG5ld1ZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1Zpc2libGVDZWxsKCkge1xuICAgIHJldHVybiB0aGlzLl9oYXNWaXNpYmxlQ2VsbDtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc1Zpc2libGVDZWxsKG5ld1ZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuX2hhc1Zpc2libGVDZWxsID0gbmV3VmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm5hbWU7XG4gIH1cbiAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm5hbWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udGl0bGU7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi50aXRsZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubG9jVGl0bGU7XG4gIH1cbiAgcHVibGljIGdldCBmdWxsVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUaXRsZS50ZXh0T3JIdG1sO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmlzUmVxdWlyZWQ7XG4gIH1cbiAgcHVibGljIHNldCBpc1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5pc1JlcXVpcmVkID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZXF1aXJlZFRleHQ7XG4gIH1cbiAgcHVibGljIGdldCByZXF1aXJlZEVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVxdWlyZWRFcnJvclRleHQ7XG4gIH1cbiAgcHVibGljIHNldCByZXF1aXJlZEVycm9yVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5yZXF1aXJlZEVycm9yVGV4dCA9IHZhbDtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubG9jUmVxdWlyZWRFcnJvclRleHQ7XG4gIH1cbiAgcHVibGljIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlYWRPbmx5O1xuICB9XG4gIHB1YmxpYyBzZXQgcmVhZE9ubHkodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnJlYWRPbmx5ID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzT3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5oYXNPdGhlcjtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc090aGVyKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5oYXNPdGhlciA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udmlzaWJsZUlmO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnZpc2libGVJZiA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGVuYWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5lbmFibGVJZjtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmVuYWJsZUlmID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVxdWlyZWRJZjtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVxdWlyZWRJZiA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHNob3dJbk11bHRpcGxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0luTXVsdGlwbGVDb2x1bW5zXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dJbk11bHRpcGxlQ29sdW1ucyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93SW5NdWx0aXBsZUNvbHVtbnNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU3VwcG9ydE11bHRpcGxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gW1wiY2hlY2tib3hcIiwgXCJyYWRpb2dyb3VwXCJdLmluZGV4T2YodGhpcy5jZWxsVHlwZSkgPiAtMTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU2hvd0luTXVsdGlwbGVDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dJbk11bHRpcGxlQ29sdW1ucyAmJiB0aGlzLmlzU3VwcG9ydE11bHRpcGxlQ29sdW1ucztcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi52YWxpZGF0b3JzO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsaWRhdG9ycyh2YWw6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4pIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udmFsaWRhdG9ycyA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbFR5cGVcIiwgXCJub25lXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxUeXBlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbEV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxFeHByZXNzaW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxFeHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxFeHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUb3RhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b3RhbFR5cGUgIT0gXCJub25lXCIgfHwgISF0aGlzLnRvdGFsRXhwcmVzc2lvbjtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidG90YWxGb3JtYXRcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB0b3RhbEZvcm1hdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidG90YWxGb3JtYXRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jVG90YWxGb3JtYXQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidG90YWxGb3JtYXRcIik7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbE1heGltdW1GcmFjdGlvbkRpZ2l0cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbE1heGltdW1GcmFjdGlvbkRpZ2l0c1wiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCB0b3RhbE1heGltdW1GcmFjdGlvbkRpZ2l0cyh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiAyMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbE1pbmltdW1GcmFjdGlvbkRpZ2l0cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbE1pbmltdW1GcmFjdGlvbkRpZ2l0c1wiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCB0b3RhbE1pbmltdW1GcmFjdGlvbkRpZ2l0cyh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiAyMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbERpc3BsYXlTdHlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0b3RhbERpc3BsYXlTdHlsZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRvdGFsRGlzcGxheVN0eWxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxEaXNwbGF5U3R5bGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRvdGFsQ3VycmVuY3koKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidG90YWxDdXJyZW5jeVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRvdGFsQ3VycmVuY3kodmFsOiBzdHJpbmcpIHtcbiAgICBpZiAoZ2V0Q3VycmVjeUNvZGVzKCkuaW5kZXhPZih2YWwpIDwgMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRvdGFsQ3VycmVuY3lcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG1pbldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pbldpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5XaWR0aFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgd2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB3aWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBjb2xDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCBjb2xDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiA0KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sT3duZXIgPyB0aGlzLmNvbE93bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sT3duZXIgPyB0aGlzLmNvbE93bmVyLmdldE1hcmtkb3duSHRtbCh0ZXh0KSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2xPd25lciA/IHRoaXMuY29sT3duZXIuZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0KSA6IHRleHQ7XG4gIH1cbiAgcHVibGljIGNyZWF0ZUNlbGxRdWVzdGlvbihkYXRhOiBhbnkpOiBRdWVzdGlvbiB7XG4gICAgdmFyIHFUeXBlID0gdGhpcy5jYWxjQ2VsbFF1ZXN0aW9uVHlwZSgpO1xuICAgIHZhciBjZWxsUXVlc3Rpb24gPSA8UXVlc3Rpb24+dGhpcy5jcmVhdGVOZXdRdWVzdGlvbihxVHlwZSk7XG4gICAgdGhpcy5jYWxsT25DZWxsUXVlc3Rpb25VcGRhdGUoY2VsbFF1ZXN0aW9uLCBkYXRhKTtcbiAgICByZXR1cm4gY2VsbFF1ZXN0aW9uO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDZWxsUXVlc3Rpb24oXG4gICAgY2VsbFF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBkYXRhOiBhbnksXG4gICAgb25VcGRhdGVKc29uOiAoanNvbjogYW55KSA9PiBhbnkgPSBudWxsXG4gICkge1xuICAgIHRoaXMuc2V0UXVlc3Rpb25Qcm9wZXJ0aWVzKGNlbGxRdWVzdGlvbiwgb25VcGRhdGVKc29uKTtcbiAgICB0aGlzLmNhbGxPbkNlbGxRdWVzdGlvblVwZGF0ZShjZWxsUXVlc3Rpb24sIGRhdGEpO1xuICB9XG4gIHByaXZhdGUgY2FsbE9uQ2VsbFF1ZXN0aW9uVXBkYXRlKGNlbGxRdWVzdGlvbjogUXVlc3Rpb24sIGRhdGE6IGFueSkge1xuICAgIHZhciBxVHlwZSA9IGNlbGxRdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgdmFyIHFEZWZpbml0aW9uID0gKDxhbnk+bWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcylbcVR5cGVdO1xuICAgIGlmIChxRGVmaW5pdGlvbiAmJiBxRGVmaW5pdGlvbltcIm9uQ2VsbFF1ZXN0aW9uVXBkYXRlXCJdKSB7XG4gICAgICBxRGVmaW5pdGlvbltcIm9uQ2VsbFF1ZXN0aW9uVXBkYXRlXCJdKFxuICAgICAgICBjZWxsUXVlc3Rpb24sXG4gICAgICAgIHRoaXMsXG4gICAgICAgIHRoaXMuY29sT3duZXIsXG4gICAgICAgIGRhdGFcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGRlZmF1bHRDZWxsVHlwZUNoYW5nZWQoKSB7XG4gICAgdGhpcy51cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNhbGNDZWxsUXVlc3Rpb25UeXBlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY2VsbFR5cGUgIT09IFwiZGVmYXVsdFwiKSByZXR1cm4gdGhpcy5jZWxsVHlwZTtcbiAgICBpZiAodGhpcy5jb2xPd25lcikgcmV0dXJuIHRoaXMuY29sT3duZXIuZ2V0Q2VsbFR5cGUoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MubWF0cml4RGVmYXVsdENlbGxUeXBlO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCkge1xuICAgIHZhciBwcmV2Q2VsbFR5cGUgPSB0aGlzLnRlbXBsYXRlUXVlc3Rpb25cbiAgICAgID8gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmdldFR5cGUoKVxuICAgICAgOiBcIlwiO1xuICAgIHZhciBjdXJDZWxsVHlwZSA9IHRoaXMuY2FsY0NlbGxRdWVzdGlvblR5cGUoKTtcbiAgICBpZiAoY3VyQ2VsbFR5cGUgPT09IHByZXZDZWxsVHlwZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRlbXBsYXRlUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMucmVtb3ZlUHJvcGVydGllcyhwcmV2Q2VsbFR5cGUpO1xuICAgIH1cbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb25WYWx1ZSA9IHRoaXMuY3JlYXRlTmV3UXVlc3Rpb24oY3VyQ2VsbFR5cGUpO1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NPd25lciA9IHRoaXM7XG4gICAgdGhpcy5hZGRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm9uUHJvcGVydHlDaGFuZ2VkLmFkZChmdW5jdGlvbiAoc2VuZGVyLCBvcHRpb25zKSB7XG4gICAgICBzZWxmLmRvQ29sdW1uUHJvcGVydGllc0NoYW5nZWQob3B0aW9ucy5uYW1lLCBvcHRpb25zLm5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3UXVlc3Rpb24oY2VsbFR5cGU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb24gPSA8UXVlc3Rpb24+U2VyaWFsaXplci5jcmVhdGVDbGFzcyhjZWxsVHlwZSk7XG4gICAgaWYgKCFxdWVzdGlvbikge1xuICAgICAgcXVlc3Rpb24gPSA8UXVlc3Rpb24+U2VyaWFsaXplci5jcmVhdGVDbGFzcyhcInRleHRcIik7XG4gICAgfVxuICAgIHF1ZXN0aW9uLmxvYWRpbmdPd25lciA9IHRoaXM7XG4gICAgdGhpcy5zZXRRdWVzdGlvblByb3BlcnRpZXMocXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UXVlc3Rpb25Qcm9wZXJ0aWVzKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBvblVwZGF0ZUpzb246IChqc29uOiBhbnkpID0+IGFueSA9IG51bGxcbiAgKSB7XG4gICAgaWYgKHRoaXMudGVtcGxhdGVRdWVzdGlvbikge1xuICAgICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdCh0aGlzLnRlbXBsYXRlUXVlc3Rpb24sIHRydWUpO1xuICAgICAgaWYgKG9uVXBkYXRlSnNvbikge1xuICAgICAgICBvblVwZGF0ZUpzb24oanNvbik7XG4gICAgICB9XG4gICAgICBqc29uLnR5cGUgPSBxdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgICBuZXcgSnNvbk9iamVjdCgpLnRvT2JqZWN0KGpzb24sIHF1ZXN0aW9uKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZywgb2xkVmFsdWU6IGFueSwgbmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgdGhpcy5kb0NvbHVtblByb3BlcnRpZXNDaGFuZ2VkKG5hbWUsIG5ld1ZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGRvQ29sdW1uUHJvcGVydGllc0NoYW5nZWQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKG5hbWUgPT0gXCJ2aXNpYmxlQ2hvaWNlc1wiKSByZXR1cm47IC8vVE9ETyBkZXNjcmlwdG9yIGRvZXNuJ3QgcmV0dXJuIHRoYXQgaXQgaXMgYSByZWFkLW9ubHkgcHJvcGVydHlcbiAgICBpZiAodGhpcy5jb2xPd25lciAhPSBudWxsICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmNvbE93bmVyLm9uQ29sdW1uUHJvcGVydHlDaGFuZ2VkKHRoaXMsIG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBkb1Nob3dJbk11bHRpcGxlQ29sdW1uc0NoYW5nZWQoKSB7XG4gICAgaWYgKHRoaXMuY29sT3duZXIgIT0gbnVsbCAmJiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5jb2xPd25lci5vblNob3dJbk11bHRpcGxlQ29sdW1uc0NoYW5nZWQodGhpcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0UHJvcGVydGllcyhjdXJDZWxsVHlwZTogc3RyaW5nKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgcmV0dXJuIFNlcmlhbGl6ZXIuZ2V0RHluYW1pY1Byb3BlcnRpZXNCeU9iaih0aGlzLCBjdXJDZWxsVHlwZSk7XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmVQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlOiBzdHJpbmcpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhjdXJDZWxsVHlwZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BlcnRpZXNbaV07XG4gICAgICBkZWxldGUgKDxhbnk+dGhpcylbcHJvcC5uYW1lXTtcbiAgICAgIGlmIChwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSkge1xuICAgICAgICBkZWxldGUgKDxhbnk+dGhpcylbcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZFByb3BlcnRpZXMoY3VyQ2VsbFR5cGU6IHN0cmluZykge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMudGVtcGxhdGVRdWVzdGlvbjtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhjdXJDZWxsVHlwZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BlcnRpZXNbaV07XG4gICAgICB0aGlzLmFkZFByb3BlcnR5KHF1ZXN0aW9uLCBwcm9wLm5hbWUsIGZhbHNlKTtcbiAgICAgIGlmIChwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSkge1xuICAgICAgICB0aGlzLmFkZFByb3BlcnR5KHF1ZXN0aW9uLCBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkUHJvcGVydHkoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgaXNSZWFkT25seTogYm9vbGVhblxuICApIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGRlc2MgPSB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICg8YW55PnF1ZXN0aW9uKVtwcm9wTmFtZV07XG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKCFpc1JlYWRPbmx5KSB7XG4gICAgICAoPGFueT5kZXNjKVtcInNldFwiXSA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcbiAgICAgICAgbGV0IG9sZFZhbHVlID0gKDxhbnk+cXVlc3Rpb24pW3Byb3BOYW1lXTtcbiAgICAgICAgKDxhbnk+cXVlc3Rpb24pW3Byb3BOYW1lXSA9IHY7XG4gICAgICAgIHNlbGYucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcE5hbWUsIG9sZFZhbHVlLCB2KTtcbiAgICAgIH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wTmFtZSwgZGVzYyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gIHByaXZhdGUgcXVlc3Rpb25WYWx1ZTogUXVlc3Rpb247XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIHB1YmxpYyByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHB1YmxpYyBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhXG4gICkge1xuICAgIHRoaXMucXVlc3Rpb25WYWx1ZSA9IHRoaXMuY3JlYXRlUXVlc3Rpb24oY29sdW1uLCByb3csIGRhdGEpO1xuICAgIHRoaXMucXVlc3Rpb25WYWx1ZS51cGRhdGVDdXN0b21XaWRnZXQoKTtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgdGhpcy5xdWVzdGlvbi5sb2NTdHJzQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVRdWVzdGlvbihcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YVxuICApOiBRdWVzdGlvbiB7XG4gICAgdmFyIHJlcyA9IGRhdGEuY3JlYXRlUXVlc3Rpb24odGhpcy5yb3csIHRoaXMuY29sdW1uKTtcbiAgICByZXMudmFsaWRhdGVWYWx1ZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGRhdGEudmFsaWRhdGVDZWxsKHJvdywgY29sdW1uLm5hbWUsIHJvdy52YWx1ZSk7XG4gICAgfTtcbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5nZXRQcm9wZXJ0aWVzKGNvbHVtbi5nZXRUeXBlKCkpLmZvckVhY2goXG4gICAgICAocHJvcGVydHkpID0+IHtcbiAgICAgICAgbGV0IHByb3BlcnR5TmFtZSA9IHByb3BlcnR5Lm5hbWU7XG4gICAgICAgIGlmICgoPGFueT5jb2x1bW4pW3Byb3BlcnR5TmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc1twcm9wZXJ0eU5hbWVdID0gKDxhbnk+Y29sdW1uKVtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgdGhpcy5xdWVzdGlvbi5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Ub3RhbENlbGwgZXh0ZW5kcyBNYXRyaXhEcm9wZG93bkNlbGwge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBwdWJsaWMgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBwdWJsaWMgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YVxuICApIHtcbiAgICBzdXBlcihjb2x1bW4sIHJvdywgZGF0YSk7XG4gICAgdGhpcy51cGRhdGVDZWxsUXVlc3Rpb24oKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUXVlc3Rpb24oXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGFcbiAgKTogUXVlc3Rpb24ge1xuICAgIHZhciByZXMgPSA8UXVlc3Rpb24+U2VyaWFsaXplci5jcmVhdGVDbGFzcyhcImV4cHJlc3Npb25cIik7XG4gICAgcmVzLnNldFN1cnZleUltcGwocm93KTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZUNlbGxRdWVzdGlvbigpO1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUNlbGxRdWVzdGlvbigpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgdGhpcy5jb2x1bW4udXBkYXRlQ2VsbFF1ZXN0aW9uKHRoaXMucXVlc3Rpb24sIG51bGwsIGZ1bmN0aW9uIChqc29uKSB7XG4gICAgICBkZWxldGUganNvbltcImRlZmF1bHRWYWx1ZVwiXTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXN0aW9uLmV4cHJlc3Npb24gPSB0aGlzLmdldFRvdGFsRXhwcmVzc2lvbigpO1xuICAgIHRoaXMucXVlc3Rpb24uZm9ybWF0ID0gdGhpcy5jb2x1bW4udG90YWxGb3JtYXQ7XG4gICAgdGhpcy5xdWVzdGlvbi5jdXJyZW5jeSA9IHRoaXMuY29sdW1uLnRvdGFsQ3VycmVuY3k7XG4gICAgdGhpcy5xdWVzdGlvbi5kaXNwbGF5U3R5bGUgPSB0aGlzLmNvbHVtbi50b3RhbERpc3BsYXlTdHlsZTtcbiAgICB0aGlzLnF1ZXN0aW9uLm1heGltdW1GcmFjdGlvbkRpZ2l0cyA9IHRoaXMuY29sdW1uLnRvdGFsTWF4aW11bUZyYWN0aW9uRGlnaXRzO1xuICAgIHRoaXMucXVlc3Rpb24ubWluaW11bUZyYWN0aW9uRGlnaXRzID0gdGhpcy5jb2x1bW4udG90YWxNaW5pbXVtRnJhY3Rpb25EaWdpdHM7XG4gICAgdGhpcy5xdWVzdGlvbi51bmxvY0NhbGN1bGF0aW9uKCk7XG4gIH1cbiAgcHVibGljIGdldFRvdGFsRXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIGlmICghIXRoaXMuY29sdW1uLnRvdGFsRXhwcmVzc2lvbikgcmV0dXJuIHRoaXMuY29sdW1uLnRvdGFsRXhwcmVzc2lvbjtcbiAgICBpZiAodGhpcy5jb2x1bW4udG90YWxUeXBlID09IFwibm9uZVwiKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgZnVuTmFtZSA9IHRoaXMuY29sdW1uLnRvdGFsVHlwZSArIFwiSW5BcnJheVwiO1xuICAgIGlmICghRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLmhhc0Z1bmN0aW9uKGZ1bk5hbWUpKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gZnVuTmFtZSArIFwiKHtzZWxmfSwgJ1wiICsgdGhpcy5jb2x1bW4ubmFtZSArIFwiJylcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbiAgaW1wbGVtZW50cyBJU3VydmV5RGF0YSwgSVN1cnZleUltcGwsIElMb2NhbGl6YWJsZU93bmVyLCBJVGV4dFByb2Nlc3NvciB7XG4gIHB1YmxpYyBzdGF0aWMgUm93VmFyaWFibGVOYW1lID0gXCJyb3dcIjtcbiAgcHVibGljIHN0YXRpYyBPd25lclZhcmlhYmxlTmFtZSA9IFwic2VsZlwiO1xuICBwdWJsaWMgc3RhdGljIEluZGV4VmFyaWFibGVOYW1lID0gXCJyb3dJbmRleFwiO1xuICBwdWJsaWMgc3RhdGljIFJvd1ZhbHVlVmFyaWFibGVOYW1lID0gXCJyb3dWYWx1ZVwiO1xuXG4gIHByaXZhdGUgc3RhdGljIGlkQ291bnRlcjogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzcm93X1wiICsgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuaWRDb3VudGVyKys7XG4gIH1cbiAgcHJvdGVjdGVkIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGE7XG4gIHByb3RlY3RlZCBpc1NldHRpbmdWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGlkVmFsdWU6IHN0cmluZztcbiAgcHJpdmF0ZSB0ZXh0UHJlUHJvY2Vzc29yOiBUZXh0UHJlUHJvY2Vzc29yO1xuXG4gIHB1YmxpYyBjZWxsczogQXJyYXk8TWF0cml4RHJvcGRvd25DZWxsPiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGEsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3NvciA9IG5ldyBUZXh0UHJlUHJvY2Vzc29yKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3Nvci5vblByb2Nlc3MgPSBmdW5jdGlvbiAoXG4gICAgICB0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZVxuICAgICkge1xuICAgICAgc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlKTtcbiAgICB9O1xuICAgIHRoaXMuaWRWYWx1ZSA9IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLmdldElkKCk7XG4gIH1cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCByb3dOYW1lKCk6IGFueSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IGFueSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICAgIGlmICghcXVlc3Rpb24uaXNFbXB0eSgpKSB7XG4gICAgICAgIHJlc3VsdFtxdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKV0gPSBxdWVzdGlvbi52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgISFxdWVzdGlvbi5jb21tZW50ICYmXG4gICAgICAgICEhdGhpcy5nZXRTdXJ2ZXkoKSAmJlxuICAgICAgICB0aGlzLmdldFN1cnZleSgpLnN0b3JlT3RoZXJzQXNDb21tZW50XG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0W3F1ZXN0aW9uLmdldFZhbHVlTmFtZSgpICsgc2V0dGluZ3MuY29tbWVudFByZWZpeF0gPVxuICAgICAgICAgIHF1ZXN0aW9uLmNvbW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldCBsb2NUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxuICBnZXRGaWx0ZXJlZFZhbHVlcygpOiBhbnkge1xuICAgIHZhciBhbGxWYWx1ZXMgPSB0aGlzLmdldEFsbFZhbHVlcygpO1xuICAgIHZhciB2YWx1ZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7IHJvdzogYWxsVmFsdWVzIH07XG4gICAgZm9yICh2YXIga2V5IGluIGFsbFZhbHVlcykge1xuICAgICAgdmFsdWVzW2tleV0gPSBhbGxWYWx1ZXNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBnZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55IHtcbiAgICByZXR1cm4geyBzdXJ2ZXk6IHRoaXMuZ2V0U3VydmV5KCksIHJvdzogdGhpcyB9O1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAoISF0aGlzLmRhdGEpIHtcbiAgICAgIHZhbHVlc1tNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5Pd25lclZhcmlhYmxlTmFtZV0gPSB0aGlzLmRhdGEudmFsdWU7XG4gICAgfVxuICAgIHZhbHVlc1tNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5JbmRleFZhcmlhYmxlTmFtZV0gPSB0aGlzLnJvd0luZGV4O1xuICAgIHZhbHVlc1tNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5Sb3dWYWx1ZVZhcmlhYmxlTmFtZV0gPSB0aGlzLnJvd05hbWU7XG4gICAgaWYgKCFwcm9wZXJ0aWVzKSBwcm9wZXJ0aWVzID0ge307XG4gICAgcHJvcGVydGllc1tNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5Sb3dWYXJpYWJsZU5hbWVdID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlc1tNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5Sb3dWYXJpYWJsZU5hbWVdID0gdGhpcy52YWx1ZTtcbiAgICAgIHRoaXMuY2VsbHNbaV0ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICAgIHZhciB2YWwgPSAhIXZhbHVlID8gdmFsdWVbcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCldIDogbnVsbDtcbiAgICAgIHZhciBvbGRDb21tZW50ID0gcXVlc3Rpb24uY29tbWVudDtcbiAgICAgIHZhciBjb21tZW50ID0gISF2YWx1ZVxuICAgICAgICA/IHZhbHVlW3F1ZXN0aW9uLmdldFZhbHVlTmFtZSgpICsgc2V0dGluZ3MuY29tbWVudFByZWZpeF1cbiAgICAgICAgOiBcIlwiO1xuICAgICAgaWYgKGNvbW1lbnQgPT0gdW5kZWZpbmVkKSBjb21tZW50ID0gXCJcIjtcbiAgICAgIHF1ZXN0aW9uLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh2YWwpO1xuICAgICAgaWYgKCEhY29tbWVudCB8fCBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMob2xkQ29tbWVudCwgcXVlc3Rpb24uY29tbWVudCkpIHtcbiAgICAgICAgcXVlc3Rpb24udXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkoY29tbWVudCk7XG4gICAgICB9XG4gICAgICBxdWVzdGlvbi5vblN1cnZleVZhbHVlQ2hhbmdlZCh2YWwpO1xuICAgIH1cbiAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jZWxsc1tpXS5xdWVzdGlvbi5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldERhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaDogYW55LCBrZXk6IHN0cmluZykge1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xuICAgIGlmICghIXN1cnZleSkge1xuICAgICAgcmV0dXJuICg8YW55PnN1cnZleSkuZ2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoLCBrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWVzSGFzaFtrZXldO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKG5hbWUpO1xuICAgIHJldHVybiAhIXF1ZXN0aW9uID8gcXVlc3Rpb24udmFsdWUgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld0NvbHVtblZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnNldFZhbHVlQ29yZShuYW1lLCBuZXdDb2x1bW5WYWx1ZSwgZmFsc2UpO1xuICB9XG4gIGdldFZhcmlhYmxlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHt9XG4gIHB1YmxpYyBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5Q29sdW1uTmFtZShuYW1lKTtcbiAgICByZXR1cm4gISFxdWVzdGlvbiA/IHF1ZXN0aW9uLmNvbW1lbnQgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzZXRDb21tZW50KG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZywgbG9jTm90aWZpY2F0aW9uOiBhbnkpIHtcbiAgICB0aGlzLnNldFZhbHVlQ29yZShuYW1lLCBuZXdWYWx1ZSwgdHJ1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRWYWx1ZUNvcmUobmFtZTogc3RyaW5nLCBuZXdDb2x1bW5WYWx1ZTogYW55LCBpc0NvbW1lbnQ6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5pc1NldHRpbmdWYWx1ZSkgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgdmFyIGNoYW5nZWROYW1lID0gaXNDb21tZW50ID8gbmFtZSArIHNldHRpbmdzLmNvbW1lbnRQcmVmaXggOiBuYW1lO1xuICAgIHZhciBjaGFuZ2VkVmFsdWUgPSBpc0NvbW1lbnQgPyB0aGlzLmdldENvbW1lbnQobmFtZSkgOiB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgIHZhciBjaGFuZ2VkUXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKG5hbWUpO1xuICAgIHZhciBjaGFuZ2luZ1ZhbHVlID0gdGhpcy5kYXRhLm9uUm93Q2hhbmdpbmcodGhpcywgY2hhbmdlZE5hbWUsIG5ld1ZhbHVlKTtcbiAgICBpZiAoXG4gICAgICAhIWNoYW5nZWRRdWVzdGlvbiAmJlxuICAgICAgIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhjaGFuZ2luZ1ZhbHVlLCBjaGFuZ2VkVmFsdWUpXG4gICAgKSB7XG4gICAgICBpZiAoaXNDb21tZW50KSB7XG4gICAgICAgIGNoYW5nZWRRdWVzdGlvbi5jb21tZW50ID0gY2hhbmdpbmdWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoYW5nZWRRdWVzdGlvbi52YWx1ZSA9IGNoYW5naW5nVmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGF0YS5vblJvd0NoYW5nZWQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGNoYW5nZWROYW1lLFxuICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgbmV3Q29sdW1uVmFsdWUgPT0gbnVsbCAmJiAhY2hhbmdlZFF1ZXN0aW9uXG4gICAgICApO1xuICAgICAgdGhpcy5vbkFueVZhbHVlQ2hhbmdlZChNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5Sb3dWYXJpYWJsZU5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbCkpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIGlmICh2YWxba2V5XSAhPT0gdW5kZWZpbmVkICYmIHZhbFtrZXldICE9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXRRdWVzdGlvbkJ5Q29sdW1uKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBRdWVzdGlvbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jZWxsc1tpXS5jb2x1bW4gPT0gY29sdW1uKSByZXR1cm4gdGhpcy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNlbGxzW2ldLmNvbHVtbi5uYW1lID09IGNvbHVtbk5hbWUpXG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoY29sdW1uTmFtZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YVxuICAgICAgPyB0aGlzLmRhdGEuZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoY29sdW1uTmFtZSwgdGhpcylcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXModmFsOiBhbnkpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKGtleSk7XG4gICAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgICAgdmFyIHFWYWwgPSBxdWVzdGlvbi52YWx1ZTtcbiAgICAgICAgcXVlc3Rpb24uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICAgICAgaWYgKCFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMocVZhbCwgcXVlc3Rpb24udmFsdWUpKSB7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZShrZXksIHF1ZXN0aW9uLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLmdldFNoYXJlZFF1ZXN0aW9uQnlOYW1lKGtleSkpIHtcbiAgICAgICAgICB0aGlzLnNldFZhbHVlKGtleSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0TG9jYWxlKCkgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldE1hcmtkb3duSHRtbCh0ZXh0KSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldFByb2Nlc3NlZFRleHQodGV4dCkgOiB0ZXh0O1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2VsbHNbaV0ubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHVwZGF0ZUNlbGxRdWVzdGlvbk9uQ29sdW1uQ2hhbmdlZChcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogYW55XG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2VsbHNbaV0uY29sdW1uID09PSBjb2x1bW4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVDZWxsT25Db2x1bW5DaGFuZ2VkKHRoaXMuY2VsbHNbaV0sIG5hbWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgb25RdWVzdGlvblJlYWRPbmx5Q2hhbmdlZChwYXJlbnRJc1JlYWRPbmx5OiBib29sZWFuKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoISF0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uKSB7XG4gICAgICAgIHRoaXMuY2VsbHNbaV0ucXVlc3Rpb24ucmVhZE9ubHkgPSBwYXJlbnRJc1JlYWRPbmx5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQ2VsbE9uQ29sdW1uQ2hhbmdlZChcbiAgICBjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgY2VsbC5xdWVzdGlvbltuYW1lXSA9IG5ld1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBidWlsZENlbGxzKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzU2V0dGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICB2YXIgY29sdW1ucyA9IHRoaXMuZGF0YS5jb2x1bW5zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbHVtbiA9IGNvbHVtbnNbaV07XG4gICAgICBpZiAoIWNvbHVtbi5pc1Zpc2libGUpIGNvbnRpbnVlO1xuICAgICAgdmFyIGNlbGwgPSB0aGlzLmNyZWF0ZUNlbGwoY29sdW1uKTtcbiAgICAgIHRoaXMuY2VsbHMucHVzaChjZWxsKTtcbiAgICAgIGlmICghIXZhbHVlICYmICFIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZVtjb2x1bW4ubmFtZV0pKSB7XG4gICAgICAgIGNlbGwucXVlc3Rpb24udmFsdWUgPSB2YWx1ZVtjb2x1bW4ubmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQ2VsbChjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKTogTWF0cml4RHJvcGRvd25DZWxsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duQ2VsbChjb2x1bW4sIHRoaXMsIHRoaXMuZGF0YSk7XG4gIH1cbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRTdXJ2ZXkoKSA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCByb3dJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRSb3dJbmRleCh0aGlzKSArIDEgOiAtMTtcbiAgfVxuICAvL0lUZXh0UHJvY2Vzc29yXG4gIHByaXZhdGUgZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKSB7XG4gICAgdmFyIGZpcnN0TmFtZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRGaXJzdE5hbWUodGV4dFZhbHVlLm5hbWUpO1xuICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9XG4gICAgICBmaXJzdE5hbWUgPT0gTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UuUm93VmFyaWFibGVOYW1lO1xuICAgIHRleHRWYWx1ZS5jYW5Qcm9jZXNzID0gdGV4dFZhbHVlLmlzRXhpc3RzO1xuICAgIGlmICghdGV4dFZhbHVlLmlzRXhpc3RzKSByZXR1cm47XG4gICAgdmFyIHZhbHVlcyA9IHsgcm93OiB0aGlzLnZhbHVlIH07XG4gICAgdGV4dFZhbHVlLnZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldFZhbHVlKHRleHRWYWx1ZS5uYW1lLCB2YWx1ZXMpO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIHByb2Nlc3NUZXh0KHRleHQ6IHN0cmluZywgcmV0dXJuRGlzcGxheVZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB0ZXh0ID0gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLnByb2Nlc3ModGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKTtcbiAgICBpZiAoIXRoaXMuZ2V0U3VydmV5KCkpIHJldHVybiB0ZXh0O1xuICAgIHJldHVybiB0aGlzLmdldFN1cnZleSgpLnByb2Nlc3NUZXh0KHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gIH1cbiAgcHJvY2Vzc1RleHRFeCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IGFueSB7XG4gICAgdGV4dCA9IHRoaXMucHJvY2Vzc1RleHQodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKTtcbiAgICBpZiAoIXRoaXMuZ2V0U3VydmV5KCkpIHJldHVybiB0ZXh0O1xuICAgIHZhciBoYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IuaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHZhciByZXMgPSB0aGlzLmdldFN1cnZleSgpLnByb2Nlc3NUZXh0RXgodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBmYWxzZSk7XG4gICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biA9XG4gICAgICByZXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuICYmIGhhc0FsbFZhbHVlc09uTGFzdFJ1bjtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Ub3RhbFJvd01vZGVsIGV4dGVuZHMgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2Uge1xuICBjb25zdHJ1Y3RvcihkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhKSB7XG4gICAgc3VwZXIoZGF0YSwgbnVsbCk7XG4gICAgdGhpcy5idWlsZENlbGxzKG51bGwpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVDZWxsKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBNYXRyaXhEcm9wZG93bkNlbGwge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHJvcGRvd25Ub3RhbENlbGwoY29sdW1uLCB0aGlzLCB0aGlzLmRhdGEpO1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAoISF0aGlzLmRhdGEgJiYgIXRoaXMuaXNTZXR0aW5nVmFsdWUpIHtcbiAgICAgIHRoaXMuZGF0YS5vblRvdGFsVmFsdWVDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB2YXIgY291bnRlciA9IDA7XG4gICAgdmFyIHByZXZWYWx1ZTtcbiAgICBkbyB7XG4gICAgICBwcmV2VmFsdWUgPSBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgICBjb3VudGVyKys7XG4gICAgfSB3aGlsZSAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhwcmV2VmFsdWUsIHRoaXMudmFsdWUpICYmIGNvdW50ZXIgPCAzKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQ2VsbE9uQ29sdW1uQ2hhbmdlZChcbiAgICBjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGwsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgKDxNYXRyaXhEcm9wZG93blRvdGFsQ2VsbD5jZWxsKS51cGRhdGVDZWxsUXVlc3Rpb24oKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCB7XG4gIHByaXZhdGUgc3RhdGljIGNvdW50ZXIgPSAxO1xuICBwcml2YXRlIGlkVmFsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBpdGVtVmFsdWU6IEl0ZW1WYWx1ZTtcbiAgcHVibGljIG1pbldpZHRoOiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgd2lkdGg6IHN0cmluZyA9IFwiXCI7XG4gIHB1YmxpYyBsb2NUaXRsZTogTG9jYWxpemFibGVTdHJpbmc7XG4gIHB1YmxpYyBjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGw7XG4gIHB1YmxpYyByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlO1xuICBwdWJsaWMgcXVlc3Rpb246IFF1ZXN0aW9uO1xuICBwdWJsaWMgaXNSZW1vdmVSb3c6IGJvb2xlYW47XG4gIHB1YmxpYyBjaG9pY2VJbmRleDogbnVtYmVyO1xuICBwdWJsaWMgbWF0cml4OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlO1xuICBwdWJsaWMgcmVxdWlyZWRUZXh0OiBzdHJpbmc7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlkVmFsdWUgPSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLmNvdW50ZXIrKztcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1F1ZXN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMucXVlc3Rpb247XG4gIH1cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmxvY1RpdGxlO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pZFZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0Vycm9yT25Ub3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0Vycm9yT25Db3JlKFwidG9wXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0Vycm9yT25Cb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0Vycm9yT25Db3JlKFwiYm90dG9tXCIpO1xuICB9XG4gIHByaXZhdGUgc2hvd0Vycm9yT25Db3JlKGxvY2F0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5nZXRTaG93RXJyb3JMb2NhdGlvbigpID09IGxvY2F0aW9uICYmXG4gICAgICAoIXRoaXMuaXNDaG9pY2UgfHwgdGhpcy5pc0ZpcnN0Q2hvaWNlKVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRTaG93RXJyb3JMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmhhc1F1ZXN0aW9uID8gdGhpcy5xdWVzdGlvbi5zdXJ2ZXkucXVlc3Rpb25FcnJvckxvY2F0aW9uIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBpdGVtKHZhbDogSXRlbVZhbHVlKSB7XG4gICAgdGhpcy5pdGVtVmFsdWUgPSB2YWw7XG4gICAgaWYgKCEhdmFsKSB7XG4gICAgICB2YWwuaGlkZUNhcHRpb24gPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ2hvaWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuaXRlbTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNob2ljZVZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaXNDaG9pY2UgPyB0aGlzLml0ZW0udmFsdWUgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDaGVja2JveCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Nob2ljZSAmJiB0aGlzLnF1ZXN0aW9uLmdldFR5cGUoKSA9PSBcImNoZWNrYm94XCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0ZpcnN0Q2hvaWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNob2ljZUluZGV4ID09PSAwO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cge1xuICBwcml2YXRlIHN0YXRpYyBjb3VudGVyID0gMTtcbiAgcHJpdmF0ZSBpZFZhbHVlOiBudW1iZXI7XG4gIHB1YmxpYyBjZWxsczogQXJyYXk8UXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbD4gPSBbXTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaWRWYWx1ZSA9IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdy5jb3VudGVyKys7XG4gIH1cbiAgcHVibGljIGdldCBpZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlIGV4dGVuZHMgQmFzZSB7XG4gIHByaXZhdGUgaGVhZGVyUm93VmFsdWU6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdztcbiAgcHJpdmF0ZSBmb290ZXJSb3dWYWx1ZTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93O1xuICBwcml2YXRlIGhhc1JlbW92ZVJvd3NWYWx1ZTogYm9vbGVhbjtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBtYXRyaXg6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJyb3dzXCIpO1xuICAgIHRoaXMuYnVpbGQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHNob3dIZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dIZWFkZXJcIik7XG4gIH1cbiAgcHVibGljIGdldCBzaG93Rm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hdHJpeC5oYXNGb290ZXIgJiYgdGhpcy5tYXRyaXguaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzRm9vdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZm9vdGVyUm93O1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzUmVtb3ZlUm93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNSZW1vdmVSb3dzVmFsdWU7XG4gIH1cbiAgcHVibGljIGlzUmVxdWlyZVJlc2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmhhc1JlbW92ZVJvd3MgIT0gdGhpcy5tYXRyaXguY2FuUmVtb3ZlUm93cyB8fFxuICAgICAgIXRoaXMubWF0cml4LmlzQ29sdW1uTGF5b3V0SG9yaXpvbnRhbFxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBoZWFkZXJSb3coKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93IHtcbiAgICByZXR1cm4gdGhpcy5oZWFkZXJSb3dWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGZvb3RlclJvdygpOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3cge1xuICAgIHJldHVybiB0aGlzLmZvb3RlclJvd1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgcm93cygpOiBBcnJheTxRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3c+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiKTtcbiAgfVxuICBwcm90ZWN0ZWQgYnVpbGQoKSB7XG4gICAgdGhpcy5oYXNSZW1vdmVSb3dzVmFsdWUgPSB0aGlzLm1hdHJpeC5jYW5SZW1vdmVSb3dzO1xuICAgIC8vYnVpbGQgcm93cyBub3dcbiAgICB2YXIgcm93cyA9IHRoaXMubWF0cml4LnZpc2libGVSb3dzO1xuICAgIHRoaXMuYnVpbGRIZWFkZXIoKTtcbiAgICB0aGlzLmJ1aWxkUm93cygpO1xuICAgIHRoaXMuYnVpbGRGb290ZXIoKTtcbiAgfVxuICBwdWJsaWMgb25BZGRlZFJvdygpIHtcbiAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA+PSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cy5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLnJvd3MucHVzaChcbiAgICAgIHRoaXMuY3JlYXRlSG9yaXpvbnRhbFJvdyhcbiAgICAgICAgdGhpcy5tYXRyaXgudmlzaWJsZVJvd3NbdGhpcy5tYXRyaXgudmlzaWJsZVJvd3MubGVuZ3RoIC0gMV0sXG4gICAgICAgIHRoaXMubWF0cml4LnZpc2libGVSb3dzLmxlbmd0aCA9PSAxICYmICF0aGlzLm1hdHJpeC5zaG93SGVhZGVyXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgb25SZW1vdmVkUm93KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5yb3dzLmxlbmd0aCA8PSBpbmRleCkgcmV0dXJuO1xuICAgIHRoaXMucm93cy5zcGxpY2UoaW5kZXgsIDEpO1xuICB9XG4gIHByb3RlY3RlZCBidWlsZEhlYWRlcigpIHtcbiAgICB2YXIgY29sSGVhZGVycyA9XG4gICAgICB0aGlzLm1hdHJpeC5pc0NvbHVtbkxheW91dEhvcml6b250YWwgJiYgdGhpcy5tYXRyaXguc2hvd0hlYWRlcjtcbiAgICB2YXIgaXNTaG93biA9XG4gICAgICBjb2xIZWFkZXJzIHx8XG4gICAgICAodGhpcy5tYXRyaXguaGFzUm93VGV4dCAmJiAhdGhpcy5tYXRyaXguaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93SGVhZGVyXCIsIGlzU2hvd24pO1xuICAgIGlmICghaXNTaG93bikgcmV0dXJuO1xuICAgIHRoaXMuaGVhZGVyUm93VmFsdWUgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93KCk7XG4gICAgaWYgKHRoaXMubWF0cml4Lmhhc1Jvd1RleHQgJiYgdGhpcy5tYXRyaXguc2hvd0hlYWRlcikge1xuICAgICAgdGhpcy5oZWFkZXJSb3cuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZUhlYWRlckNlbGwobnVsbCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRyaXguaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWF0cml4LnZpc2libGVDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjb2x1bW4gPSB0aGlzLm1hdHJpeC52aXNpYmxlQ29sdW1uc1tpXTtcbiAgICAgICAgaWYgKCFjb2x1bW4uaGFzVmlzaWJsZUNlbGwpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoY29sdW1uLmlzU2hvd0luTXVsdGlwbGVDb2x1bW5zKSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVNdXRsaXBsZUNvbHVtbnNIZWFkZXIoY29sdW1uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhlYWRlclJvdy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlSGVhZGVyQ2VsbChjb2x1bW4pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcm93cyA9IHRoaXMubWF0cml4LnZpc2libGVSb3dzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyUm93LmNlbGxzLnB1c2godGhpcy5jcmVhdGVUZXh0Q2VsbChyb3dzW2ldLmxvY1RleHQpKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1hdHJpeC5oYXNGb290ZXIpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJSb3cuY2VsbHMucHVzaChcbiAgICAgICAgICB0aGlzLmNyZWF0ZVRleHRDZWxsKHRoaXMubWF0cml4LmdldEZvb3RlclRleHQoKSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzUmVtb3ZlUm93cykge1xuICAgICAgdGhpcy5oZWFkZXJSb3cuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZUhlYWRlckNlbGwobnVsbCkpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgYnVpbGRGb290ZXIoKSB7XG4gICAgaWYgKCF0aGlzLnNob3dGb290ZXIpIHJldHVybjtcbiAgICB0aGlzLmZvb3RlclJvd1ZhbHVlID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdygpO1xuICAgIGlmICh0aGlzLm1hdHJpeC5oYXNSb3dUZXh0KSB7XG4gICAgICB0aGlzLmZvb3RlclJvdy5jZWxscy5wdXNoKFxuICAgICAgICB0aGlzLmNyZWF0ZVRleHRDZWxsKHRoaXMubWF0cml4LmdldEZvb3RlclRleHQoKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciBjZWxscyA9IHRoaXMubWF0cml4LnZpc2libGVUb3RhbFJvdy5jZWxscztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbCA9IGNlbGxzW2ldO1xuICAgICAgaWYgKCFjZWxsLmNvbHVtbi5oYXNWaXNpYmxlQ2VsbCkgY29udGludWU7XG4gICAgICBpZiAoY2VsbC5jb2x1bW4uaXNTaG93SW5NdWx0aXBsZUNvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVNdXRsaXBsZUNvbHVtbnNGb290ZXIodGhpcy5mb290ZXJSb3csIGNlbGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5mb290ZXJSb3cuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZUVkaXRDZWxsKGNlbGwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzUmVtb3ZlUm93cykge1xuICAgICAgdGhpcy5mb290ZXJSb3cuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZUhlYWRlckNlbGwobnVsbCkpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgYnVpbGRSb3dzKCkge1xuICAgIHZhciByb3dzID0gdGhpcy5tYXRyaXguaXNDb2x1bW5MYXlvdXRIb3Jpem9udGFsXG4gICAgICA/IHRoaXMuYnVpbGRIb3Jpem9udGFsUm93cygpXG4gICAgICA6IHRoaXMuYnVpbGRWZXJ0aWNhbFJvd3MoKTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIsIHJvd3MpO1xuICB9XG4gIHByaXZhdGUgY2FuUmVtb3ZlUm93KHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXguY2FuUmVtb3ZlUm93KHJvdyk7XG4gIH1cbiAgcHJpdmF0ZSBidWlsZEhvcml6b250YWxSb3dzKCk6IEFycmF5PFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdz4ge1xuICAgIHZhciByb3dzID0gdGhpcy5tYXRyaXgudmlzaWJsZVJvd3M7XG4gICAgdmFyIHJlbmRlcmVkUm93cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVuZGVyZWRSb3dzLnB1c2goXG4gICAgICAgIHRoaXMuY3JlYXRlSG9yaXpvbnRhbFJvdyhyb3dzW2ldLCBpID09IDAgJiYgIXRoaXMubWF0cml4LnNob3dIZWFkZXIpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVuZGVyZWRSb3dzO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlSG9yaXpvbnRhbFJvdyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHVzZUFzSGVhZGVyOiBib29sZWFuXG4gICk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyB7XG4gICAgdmFyIHJlcyA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3coKTtcbiAgICBpZiAodGhpcy5tYXRyaXguaGFzUm93VGV4dCkge1xuICAgICAgdmFyIHJlbmRlcmVkQ2VsbCA9IHRoaXMuY3JlYXRlVGV4dENlbGwocm93LmxvY1RleHQpO1xuICAgICAgcmVzLmNlbGxzLnB1c2gocmVuZGVyZWRDZWxsKTtcbiAgICAgIGlmICh1c2VBc0hlYWRlcikge1xuICAgICAgICB0aGlzLnNldEhlYWRlckNlbGxXaWR0aChudWxsLCByZW5kZXJlZENlbGwpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGwgPSByb3cuY2VsbHNbaV07XG4gICAgICBpZiAoIWNlbGwuY29sdW1uLmhhc1Zpc2libGVDZWxsKSBjb250aW51ZTtcbiAgICAgIGlmIChjZWxsLmNvbHVtbi5pc1Nob3dJbk11bHRpcGxlQ29sdW1ucykge1xuICAgICAgICB0aGlzLmNyZWF0ZU11dGxpcGxlRWRpdENlbGxzKHJlcywgY2VsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVuZGVyZWRDZWxsID0gdGhpcy5jcmVhdGVFZGl0Q2VsbChjZWxsKTtcbiAgICAgICAgcmVzLmNlbGxzLnB1c2gocmVuZGVyZWRDZWxsKTtcbiAgICAgICAgaWYgKHVzZUFzSGVhZGVyKSB7XG4gICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsV2lkdGgoY2VsbC5jb2x1bW4sIHJlbmRlcmVkQ2VsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzUmVtb3ZlUm93cykge1xuICAgICAgcmVzLmNlbGxzLnB1c2godGhpcy5jcmVhdGVSZW1vdmVSb3dDZWxsKHJvdykpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgYnVpbGRWZXJ0aWNhbFJvd3MoKTogQXJyYXk8UXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93PiB7XG4gICAgdmFyIGNvbHVtbnMgPSB0aGlzLm1hdHJpeC5jb2x1bW5zO1xuICAgIHZhciByZW5kZXJlZFJvd3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb2wgPSBjb2x1bW5zW2ldO1xuICAgICAgaWYgKGNvbC5pc1Zpc2libGUgJiYgY29sLmhhc1Zpc2libGVDZWxsKSB7XG4gICAgICAgIGlmIChjb2wuaXNTaG93SW5NdWx0aXBsZUNvbHVtbnMpIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZU11dGxpcGxlVmVydGljYWxSb3dzKHJlbmRlcmVkUm93cywgY29sLCBpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW5kZXJlZFJvd3MucHVzaCh0aGlzLmNyZWF0ZVZlcnRpY2FsUm93KGNvbCwgaSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc1JlbW92ZVJvd3MpIHtcbiAgICAgIHJlbmRlcmVkUm93cy5wdXNoKHRoaXMuY3JlYXRlVmVydGljYWxSZW1vdmVSb3coKSk7XG4gICAgfVxuICAgIHJldHVybiByZW5kZXJlZFJvd3M7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVNdXRsaXBsZVZlcnRpY2FsUm93cyhcbiAgICByZW5kZXJlZFJvd3M6IEFycmF5PFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdz4sXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBpbmRleDogbnVtYmVyXG4gICkge1xuICAgIHZhciBjaG9pY2VzID0gdGhpcy5nZXRNdWx0aXBsZUNvbHVtbkNob2ljZXMoY29sdW1uKTtcbiAgICBpZiAoIWNob2ljZXMpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlbmRlcmVkUm93cy5wdXNoKHRoaXMuY3JlYXRlVmVydGljYWxSb3coY29sdW1uLCBpbmRleCwgY2hvaWNlc1tpXSwgaSkpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNyZWF0ZVZlcnRpY2FsUm93KFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBjaG9pY2U6IEl0ZW1WYWx1ZSA9IG51bGwsXG4gICAgY2hvaWNlSW5kZXg6IG51bWJlciA9IC0xXG4gICk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyB7XG4gICAgdmFyIHJlcyA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3coKTtcbiAgICBpZiAodGhpcy5tYXRyaXguc2hvd0hlYWRlcikge1xuICAgICAgdmFyIGxUaXRsZSA9ICEhY2hvaWNlID8gY2hvaWNlLmxvY1RleHQgOiBjb2x1bW4ubG9jVGl0bGU7XG4gICAgICB2YXIgaENlbGwgPSB0aGlzLmNyZWF0ZVRleHRDZWxsKGxUaXRsZSk7XG4gICAgICBpZiAoIWNob2ljZSkge1xuICAgICAgICB0aGlzLnNldFJlcXVyaWVkVG9IZWFkZXJDZWxsKGNvbHVtbiwgaENlbGwpO1xuICAgICAgfVxuICAgICAgcmVzLmNlbGxzLnB1c2goaENlbGwpO1xuICAgIH1cbiAgICB2YXIgcm93cyA9IHRoaXMubWF0cml4LnZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJDZWxsID0gdGhpcy5jcmVhdGVFZGl0Q2VsbChyb3dzW2ldLmNlbGxzW2luZGV4XSk7XG4gICAgICByQ2VsbC5pdGVtID0gY2hvaWNlO1xuICAgICAgckNlbGwuY2hvaWNlSW5kZXggPSBjaG9pY2VJbmRleCA+PSAwID8gY2hvaWNlSW5kZXggOiBpO1xuICAgICAgcmVzLmNlbGxzLnB1c2gockNlbGwpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXRyaXguaGFzVG90YWwpIHtcbiAgICAgIHJlcy5jZWxscy5wdXNoKFxuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRDZWxsKHRoaXMubWF0cml4LnZpc2libGVUb3RhbFJvdy5jZWxsc1tpbmRleF0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlVmVydGljYWxSZW1vdmVSb3coKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93IHtcbiAgICB2YXIgcmVzID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdygpO1xuICAgIGlmICh0aGlzLm1hdHJpeC5zaG93SGVhZGVyKSB7XG4gICAgICByZXMuY2VsbHMucHVzaCh0aGlzLmNyZWF0ZVRleHRDZWxsKG51bGwpKTtcbiAgICB9XG4gICAgdmFyIHJvd3MgPSB0aGlzLm1hdHJpeC52aXNpYmxlUm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlUmVtb3ZlUm93Q2VsbChyb3dzW2ldKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hdHJpeC5oYXNUb3RhbCkge1xuICAgICAgcmVzLmNlbGxzLnB1c2godGhpcy5jcmVhdGVUZXh0Q2VsbChudWxsKSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVNdXRsaXBsZUVkaXRDZWxscyhcbiAgICByUm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csXG4gICAgY2VsbDogTWF0cml4RHJvcGRvd25DZWxsLFxuICAgIGlzRm9vdGVyOiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdmFyIGNob2ljZXMgPSB0aGlzLmdldE11bHRpcGxlQ29sdW1uQ2hvaWNlcyhjZWxsLmNvbHVtbik7XG4gICAgaWYgKCFjaG9pY2VzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgckNlbGwgPSB0aGlzLmNyZWF0ZUVkaXRDZWxsKGNlbGwpO1xuICAgICAgaWYgKCFpc0Zvb3Rlcikge1xuICAgICAgICByQ2VsbC5pdGVtID0gY2hvaWNlc1tpXTtcbiAgICAgICAgckNlbGwuY2hvaWNlSW5kZXggPSBpO1xuICAgICAgfVxuICAgICAgclJvdy5jZWxscy5wdXNoKHJDZWxsKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVFZGl0Q2VsbChcbiAgICBjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGxcbiAgKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCB7XG4gICAgdmFyIHJlcyA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKCk7XG4gICAgcmVzLmNlbGwgPSBjZWxsO1xuICAgIHJlcy5yb3cgPSBjZWxsLnJvdztcbiAgICByZXMucXVlc3Rpb24gPSBjZWxsLnF1ZXN0aW9uO1xuICAgIHJlcy5tYXRyaXggPSB0aGlzLm1hdHJpeDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTXV0bGlwbGVDb2x1bW5zRm9vdGVyKFxuICAgIHJSb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyxcbiAgICBjZWxsOiBNYXRyaXhEcm9wZG93bkNlbGxcbiAgKSB7XG4gICAgdGhpcy5jcmVhdGVNdXRsaXBsZUVkaXRDZWxscyhyUm93LCBjZWxsLCB0cnVlKTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU11dGxpcGxlQ29sdW1uc0hlYWRlcihjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSB7XG4gICAgdmFyIGNob2ljZXMgPSB0aGlzLmdldE11bHRpcGxlQ29sdW1uQ2hvaWNlcyhjb2x1bW4pO1xuICAgIGlmICghY2hvaWNlcykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGwgPSB0aGlzLmNyZWF0ZVRleHRDZWxsKGNob2ljZXNbaV0ubG9jVGV4dCk7XG4gICAgICB0aGlzLnNldEhlYWRlckNlbGwoY29sdW1uLCBjZWxsKTtcbiAgICAgIHRoaXMuaGVhZGVyUm93LmNlbGxzLnB1c2goY2VsbCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0TXVsdGlwbGVDb2x1bW5DaG9pY2VzKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBhbnkge1xuICAgIHZhciBjaG9pY2VzID0gY29sdW1uLnRlbXBsYXRlUXVlc3Rpb24uY2hvaWNlcztcbiAgICBpZiAoISFjaG9pY2VzICYmIEFycmF5LmlzQXJyYXkoY2hvaWNlcykgJiYgY2hvaWNlcy5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybiB0aGlzLm1hdHJpeC5jaG9pY2VzO1xuICAgIHZhciBjaG9pY2VzID0gY29sdW1uLnRlbXBsYXRlUXVlc3Rpb24udmlzaWJsZUNob2ljZXM7XG4gICAgaWYgKCFjaG9pY2VzIHx8ICFBcnJheS5pc0FycmF5KGNob2ljZXMpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gY2hvaWNlcztcbiAgfVxuICBwcml2YXRlIGNyZWF0ZUhlYWRlckNlbGwoXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtblxuICApOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuY3JlYXRlVGV4dENlbGwoISFjb2x1bW4gPyBjb2x1bW4ubG9jVGl0bGUgOiBudWxsKTtcbiAgICB0aGlzLnNldEhlYWRlckNlbGwoY29sdW1uLCBjZWxsKTtcbiAgICByZXR1cm4gY2VsbDtcbiAgfVxuICBwcml2YXRlIHNldEhlYWRlckNlbGwoXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgICBjZWxsOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsXG4gICkge1xuICAgIHRoaXMuc2V0SGVhZGVyQ2VsbFdpZHRoKGNvbHVtbiwgY2VsbCk7XG4gICAgdGhpcy5zZXRSZXF1cmllZFRvSGVhZGVyQ2VsbChjb2x1bW4sIGNlbGwpO1xuICB9XG4gIHByaXZhdGUgc2V0SGVhZGVyQ2VsbFdpZHRoKFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbFxuICApIHtcbiAgICBjZWxsLm1pbldpZHRoID0gY29sdW1uICE9IG51bGwgPyB0aGlzLm1hdHJpeC5nZXRDb2x1bW5XaWR0aChjb2x1bW4pIDogXCJcIjtcbiAgICBjZWxsLndpZHRoID0gY29sdW1uICE9IG51bGwgPyBjb2x1bW4ud2lkdGggOiB0aGlzLm1hdHJpeC5nZXRSb3dUaXRsZVdpZHRoKCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRSZXF1cmllZFRvSGVhZGVyQ2VsbChcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGxcbiAgKSB7XG4gICAgaWYgKCEhY29sdW1uICYmIGNvbHVtbi5pc1JlcXVpcmVkICYmIHRoaXMubWF0cml4LnN1cnZleSkge1xuICAgICAgY2VsbC5yZXF1aXJlZFRleHQgPSB0aGlzLm1hdHJpeC5zdXJ2ZXkucmVxdWlyZWRUZXh0O1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNyZWF0ZVJlbW92ZVJvd0NlbGwoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsIHtcbiAgICB2YXIgcmVzID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwoKTtcbiAgICByZXMucm93ID0gcm93O1xuICAgIHJlcy5pc1JlbW92ZVJvdyA9IHRoaXMuY2FuUmVtb3ZlUm93KHJvdyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVRleHRDZWxsKFxuICAgIGxvY1RpdGxlOiBMb2NhbGl6YWJsZVN0cmluZ1xuICApOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsIHtcbiAgICB2YXIgY2VsbCA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsKCk7XG4gICAgY2VsbC5sb2NUaXRsZSA9ICEhbG9jVGl0bGVcbiAgICAgID8gbG9jVGl0bGVcbiAgICAgIDogbmV3IExvY2FsaXphYmxlU3RyaW5nKHRoaXMubWF0cml4LCBmYWxzZSk7XG4gICAgcmV0dXJuIGNlbGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIG1hdHJpeCBkcm9wZG93biBhbmQgbWF0cml4IGR5bmFtaWMgcXVlc3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICBleHRlbmRzIFF1ZXN0aW9uTWF0cml4QmFzZU1vZGVsPFxuICAgIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIE1hdHJpeERyb3Bkb3duQ29sdW1uXG4gID5cbiAgaW1wbGVtZW50cyBJTWF0cml4RHJvcGRvd25EYXRhIHtcbiAgcHVibGljIHN0YXRpYyBnZXQgZGVmYXVsdENlbGxUeXBlKCkge1xuICAgIHJldHVybiBzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Q2VsbFR5cGU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXQgZGVmYXVsdENlbGxUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3MubWF0cml4RGVmYXVsdENlbGxUeXBlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgYWRkRGVmYXVsdENvbHVtbnMobWF0cml4OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlKSB7XG4gICAgdmFyIGNvbE5hbWVzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xOYW1lcy5sZW5ndGg7IGkrKykgbWF0cml4LmFkZENvbHVtbihjb2xOYW1lc1tpXSk7XG4gIH1cbiAgcHJpdmF0ZSByZW5kZXJlZFRhYmxlVmFsdWU6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlO1xuICBwcm90ZWN0ZWQgaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICBjb2x1bW5zQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICB1cGRhdGVDZWxsc0NhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb2x1bW5MYXlvdXRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIG9uUmVuZGVyZWRUYWJsZVJlc2V0Q2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIG9uUmVuZGVyZWRUYWJsZUNyZWF0ZWRDYWxsYmFjazogKFxuICAgIHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZVxuICApID0+IHZvaWQ7XG4gIG9uQ2VsbENyZWF0ZWRDYWxsYmFjazogKG9wdGlvbnM6IGFueSkgPT4gdm9pZDtcbiAgb25DZWxsVmFsdWVDaGFuZ2VkQ2FsbGJhY2s6IChvcHRpb25zOiBhbnkpID0+IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbHVtblZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXdBcnJheShcImNvbHVtbnNcIiwgKGl0ZW06IGFueSkgPT4ge1xuICAgICAgaXRlbS5jb2xPd25lciA9IHRoaXM7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcImNob2ljZXNcIik7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJjb2x1bW5zXCIsIGZ1bmN0aW9uIChcbiAgICAgIG5ld0NvbHVtbnM6IGFueVxuICAgICkge1xuICAgICAgc2VsZi51cGRhdGVDb2x1bW5zSW5kZXhlcyhuZXdDb2x1bW5zKTtcbiAgICAgIHNlbGYuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgICAgc2VsZi5nZW5lcmF0ZWRUb3RhbFJvdyA9IG51bGw7XG4gICAgICBzZWxmLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5jb2x1bW5zQ2hhbmdlZENhbGxiYWNrKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJjb2x1bW5MYXlvdXRcIiwgXCJhZGRSb3dMb2NhdGlvblwiXSxcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5jb2x1bW5MYXlvdXRDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiY2VsbFR5cGVcIiwgXCJvcHRpb25zQ2FwdGlvblwiLCBcImNvbHVtbkNvbENvdW50XCIsIFwicm93VGl0bGVXaWR0aFwiXSxcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IG51bGw7XG4gICAgICAgIHNlbGYucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYuY29sdW1uc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXG4gICAgICAgIFwiY29sdW1uTGF5b3V0XCIsXG4gICAgICAgIFwic2hvd0hlYWRlclwiLFxuICAgICAgICBcIm1pblJvd0NvdW50XCIsXG4gICAgICAgIFwiaXNSZWFkT25seVwiLFxuICAgICAgICBcInJvd0NvdW50XCIsXG4gICAgICAgIFwiaGFzRm9vdGVyXCIsXG4gICAgICBdLFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhkcm9wZG93bmJhc2VcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1NpbmdsZUlucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUm93c0R5bmFtaWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgY29sdW1uTGF5b3V0IHRvICd2ZXJ0aWNhbCcgdG8gcGxhY2UgY29sdW1ucyB2ZXJ0aWNhbGx5IGFuZCByb3dzIGhvcml6b250YWxseS4gSXQgbWFrZXMgc2Vuc2Ugd2hlbiB3ZSBoYXZlIG1hbnkgY29sdW1ucyBhbmQgZmV3IHJvd3MuXG4gICAqIEBzZWUgY29sdW1uc1xuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbHVtbkxheW91dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5MYXlvdXRcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb2x1bW5MYXlvdXQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5MYXlvdXRcIiwgdmFsKTtcbiAgfVxuICBnZXQgY29sdW1uc0xvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uTGF5b3V0O1xuICB9XG4gIHNldCBjb2x1bW5zTG9jYXRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbHVtbkxheW91dCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGNvbHVtbnMgYXJlIGxvY2F0ZWQgaG9yaXpvbnRhbGx5XG4gICAqIEBzZWUgY29sdW1uTGF5b3V0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQ29sdW1uTGF5b3V0SG9yaXpvbnRhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5MYXlvdXQgIT0gXCJ2ZXJ0aWNhbFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzUm93VGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0Rm9vdGVyVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldCBjYW5SZW1vdmVSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgY2FuUmVtb3ZlUm93KHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Sb3dzQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgIHN1cGVyLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIGxvY2tSZXNldFJlbmRlcmVkVGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG9uU3RhcnRSb3dBZGRpbmdSZW1vdmluZygpIHtcbiAgICB0aGlzLmxvY2tSZXNldFJlbmRlcmVkVGFibGUgPSB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBvbkVuZFJvd0FkZGluZygpIHtcbiAgICB0aGlzLmxvY2tSZXNldFJlbmRlcmVkVGFibGUgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMucmVuZGVyZWRUYWJsZSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlbmRlcmVkVGFibGUuaXNSZXF1aXJlUmVzZXQoKSkge1xuICAgICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlZFRhYmxlLm9uQWRkZWRSb3coKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uRW5kUm93UmVtb3ZpbmcoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMubG9ja1Jlc2V0UmVuZGVyZWRUYWJsZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnJlbmRlcmVkVGFibGUuaXNSZXF1aXJlUmVzZXQoKSkge1xuICAgICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlZFRhYmxlLm9uUmVtb3ZlZFJvdyhpbmRleCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCByZXNldFJlbmRlcmVkVGFibGUoKSB7XG4gICAgaWYgKHRoaXMubG9ja1Jlc2V0UmVuZGVyZWRUYWJsZSB8fCB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5yZW5kZXJlZFRhYmxlVmFsdWUgPSBudWxsO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMub25SZW5kZXJlZFRhYmxlUmVzZXRDYWxsYmFjayk7XG4gIH1cbiAgcHVibGljIGdldCByZW5kZXJlZFRhYmxlKCk6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlIHtcbiAgICBpZiAoIXRoaXMucmVuZGVyZWRUYWJsZVZhbHVlKSB7XG4gICAgICB0aGlzLnJlbmRlcmVkVGFibGVWYWx1ZSA9IHRoaXMuY3JlYXRlUmVuZGVyZWRUYWJsZSgpO1xuICAgICAgaWYgKCEhdGhpcy5vblJlbmRlcmVkVGFibGVDcmVhdGVkQ2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5vblJlbmRlcmVkVGFibGVDcmVhdGVkQ2FsbGJhY2sodGhpcy5yZW5kZXJlZFRhYmxlVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZFRhYmxlVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJlbmRlcmVkVGFibGUoKTogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTWF0cml4Um93Q3JlYXRlZChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcm93VmFsdWU6IHJvdy52YWx1ZSxcbiAgICAgIHJvdzogcm93LFxuICAgICAgY29sdW1uOiA8YW55Pm51bGwsXG4gICAgICBjb2x1bW5OYW1lOiA8YW55Pm51bGwsXG4gICAgICBjZWxsOiA8YW55Pm51bGwsXG4gICAgICBjZWxsUXVlc3Rpb246IDxhbnk+bnVsbCxcbiAgICAgIHZhbHVlOiA8YW55Pm51bGwsXG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9wdGlvbnMuY29sdW1uID0gdGhpcy52aXNpYmxlQ29sdW1uc1tpXTtcbiAgICAgIG9wdGlvbnMuY29sdW1uTmFtZSA9IG9wdGlvbnMuY29sdW1uLm5hbWU7XG4gICAgICB2YXIgY2VsbCA9IHJvdy5jZWxsc1tpXTtcbiAgICAgIG9wdGlvbnMuY2VsbCA9IGNlbGw7XG4gICAgICBvcHRpb25zLmNlbGxRdWVzdGlvbiA9IGNlbGwucXVlc3Rpb247XG4gICAgICBvcHRpb25zLnZhbHVlID0gY2VsbC52YWx1ZTtcbiAgICAgIGlmICghIXRoaXMub25DZWxsQ3JlYXRlZENhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMub25DZWxsQ3JlYXRlZENhbGxiYWNrKG9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdXJ2ZXkubWF0cml4Q2VsbENyZWF0ZWQodGhpcywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgY2VsbCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBjZWxsVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjZWxsVHlwZVwiLCBzZXR0aW5ncy5tYXRyaXhEZWZhdWx0Q2VsbFR5cGUpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2VsbFR5cGUodmFsOiBzdHJpbmcpIHtcbiAgICB2YWwgPSB2YWwudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodGhpcy5jZWxsVHlwZSA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjZWxsVHlwZVwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uc0NlbGxUeXBlKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy51cGRhdGVDZWxsc0NhbGxiYWNrKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbnNDZWxsVHlwZSgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jb2x1bW5zW2ldLmRlZmF1bHRDZWxsVHlwZUNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zSW5kZXhlcyhjb2xzOiBBcnJheTxNYXRyaXhEcm9wZG93bkNvbHVtbj4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbHNbaV0uc2V0SW5kZXgoaSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBjb2x1bW4gY291bnQgZm9yIHJhZGlvZ3JvdXAgYW5kIGNoZWNrYm94ICBjZWxsIHR5cGVzLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5Db2xDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5Db2xDb3VudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHVtbkNvbENvdW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkNvbENvdW50XCIsIHZhbHVlKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnVwZGF0ZUNlbGxzQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIG1pbmltdW0gY29sdW1uIHdpZHRoLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5NaW5XaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5NaW5XaWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHVtbk1pbldpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uTWluV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBzaG93IHRoZSBob3Jpem9udGFsIHNjcm9sbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaG9yaXpvbnRhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaG9yaXpvbnRhbFNjcm9sbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBob3Jpem9udGFsU2Nyb2xsKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhvcml6b250YWxTY3JvbGxcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0UmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucmVxdWlyZWRUZXh0IDogXCJcIjtcbiAgfVxuICBvbkNvbHVtblByb3BlcnR5Q2hhbmdlZChcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogYW55XG4gICkge1xuICAgIHRoaXMudXBkYXRlSGFzRm9vdGVyKCk7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLnVwZGF0ZUNlbGxRdWVzdGlvbk9uQ29sdW1uQ2hhbmdlZChcbiAgICAgICAgY29sdW1uLFxuICAgICAgICBuYW1lLFxuICAgICAgICBuZXdWYWx1ZVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdy51cGRhdGVDZWxsUXVlc3Rpb25PbkNvbHVtbkNoYW5nZWQoXG4gICAgICAgIGNvbHVtbixcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbmV3VmFsdWVcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMub25Db2x1bW5zQ2hhbmdlZCgpO1xuICAgIGlmIChuYW1lID09IFwiaXNSZXF1aXJlZFwiKSB7XG4gICAgICB0aGlzLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgIH1cbiAgICBpZiAoY29sdW1uLmlzU2hvd0luTXVsdGlwbGVDb2x1bW5zKSB7XG4gICAgICB0aGlzLm9uU2hvd0luTXVsdGlwbGVDb2x1bW5zQ2hhbmdlZChjb2x1bW4pO1xuICAgIH1cbiAgfVxuICBvblNob3dJbk11bHRpcGxlQ29sdW1uc0NoYW5nZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikge1xuICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgIHRoaXMucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gIH1cbiAgb25Db2x1bW5DZWxsVHlwZUNoYW5nZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikge1xuICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgIHRoaXMucmVzZXRSZW5kZXJlZFRhYmxlKCk7XG4gIH1cbiAgcHVibGljIGdldFJvd1RpdGxlV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0Zvb3RlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGFzRm9vdGVyXCIsIGZhbHNlKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlSGFzRm9vdGVyKCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc0Zvb3RlclwiLCB0aGlzLmhhc1RvdGFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RvdGFsKCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jb2x1bW5zW2ldLmhhc1RvdGFsKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldENlbGxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbFR5cGU7XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICB2YXIgY29sdW1uTmFtZSA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChwYXRoW2ldID09IFwiLlwiKSBicmVhaztcbiAgICAgIGNvbHVtbk5hbWUgPSBwYXRoW2ldICsgY29sdW1uTmFtZTtcbiAgICB9XG4gICAgdmFyIGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWUpO1xuICAgIGlmICghY29sdW1uKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcXVlc3Rpb24gPSBjb2x1bW4uY3JlYXRlQ2VsbFF1ZXN0aW9uKG51bGwpO1xuICAgIGlmICghcXVlc3Rpb24pIHJldHVybiBudWxsO1xuICAgIHJldHVybiBxdWVzdGlvbi5nZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5jbGVhckluY29ycmVjdFZhbHVlcyh0aGlzLmdldFJvd1ZhbHVlKGkpKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIHN1cGVyLmNsZWFyRXJyb3JzKCk7XG4gICAgaWYgKCEhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJvdy5jZWxscy5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHJvdy5jZWxsc1tqXS5xdWVzdGlvbi5jbGVhckVycm9ycygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICB2YXIgcHJldlRvdGFsVmFsdWU7XG4gICAgZG8ge1xuICAgICAgcHJldlRvdGFsVmFsdWUgPSBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHRoaXMudG90YWxWYWx1ZSk7XG4gICAgICB0aGlzLnJ1bkNlbGxzQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgICB0aGlzLnJ1blRvdGFsc0NvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgY291bnRlcisrO1xuICAgIH0gd2hpbGUgKFxuICAgICAgIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhwcmV2VG90YWxWYWx1ZSwgdGhpcy50b3RhbFZhbHVlKSAmJlxuICAgICAgY291bnRlciA8IDNcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBzaG91bGRSdW5Db2x1bW5FeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuQ2VsbHNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWVzID0gdGhpcy5nZXRSb3dDb25kaXRpb25WYWx1ZXModmFsdWVzKTtcbiAgICB2YXIgcm93cyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzW2ldLnJ1bkNvbmRpdGlvbihuZXdWYWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH1cbiAgICB0aGlzLmNoZWNrQ29sdW1uc1Zpc2liaWxpdHkoKTtcbiAgfVxuICBwcml2YXRlIGNoZWNrQ29sdW1uc1Zpc2liaWxpdHkoKSB7XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlQ29sdW1uc1tpXS52aXNpYmxlSWYpIGNvbnRpbnVlO1xuICAgICAgaGFzQ2hhbmdlZCA9XG4gICAgICAgIHRoaXMuaXNDb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLnZpc2libGVDb2x1bW5zW2ldKSB8fCBoYXNDaGFuZ2VkO1xuICAgIH1cbiAgICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc0NvbHVtblZpc2liaWxpdHlDaGFuZ2VkKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pOiBib29sZWFuIHtcbiAgICB2YXIgY3VyVmlzID0gY29sdW1uLmhhc1Zpc2libGVDZWxsO1xuICAgIHZhciBoYXNWaXNDZWxsID0gZmFsc2U7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGwgPSByb3dzW2ldLmNlbGxzW2NvbHVtbi5pbmRleF07XG4gICAgICBpZiAoISFjZWxsICYmICEhY2VsbC5xdWVzdGlvbiAmJiBjZWxsLnF1ZXN0aW9uLmlzVmlzaWJsZSkge1xuICAgICAgICBoYXNWaXNDZWxsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJWaXMgIT0gaGFzVmlzQ2VsbCkge1xuICAgICAgY29sdW1uLmhhc1Zpc2libGVDZWxsID0gaGFzVmlzQ2VsbDtcbiAgICB9XG4gICAgcmV0dXJuIGN1clZpcyAhPSBoYXNWaXNDZWxsO1xuICB9XG4gIHByb3RlY3RlZCBydW5Ub3RhbHNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVG90YWxSb3cpIHJldHVybjtcbiAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93LnJ1bkNvbmRpdGlvbihcbiAgICAgIHRoaXMuZ2V0Um93Q29uZGl0aW9uVmFsdWVzKHZhbHVlcyksXG4gICAgICBwcm9wZXJ0aWVzXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldFJvd0NvbmRpdGlvblZhbHVlcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KTogSGFzaFRhYmxlPGFueT4ge1xuICAgIHZhciBuZXdWYWx1ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICBuZXdWYWx1ZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlcykpO1xuICAgIH1cbiAgICB2YXIgdG90YWxSb3cgPSB7fTtcbiAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMudG90YWxWYWx1ZSkpIHtcbiAgICAgIHRvdGFsUm93ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnRvdGFsVmFsdWUpKTtcbiAgICB9XG4gICAgbmV3VmFsdWVzW1wicm93XCJdID0ge307XG4gICAgbmV3VmFsdWVzW1widG90YWxSb3dcIl0gPSB0b3RhbFJvdztcbiAgICByZXR1cm4gbmV3VmFsdWVzO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJldHVybjtcbiAgICB2YXIgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbHVtbnNbaV0ubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzW2ldLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICAgIGlmICghIXRoaXMuZ2VuZXJhdGVkVG90YWxSb3cpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVG90YWxSb3cubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbHVtbiBieSBpdCdzIG5hbWUuIFJldHVybnMgbnVsbCBpZiBhIGNvbHVtbiB3aXRoIHRoaXMgbmFtZSBkb2Vzbid0IGV4aXN0LlxuICAgKiBAcGFyYW0gY29sdW1uXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbk5hbWU6IHN0cmluZyk6IE1hdHJpeERyb3Bkb3duQ29sdW1uIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY29sdW1uc1tpXS5uYW1lID09IGNvbHVtbk5hbWUpIHJldHVybiB0aGlzLmNvbHVtbnNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldENvbHVtbk5hbWUoY29sdW1uTmFtZTogc3RyaW5nKTogTWF0cml4RHJvcGRvd25Db2x1bW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbHVtbkJ5TmFtZShjb2x1bW5OYW1lKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29sdW1uIHdpZHRoLlxuICAgKiBAcGFyYW0gY29sdW1uXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uV2lkdGgoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbHVtbi5taW5XaWR0aCA/IGNvbHVtbi5taW5XaWR0aCA6IHRoaXMuY29sdW1uTWluV2lkdGg7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGNob2ljZXMgZm9yIGRyb3Bkb3duLCBjaGVja2JveCBhbmQgcmFkaW9ncm91cCBjZWxsIHR5cGVzLlxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlcyh2YWw6IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IG9wdGlvbnMgY2FwdGlvbiBmb3IgZHJvcGRvd24gY2VsbCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBvcHRpb25zQ2FwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcIm9wdGlvbnNDYXB0aW9uXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgb3B0aW9uc0NhcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm9wdGlvbnNDYXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NPcHRpb25zQ2FwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgc3RvcmVPdGhlcnNBc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5zdG9yZU90aGVyc0FzQ29tbWVudCA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBhZGRDb2x1bW4obmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nID0gbnVsbCk6IE1hdHJpeERyb3Bkb3duQ29sdW1uIHtcbiAgICB2YXIgY29sdW1uID0gbmV3IE1hdHJpeERyb3Bkb3duQ29sdW1uKG5hbWUsIHRpdGxlKTtcbiAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgIHJldHVybiBjb2x1bW47XG4gIH1cbiAgcHJvdGVjdGVkIGdldFZpc2libGVSb3dzKCk6IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlPiB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IHRoaXMuZ2VuZXJhdGVSb3dzKCk7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmZvckVhY2goKHJvdykgPT4gdGhpcy5vbk1hdHJpeFJvd0NyZWF0ZWQocm93KSk7XG4gICAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24oXG4gICAgICAgICAgdGhpcy5kYXRhLmdldEZpbHRlcmVkVmFsdWVzKCksXG4gICAgICAgICAgdGhpcy5kYXRhLmdldEZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlT25Sb3dzR2VuZXJhdGlvbih0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKTtcbiAgICAgIHRoaXMudXBkYXRlSXNBbnN3ZXJlZCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVZhbHVlT25Sb3dzR2VuZXJhdGlvbihyb3dzOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZT4pIHtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRydWUpO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgdmFyIHJvd1ZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZShpKTtcbiAgICAgIHZhciByVmFsdWUgPSByb3cudmFsdWU7XG4gICAgICBpZiAodGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHJvd1ZhbHVlLCByVmFsdWUpKSBjb250aW51ZTtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy5nZXROZXdWYWx1ZU9uUm93Q2hhbmdlZChyb3csIFwiXCIsIHJWYWx1ZSwgZmFsc2UsIG5ld1ZhbHVlKVxuICAgICAgICAudmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzVHdvVmFsdWVFcXVhbHMob2xkVmFsdWUsIG5ld1ZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCB0b3RhbFZhbHVlKCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmhhc1RvdGFsIHx8ICF0aGlzLnZpc2libGVUb3RhbFJvdykgcmV0dXJuIHt9O1xuICAgIHJldHVybiB0aGlzLnZpc2libGVUb3RhbFJvdy52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZVRvdGFsUm93KCk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMuaGFzVG90YWwpIHtcbiAgICAgIGlmICghdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdykge1xuICAgICAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93ID0gdGhpcy5nZW5lcmF0ZVRvdGFsUm93KCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IHsgc3VydmV5OiB0aGlzLnN1cnZleSB9O1xuICAgICAgICAgIHRoaXMucnVuVG90YWxzQ29uZGl0aW9uKHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSwgcHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRUb3RhbFJvdyA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlZFRvdGFsUm93O1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZVRvdGFsUm93KCk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWaXNpYmxlVG90YWxSb3coKTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMudXBkYXRlQ29sdW1uc0luZGV4ZXModGhpcy5jb2x1bW5zKTtcbiAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDtcbiAgICB0aGlzLmdlbmVyYXRlZFRvdGFsUm93ID0gbnVsbDtcbiAgICB0aGlzLnVwZGF0ZUhhc0Zvb3RlcigpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgdmFsdWUuIElmIHRoZSByb3cgdmFsdWUgaXMgZW1wdHksIHRoZSBvYmplY3QgaXMgZW1wdHk6IHt9LlxuICAgKiBAcGFyYW0gcm93SW5kZXggcm93IGluZGV4IGZyb20gMCB0byB2aXNpYmxlIHJvdyBjb3VudCAtIDEuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93VmFsdWUocm93SW5kZXg6IG51bWJlcikge1xuICAgIGlmIChyb3dJbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2aXNSb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBpZiAocm93SW5kZXggPj0gdmlzUm93cy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5nZXRSb3dWYWx1ZUNvcmUodmlzUm93c1tyb3dJbmRleF0sIG5ld1ZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSByb3cgdmFsdWUuXG4gICAqIEBwYXJhbSByb3dJbmRleCByb3cgaW5kZXggZnJvbSAwIHRvIHZpc2libGUgcm93IGNvdW50IC0gMS5cbiAgICogQHBhcmFtIHJvd1ZhbHVlIGFuIG9iamVjdCB7XCJjb2x1bW4gbmFtZVwiOiBjb2x1bW5WYWx1ZSwuLi4gfVxuICAgKi9cbiAgcHVibGljIHNldFJvd1ZhbHVlKHJvd0luZGV4OiBudW1iZXIsIHJvd1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmIChyb3dJbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2aXNSb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBpZiAocm93SW5kZXggPj0gdmlzUm93cy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHZpc1Jvd3Nbcm93SW5kZXhdLnZhbHVlID0gcm93VmFsdWU7XG4gICAgdGhpcy5vblJvd0NoYW5nZWQodmlzUm93c1tyb3dJbmRleF0sIFwiXCIsIHJvd1ZhbHVlLCBmYWxzZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdlbmVyYXRlUm93cygpOiBBcnJheTxNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZT4ge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZVRvdGFsUm93KCk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeERyb3Bkb3duVG90YWxSb3dNb2RlbCh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3VmFsdWUobnVsbE9uRW1wdHk6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XG4gICAgdmFyIHJlcyA9ICF0aGlzLnZhbHVlID8ge30gOiB0aGlzLmNyZWF0ZVZhbHVlQ29weSgpO1xuICAgIGlmIChudWxsT25FbXB0eSAmJiB0aGlzLmlzTWF0cml4VmFsdWVFbXB0eShyZXMpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRSb3dWYWx1ZUNvcmUoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBxdWVzdGlvblZhbHVlOiBhbnksXG4gICAgY3JlYXRlOiBib29sZWFuID0gZmFsc2VcbiAgKTogYW55IHtcbiAgICB2YXIgcmVzdWx0ID1cbiAgICAgICEhcXVlc3Rpb25WYWx1ZSAmJiAhIXF1ZXN0aW9uVmFsdWVbcm93LnJvd05hbWVdXG4gICAgICAgID8gcXVlc3Rpb25WYWx1ZVtyb3cucm93TmFtZV1cbiAgICAgICAgOiBudWxsO1xuICAgIGlmICghcmVzdWx0ICYmIGNyZWF0ZSkge1xuICAgICAgcmVzdWx0ID0ge307XG4gICAgICBpZiAoISFxdWVzdGlvblZhbHVlKSB7XG4gICAgICAgIHF1ZXN0aW9uVmFsdWVbcm93LnJvd05hbWVdID0gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFJvd0Rpc3BsYXlWYWx1ZShcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogYW55IHtcbiAgICBpZiAoIXJvd1ZhbHVlKSByZXR1cm4gcm93VmFsdWU7XG4gICAgZm9yICh2YXIga2V5IGluIHJvd1ZhbHVlKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSByb3cuZ2V0UXVlc3Rpb25CeUNvbHVtbk5hbWUoa2V5KTtcbiAgICAgIGlmICghcXVlc3Rpb24pIHtcbiAgICAgICAgcXVlc3Rpb24gPSB0aGlzLmdldFNoYXJlZFF1ZXN0aW9uQnlOYW1lKGtleSwgcm93KTtcbiAgICAgIH1cbiAgICAgIGlmICghIXF1ZXN0aW9uKSB7XG4gICAgICAgIHJvd1ZhbHVlW2tleV0gPSBxdWVzdGlvbi5kaXNwbGF5VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0UGxhaW5EYXRhKFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGluY2x1ZGVFbXB0eT86IGJvb2xlYW47XG4gICAgICBjYWxjdWxhdGlvbnM/OiBBcnJheTx7XG4gICAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgfSA9IHtcbiAgICAgIGluY2x1ZGVFbXB0eTogdHJ1ZSxcbiAgICB9XG4gICkge1xuICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IHN1cGVyLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICBpZiAoISFxdWVzdGlvblBsYWluRGF0YSkge1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuaXNOb2RlID0gdHJ1ZTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmRhdGEgPSB0aGlzLnZpc2libGVSb3dzLm1hcChcbiAgICAgICAgKHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UpID0+IHtcbiAgICAgICAgICB2YXIgcm93RGF0YUl0ZW0gPSA8YW55PntcbiAgICAgICAgICAgIG5hbWU6IHJvdy5yb3dOYW1lLFxuICAgICAgICAgICAgdGl0bGU6IHJvdy5yb3dOYW1lLFxuICAgICAgICAgICAgdmFsdWU6IHJvdy52YWx1ZSxcbiAgICAgICAgICAgIGRpc3BsYXlWYWx1ZTogdGhpcy5nZXRSb3dEaXNwbGF5VmFsdWUocm93LCByb3cudmFsdWUpLFxuICAgICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeSh2YWwpIDogdmFsLFxuICAgICAgICAgICAgaXNOb2RlOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogcm93LmNlbGxzXG4gICAgICAgICAgICAgIC5tYXAoKGNlbGw6IE1hdHJpeERyb3Bkb3duQ2VsbCkgPT5cbiAgICAgICAgICAgICAgICBjZWxsLnF1ZXN0aW9uLmdldFBsYWluRGF0YShvcHRpb25zKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gISFkKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIChvcHRpb25zLmNhbGN1bGF0aW9ucyB8fCBbXSkuZm9yRWFjaCgoY2FsY3VsYXRpb24pID0+IHtcbiAgICAgICAgICAgIHJvd0RhdGFJdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV0gPSAoPGFueT5yb3cpW1xuICAgICAgICAgICAgICBjYWxjdWxhdGlvbi5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJvd0RhdGFJdGVtO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25QbGFpbkRhdGE7XG4gIH1cbiAgcHVibGljIGdldFByb2dyZXNzSW5mbygpOiBJUHJvZ3Jlc3NJbmZvIHtcbiAgICByZXR1cm4gU3VydmV5RWxlbWVudC5nZXRQcm9ncmVzc0luZm9CeUVsZW1lbnRzKFxuICAgICAgdGhpcy5nZXRDZWxsUXVlc3Rpb25zKCksXG4gICAgICB0aGlzLmlzUmVxdWlyZWRcbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0Q2VsbFF1ZXN0aW9ucygpOiBBcnJheTxRdWVzdGlvbj4ge1xuICAgIHZhciByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJldHVybiBbXTtcbiAgICB2YXIgcXVlc3Rpb25zID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gcm93c1tpXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHF1ZXN0aW9ucy5wdXNoKHJvdy5jZWxsc1tqXS5xdWVzdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBxdWVzdGlvbnM7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25CZWZvcmVWYWx1ZUNoYW5nZWQodmFsOiBhbnkpIHt9XG4gIHByaXZhdGUgb25TZXRRdWVzdGlvblZhbHVlKCkge1xuICAgIGlmICh0aGlzLmlzUm93Q2hhbmdpbmcpIHJldHVybjtcbiAgICB0aGlzLm9uQmVmb3JlVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyB8fCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aCA9PSAwKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgdmFyIHZhbCA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldO1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS52YWx1ZSA9IHRoaXMuZ2V0Um93VmFsdWVDb3JlKHJvdywgdmFsKTtcbiAgICB9XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUsIGZhbHNlKTtcbiAgICB0aGlzLm9uU2V0UXVlc3Rpb25WYWx1ZSgpO1xuICAgIHRoaXMudXBkYXRlSXNBbnN3ZXJlZCgpO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbHMgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLmNlbGxzO1xuICAgICAgaWYgKCFjZWxscykgY29udGludWU7XG4gICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY2VsbHMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHF1ZXN0aW9uICYmXG4gICAgICAgICAgKCFxdWVzdGlvbi5zdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHx8ICFxdWVzdGlvbi52YWx1ZSlcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBzdXBlci5nZXRDb250YWluc0Vycm9ycygpIHx8XG4gICAgICB0aGlzLmNoZWNrRm9yQW5zd2Vyc09yRXJyb3JzKFxuICAgICAgICAocXVlc3Rpb246IFF1ZXN0aW9uKSA9PiBxdWVzdGlvbi5jb250YWluc0Vycm9ycyxcbiAgICAgICAgZmFsc2VcbiAgICAgIClcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBzdXBlci5nZXRJc0Fuc3dlcmVkKCkgJiZcbiAgICAgIHRoaXMuY2hlY2tGb3JBbnN3ZXJzT3JFcnJvcnMoXG4gICAgICAgIChxdWVzdGlvbjogUXVlc3Rpb24pID0+IHF1ZXN0aW9uLmlzQW5zd2VyZWQsXG4gICAgICAgIHRydWVcbiAgICAgIClcbiAgICApO1xuICB9XG4gIHByaXZhdGUgY2hlY2tGb3JBbnN3ZXJzT3JFcnJvcnMoXG4gICAgcHJlZGljYXRlOiAocXVlc3Rpb246IFF1ZXN0aW9uKSA9PiBib29sZWFuLFxuICAgIGV2ZXJ5OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gcm93c1tpXS5jZWxscztcbiAgICAgIGlmICghY2VsbHMpIGNvbnRpbnVlO1xuICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGNlbGxzLmxlbmd0aDsgY29sSW5kZXgrKykge1xuICAgICAgICBpZiAoIWNlbGxzW2NvbEluZGV4XSkgY29udGludWU7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgaWYgKHF1ZXN0aW9uICYmIHF1ZXN0aW9uLmlzVmlzaWJsZSlcbiAgICAgICAgICBpZiAocHJlZGljYXRlKHF1ZXN0aW9uKSkge1xuICAgICAgICAgICAgaWYgKCFldmVyeSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChldmVyeSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV2ZXJ5ID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgdmFyIGVycm9zSW5Db2x1bW5zID0gdGhpcy5oYXNFcnJvckluQ29sdW1ucyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgcmV0dXJuIHN1cGVyLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2spIHx8IGVycm9zSW5Db2x1bW5zO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCk6IGJvb2xlYW4ge1xuICAgIGlmIChzdXBlci5nZXRJc1J1bm5pbmdWYWxpZGF0b3JzKCkpIHJldHVybiB0cnVlO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgIGlmICghY2VsbHMpIGNvbnRpbnVlO1xuICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IGNlbGxzLmxlbmd0aDsgY29sSW5kZXgrKykge1xuICAgICAgICBpZiAoIWNlbGxzW2NvbEluZGV4XSkgY29udGludWU7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgaWYgKCEhcXVlc3Rpb24gJiYgcXVlc3Rpb24uaXNSdW5uaW5nVmFsaWRhdG9ycykgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHJlc3VsdCA9IHN1cGVyLmdldEFsbEVycm9ycygpO1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcblxuICAgIGlmIChyb3dzID09PSBudWxsKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gcm93c1tpXTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlcnJvcnMgPSByb3cuY2VsbHNbal0ucXVlc3Rpb24uZ2V0QWxsRXJyb3JzKCk7XG4gICAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9ySW5Db2x1bW5zKGZpcmVDYWxsYmFjazogYm9vbGVhbiwgcmVjOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbHMgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLmNlbGxzO1xuICAgICAgaWYgKCFjZWxscykgY29udGludWU7XG4gICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY2VsbHMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIGlmICghY2VsbHNbY29sSW5kZXhdKSBjb250aW51ZTtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gY2VsbHNbY29sSW5kZXhdLnF1ZXN0aW9uO1xuICAgICAgICBpZiAoIXF1ZXN0aW9uIHx8ICFxdWVzdGlvbi52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgcXVlc3Rpb24ub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMgPSAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgdGhpcy5yYWlzZU9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzKCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmICghIXJlYyAmJiByZWMuaXNPblZhbHVlQ2hhbmdlZCA9PT0gdHJ1ZSAmJiBxdWVzdGlvbi5pc0VtcHR5KCkpXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIHJlcyA9IHF1ZXN0aW9uLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYykgfHwgcmVzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRGaXJzdENlbGxRdWVzdGlvbihmYWxzZSk7XG4gICAgcmV0dXJuIHF1ZXN0aW9uID8gcXVlc3Rpb24uaW5wdXRJZCA6IHN1cGVyLmdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRGaXJzdENlbGxRdWVzdGlvbih0cnVlKTtcbiAgICByZXR1cm4gcXVlc3Rpb24gPyBxdWVzdGlvbi5pbnB1dElkIDogc3VwZXIuZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0Q2VsbFF1ZXN0aW9uKG9uRXJyb3I6IGJvb2xlYW4pOiBRdWVzdGlvbiB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjZWxscyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0uY2VsbHM7XG4gICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY2VsbHMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIGlmICghb25FcnJvcikgcmV0dXJuIGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgaWYgKGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbi5jdXJyZW50RXJyb3JDb3VudCA+IDApXG4gICAgICAgICAgcmV0dXJuIGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVhZE9ubHlDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uUmVhZE9ubHlDaGFuZ2VkKCk7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlUm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52aXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy52aXNpYmxlUm93c1tpXS5vblF1ZXN0aW9uUmVhZE9ubHlDaGFuZ2VkKHRoaXMuaXNSZWFkT25seSk7XG4gICAgfVxuICB9XG5cbiAgLy9JTWF0cml4RHJvcGRvd25EYXRhXG4gIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVF1ZXN0aW9uQ29yZShyb3csIGNvbHVtbik7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVF1ZXN0aW9uQ29yZShcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgKTogUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbiA9IGNvbHVtbi5jcmVhdGVDZWxsUXVlc3Rpb24ocm93KTtcbiAgICBpZiAodGhpcy5pc1JlYWRPbmx5KSB7XG4gICAgICBxdWVzdGlvbi5yZWFkT25seSA9IHRydWU7XG4gICAgfVxuICAgIHF1ZXN0aW9uLnNldFN1cnZleUltcGwocm93KTtcbiAgICByZXR1cm4gcXVlc3Rpb247XG4gIH1cbiAgcHJvdGVjdGVkIGRlbGV0ZVJvd1ZhbHVlKFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBhbnkge1xuICAgIGlmICghbmV3VmFsdWUpIHJldHVybiBuZXdWYWx1ZTtcbiAgICBkZWxldGUgbmV3VmFsdWVbcm93LnJvd05hbWVdO1xuICAgIHJldHVybiB0aGlzLmlzT2JqZWN0KG5ld1ZhbHVlKSAmJiBPYmplY3Qua2V5cyhuZXdWYWx1ZSkubGVuZ3RoID09IDBcbiAgICAgID8gbnVsbFxuICAgICAgOiBuZXdWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGlzRG9pbmdvbkFueVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8XG4gICAgICB0aGlzLmlzRG9pbmdvbkFueVZhbHVlQ2hhbmdlZCB8fFxuICAgICAgIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5pc0RvaW5nb25BbnlWYWx1ZUNoYW5nZWQgPSB0cnVlO1xuICAgIHZhciByb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJvd3NbaV0ub25BbnlWYWx1ZUNoYW5nZWQobmFtZSk7XG4gICAgfVxuICAgIHZhciB0b3RhbFJvdyA9IHRoaXMudmlzaWJsZVRvdGFsUm93O1xuICAgIGlmICghIXRvdGFsUm93KSB7XG4gICAgICB0b3RhbFJvdy5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gICAgdGhpcy5pc0RvaW5nb25BbnlWYWx1ZUNoYW5nZWQgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNPYmplY3QodmFsdWU6IGFueSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXRPbkNlbGxWYWx1ZUNoYW5nZWRPcHRpb25zKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogYW55IHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGdldFF1ZXN0aW9uID0gZnVuY3Rpb24gKGNvbE5hbWU6IGFueSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IHNlbGYuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2VsZi5jb2x1bW5zW2ldLm5hbWUgPT09IGNvbE5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gcm93LmNlbGxzW2ldLnF1ZXN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICByb3c6IHJvdyxcbiAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICByb3dWYWx1ZTogcm93VmFsdWUsXG4gICAgICB2YWx1ZTogISFyb3dWYWx1ZSA/IHJvd1ZhbHVlW2NvbHVtbk5hbWVdIDogbnVsbCxcbiAgICAgIGdldENlbGxRdWVzdGlvbjogZ2V0UXVlc3Rpb24sXG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DZWxsVmFsdWVDaGFuZ2VkKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5nZXRPbkNlbGxWYWx1ZUNoYW5nZWRPcHRpb25zKHJvdywgY29sdW1uTmFtZSwgcm93VmFsdWUpO1xuICAgIGlmICghIXRoaXMub25DZWxsVmFsdWVDaGFuZ2VkQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMub25DZWxsVmFsdWVDaGFuZ2VkQ2FsbGJhY2sob3B0aW9ucyk7XG4gICAgfVxuICAgIHRoaXMuc3VydmV5Lm1hdHJpeENlbGxWYWx1ZUNoYW5nZWQodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgdmFsaWRhdGVDZWxsKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogU3VydmV5RXJyb3Ige1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGdldFF1ZXN0aW9uID0gZnVuY3Rpb24gKGNvbE5hbWU6IGFueSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IHNlbGYuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc2VsZi5jb2x1bW5zW2ldLm5hbWUgPT09IGNvbE5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gcm93LmNlbGxzW2ldLnF1ZXN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcm93OiByb3csXG4gICAgICBjb2x1bW5OYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgcm93VmFsdWU6IHJvd1ZhbHVlLFxuICAgICAgdmFsdWU6IHJvd1ZhbHVlW2NvbHVtbk5hbWVdLFxuICAgICAgZ2V0Q2VsbFF1ZXN0aW9uOiBnZXRRdWVzdGlvbixcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5tYXRyaXhDZWxsVmFsaWRhdGUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgb25Sb3dDaGFuZ2luZyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICByb3dWYWx1ZTogYW55XG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuICEhcm93VmFsdWUgPyByb3dWYWx1ZVtjb2x1bW5OYW1lXSA6IG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLmdldE9uQ2VsbFZhbHVlQ2hhbmdlZE9wdGlvbnMocm93LCBjb2x1bW5OYW1lLCByb3dWYWx1ZSk7XG4gICAgdmFyIG9sZFJvd1ZhbHVlID0gdGhpcy5nZXRSb3dWYWx1ZUNvcmUocm93LCB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCksIHRydWUpO1xuICAgIG9wdGlvbnMub2xkVmFsdWUgPSAhIW9sZFJvd1ZhbHVlID8gb2xkUm93VmFsdWVbY29sdW1uTmFtZV0gOiBudWxsO1xuICAgIHRoaXMuc3VydmV5Lm1hdHJpeENlbGxWYWx1ZUNoYW5naW5nKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnZhbHVlO1xuICB9XG4gIG9uUm93Q2hhbmdlZChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICBuZXdSb3dWYWx1ZTogYW55LFxuICAgIGlzRGVsZXRpbmdWYWx1ZTogYm9vbGVhblxuICApIHtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRydWUpO1xuICAgIHZhciBjb21iaW5lID0gdGhpcy5nZXROZXdWYWx1ZU9uUm93Q2hhbmdlZChcbiAgICAgIHJvdyxcbiAgICAgIGNvbHVtbk5hbWUsXG4gICAgICBuZXdSb3dWYWx1ZSxcbiAgICAgIGlzRGVsZXRpbmdWYWx1ZSxcbiAgICAgIHRoaXMuY3JlYXRlTmV3VmFsdWUoKVxuICAgICk7XG4gICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyhvbGRWYWx1ZSwgY29tYmluZS52YWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2V0TmV3VmFsdWUoY29tYmluZS52YWx1ZSk7XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gZmFsc2U7XG4gICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgIHRoaXMub25DZWxsVmFsdWVDaGFuZ2VkKHJvdywgY29sdW1uTmFtZSwgY29tYmluZS5yb3dWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0TmV3VmFsdWVPblJvd0NoYW5nZWQoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW5OYW1lOiBzdHJpbmcsXG4gICAgbmV3Um93VmFsdWU6IGFueSxcbiAgICBpc0RlbGV0aW5nVmFsdWU6IGJvb2xlYW4sXG4gICAgbmV3VmFsdWU6IGFueVxuICApOiBhbnkge1xuICAgIHZhciByb3dWYWx1ZSA9IHRoaXMuZ2V0Um93VmFsdWVDb3JlKHJvdywgbmV3VmFsdWUsIHRydWUpO1xuICAgIGlmIChpc0RlbGV0aW5nVmFsdWUpIHtcbiAgICAgIGRlbGV0ZSByb3dWYWx1ZVtjb2x1bW5OYW1lXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3cuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSByb3cuY2VsbHNbaV0ucXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCk7XG4gICAgICBkZWxldGUgcm93VmFsdWVba2V5XTtcbiAgICB9XG4gICAgaWYgKG5ld1Jvd1ZhbHVlKSB7XG4gICAgICBuZXdSb3dWYWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobmV3Um93VmFsdWUpKTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBuZXdSb3dWYWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KG5ld1Jvd1ZhbHVlW2tleV0pKSB7XG4gICAgICAgICAgcm93VmFsdWVba2V5XSA9IG5ld1Jvd1ZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuaXNPYmplY3Qocm93VmFsdWUpICYmIE9iamVjdC5rZXlzKHJvd1ZhbHVlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy5kZWxldGVSb3dWYWx1ZShuZXdWYWx1ZSwgcm93KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWU6IG5ld1ZhbHVlLCByb3dWYWx1ZTogcm93VmFsdWUgfTtcbiAgfVxuICBnZXRSb3dJbmRleChyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiAtMTtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUm93cy5pbmRleE9mKHJvdyk7XG4gIH1cbiAgZ2V0U2hhcmVkUXVlc3Rpb25CeU5hbWUoXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbiAgKTogUXVlc3Rpb24ge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkgfHwgIXRoaXMudmFsdWVOYW1lKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmdldFJvd0luZGV4KHJvdyk7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIDxRdWVzdGlvbj4oXG4gICAgICB0aGlzLnN1cnZleS5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lRnJvbUFycmF5KFxuICAgICAgICB0aGlzLnZhbHVlTmFtZSxcbiAgICAgICAgY29sdW1uTmFtZSxcbiAgICAgICAgaW5kZXhcbiAgICAgIClcbiAgICApO1xuICB9XG4gIG9uVG90YWxWYWx1ZUNoYW5nZWQoKTogYW55IHtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuZGF0YSAmJlxuICAgICAgISF0aGlzLnZpc2libGVUb3RhbFJvdyAmJlxuICAgICAgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiZcbiAgICAgICF0aGlzLmlzU2V0dFxuICAgICkge1xuICAgICAgdGhpcy5kYXRhLnNldFZhbHVlKFxuICAgICAgICB0aGlzLmdldFZhbHVlTmFtZSgpICsgc2V0dGluZ3MubWF0cml4VG90YWxWYWx1ZVBvc3RGaXgsXG4gICAgICAgIHRoaXMudG90YWxWYWx1ZSxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRRdWVzdGlvbkZyb21BcnJheShuYW1lOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBJUXVlc3Rpb24ge1xuICAgIGlmIChpbmRleCA+PSB0aGlzLnZpc2libGVSb3dzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVJvd3NbaW5kZXhdLmdldFF1ZXN0aW9uQnlDb2x1bW5OYW1lKG5hbWUpO1xuICB9XG4gIHByaXZhdGUgaXNNYXRyaXhWYWx1ZUVtcHR5KHZhbDogYW55KSB7XG4gICAgaWYgKCF2YWwpIHJldHVybjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5pc09iamVjdCh2YWxbaV0pICYmIE9iamVjdC5rZXlzKHZhbFtpXSkubGVuZ3RoID4gMClcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbCkubGVuZ3RoID09IDA7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm1hdHJpeGRyb3Bkb3duY29sdW1uXCIsXG4gIFtcbiAgICB7bmFtZTogXCIhbmFtZVwiLCBpc1VuaXF1ZTogdHJ1ZX0sXG4gICAgeyBuYW1lOiBcInRpdGxlXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjZWxsVHlwZVwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiAoKSA9PiB7XG4gICAgICAgIHZhciByZXMgPSBNYXRyaXhEcm9wZG93bkNvbHVtbi5nZXRDb2x1bW5UeXBlcygpO1xuICAgICAgICByZXMuc3BsaWNlKDAsIDAsIFwiZGVmYXVsdFwiKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiY29sQ291bnRcIiwgZGVmYXVsdDogLTEsIGNob2ljZXM6IFstMSwgMCwgMSwgMiwgMywgNF0gfSxcbiAgICBcImlzUmVxdWlyZWQ6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHQ6dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1JlcXVpcmVkRXJyb3JUZXh0XCIsXG4gICAgfSxcbiAgICBcInJlYWRPbmx5OmJvb2xlYW5cIixcbiAgICBcIm1pbldpZHRoXCIsXG4gICAgXCJ3aWR0aFwiLFxuICAgIFwidmlzaWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIFwiZW5hYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJyZXF1aXJlZElmOmNvbmRpdGlvblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwic2hvd0luTXVsdGlwbGVDb2x1bW5zOmJvb2xlYW5cIixcbiAgICAgIGRlcGVuZHNPbjogXCJjZWxsVHlwZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgICAgaWYgKCFvYmopIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG9iai5pc1N1cHBvcnRNdWx0aXBsZUNvbHVtbnM7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ2YWxpZGF0b3JzOnZhbGlkYXRvcnNcIixcbiAgICAgIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dmFsaWRhdG9yXCIsXG4gICAgICBjbGFzc05hbWVQYXJ0OiBcInZhbGlkYXRvclwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ0b3RhbFR5cGVcIixcbiAgICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcInN1bVwiLCBcImNvdW50XCIsIFwibWluXCIsIFwibWF4XCIsIFwiYXZnXCJdLFxuICAgIH0sXG4gICAgXCJ0b3RhbEV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgIHsgbmFtZTogXCJ0b3RhbEZvcm1hdFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVG90YWxGb3JtYXRcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidG90YWxEaXNwbGF5U3R5bGVcIixcbiAgICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcImRlY2ltYWxcIiwgXCJjdXJyZW5jeVwiLCBcInBlcmNlbnRcIl0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRvdGFsQ3VycmVuY3lcIixcbiAgICAgIGNob2ljZXM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldEN1cnJlY3lDb2RlcygpO1xuICAgICAgfSxcbiAgICAgIGRlZmF1bHQ6IFwiVVNEXCIsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidG90YWxNYXhpbXVtRnJhY3Rpb25EaWdpdHM6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAgeyBuYW1lOiBcInRvdGFsTWluaW11bUZyYWN0aW9uRGlnaXRzOm51bWJlclwiLCBkZWZhdWx0OiAtMSB9LFxuICBdLFxuICBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXhEcm9wZG93bkNvbHVtbihcIlwiKTtcbiAgfVxuKTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhkcm9wZG93bmJhc2VcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiY29sdW1uczptYXRyaXhkcm9wZG93bmNvbHVtbnNcIixcbiAgICAgIGNsYXNzTmFtZTogXCJtYXRyaXhkcm9wZG93bmNvbHVtblwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb2x1bW5MYXlvdXRcIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJjb2x1bW5zTG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgY2hvaWNlczogW1wiaG9yaXpvbnRhbFwiLCBcInZlcnRpY2FsXCJdLFxuICAgIH0sXG4gICAgXCJob3Jpem9udGFsU2Nyb2xsOmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXM6aXRlbXZhbHVlW11cIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJvcHRpb25zQ2FwdGlvblwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jT3B0aW9uc0NhcHRpb25cIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2VsbFR5cGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiZHJvcGRvd25cIixcbiAgICAgIGNob2ljZXM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIE1hdHJpeERyb3Bkb3duQ29sdW1uLmdldENvbHVtblR5cGVzKCk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImNvbHVtbkNvbENvdW50XCIsIGRlZmF1bHQ6IDAsIGNob2ljZXM6IFswLCAxLCAyLCAzLCA0XSB9LFxuICAgIFwiY29sdW1uTWluV2lkdGhcIixcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZShcIlwiKTtcbiAgfSxcbiAgXCJtYXRyaXhiYXNlXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIG5vbiB2YWx1ZSBxdWVzdGlvbi4gVGhpcyBxdWVzdGlvbiBkb2Vzbid0IGFkZCBhbnkgbmV3IGZ1bmN0aW9uYWxpdHkuIEl0IGhpZGVzIHNvbWUgcHJvcGVydGllcywgaW5jbHVkaW5nIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTm9uVmFsdWUgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm5vbnZhbHVlXCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldFRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7fVxuICBwdWJsaWMgZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvcjogc3RyaW5nID0gbnVsbCwgcGF0aDogc3RyaW5nID0gbnVsbCk6IGFueSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibm9udmFsdWVcIixcbiAgW1xuICAgIHsgbmFtZTogXCJ0aXRsZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJ2YWx1ZU5hbWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiZW5hYmxlSWZcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiZGVmYXVsdFZhbHVlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImNvcnJlY3RBbnN3ZXJcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiaXNSZXF1aXJlZFwiLCB2aXNpYmxlOiBmYWxzZSwgaXNTZXJpYWxpemFibGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlYWRPbmx5XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlcXVpcmVkSWZcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidmFsaWRhdG9yc1wiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJ0aXRsZUxvY2F0aW9uXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInVzZURpc3BsYXlWYWx1ZXNJblRpdGxlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTm9uVmFsdWUoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbm5vbnZhbHVlLnRzIiwiaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4vZGVmYXVsdENzcy9jc3NzdGFuZGFyZFwiO1xuZXhwb3J0IGNsYXNzIFN0eWxlc01hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBTdXJ2ZXlKU1N0eWxlc1NoZWV0SWQgPSBcInN1cnZleWpzLXN0eWxlc1wiO1xuXG4gIHB1YmxpYyBzdGF0aWMgU3R5bGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIC8vIFwiLnN2X2Jvb3RzdHJhcF9jc3NcIjpcbiAgICAvLyAgIFwicG9zaXRpb246IHJlbGF0aXZlOyB3aWR0aDogMTAwJTsgYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjRmNFwiLFxuICAgIC8vIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X2N1c3RvbV9oZWFkZXJcIjpcbiAgICAvLyAgIFwicG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAyNzVweDsgYmFja2dyb3VuZC1jb2xvcjogI2U3ZTdlNztcIixcbiAgICAvLyBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9jb250YWluZXJcIjpcbiAgICAvLyAgIFwibWF4LXdpZHRoOiA4MCU7IG1hcmdpbjogYXV0bzsgcG9zaXRpb246IHJlbGF0aXZlOyBjb2xvcjogIzZkNzA3MjsgcGFkZGluZzogMCAxZW07XCIsXG4gICAgLy8gXCIuc3ZfYm9vdHN0cmFwX2NzcyAucGFuZWwtYm9keVwiOlxuICAgIC8vICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMWVtIDFlbSA1ZW0gMWVtOyBib3JkZXItdG9wOiAycHggc29saWQgbGlnaHRncmF5O1wiLFxuXG4gICAgXCIuc3ZfbWFpbiBzcGFuXCI6IFwid29yZC1icmVhazogYnJlYWstd29yZDtcIixcblxuICAgIFwiLnN2X21haW4gbGVnZW5kXCI6IFwiYm9yZGVyOiBub25lOyBtYXJnaW46IDA7XCIsXG5cbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xc3RuXCI6IFwicGFkZGluZzogMC41ZW0gMWVtIDEuNWVtIDFlbTtcIixcbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xY2JjIGlucHV0W3R5cGU9Y2hlY2tib3hdLCAuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcWNiYyBpbnB1dFt0eXBlPXJhZGlvXVwiOlxuICAgICAgXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBtYXJnaW4tdG9wOiAtMXB4XCIsXG4gICAgXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcXN0biBmaWVsZHNldFwiOiBcImRpc3BsYXk6IGJsb2NrO1wiLFxuICAgIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FzdG4gIC5zdl9xX2NoZWNrYm94X2lubGluZSwgLnN2X2Jvb3RzdHJhcF9jc3MgLnN2X3FzdG4gLnN2X3FfcmFkaW9ncm91cF9pbmxpbmVcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuXG4gICAgXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy1jb250YWluZXIgXCI6XG4gICAgICBcInBvc2l0aW9uOiByZWxhdGl2ZTsgbWFyZ2luLXJpZ2h0OiAyNTBweDsgbWFyZ2luLWxlZnQ6IDQwcHg7IG1hcmdpbi10b3A6IDEwcHg7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcV9yYWRpb2dyb3VwX2NvbnRyb2xfbGFiZWxcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lOyBwb3NpdGlvbjogc3RhdGljO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5jaGVja2JveFwiOlxuICAgICAgXCJtYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4O1wiLFxuXG4gICAgXCIuc3Zfcm93XCI6IFwiY2xlYXI6IGJvdGg7IG1pbi13aWR0aDozMDBweDtcIixcbiAgICBcIi5zdl9yb3cgLnN2X3FzdG5cIjogXCJmbG9hdDogbGVmdFwiLFxuICAgIFwiLnN2X3JvdyAuc3ZfcXN0bjpsYXN0LWNoaWxkXCI6IFwiZmxvYXQ6IG5vbmVcIixcbiAgICBcIi5zdl9xc3RuXCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDsgb3ZlcmZsb3c6IGF1dG87IG1pbi13aWR0aDozMDBweDtcIixcbiAgICBcIi5zdl9wX2NvbnRhaW5lclwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7IG1pbi13aWR0aDozMDBweDtcIixcbiAgICBcIi5zdl9xYmxuIC5jaGVja2JveC1tYXRlcmlhbFwiOiBcIm1hcmdpbi1yaWdodDogM3B4O1wiLFxuICAgIFwiLnN2X3FjYnggLmNoZWNrYm94LW1hdGVyaWFsXCI6IFwibWFyZ2luLXJpZ2h0OiA1cHg7XCIsXG4gICAgXCIuc3ZfcWNieCAuY2hlY2tib3ggbGFiZWxcIjogXCJqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7IGRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xc3RuIC5yYWRpbyBsYWJlbFwiOiBcImp1c3RpZnktY29udGVudDogbGVmdDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2X3FfaW1nc2VsID4gbGFiZWwgaW1nXCI6IFwicG9pbnRlci1ldmVudHM6IG5vbmU7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3ZfcV9pbWdzZWwuc3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIjogXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcXN0biBsYWJlbC5zdl9xX21fbGFiZWxcIjpcbiAgICAgIFwicG9zaXRpb246IGFic29sdXRlOyBtYXJnaW46IDA7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJTtcIixcbiAgICBcIi5zdl9xc3RuIHRkXCI6IFwicG9zaXRpb246IHJlbGF0aXZlO1wiLFxuICAgIFwiLnN2X3FfbXRfaXRlbV92YWx1ZVwiOiBcImZsb2F0OiBsZWZ0O1wiLFxuICAgICdbZGlyPVwicnRsXCJdIC5zdl9xX210X2l0ZW1fdmFsdWUnOiBcImZsb2F0OiByaWdodDtcIixcbiAgICBcIi5zdl9xc3RuLnN2X3FzdG5fbGVmdFwiOiBcIm1hcmdpbi10b3A6IDAuNzVlbTtcIixcbiAgICBcIi5zdl9xc3RuIC50aXRsZS1sZWZ0XCI6IFwiZmxvYXQ6IGxlZnQ7IG1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgICdbZGlyPVwicnRsXCJdIC5zdl9xc3RuIC50aXRsZS1sZWZ0JzogXCJmbG9hdDogcmlnaHQ7IG1hcmdpbi1sZWZ0OiAxZW07XCIsXG4gICAgXCIuc3ZfcXN0biAuY29udGVudC1sZWZ0XCI6IFwib3ZlcmZsb3c6IGhpZGRlblwiLFxuICAgIFwiLnN2X3FfcmFkaW9ncm91cF9pbmxpbmUgLnN2X3FfcmFkaW9ncm91cF9vdGhlclwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xX2NoZWNrYm94X2lubGluZSAuc3ZfcV9jaGVja2JveF9vdGhlclwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xX2NoZWNrYm94X2lubGluZSwgLnN2X3FfcmFkaW9ncm91cF9pbmxpbmUsIC5zdl9xX2ltYWdlcGlja2VyX2lubGluZVwiOlxuICAgICAgXCJsaW5lLWhlaWdodDogMi41ZW07XCIsXG4gICAgXCIuZm9ybS1pbmxpbmUgLnN2X3FfY2hlY2tib3hfaW5saW5lOm5vdCg6bGFzdC1jaGlsZClcIjogXCJtYXJnaW4tcmlnaHQ6IDFlbTtcIixcbiAgICBcIi5mb3JtLWlubGluZSAuc3ZfcV9yYWRpb2dyb3VwX2lubGluZTpub3QoOmxhc3QtY2hpbGQpXCI6XG4gICAgICBcIm1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLnN2X2ltZ3NlbCAuc3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmU6bm90KDpsYXN0LWNoaWxkKVwiOlxuICAgICAgXCJtYXJnaW4tcmlnaHQ6IDFlbTtcIixcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0XCI6IFwiYm9yZGVyOiBub25lOyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3ZfcV9maWxlX3BsYWNlaG9sZGVyXCI6IFwiZGlzcGxheTpub25lXCIsXG5cbiAgICBcIi5zdl9wX3RpdGxlXCI6IFwicGFkZGluZy1sZWZ0OiAxZW07IHBhZGRpbmctYm90dG9tOiAwLjNlbTtcIixcbiAgICBcIi5zdl9wX3RpdGxlX2V4cGFuZGFibGVcIjogXCJjdXJzb3I6IHBvaW50ZXI7XCIsXG4gICAgXCIuc3ZfcF90aXRsZSAuc3ZfcGFuZWxfaWNvblwiOiBcImZsb2F0OiByaWdodDsgbWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCIuc3ZfcF90aXRsZSAuc3ZfcGFuZWxfaWNvbjo6YmVmb3JlXCI6XG4gICAgICBcImNvbnRlbnQ6ICcnOyBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7IHBhZGRpbmc6IDAuNWVtOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBEOTRiV3dnZG1WeWMybHZiajBpTVM0d0lpQmxibU52WkdsdVp6MGlkWFJtTFRnaVB6NE5DandoTFMwZ1IyVnVaWEpoZEc5eU9pQkJaRzlpWlNCSmJHeDFjM1J5WVhSdmNpQXlNaTR3TGpFc0lGTldSeUJGZUhCdmNuUWdVR3gxWnkxSmJpQXVJRk5XUnlCV1pYSnphVzl1T2lBMkxqQXdJRUoxYVd4a0lEQXBJQ0F0TFQ0TkNqeHpkbWNnZG1WeWMybHZiajBpTVM0eElpQnBaRDBpVEdGNVpYSmZNU0lnZUcxc2JuTTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TURBdmMzWm5JaUI0Yld4dWN6cDRiR2x1YXowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1UazVPUzk0YkdsdWF5SWdlRDBpTUhCNElpQjVQU0l3Y0hnaURRb0pJSFpwWlhkQ2IzZzlJakFnTUNBeE1DQXhNQ0lnYzNSNWJHVTlJbVZ1WVdKc1pTMWlZV05yWjNKdmRXNWtPbTVsZHlBd0lEQWdNVEFnTVRBN0lpQjRiV3c2YzNCaFkyVTlJbkJ5WlhObGNuWmxJajROQ2p4emRIbHNaU0IwZVhCbFBTSjBaWGgwTDJOemN5SStEUW9KTG5OME1IdG1hV3hzT2lNMlJEY3dOekk3ZlEwS1BDOXpkSGxzWlQ0TkNqeHdiMng1WjI5dUlHTnNZWE56UFNKemREQWlJSEJ2YVc1MGN6MGlNaXd5SURBc05DQTFMRGtnTVRBc05DQTRMRElnTlN3MUlDSXZQZzBLUEM5emRtYytEUW89KTtcIixcbiAgICBcIi5zdl9wX3RpdGxlIC5zdl9wYW5lbF9pY29uLnN2X2V4cGFuZGVkOjpiZWZvcmVcIjpcbiAgICAgIFwidHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcIixcbiAgICBcIi5zdl9wX2Zvb3RlclwiOiBcInBhZGRpbmctbGVmdDogMWVtOyBwYWRkaW5nLWJvdHRvbTogMWVtO3BhZGRpbmctdG9wOiAxZW07XCIsXG5cbiAgICBcIi5zdl9xX2ZpbGUgPiBpbnB1dFt0eXBlPWZpbGVdLCAuc3ZfcV9maWxlID4gYnV0dG9uXCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xX2ZpbGVfcHJldmlld1wiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7IGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTsgcGFkZGluZzogNXB4OyBtYXJnaW4tdG9wOiAxMHB4O1wiLFxuICAgIFwiLnN2X3FfZmlsZV9wcmV2aWV3ID4gYVwiOlxuICAgICAgXCJkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgdmVydGljYWwtYWxpZ246IHRvcDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XCIsXG4gICAgXCIuc3ZfcV9maWxlX3JlbW92ZV9idXR0b25cIjogXCJsaW5lLWhlaWdodDogbm9ybWFsO1wiLFxuICAgIFwiLnN2X3FfZmlsZV9yZW1vdmVcIjogXCJkaXNwbGF5OiBibG9jazsgY3Vyc29yOiBwb2ludGVyO1wiLFxuXG4gICAgXCIuc3ZfcV9tX2NlbGxfdGV4dFwiOiBcImN1cnNvcjogcG9pbnRlcjtcIixcblxuICAgIFwiLnN2X3FfZGRfb3RoZXJcIjogXCJtYXJnaW4tdG9wOiAxZW07XCIsXG4gICAgXCIuc3ZfcV9kZF9vdGhlciBpbnB1dFwiOiBcIndpZHRoOiAxMDAlO1wiLFxuXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtMSwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbC0xXCI6XG4gICAgICBcIndpZHRoOiAxMDAlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbC0yLCAuc3YtcXVlc3Rpb24gLnN2LXEtY29sLTJcIjpcbiAgICAgIFwid2lkdGg6IDUwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2wtMywgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbC0zXCI6XG4gICAgICBcIndpZHRoOiAzMy4zMzMzMyU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sLTQsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2wtNFwiOlxuICAgICAgXCJ3aWR0aDogMjUlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbC01LCAuc3YtcXVlc3Rpb24gLnN2LXEtY29sLTVcIjpcbiAgICAgIFwid2lkdGg6IDIwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG5cbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbHVtbi0xLCAuc3YtcXVlc3Rpb24gLnN2LXEtY29sdW1uLTFcIjpcbiAgICAgIFwid2lkdGg6IDEwMCU7IG1heC13aWR0aDogMTAwJTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tMiwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbHVtbi0yXCI6XG4gICAgICBcIm1heC13aWR0aDogNTAlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcbiAgICBcIi5zdl9xc3RuIC5zdi1xLWNvbHVtbi0zLCAuc3YtcXVlc3Rpb24gLnN2LXEtY29sdW1uLTNcIjpcbiAgICAgIFwibWF4LXdpZHRoOiAzMy4zMzMzMyU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZy1yaWdodDogMWVtOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3b3JkLWJyZWFrOiBicmVhay13b3JkO1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2LXEtY29sdW1uLTQsIC5zdi1xdWVzdGlvbiAuc3YtcS1jb2x1bW4tNFwiOlxuICAgICAgXCJtYXgtd2lkdGg6IDI1JTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nLXJpZ2h0OiAxZW07IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3YtcS1jb2x1bW4tNSwgLnN2LXF1ZXN0aW9uIC5zdi1xLWNvbHVtbi01XCI6XG4gICAgICBcIm1heC13aWR0aDogMjAlOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmctcmlnaHQ6IDFlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd29yZC1icmVhazogYnJlYWstd29yZDtcIixcblxuICAgIFwiLnN2X3FzdG4gLnN2X3FfZmlsZV9pbnB1dFwiOiBcImNvbG9yOiB0cmFuc3BhcmVudDtcIixcblxuICAgIFwiLnN2X3FzdG4gLnN2X3FfaW1nc2VsIGxhYmVsID4gZGl2XCI6XG4gICAgICBcIm92ZXJmbG93OiBoaWRkZW47IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyBwYWRkaW5nOiA0cHg7IGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTsgYm9yZGVyLXJhZGl1czogNHB4O1wiLFxuICAgIFwiLnN2X3FzdG4gLnN2X3FfaW1nc2VsIGxhYmVsID4gZGl2ID4gaW1nLCAuc3ZfcXN0biAuc3ZfcV9pbWdzZWwgbGFiZWwgPiBkaXYgPiBlbWJlZFwiOlxuICAgICAgXCJkaXNwbGF5OiBibG9jaztcIixcblxuICAgIFwiLnN2X3FzdG4gdGFibGUgdHIgdGQgLnN2X3FfbV9jZWxsX2xhYmVsXCI6XG4gICAgICBcInBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgcmlnaHQ6IDA7IHRvcDogMDsgYm90dG9tOiAwO1wiLFxuXG4gICAgXCJmLXBhbmVsXCI6IFwicGFkZGluZzogMC41ZW0gMWVtOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGxpbmUtaGVpZ2h0OiAyZW07XCIsXG5cbiAgICBcIi5zdl9wcm9ncmVzc19iYXIgPiBzcGFuXCI6IFwid2hpdGUtc3BhY2U6IG5vd3JhcDtcIixcblxuICAgIFwiLnN2X3FzdG4gLnN2X3Ffc2VsZWN0X2NvbHVtblwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7IG1pbi13aWR0aDogMTAlO1wiLFxuXG4gICAgXCIuc3ZfcXN0biAuc3ZfcV9zZWxlY3RfY29sdW1uID4gKjpub3QoLnN2X3RlY2huaWNhbClcIjogXCJkaXNwbGF5OiBibG9jaztcIixcblxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAuc3ZfYm9keSAuc3ZfcF9yb290IC5zdl9xc3RuIC5zdl9xX3NlbGVjdF9jb2x1bW4gdGV4dGFyZWFcIjpcbiAgICAgIFwibWFyZ2luLWxlZnQ6IDA7IHBhZGRpbmctbGVmdDogMDsgbGluZS1oZWlnaHQ6IGluaXRpYWw7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtaGlkZGVuXCI6IFwiZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXZpc3VhbGx5aGlkZGVuXCI6XG4gICAgICBcInBvc2l0aW9uOiBhYnNvbHV0ZTsgaGVpZ2h0OiAxcHggIWltcG9ydGFudDsgd2lkdGg6IDFweCAhaW1wb3J0YW50OyBvdmVyZmxvdzogaGlkZGVuOyBjbGlwOiByZWN0KDFweCAxcHggMXB4IDFweCk7IGNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtcIixcblxuICAgIC8vIHBhbmVsZHluYW1pYyBwcm9ncmVzc1xuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzXCI6XG4gICAgICBcImhlaWdodDogMC4xOWVtOyBiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NfX2JhclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgaGVpZ2h0OiAxMDAlOyBwb3NpdGlvbjogcmVsYXRpdmU7XCIsXG4gICAgLy8gRU8gcGFuZWxkeW5hbWljIHByb2dyZXNzXG5cbiAgICAvLyBwYW5lbGR5bmFtaWNcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLWNvbnRhaW5lclwiOlxuICAgICAgXCJwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IGNhbGMoMTAwJSAtIDI1MHB4KTsgbWFyZ2luLXRvcDogMjBweDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIjogXCJmbG9hdDogcmlnaHQ7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19hZGQtYnRuLS1saXN0LW1vZGVcIjpcbiAgICAgIFwiZmxvYXQ6IG5vbmU7IG1hcmdpbi10b3A6IDA7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19yZW1vdmUtYnRuIFwiOiBcIm1hcmdpbi10b3A6IDEuMjVlbTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLCAuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0blwiOlxuICAgICAgXCJib3gtc2l6aW5nOiBib3JkZXItYm94OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGN1cnNvcjogcG9pbnRlcjsgd2lkdGg6IDAuN2VtOyB0b3A6IC0wLjI4ZW07IHBvc2l0aW9uOiBhYnNvbHV0ZTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuXCI6XG4gICAgICBcImxlZnQ6IC0xLjNlbTsgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4gXCI6XG4gICAgICBcInJpZ2h0OiAtMS4zZW07IHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLS1kaXNhYmxlZCwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4uc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi0tZGlzYWJsZWRcIjpcbiAgICAgIFwiY3Vyc29yOiBhdXRvO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiOlxuICAgICAgXCJmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiAwLjg3ZW07IG1hcmdpbi10b3A6IDAuNjllbTsgbWFyZ2luLWxlZnQ6IDRlbVwiLFxuICAgIC8vIEVPIHBhbmVsZHluYW1pY1xuICAgIC8vYm9vbGVhblxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX3N3aXRjaFwiOlxuICAgICAgXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiA2M3B4OyBoZWlnaHQ6IDI0cHg7IG1hcmdpbi1yaWdodDogMTdweDsgbWFyZ2luLWxlZnQ6IDIxcHg7IHBhZGRpbmc6IDJweCAzcHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IGJvcmRlci1yYWRpdXM6IDEycHg7IGN1cnNvcjogcG9pbnRlcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogMjBweDsgaGVpZ2h0OiAyMHB4OyB0cmFuc2l0aW9uLWR1cmF0aW9uOiAuNHM7IHRyYW5zaXRpb24tcHJvcGVydHk6IG1hcmdpbi1sZWZ0OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDEwMCU7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fbGFiZWxcIjogXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBjdXJzb3I6IHBvaW50ZXI7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0taW5kZXRlcm1pbmF0ZSAgLnN2LWJvb2xlYW5fX3NsaWRlclwiOlxuICAgICAgXCJtYXJnaW4tbGVmdDogY2FsYyg1MCUgLSAxMHB4KTtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuLS1jaGVja2VkICAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcIm1hcmdpbi1sZWZ0OiBjYWxjKDEwMCUgLSAyMHB4KTtcIixcbiAgICBcIltkaXI9J3J0bCddIC5zdi1ib29sZWFuX19sYWJlbCBcIjogXCJmbG9hdDogcmlnaHQ7XCIsXG4gICAgXCJbZGlyPSdydGwnXSAuc3YtYm9vbGVhbi0taW5kZXRlcm1pbmF0ZSAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6XG4gICAgICBcIm1hcmdpbi1yaWdodDogY2FsYyg1MCUgLSAwLjYyNWVtKTtcIixcbiAgICBcIltkaXI9J3J0bCddIC5zdi1ib29sZWFuLS1jaGVja2VkIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwibWFyZ2luLXJpZ2h0OiBjYWxjKDEwMCUgLSAxLjI1ZW0pO1wiLFxuICAgIFwiW2Rpcj0ncnRsJ10gLnN2LWJvb2xlYW5fX3N3aXRjaFwiOiBcImZsb2F0OiByaWdodDtcIixcbiAgICBcIltzdHlsZSo9J2RpcmVjdGlvbjpydGwnXSAuc3YtYm9vbGVhbl9fbGFiZWwgXCI6IFwiZmxvYXQ6IHJpZ2h0O1wiLFxuICAgIFwiW3N0eWxlKj0nZGlyZWN0aW9uOnJ0bCddIC5zdi1ib29sZWFuLS1pbmRldGVybWluYXRlIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwibWFyZ2luLXJpZ2h0OiBjYWxjKDUwJSAtIDAuNjI1ZW0pO1wiLFxuICAgIFwiW3N0eWxlKj0nZGlyZWN0aW9uOnJ0bCddIC5zdi1ib29sZWFuLS1jaGVja2VkIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwibWFyZ2luLXJpZ2h0OiBjYWxjKDEwMCUgLSAxLjI1ZW0pO1wiLFxuICAgIFwiW3N0eWxlKj0nZGlyZWN0aW9uOnJ0bCddIC5zdi1ib29sZWFuX19zd2l0Y2hcIjogXCJmbG9hdDogcmlnaHQ7XCIsXG5cbiAgICAvLyBFTyBib29sZWFuXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9udW1cIjogXCJcIixcbiAgICBcIi5zdl9tYWluIC5zdl9xX251bSArIHNwYW5cIjogXCJcIixcblxuICAgIC8vIFNpZ25hdHVyZVBhZFxuICAgIFwiLnN2X21haW4gLnNqc19zcF9jb250YWluZXJcIjogXCJwb3NpdGlvbjogcmVsYXRpdmU7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX2NvbnRyb2xzXCI6IFwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAwOyBib3R0b206IDA7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX2NvbnRyb2xzID4gYnV0dG9uXCI6IFwidXNlci1zZWxlY3Q6IG5vbmU7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc2pzX3NwX2NvbnRhaW5lcj5kaXY+Y2FudmFzOmZvY3VzXCI6IFwib3V0bGluZTogbm9uZTtcIixcblxuICAgIC8vIGxvZ29cbiAgICAvLyBcIi5zdl9tYWluIC5zdl9oZWFkZXJcIjogXCJ3aGl0ZS1zcGFjZTogbm93cmFwO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X2xvZ29cIjogXCJcIixcbiAgICBcIi5zdl9tYWluIC5zdi1sb2dvLS1sZWZ0XCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDsgbWFyZ2luLXJpZ2h0OiAyZW07XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtbG9nby0tcmlnaHRcIjpcbiAgICAgIFwiZGlzcGxheTogaW5saW5lLWJsb2NrOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBtYXJnaW4tbGVmdDogMmVtOyBmbG9hdDogcmlnaHQ7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtbG9nby0tcmlnaHQrLnN2LWxvZ28tLXJpZ2h0LXRhaWxcIjogXCJjbGVhcjogYm90aDtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1sb2dvLS10b3BcIjpcbiAgICAgIFwiZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtbG9nby0tYm90dG9tXCI6XG4gICAgICBcImRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X2hlYWRlcl9fdGV4dFwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDtcIixcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIE1lZGlhOiB7IFtrZXk6IHN0cmluZ106IHsgbWVkaWE6IHN0cmluZzsgc3R5bGU6IHN0cmluZyB9IH0gPSB7XG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldCAuc3YtcS1jb2wtMVwiOiB7XG4gICAgICBzdHlsZTogXCJ3aWR0aDogMTAwJTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0IC5zdi1xLWNvbC0yXCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X3FzdG4gZmllbGRzZXQgLnN2LXEtY29sLTNcIjoge1xuICAgICAgc3R5bGU6IFwid2lkdGg6IDEwMCU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDQ4MHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldCAuc3YtcS1jb2wtNFwiOiB7XG4gICAgICBzdHlsZTogXCJ3aWR0aDogMTAwJTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNDgwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9xc3RuIGZpZWxkc2V0IC5zdi1xLWNvbC01XCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA0ODBweClcIixcbiAgICB9LFxuXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0blwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gLnRpdGxlLWxlZnRcIjoge1xuICAgICAgc3R5bGU6IFwiZmxvYXQ6IG5vbmU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC5zdl9xX3JhZGlvZ3JvdXBfaW5saW5lLCAuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAuc3ZfcV9jaGVja2JveF9pbmxpbmUsIC5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC5zdl9xX2ltYWdlcGlja2VyX2lubGluZVwiOiB7XG4gICAgICBzdHlsZTogXCJkaXNwbGF5OiBibG9jaztcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGVcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogYmxvY2s7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnRhYmxlIHRoZWFkXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IG5vbmU7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnRhYmxlIHRib2R5LCAuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS50YWJsZSB0ciwgLnN2X21haW4gLnN2X2NvbnRhaW5lciAucGFuZWwtYm9keS5jYXJkLWJsb2NrIC5zdl9yb3cgLnN2X3FzdG4gdGFibGUudGFibGUgdGRcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogYmxvY2s7XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIHRhYmxlLnRhYmxlOm5vdCguc3ZfcV9tYXRyaXgpIHRkOmJlZm9yZVwiOiB7XG4gICAgICBzdHlsZTogXCJjb250ZW50OiBhdHRyKGhlYWRlcnMpO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biB0YWJsZS5zdl9xX21hdHJpeCB0ZDphZnRlclwiOiB7XG4gICAgICBzdHlsZTogXCJjb250ZW50OiBhdHRyKGhlYWRlcnMpOyBwYWRkaW5nLWxlZnQ6IDFlbVwiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KVwiLFxuICAgIH0sXG4gICAgXCIuc3ZfbWFpbiAuc3ZfY29udGFpbmVyIC5wYW5lbC1ib2R5LmNhcmQtYmxvY2sgLnN2X3JvdyAuc3ZfcXN0biAucmFkaW8gbGFiZWwsIC5zdl9tYWluIC5zdl9jb250YWluZXIgLnBhbmVsLWJvZHkuY2FyZC1ibG9jayAuc3Zfcm93IC5zdl9xc3RuIC5jaGVja2JveCBsYWJlbFwiOiB7XG4gICAgICBzdHlsZTogXCJsaW5lLWhlaWdodDogMTJweDsgdmVydGljYWwtYWxpZ246IHRvcDtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X3FzdG4gbGFiZWwuc3ZfcV9tX2xhYmVsXCI6IHtcbiAgICAgIHN0eWxlOiBcImRpc3BsYXk6IGlubGluZTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiA2MDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2N1c3RvbV9oZWFkZXJcIjoge1xuICAgICAgc3R5bGU6IFwiZGlzcGxheTogbm9uZTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWF4LXdpZHRoOiAxMzAwcHgpXCIsXG4gICAgfSxcbiAgICBcIi5zdl9tYWluIC5zdl9jb250YWluZXIgLnN2X2hlYWRlciBoM1wiOiB7XG4gICAgICBzdHlsZTogXCJmb250LXNpemU6IDEuNWVtO1wiLFxuICAgICAgbWVkaWE6IFwiQG1lZGlhIChtYXgtd2lkdGg6IDEzMDBweClcIixcbiAgICB9LFxuICAgIFwiLnN2X21haW4gLnN2X2NvbnRhaW5lciAuc3ZfaGVhZGVyIGgzIHNwYW5cIjoge1xuICAgICAgc3R5bGU6IFwiZm9udC1zaXplOiAwLjc1ZW07XCIsXG4gICAgICBtZWRpYTogXCJAbWVkaWEgKG1heC13aWR0aDogNzAwcHgpXCIsXG4gICAgfSxcblxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwX2NzcyAuc3YtcHJvZ3Jlc3NfX3RleHRcIjoge1xuICAgICAgc3R5bGU6IFwibWFyZ2luLWxlZnQ6IDhlbTtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSAobWluLXdpZHRoOiA3NjhweClcIixcbiAgICB9LFxuXG4gICAgXCIuc3Zfcm93XCI6IHtcbiAgICAgIHN0eWxlOiBcIiBkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7XCIsXG4gICAgICBtZWRpYTogXCJAc3VwcG9ydHMgKGRpc3BsYXk6IGZsZXgpXCIsXG4gICAgfSxcblxuICAgIFwiLnN2LXZ1ZS1yb3ctYWRkaXRpb25hbC1kaXZcIjoge1xuICAgICAgc3R5bGU6IFwiIGRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZmxleC1iYXNpczogMTAwJTtcIixcbiAgICAgIG1lZGlhOiBcIkBzdXBwb3J0cyAoZGlzcGxheTogZmxleClcIixcbiAgICB9LFxuXG4gICAgXCIuc3Ytcm93ID4gLnN2LXJvd19fcGFuZWwsIC5zdi1yb3dfX3F1ZXN0aW9uOm5vdCg6bGFzdC1jaGlsZClcIjoge1xuICAgICAgc3R5bGU6IFwiZmxvYXQ6IGxlZnQ7XCIsXG4gICAgICBtZWRpYTpcbiAgICAgICAgXCJAbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSksICgtbXMtaGlnaC1jb250cmFzdDogbm9uZSlcIixcbiAgICB9LFxuXG4gICAgXCJbZGlyPSdydGwnXSxbc3R5bGUqPSdkaXJlY3Rpb246cnRsJ10gLnN2LXJvd19fcXVlc3Rpb246bm90KDpsYXN0LWNoaWxkKVwiOiB7XG4gICAgICBzdHlsZTogXCJmbG9hdDogcmlnaHQ7XCIsXG4gICAgICBtZWRpYTpcbiAgICAgICAgXCJAbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSksICgtbXMtaGlnaC1jb250cmFzdDogbm9uZSlcIixcbiAgICB9LFxuXG4gICAgXCIuc3Ytcm93ID4gLnN2LXJvd19fcGFuZWwsIC5zdi1yb3dfX3F1ZXN0aW9uXCI6IHtcbiAgICAgIHN0eWxlOiBcIndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IHBhZGRpbmctcmlnaHQ6IDAgIWltcG9ydGFudDtcIixcbiAgICAgIG1lZGlhOiBcIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjAwcHgpXCIsXG4gICAgfSxcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIFRoZW1lQ29sb3JzOiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSA9IHtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlN2U3ZTdcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjRmNGY0XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjMWFiMzk0XCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzBhYTM4NFwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNmQ3MDcyXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjNmQ3MDcyXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIixcblxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGUtY29sb3JcIjogXCIjZGJkYmRiXCIsXG4gICAgICBcIiRkaXNhYmxlZC1sYWJlbC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkc2xpZGVyLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGRpc2FibGVkLXN3aXRjaC1jb2xvclwiOiBcIiM5ZjlmOWZcIixcbiAgICAgIFwiJGRpc2FibGVkLXNsaWRlci1jb2xvclwiOiBcIiNjZmNmY2ZcIixcbiAgICB9LFxuICAgIG9yYW5nZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y4ZjhmOFwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiI2Y3ODExOVwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiNlNzcxMDlcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiI2Y3ODExOVwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCIsXG4gICAgfSxcbiAgICBkYXJrYmx1ZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZDlkOGRkXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y2ZjdmMlwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzNjNGY2ZFwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiMyYzNmNWRcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiIzZkNzA3MlwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCIsXG4gICAgfSxcbiAgICBkYXJrcm9zZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZGRkMmNlXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y3ZWZlZFwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzY4NjU2ZVwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiM1ODU1NWVcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiIzZkNzA3MlwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCIsXG4gICAgfSxcbiAgICBzdG9uZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjY2RjY2QyXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2VmZWRmNFwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzBmMGYzM1wiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiMxOTE5NTVcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzBmMGYzM1wiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiIzBmMGYzM1wiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCIsXG5cbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkZGlzYWJsZWQtbGFiZWwtY29sb3JcIjogXCJyZ2JhKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJHNsaWRlci1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zd2l0Y2gtY29sb3JcIjogXCIjOWY5ZjlmXCIsXG4gICAgICBcIiRkaXNhYmxlZC1zbGlkZXItY29sb3JcIjogXCIjY2ZjZmNmXCIsXG4gICAgfSxcbiAgICB3aW50ZXI6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiIzgyYjhkYVwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNkYWUxZTdcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMzYzNiNDBcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMWUxZDIwXCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiLFxuXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiLFxuICAgIH0sXG4gICAgd2ludGVyc3RvbmU6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiIzMyMzIzMlwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmOGY4ZjhcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiM1YWM4ZmFcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMDZhMWU3XCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiNmZmZcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiLFxuXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiLFxuICAgIH0sXG4gICAgbW9kZXJuOiB7XG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzFhYjM5NFwiLFxuICAgICAgXCIkYWRkLWJ1dHRvbi1jb2xvclwiOiBcIiMxOTQ4YjNcIixcbiAgICAgIFwiJHJlbW92ZS1idXR0b24tY29sb3JcIjogXCIjZmYxODAwXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiLFxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZDUyOTAxXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzQwNDA0MFwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjRmNGY0XCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmNGY0ZjRcIixcbiAgICAgIFwiJHRleHQtYm9yZGVyLWNvbG9yXCI6IFwiI2Q0ZDRkNFwiLFxuICAgICAgXCIkZGlzYWJsZWQtdGV4dC1jb2xvclwiOiBcInJnYmEoNjQsIDY0LCA2NCwgMC41KVwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwicmdiKDY0LCA2NCwgNjQsIDAuNSlcIixcbiAgICAgIFwiJGRyb3Bkb3duLWJvcmRlci1jb2xvclwiOiBcIiNkNGQ0ZDRcIixcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuICAgICAgXCIkYW5zd2VyLWJhY2tncm91bmQtY29sb3JcIjogXCJyZ2JhKDI2LCAxNzksIDE0OCwgMC4yKVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcInJnYmEoMjEzLCA0MSwgMSwgMC4yKVwiLFxuICAgICAgXCIkcmFkaW8tY2hlY2tlZC1jb2xvclwiOiBcIiM0MDQwNDBcIixcbiAgICAgIFwiJGNsZWFuLWJ1dHRvbi1jb2xvclwiOiBcIiMxOTQ4YjNcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZmZmZmZcIixcbiAgICB9LFxuICAgIGJvb3RzdHJhcDoge1xuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMxOGE2ODlcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNDA0MDQwO1wiLFxuICAgICAgXCIkcHJvZ3Jlc3MtdGV4dC1jb2xvclwiOiBcIiM5ZDlkOWRcIixcbiAgICAgIFwiJGRpc2FibGUtY29sb3JcIjogXCIjZGJkYmRiXCIsXG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlN2U3ZTdcIixcbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiLFxuICAgIH0sXG4gICAgYm9vdHN0cmFwbWF0ZXJpYWw6IHtcbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjMThhNjg5XCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzQwNDA0MDtcIixcbiAgICAgIFwiJHByb2dyZXNzLXRleHQtY29sb3JcIjogXCIjOWQ5ZDlkXCIsXG4gICAgICBcIiRkaXNhYmxlLWNvbG9yXCI6IFwiI2RiZGJkYlwiLFxuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGRpc2FibGVkLWxhYmVsLWNvbG9yXCI6IFwicmdiYSg2NCwgNjQsIDY0LCAwLjUpXCIsXG4gICAgICBcIiRzbGlkZXItY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkZGlzYWJsZWQtc3dpdGNoLWNvbG9yXCI6IFwiIzlmOWY5ZlwiLFxuICAgICAgXCIkZGlzYWJsZWQtc2xpZGVyLWNvbG9yXCI6IFwiI2NmY2ZjZlwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZmZmZmZlwiLFxuICAgIH0sXG4gIH07XG4gIHB1YmxpYyBzdGF0aWMgVGhlbWVDc3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgXCIuc3ZfZGVmYXVsdF9jc3NcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIGhyXCI6IFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgaW5wdXRbdHlwZT0nYnV0dG9uJ10sIC5zdl9kZWZhdWx0X2NzcyBidXR0b25cIjpcbiAgICAgIFwiY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIGlucHV0W3R5cGU9J2J1dHRvbiddOmhvdmVyLCAuc3ZfZGVmYXVsdF9jc3MgYnV0dG9uOmhvdmVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X2hlYWRlclwiOiBcImNvbG9yOiAkaGVhZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9jdXN0b21faGVhZGVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRoZWFkZXItYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfY29udGFpbmVyXCI6IFwiY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9ib2R5XCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7IGJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Byb2dyZXNzXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcHJvZ3Jlc3NfYmFyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcF9yb290ID4gLnN2X3Jvd1wiOiBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcF9yb290ID4gLnN2X3JvdzpudGgtY2hpbGQob2RkKVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wX3Jvb3QgPiAuc3Zfcm93Om50aC1jaGlsZChldmVuKVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX290aGVyIGlucHV0XCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1jb2xvcjsgLXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV90ZXh0X3Jvb3RcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyAtd2Via2l0LXRleHQtZmlsbC1jb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX2Ryb3Bkb3duX2NvbnRyb2xcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSd0ZXh0J11cIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyAtd2Via2l0LXRleHQtZmlsbC1jb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHNlbGVjdFwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRleHRhcmVhXCI6XG4gICAgICBcImNvbG9yOiAkdGV4dC1jb2xvcjsgLXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dDpub3QoW3R5cGU9J2J1dHRvbiddKTpub3QoW3R5cGU9J3Jlc2V0J10pOm5vdChbdHlwZT0nc3VibWl0J10pOm5vdChbdHlwZT0naW1hZ2UnXSk6bm90KFt0eXBlPSdjaGVja2JveCddKTpub3QoW3R5cGU9J3JhZGlvJ10pXCI6XG4gICAgICBcImJvcmRlcjogMXB4IHNvbGlkICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtjb2xvcjogJHRleHQtY29sb3I7IC13ZWJraXQtdGV4dC1maWxsLWNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dDpub3QoW3R5cGU9J2J1dHRvbiddKTpub3QoW3R5cGU9J3Jlc2V0J10pOm5vdChbdHlwZT0nc3VibWl0J10pOm5vdChbdHlwZT0naW1hZ2UnXSk6bm90KFt0eXBlPSdjaGVja2JveCddKTpub3QoW3R5cGU9J3JhZGlvJ10pOmZvY3VzXCI6XG4gICAgICBcImJvcmRlcjogMXB4IHNvbGlkICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9jb250YWluZXIgLnN2X2JvZHkgLnN2X3Bfcm9vdCAuc3ZfcSAuc3Zfc2VsZWN0X3dyYXBwZXIgLnN2X3FfZHJvcGRvd25fY29udHJvbCBcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX290aGVyIGlucHV0OmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV90ZXh0X3Jvb3Q6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX2Ryb3Bkb3duX2NvbnRyb2w6Zm9jdXNcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSd0ZXh0J106Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgICcuc3ZfZGVmYXVsdF9jc3MgLnN2X2NvbnRhaW5lciAuc3ZfYm9keSAuc3ZfcF9yb290IC5zdl9xIGlucHV0W3R5cGU9XCJyYWRpb1wiXTpmb2N1cywgLnN2X2RlZmF1bHRfY3NzIC5zdl9jb250YWluZXIgLnN2X2JvZHkgLnN2X3Bfcm9vdCAuc3ZfcSBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl06Zm9jdXMnOlxuICAgICAgXCJvdXRsaW5lOiAxcHggZG90dGVkICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHNlbGVjdDpmb2N1c1wiOiBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGV4dGFyZWE6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3NlbGVjdF93cmFwcGVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3NlbGVjdF93cmFwcGVyOjpiZWZvcmVcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9yYXRpbmdfaXRlbS5hY3RpdmUgLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfcmF0aW5nX2l0ZW0gLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfcmF0aW5nX2l0ZW0gLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dDpob3ZlclwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGFibGUuc3ZfcV9tYXRyaXggdHJcIjogXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGFibGUuc3ZfcV9tYXRyaXhfZHJvcGRvd24gdHJcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRhYmxlLnN2X3FfbWF0cml4X2R5bmFtaWMgdHJcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfbV9jZWxsX3NlbGVjdGVkXCI6XG4gICAgICBcImNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X21haW4gLnN2X3FfZmlsZV9yZW1vdmU6aG92ZXJcIjogXCJjb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9maWxlX2Nob29zZV9idXR0b25cIjpcbiAgICAgIFwiY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3FfZmlsZV9jaG9vc2VfYnV0dG9uOmhvdmVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9pbWdzZWwuY2hlY2tlZCBsYWJlbD5kaXZcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvclwiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3BfZGVzY3JpcHRpb25cIjogXCJwYWRkaW5nLWxlZnQ6IDEuMjllbTtcIixcbiAgICAvL3Byb2dyZXNzIGJhclxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXByb2dyZXNzX19iYXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcblxuICAgIC8vcGFuZWxkeW5hbWljXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0bi5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLS1kaXNhYmxlZCwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG4uc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi0tZGlzYWJsZWRcIjpcbiAgICAgIFwiZmlsbDogJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy10ZXh0XCI6IFwiY29sb3I6ICRwcm9ncmVzcy10ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4sIC5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuXCI6XG4gICAgICBcImZpbGw6ICR0ZXh0LWNvbG9yXCIsXG5cbiAgICAvL2Jvb2xlYW5cbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zd2l0Y2hcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19zbGlkZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkc2xpZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiOiBcImNvbG9yOiAkZGlzYWJsZWQtbGFiZWwtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0tZGlzYWJsZWQgLnN2LWJvb2xlYW5fX3N3aXRjaFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZWQtc3dpdGNoLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4tLWRpc2FibGVkIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXNsaWRlci1jb2xvcjtcIixcbiAgICAvL2VvIGJvb2xlYW5cbiAgfTtcbiAgcHVibGljIHN0YXRpYyBtb2Rlcm5UaGVtZUNzczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAvLyBcIi5zdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYWRkLWJ1dHRvbi1jb2xvcjtcIixcbiAgICAvLyBcIi5zdi1wYW5lbGR5bmFtaWNfX3JlbW92ZS1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkcmVtb3ZlLWJ1dHRvbi1jb2xvcjtcIixcbiAgICBcIi5zdi1ib29sZWFuX19zd2l0Y2hcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1ib29sZWFuX19zbGlkZXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkc2xpZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2LWJvb2xlYW5fX2xhYmVsLS1kaXNhYmxlZFwiOiBcImNvbG9yOiAkZGlzYWJsZWQtbGFiZWwtY29sb3I7XCIsXG4gICAgXCIuc3YtYm9vbGVhbi0tZGlzYWJsZWQgLnN2LWJvb2xlYW5fX3N3aXRjaFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZWQtc3dpdGNoLWNvbG9yO1wiLFxuICAgIFwiLnN2LWJvb2xlYW4tLWRpc2FibGVkIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXNsaWRlci1jb2xvcjtcIixcblxuICAgIFwiLnN2LWJ0blwiOiBcImNvbG9yOiAkaW5wdXRzLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3YtY2hlY2tib3hfX3N2Z1wiOiBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgZmlsbDogdHJhbnNwYXJlbnQ7XCIsXG4gICAgXCIuc3YtY2hlY2tib3gtLWFsbG93aG92ZXI6aG92ZXIgLnN2LWNoZWNrYm94X19zdmdcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGZpbGw6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdi1jaGVja2JveC0tY2hlY2tlZCAuc3YtY2hlY2tib3hfX3N2Z1wiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgZmlsbDogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2LWNoZWNrYm94LS1jaGVja2VkLnN2LWNoZWNrYm94LS1kaXNhYmxlZCAuc3YtY2hlY2tib3hfX3N2Z1wiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjsgZmlsbDogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2LWNoZWNrYm94LS1kaXNhYmxlZCAuc3YtY2hlY2tib3hfX3N2Z1wiOiBcImJvcmRlci1jb2xvcjogJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc3YtY29tbWVudFwiOiBcImJvcmRlci1jb2xvcjogJHRleHQtYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2LWNvbW1lbnQ6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LWNvbXBsZXRlZHBhZ2VcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdi1jb250YWluZXItbW9kZXJuXCI6IFwiY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2LWNvbnRhaW5lci1tb2Rlcm5fX3RpdGxlXCI6IFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LWRlc2NyaXB0aW9uXCI6IFwiY29sb3I6ICRkaXNhYmxlZC10ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2LWRyb3Bkb3duXCI6IFwiYm9yZGVyLWJvdHRvbTogMC4wNmVtIHNvbGlkICR0ZXh0LWJvcmRlci1jb2xvcjtcIixcbiAgICBcIi5zdi1kcm9wZG93bjpmb2N1c1wiOiBcImJvcmRlci1jb2xvcjogJGRyb3Bkb3duLWJvcmRlci1jb2xvcjtcIixcbiAgICBcIi5zdi1kcm9wZG93bi0tZXJyb3JcIjogXCJib3JkZXItY29sb3I6ICRlcnJvci1jb2xvcjsgY29sb3I6ICRlcnJvci1jb2xvcjtcIixcbiAgICBcIi5zdi1kcm9wZG93bi0tZXJyb3I6OnBsYWNlaG9sZGVyXCI6IFwiY29sb3I6ICRlcnJvci1jb2xvcjtcIixcbiAgICBcIi5zdi1kcm9wZG93bi0tZXJyb3I6Oi1tcy1pbnB1dC1wbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkZXJyb3ItY29sb3I7XCIsXG4gICAgXCIuc3YtZmlsZV9fZGVjb3JhdG9yXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2LWZpbGVfX2NsZWFuLWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRyZW1vdmUtYnV0dG9uLWNvbG9yO1wiLFxuICAgIFwiLnN2LWZpbGVfX2Nob29zZS1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYWRkLWJ1dHRvbi1jb2xvcjtcIixcbiAgICBcIi5zdi1maWxlX19jaG9vc2UtYnRuLS1kaXNhYmxlZFwiOiBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2LWZpbGVfX3JlbW92ZS1zdmdcIjogXCJmaWxsOiAjZmYxODAwO1wiLFxuICAgIFwiLnN2LWZpbGVfX3NpZ24gYVwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdi1mb290ZXJfX2NvbXBsZXRlLWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LWZvb3Rlcl9fbmV4dC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1mb290ZXJfX3ByZXYtYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtZm9vdGVyX19zdGFydC1idG5cIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1mb290ZXJfX3ByZXZpZXctYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtZm9vdGVyX19lZGl0LWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LWltYWdlcGlja2VyX19pdGVtLS1hbGxvd2hvdmVyOmhvdmVyIC5zdi1pbWFnZXBpY2tlcl9faW1hZ2VcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7IGJvcmRlci1jb2xvcjogJG1haW4taG92ZXItY29sb3I7XCIsXG4gICAgXCIuc3YtaW1hZ2VwaWNrZXJfX2l0ZW0tLWNoZWNrZWQgLnN2LWltYWdlcGlja2VyX19pbWFnZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1pbWFnZXBpY2tlcl9faXRlbS0tZGlzYWJsZWQuc3YtaW1hZ2VwaWNrZXJfX2l0ZW0tLWNoZWNrZWQgLnN2LWltYWdlcGlja2VyX19pbWFnZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdi1pdGVtX19jb250cm9sOmZvY3VzICsgLnN2LWl0ZW1fX2RlY29yYXRvclwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2LW1hdHJpeF9fdGV4dC0tY2hlY2tlZFwiOlxuICAgICAgXCJjb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1tYXRyaXhfX3RleHQtLWRpc2FibGVkLnN2LW1hdHJpeF9fdGV4dC0tY2hlY2tlZFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdi1tYXRyaXhkeW5hbWljX19hZGQtYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGFkZC1idXR0b24tY29sb3I7XCIsXG4gICAgXCIuc3YtbWF0cml4ZHluYW1pY19fcmVtb3ZlLWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRyZW1vdmUtYnV0dG9uLWNvbG9yO1wiLFxuICAgIFwiLnN2LXBhbmVsZHluYW1pY19fYWRkLWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRhZGQtYnV0dG9uLWNvbG9yO1wiLFxuICAgIFwiLnN2LXBhbmVsZHluYW1pY19fcmVtb3ZlLWJ0blwiOiBcImJhY2tncm91bmQtY29sb3I6ICRyZW1vdmUtYnV0dG9uLWNvbG9yO1wiLFxuICAgIFwiLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4sIC5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuXCI6XG4gICAgICBcImZpbGw6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4tLWRpc2FibGVkLCAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi0tZGlzYWJsZWRcIjpcbiAgICAgIFwiZmlsbDogJGRpc2FibGUtY29sb3I7XCIsXG4gICAgXCIuc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy10ZXh0XCI6IFwiY29sb3I6ICRwcm9ncmVzcy10ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2LXByb2dyZXNzXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2LXByb2dyZXNzX19iYXJcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdi1wcm9ncmVzc19fdGV4dFwiOiBcImNvbG9yOiAkcHJvZ3Jlc3MtdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdi1xdWVzdGlvbl9fZXJib3hcIjogXCJjb2xvcjogJGVycm9yLWNvbG9yO1wiLFxuICAgIFwiLnN2LXF1ZXN0aW9uX190aXRsZS0tYW5zd2VyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRhbnN3ZXItYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdi1xdWVzdGlvbl9fdGl0bGUtLWVycm9yXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGVycm9yLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3YtcGFuZWxfX3RpdGxlLS1lcnJvclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2LXJhZGlvX19zdmdcIjogXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGZpbGw6IHRyYW5zcGFyZW50O1wiLFxuICAgIFwiLnN2LXJhZGlvLS1hbGxvd2hvdmVyOmhvdmVyIC5zdi1yYWRpb19fc3ZnXCI6IFwiZmlsbDogJGJvcmRlci1jb2xvcjtcIixcbiAgICBcIi5zdi1yYWRpby0tY2hlY2tlZCAuc3YtcmFkaW9fX3N2Z1wiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRyYWRpby1jaGVja2VkLWNvbG9yOyBmaWxsOiAkcmFkaW8tY2hlY2tlZC1jb2xvcjtcIixcbiAgICBcIi5zdi1yYWRpby0tZGlzYWJsZWQgLnN2LXJhZGlvX19zdmdcIjogXCJib3JkZXItY29sb3I6ICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2LXJhZGlvLS1kaXNhYmxlZC5zdi1yYWRpby0tY2hlY2tlZCAuc3YtcmFkaW9fX3N2Z1wiOlxuICAgICAgXCJmaWxsOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdi1yYXRpbmdcIjogXCJjb2xvcjogJHRleHQtY29sb3I7XCIsXG4gICAgXCIuc3YtcmF0aW5nIGlucHV0OmZvY3VzICsgLnN2LXJhdGluZ19fbWluLXRleHQgKyAuc3YtcmF0aW5nX19pdGVtLXRleHQsIC5zdi1yYXRpbmcgaW5wdXQ6Zm9jdXMgKyAuc3YtcmF0aW5nX19pdGVtLXRleHRcIjpcbiAgICAgIFwib3V0bGluZS1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtcmF0aW5nX19pdGVtLXRleHRcIjpcbiAgICAgIFwiY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yOyBib3JkZXI6IHNvbGlkIDAuMTg3NWVtICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuICAgIFwiLnN2LXJhdGluZ19faXRlbS10ZXh0OmhvdmVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yOyBjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdi1yYXRpbmdfX2l0ZW0tLXNlbGVjdGVkIC5zdi1yYXRpbmdfX2l0ZW0tdGV4dFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7IGJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3YtcmF0aW5nLS1kaXNhYmxlZCAuc3YtcmF0aW5nX19pdGVtLXRleHRcIjpcbiAgICAgIFwiY29sb3I6ICRkaXNhYmxlLWNvbG9yOyBib3JkZXItY29sb3I6ICRkaXNhYmxlLWNvbG9yO1wiLFxuICAgIFwiLnN2LXJhdGluZy0tZGlzYWJsZWQgLnN2LXJhdGluZ19faXRlbS10ZXh0OmhvdmVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1wiLFxuICAgIFwiLnN2LXJhdGluZy0tZGlzYWJsZWQgLnN2LXJhdGluZ19faXRlbS10ZXh0OmhvdmVyIC5zdi1yYXRpbmdfX2l0ZW0tLXNlbGVjdGVkIC5zdi1yYXRpbmdfX2l0ZW0tdGV4dFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkZGlzYWJsZS1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCI6Oi13ZWJraXQtc2Nyb2xsYmFyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4taG92ZXItY29sb3I7XCIsXG4gICAgXCI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iXCI6IFwiYmFja2dyb3VuZDogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3Ytc2VsZWN0YmFzZV9fY2xlYXItYnRuXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGNsZWFuLWJ1dHRvbi1jb2xvcjtcIixcbiAgICBcIi5zdi10YWJsZVwiOiBcImJhY2tncm91bmQtY29sb3I6IHJnYmEoJG1haW4taG92ZXItY29sb3IsIDAuMSk7XCIsXG4gICAgXCIuc3YtdGV4dDpmb2N1c1wiOiBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgJy5zdi10ZXh0W3R5cGU9XCJkYXRlXCJdOjotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3InOlxuICAgICAgXCJjb2xvcjogdHJhbnNwYXJlbnQ7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1wiLFxuICAgIFwiLnN2LXRleHQtLWVycm9yXCI6IFwiY29sb3I6ICRlcnJvci1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkZXJyb3ItY29sb3I7XCIsXG4gICAgXCIuc3YtdGV4dC0tZXJyb3I6OnBsYWNlaG9sZGVyXCI6IFwiY29sb3I6ICRlcnJvci1jb2xvcjtcIixcbiAgICBcIi5zdi10ZXh0LS1lcnJvcjo6LW1zLXBsYWNlaG9sZGVyXCI6IFwiY29sb3I6ICRlcnJvci1jb2xvcjtcIixcbiAgICBcIi5zdi10ZXh0LS1lcnJvcjotbXMtcGxhY2Vob2xkZXJcIjogXCJjb2xvcjogJGVycm9yLWNvbG9yO1wiLFxuICAgIFwiLnN2LXRleHQ6OnBsYWNlaG9sZGVyXCI6IFwiY29sb3I6ICR0ZXh0LWNvbG9yO1wiLFxuICAgIFwiLnN2LXRleHQ6Oi1tcy1wbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdi10ZXh0Oi1tcy1wbGFjZWhvbGRlclwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgfTtcbiAgcHVibGljIHN0YXRpYyBib290c3RyYXBUaGVtZUNzczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBcIi5zdl9tYWluIC5zdl9xX2ltZ3NlbC5jaGVja2VkIGxhYmVsPmRpdlwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yXCIsXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcF9kZXNjcmlwdGlvblwiOiBcInBhZGRpbmctbGVmdDogMS42NmVtO1wiLFxuICAgIFwiLnN2X21haW4gLnN2X3FzdG5fZXJyb3JfYm90dG9tXCI6IFwibWFyZ2luLXRvcDogMjBweDsgbWFyZ2luLWJvdHRvbTogMDtcIixcbiAgICBcIi5zdl9tYWluIC5wcm9ncmVzc1wiOiBcIndpZHRoOiA2MCU7XCIsXG4gICAgXCIuc3ZfbWFpbiAucHJvZ3Jlc3MtYmFyXCI6XG4gICAgICBcIndpZHRoOiBhdXRvOyBtYXJnaW4tbGVmdDogMnB4OyBtYXJnaW4tcmlnaHQ6IDJweDtcIixcbiAgICBcIi5zdl9tYWluIC50YWJsZT50Ym9keT50cj50ZFwiOiBcIm1pbi13aWR0aDogOTBweDtcIixcbiAgICBcIi5zdl9tYWluIGYtcGFuZWwgLnN2X3FzdG5cIjogXCJwYWRkaW5nOiAwOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1wiLFxuXG4gICAgXCIuc3ZfbWFpbiAuc3ZfcV9pbWFnZVwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcblxuICAgIC8vcHJvZ3Jlc3MgYmFyXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NfX2JhclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgLy9wYW5lbGR5bmFtaWNcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4tLWRpc2FibGVkLCAuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuLS1kaXNhYmxlZFwiOlxuICAgICAgXCJmaWxsOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIjogXCJjb2xvcjogJHByb2dyZXNzLXRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0biwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIjpcbiAgICAgIFwiZmlsbDogJHRleHQtY29sb3JcIixcblxuICAgIC8vYm9vbGVhblxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX3N3aXRjaFwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW5fX3NsaWRlclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRzbGlkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fbGFiZWwtLWRpc2FibGVkXCI6IFwiY29sb3I6ICRkaXNhYmxlZC1sYWJlbC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuLS1kaXNhYmxlZCAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlZC1zd2l0Y2gtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0tZGlzYWJsZWQgIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXNsaWRlci1jb2xvcjtcIixcbiAgICAvL2VvIGJvb2xlYW5cbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIGJvb3RzdHJhcG1hdGVyaWFsVGhlbWVDc3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmZvcm0tZ3JvdXAuaXMtZm9jdXNlZCAuZm9ybS1jb250cm9sXCI6XG4gICAgICBcImxpbmVhci1ncmFkaWVudCgwZGVnLCAkbWFpbi1jb2xvciAycHgsICRtYWluLWNvbG9yIDApLGxpbmVhci1ncmFkaWVudCgwZGVnLCAjRDJEMkQyIDFweCwgdHJhbnNwYXJlbnQgMCk7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnN2X3FzdG5cIjogXCJtYXJnaW4tYm90dG9tOiAxcmVtO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5zdl9xc3RuIGxhYmVsLnN2X3FfbV9sYWJlbFwiOlxuICAgICAgXCJoZWlnaHQ6IDEwMCU7XCIsXG5cbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuc3ZfcV9pbWFnZVwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcblxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5jaGVja2JveCBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVja1wiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGxhYmVsLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVja1wiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5jaGVja2JveCBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVjazpiZWZvcmVcIjpcbiAgICAgIFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGxhYmVsLmNoZWNrYm94LWlubGluZSBpbnB1dFt0eXBlPWNoZWNrYm94XTpjaGVja2VkICsgLmNoZWNrYm94LW1hdGVyaWFsIC5jaGVjazpiZWZvcmVcIjpcbiAgICAgIFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnJhZGlvIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2lyY2xlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwucmFkaW8taW5saW5lIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2lyY2xlXCI6XG4gICAgICBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnJhZGlvIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2hlY2tcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgbGFiZWwucmFkaW8taW5saW5lIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQgfiAuY2hlY2tcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmJ0bi1kZWZhdWx0LmFjdGl2ZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmJ0bi1kZWZhdWx0OmFjdGl2ZVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmJ0bi1zZWNvbmRhcnkuYWN0aXZlXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yOyBjb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAuYnRuLXNlY29uZGFyeTphY3RpdmVcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIC5vcGVuPi5kcm9wZG93bi10b2dnbGUuYnRuLWRlZmF1bHRcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7IGNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGlucHV0W3R5cGU9J2J1dHRvbiddLmJ0bi1wcmltYXJ5LCAuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgYnV0dG9uLmJ0bi1wcmltYXJ5XCI6XG4gICAgICBcImNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyBpbnB1dFt0eXBlPSdidXR0b24nXS5idG4tcHJpbWFyeTpob3ZlciwgLnN2X21haW4uc3ZfYm9vdHN0cmFwbWF0ZXJpYWxfY3NzIGJ1dHRvbi5idG4tcHJpbWFyeTpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdl9xX2ltZ3NlbC5jaGVja2VkIGxhYmVsPmRpdlwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnN2X3FfZmlsZV9yZW1vdmU6aG92ZXJcIjpcbiAgICAgIFwiY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLmZvcm0tZ3JvdXAgaW5wdXRbdHlwZT1maWxlXVwiOlxuICAgICAgXCJwb3NpdGlvbjogcmVsYXRpdmU7IG9wYWNpdHk6IDE7XCIsXG4gICAgXCIuc3ZfbWFpbi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnByb2dyZXNzXCI6IFwid2lkdGg6IDYwJTsgaGVpZ2h0OiAxLjVlbTtcIixcbiAgICBcIi5zdl9tYWluLnN2X2Jvb3RzdHJhcG1hdGVyaWFsX2NzcyAucHJvZ3Jlc3MtYmFyXCI6XG4gICAgICBcIndpZHRoOiBhdXRvOyBtYXJnaW4tbGVmdDogMnB4OyBtYXJnaW4tcmlnaHQ6IDJweDtcIixcblxuICAgIC8vcHJvZ3Jlc3MgYmFyXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NcIjogXCJiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcHJvZ3Jlc3NfX2JhclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgLy9wYW5lbGR5bmFtaWNcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3ByZXYtYnRuLnN2LXBhbmVsZHluYW1pY19fcHJldi1idG4tLWRpc2FibGVkLCAuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0bi5zdi1wYW5lbGR5bmFtaWNfX25leHQtYnRuLS1kaXNhYmxlZFwiOlxuICAgICAgXCJmaWxsOiAkZGlzYWJsZS1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIjogXCJjb2xvcjogJHByb2dyZXNzLXRleHQtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0biwgLnN2X21haW4gLnN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIjpcbiAgICAgIFwiZmlsbDogJHRleHQtY29sb3JcIixcblxuICAgIC8vYm9vbGVhblxuICAgIFwiLnN2X21haW4gLnN2LWJvb2xlYW4gLmNoZWNrYm94LWRlY29yYXRvclwiOiBcImRpc3BsYXk6IG5vbmU7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbl9fc2xpZGVyXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJHNsaWRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19sYWJlbC5zdi1ib29sZWFuX19sYWJlbC0tZGlzYWJsZWRcIjpcbiAgICAgIFwiY29sb3I6ICRkaXNhYmxlZC1sYWJlbC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuX19sYWJlbFwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9tYWluIC5zdi1ib29sZWFuLS1kaXNhYmxlZCAuc3YtYm9vbGVhbl9fc3dpdGNoXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRkaXNhYmxlZC1zd2l0Y2gtY29sb3I7XCIsXG4gICAgXCIuc3ZfbWFpbiAuc3YtYm9vbGVhbi0tZGlzYWJsZWQgIC5zdi1ib29sZWFuX19zbGlkZXJcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGRpc2FibGVkLXNsaWRlci1jb2xvcjtcIixcbiAgICAvL2VvIGJvb2xlYW5cbiAgfTtcblxuICBwcml2YXRlIHNoZWV0OiBDU1NTdHlsZVNoZWV0ID0gbnVsbDtcblxuICBzdGF0aWMgZmluZFNoZWV0KHN0eWxlU2hlZXRJZDogc3RyaW5nKTogYW55IHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgICEhZG9jdW1lbnQuc3R5bGVTaGVldHNbaV0ub3duZXJOb2RlICYmXG4gICAgICAgICg8YW55PmRvY3VtZW50KS5zdHlsZVNoZWV0c1tpXS5vd25lck5vZGVbXCJpZFwiXSA9PT0gc3R5bGVTaGVldElkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIDxDU1NTdHlsZVNoZWV0PmRvY3VtZW50LnN0eWxlU2hlZXRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVTaGVldChzdHlsZVNoZWV0SWQ6IHN0cmluZykge1xuICAgIGxldCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICBzdHlsZS5pZCA9IHN0eWxlU2hlZXRJZDtcbiAgICAvLyBBZGQgYSBtZWRpYSAoYW5kL29yIG1lZGlhIHF1ZXJ5KSBoZXJlIGlmIHlvdSdkIGxpa2UhXG4gICAgLy8gc3R5bGUuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgXCJzY3JlZW5cIilcbiAgICAvLyBzdHlsZS5zZXRBdHRyaWJ1dGUoXCJtZWRpYVwiLCBcIm9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoIDogMTAyNHB4KVwiKVxuICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKTtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICByZXR1cm4gPENTU1N0eWxlU2hlZXQ+c3R5bGUuc2hlZXQ7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFwcGx5VGhlbWUoXG4gICAgdGhlbWVOYW1lOiBzdHJpbmcgPSBcImRlZmF1bHRcIixcbiAgICB0aGVtZVNlbGVjdG9yOiBzdHJpbmcgPSBcIi5zdl9tYWluXCJcbiAgKSB7XG4gICAgbGV0IFRoZW1lQ3NzOiBhbnk7XG5cbiAgICBpZiAodGhlbWVOYW1lID09PSBcIm1vZGVyblwiKSB0aGVtZVNlbGVjdG9yID0gXCIuc3Ytcm9vdC1tb2Rlcm4gXCI7XG5cbiAgICBpZiAoXG4gICAgICBbXCJib290c3RyYXBcIiwgXCJib290c3RyYXBtYXRlcmlhbFwiLCBcIm1vZGVyblwiXS5pbmRleE9mKHRoZW1lTmFtZSkgIT09IC0xXG4gICAgKSB7XG4gICAgICBUaGVtZUNzcyA9ICg8YW55PlN0eWxlc01hbmFnZXIpW3RoZW1lTmFtZSArIFwiVGhlbWVDc3NcIl07XG4gICAgICBzdXJ2ZXlDc3MuY3VycmVudFR5cGUgPSB0aGVtZU5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIFRoZW1lQ3NzID0gU3R5bGVzTWFuYWdlci5UaGVtZUNzcztcbiAgICAgIHN1cnZleUNzcy5jdXJyZW50VHlwZSA9IFwic3RhbmRhcmRcIjtcbiAgICB9XG5cbiAgICBpZiAoU3R5bGVzTWFuYWdlci5FbmFibGVkKSB7XG4gICAgICBsZXQgc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmZpbmRTaGVldCh0aGVtZU5hbWUgKyB0aGVtZVNlbGVjdG9yKTtcbiAgICAgIGlmICghc2hlZXQpIHtcbiAgICAgICAgc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmNyZWF0ZVNoZWV0KHRoZW1lTmFtZSArIHRoZW1lU2VsZWN0b3IpO1xuICAgICAgICBsZXQgdGhlbWUgPVxuICAgICAgICAgIFN0eWxlc01hbmFnZXIuVGhlbWVDb2xvcnNbdGhlbWVOYW1lXSB8fFxuICAgICAgICAgIFN0eWxlc01hbmFnZXIuVGhlbWVDb2xvcnNbXCJkZWZhdWx0XCJdO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKFRoZW1lQ3NzKS5mb3JFYWNoKChzZWxlY3RvcikgPT4ge1xuICAgICAgICAgIGxldCBjc3NSdWxlVGV4dCA9IFRoZW1lQ3NzW3NlbGVjdG9yXTtcbiAgICAgICAgICBPYmplY3Qua2V5cyh0aGVtZSkuZm9yRWFjaChcbiAgICAgICAgICAgIChjb2xvclZhcmlhYmxlTmFtZSkgPT5cbiAgICAgICAgICAgICAgKGNzc1J1bGVUZXh0ID0gY3NzUnVsZVRleHQucmVwbGFjZShcbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKFwiXFxcXFwiICsgY29sb3JWYXJpYWJsZU5hbWUsIFwiZ1wiKSxcbiAgICAgICAgICAgICAgICB0aGVtZVtjb2xvclZhcmlhYmxlTmFtZV1cbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzaGVldC5pbnNlcnRSdWxlKFxuICAgICAgICAgICAgICB0aGVtZVNlbGVjdG9yICsgc2VsZWN0b3IgKyBcIiB7IFwiICsgY3NzUnVsZVRleHQgKyBcIiB9XCIsXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBFbmFibGVkID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoU3R5bGVzTWFuYWdlci5FbmFibGVkKSB7XG4gICAgICB0aGlzLnNoZWV0ID0gU3R5bGVzTWFuYWdlci5maW5kU2hlZXQoU3R5bGVzTWFuYWdlci5TdXJ2ZXlKU1N0eWxlc1NoZWV0SWQpO1xuICAgICAgaWYgKCF0aGlzLnNoZWV0KSB7XG4gICAgICAgIHRoaXMuc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmNyZWF0ZVNoZWV0KFxuICAgICAgICAgIFN0eWxlc01hbmFnZXIuU3VydmV5SlNTdHlsZXNTaGVldElkXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVN0eWxlcyh0aGlzLnNoZWV0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVN0eWxlcyhzaGVldDogQ1NTU3R5bGVTaGVldCkge1xuICAgIGlmIChTdHlsZXNNYW5hZ2VyLkVuYWJsZWQpIHtcbiAgICAgIE9iamVjdC5rZXlzKFN0eWxlc01hbmFnZXIuU3R5bGVzKS5mb3JFYWNoKChzZWxlY3RvcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNoZWV0Lmluc2VydFJ1bGUoXG4gICAgICAgICAgICBzZWxlY3RvciArIFwiIHsgXCIgKyBTdHlsZXNNYW5hZ2VyLlN0eWxlc1tzZWxlY3Rvcl0gKyBcIiB9XCIsXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmtleXMoU3R5bGVzTWFuYWdlci5NZWRpYSkuZm9yRWFjaCgoc2VsZWN0b3IpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzaGVldC5pbnNlcnRSdWxlKFxuICAgICAgICAgICAgU3R5bGVzTWFuYWdlci5NZWRpYVtzZWxlY3Rvcl0ubWVkaWEgK1xuICAgICAgICAgICAgICBcIiB7IFwiICtcbiAgICAgICAgICAgICAgc2VsZWN0b3IgK1xuICAgICAgICAgICAgICBcIiB7IFwiICtcbiAgICAgICAgICAgICAgU3R5bGVzTWFuYWdlci5NZWRpYVtzZWxlY3Rvcl0uc3R5bGUgK1xuICAgICAgICAgICAgICBcIiB9IH1cIixcbiAgICAgICAgICAgIDBcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3R5bGVzbWFuYWdlci50cyIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEpzb25PYmplY3QsIEpzb25FcnJvciwgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7XG4gIEJhc2UsXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5SW1wbCxcbiAgSVRleHRQcm9jZXNzb3IsXG4gIElRdWVzdGlvbixcbiAgSVBhbmVsLFxuICBJRWxlbWVudCxcbiAgSVBhZ2UsXG4gIFN1cnZleUVycm9yLFxuICBFdmVudCxcbiAgSVN1cnZleUVycm9yT3duZXIsXG4gIElTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlFbGVtZW50LFxuICBJUHJvZ3Jlc3NJbmZvLFxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG5pbXBvcnQgeyBJU3VydmV5VHJpZ2dlck93bmVyLCBTdXJ2ZXlUcmlnZ2VyIH0gZnJvbSBcIi4vdHJpZ2dlclwiO1xuaW1wb3J0IHsgQ2FsY3VsYXRlZFZhbHVlIH0gZnJvbSBcIi4vY2FsY3VsYXRlZFZhbHVlXCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi9wYWdlXCI7XG5pbXBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yLCBUZXh0UHJlUHJvY2Vzc29yVmFsdWUgfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmltcG9ydCB7IGR4U3VydmV5U2VydmljZSB9IGZyb20gXCIuL2R4U3VydmV5U2VydmljZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IFN0eWxlc01hbmFnZXIgfSBmcm9tIFwiLi9zdHlsZXNtYW5hZ2VyXCI7XG5pbXBvcnQgeyBTdXJ2ZXlUaW1lciB9IGZyb20gXCIuL3N1cnZleXRpbWVyXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFBhbmVsTW9kZWxCYXNlIH0gZnJvbSBcIi4vcGFuZWxcIjtcbmltcG9ydCB7XG4gIEh0bWxDb25kaXRpb25JdGVtLFxuICBVcmxDb25kaXRpb25JdGVtLFxuICBFeHByZXNzaW9uSXRlbSxcbn0gZnJvbSBcIi4vZXhwcmVzc2lvbkl0ZW1zXCI7XG5pbXBvcnQgeyBFeHByZXNzaW9uUnVubmVyLCBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbi8qKlxuICogVGhlIGBTdXJ2ZXlgIG9iamVjdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VydmV5LCBQYWdlcywgUXVlc3Rpb25zLCBmbG93IGxvZ2ljIGFuZCBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlNb2RlbFxuICBleHRlbmRzIEJhc2VcbiAgaW1wbGVtZW50c1xuICAgIElTdXJ2ZXksXG4gICAgSVN1cnZleURhdGEsXG4gICAgSVN1cnZleUltcGwsXG4gICAgSVN1cnZleVRyaWdnZXJPd25lcixcbiAgICBJU3VydmV5RXJyb3JPd25lcixcbiAgICBJTG9jYWxpemFibGVPd25lciB7XG4gIFtpbmRleDogc3RyaW5nXTogYW55O1xuICBwcml2YXRlIHN0YXRpYyBzdHlsZXNNYW5hZ2VyOiBTdHlsZXNNYW5hZ2VyID0gbnVsbDtcbiAgcHVibGljIHN0YXRpYyBwbGF0Zm9ybTogc3RyaW5nID0gXCJ1bmtub3duXCI7XG4gIHB1YmxpYyBnZXQgcGxhdGZvcm1OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN1cnZleU1vZGVsLnBsYXRmb3JtO1xuICB9XG4gIC8qKlxuICAgKiBZb3UgY2FuIGRpc3BsYXkgYW4gYWRkaXRpb25hbCBmaWVsZCAoY29tbWVudCBmaWVsZCkgZm9yIHRoZSBtb3N0IG9mIHF1ZXN0aW9uczsgdXNlcnMgY2FuIGVudGVyIGFkZGl0aW9uYWwgY29tbWVudHMgdG8gdGhlaXIgcmVzcG9uc2UuXG4gICAqIFRoZSBjb21tZW50IGZpZWxkIGlucHV0IGlzIHNhdmVkIGFzIGAncXVlc3Rpb24gbmFtZScgKyAnY29tbWVudFByZWZpeCdgLlxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBRdWVzdGlvbi5oYXNDb21tZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1lbnRQcmVmaXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2V0dGluZ3MuY29tbWVudFByZWZpeDtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbW1lbnRQcmVmaXgodmFsOiBzdHJpbmcpIHtcbiAgICBzZXR0aW5ncy5jb21tZW50UHJlZml4ID0gdmFsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY3VycmVudFBhZ2VWYWx1ZSgpOiBQYWdlTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjdXJyZW50UGFnZVZhbHVlXCIsIG51bGwpO1xuICB9XG4gIHByaXZhdGUgc2V0IGN1cnJlbnRQYWdlVmFsdWUodmFsOiBQYWdlTW9kZWwpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjdXJyZW50UGFnZVZhbHVlXCIsIHZhbCk7XG4gIH1cblxuICBwcml2YXRlIHZhbHVlc0hhc2g6IEhhc2hUYWJsZTxhbnk+ID0ge307XG4gIHByaXZhdGUgdmFyaWFibGVzSGFzaDogSGFzaFRhYmxlPGFueT4gPSB7fTtcbiAgcHJpdmF0ZSBlZGl0aW5nT2JqVmFsdWU6IEJhc2U7XG5cbiAgcHJpdmF0ZSBsb2NhbGVWYWx1ZTogc3RyaW5nID0gXCJcIjtcblxuICBwcml2YXRlIHRleHRQcmVQcm9jZXNzb3I6IFRleHRQcmVQcm9jZXNzb3I7XG4gIHByaXZhdGUgY29tcGxldGVkU3RhdGVWYWx1ZTogc3RyaW5nID0gXCJcIjtcbiAgcHJpdmF0ZSBjb21wbGV0ZWRTdGF0ZVRleHRWYWx1ZTogc3RyaW5nID0gXCJcIjtcblxuICBwcml2YXRlIGlzVGltZXJTdGFydGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHRoZSBzdXJ2ZXkgaXMgY29tcGxldGVkIGFuZCB0aGUgYG9uQ29tcGxldGVgIGV2ZW50IGlzIGZpcmVkLiBZb3UgY2FuIHByZXZlbnQgdGhlIHN1cnZleSBmcm9tIGNvbXBsZXRpbmcgYnkgc2V0dGluZyBgb3B0aW9ucy5hbGxvd0NvbXBsZXRlYCB0byBgZmFsc2VgXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLmFsbG93Q29tcGxldGVgIC0gU3BlY2lmaWVzIHdoZXRoZXIgYSB1c2VyIGNhbiBjb21wbGV0ZSBhIHN1cnZleS4gU2V0IHRoaXMgcHJvcGVydHkgdG8gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBzdXJ2ZXkgZnJvbSBjb21wbGV0aW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAqIDxici8+IGBvcHRpb25zLmlzQ29tcGxldGVPblRyaWdnZXJgIC0gcmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaXMgY29tcGxldGluZyBvbiBcImNvbXBsZXRlXCIgdHJpZ2dlci5cbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgb25Db21wbGV0aW5nOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSB1c2VyIGNsaWNrcyB0aGUgJ0NvbXBsZXRlJyBidXR0b24gYW5kIGZpbmlzaGVzIGEgc3VydmV5LiBVc2UgdGhpcyBldmVudCB0byBzZW5kIHRoZSBzdXJ2ZXkgZGF0YSB0byB5b3VyIHdlYiBzZXJ2ZXIuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnNob3dEYXRhU2F2aW5nKHRleHQpYCAtIGNhbGwgdGhpcyBtZXRob2QgdG8gc2hvdyB0aGF0IHRoZSBzdXJ2ZXkgaXMgc2F2aW5nIHN1cnZleSBkYXRhIG9uIHlvdXIgc2VydmVyLiBUaGUgYHRleHRgIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0byBzaG93IGEgY3VzdG9tIG1lc3NhZ2UgaW5zdGVhZCBvZiBkZWZhdWx0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5zaG93RGF0YVNhdmluZ0Vycm9yKHRleHQpYCAtIGNhbGwgdGhpcyBtZXRob2QgdG8gc2hvdyB0aGF0IGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNhdmluZyB0aGUgZGF0YSBvbiB5b3VyIHNlcnZlci4gSWYgeW91IHdhbnQgdG8gc2hvdyBhIGN1c3RvbSBlcnJvciwgdXNlIGFuIG9wdGlvbmFsIGB0ZXh0YCBwYXJhbWV0ZXIuXG4gICAqIDxici8+IGBvcHRpb25zLnNob3dEYXRhU2F2aW5nU3VjY2Vzcyh0ZXh0KWAgLSBjYWxsIHRoaXMgbWV0aG9kIHRvIHNob3cgdGhhdCB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqIDxici8+IGBvcHRpb25zLnNob3dEYXRhU2F2aW5nQ2xlYXJgIC0gY2FsbCB0aGlzIG1ldGhvZCB0byBoaWRlIHRoZSB0ZXh0IGFib3V0IHRoZSBzYXZpbmcgcHJvZ3Jlc3MuXG4gICAqIDxici8+IGBvcHRpb25zLmlzQ29tcGxldGVPblRyaWdnZXJgIC0gcmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaXMgY29tcGxldGVkIG9uIFwiY29tcGxldGVcIiB0cmlnZ2VyLlxuICAgKiAgQHNlZSBkYXRhXG4gICAqIEBzZWUgY2xlYXJJbnZpc2libGVWYWx1ZXNcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqIEBzZWUgc3VydmV5UG9zdElkXG4gICAqL1xuICBwdWJsaWMgb25Db21wbGV0ZTogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgdXNlciBjbGlja3MgdGhlICdDb21wbGV0ZScgYnV0dG9uLiBUaGUgZXZlbnQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBVUkwgb3BlbmVkIGFmdGVyIGNvbXBsZXRpbmcgYSBzdXJ2ZXkuXG4gICAqIFNwZWNpZnkgdGhlIGBuYXZpZ2F0ZVRvVXJsYCBwcm9wZXJ0eSB0byBtYWtlIHN1cnZleSBuYXZpZ2F0ZSB0byBhbm90aGVyIHVybC5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMudXJsYCAtIFNwZWNpZmllcyBhIFVSTCBvcGVuZWQgYWZ0ZXIgY29tcGxldGluZyBhIHN1cnZleS4gU2V0IHRoaXMgcHJvcGVydHkgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIGNhbmNlbCB0aGUgbmF2aWdhdGlvbiBhbmQgc2hvdyB0aGUgY29tcGxldGVkIHN1cnZleSBwYWdlLlxuICAgKiBAc2VlIG5hdmlnYXRlVG9VcmxcbiAgICogQHNlZSBuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb25cbiAgICovXG4gIHB1YmxpYyBvbk5hdmlnYXRlVG9Vcmw6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBhZnRlciB0aGUgc3VydmV5IGNoYW5nZWQgaXQncyBzdGF0ZSBmcm9tIFwic3RhcnRpbmdcIiB0byBcInJ1bm5pbmdcIi4gVGhlIFwic3RhcnRpbmdcIiBzdGF0ZSBtZWFucyB0aGF0IHN1cnZleSBzaG93cyB0aGUgc3RhcnRlZCBwYWdlLlxuICAgKiBUaGUgYGZpcnN0UGFnZUlzU3RhcnRlZGAgcHJvcGVydHkgc2hvdWxkIGJlIHNldCB0byBgdHJ1ZWAsIGlmIHlvdSB3YW50IHRvIGRpc3BsYXkgYSBzdGFydCBwYWdlIGluIHlvdXIgc3VydmV5LiBJbiB0aGlzIGNhc2UsIGFuIGVuZCB1c2VyIHNob3VsZCBjbGljayB0aGUgXCJTdGFydFwiIGJ1dHRvbiB0byBzdGFydCB0aGUgc3VydmV5LlxuICAgKiBAc2VlIGZpcnN0UGFnZUlzU3RhcnRlZFxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LFxuICAgIGFueVxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2xpY2tpbmcgdGhlICdOZXh0JyBidXR0b24gaWYgdGhlIGBzZW5kUmVzdWx0T25QYWdlTmV4dGAgaXMgc2V0IHRvIGB0cnVlYC4gWW91IGNhbiB1c2UgaXQgdG8gc2F2ZSB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMsIGZvciBleGFtcGxlLCBpZiB5b3VyIHN1cnZleSBpcyBsYXJnZSBlbm91Z2guXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIEBzZWUgc2VuZFJlc3VsdE9uUGFnZU5leHRcbiAgICovXG4gIHB1YmxpYyBvblBhcnRpYWxTZW5kOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksXG4gICAgYW55XG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgdGhlIGN1cnJlbnQgcGFnZSBjaGFuZ2VzIHRvIGFub3RoZXIgcGFnZS4gVHlwaWNhbGx5IGl0IGhhcHBlbnMgd2hlbiBhIHVzZXIgY2xpY2sgdGhlICdOZXh0JyBvciAnUHJldicgYnV0dG9ucy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbi5vbGRDdXJyZW50UGFnZWAgLSB0aGUgcHJldmlvdXMgY3VycmVudC9hY3RpdmUgcGFnZS5cbiAgICogPGJyLz4gYG9wdGlvbi5uZXdDdXJyZW50UGFnZWAgLSBhIG5ldyBjdXJyZW50L2FjdGl2ZSBwYWdlLlxuICAgKiA8YnIvPiBgb3B0aW9uLmFsbG93Q2hhbmdpbmdgIC0gc2V0IGl0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZSB0aGUgY3VycmVudCBwYWdlIGNoYW5naW5nLiBJdCBpcyBgdHJ1ZWAgYnkgZGVmYXVsdC5cbiAgICogPGJyLz4gYG9wdGlvbi5pc05leHRQYWdlYCAtIGNvbW1vbmx5IG1lYW5zLCB0aGF0IGVuZC11c2VyIHByZXNzIHRoZSBuZXh0IHBhZ2UgYnV0dG9uLiBJbiBnZW5lcmFsLCBpdCBtZWFucyB0aGF0IG9wdGlvbnMubmV3Q3VycmVudFBhZ2UgaXMgdGhlIG5leHQgcGFnZSBhZnRlciBvcHRpb25zLm9sZEN1cnJlbnRQYWdlXG4gICAqIDxici8+IGBvcHRpb24uaXNQcmV2UGFnZWAgLSBjb21tb25seSBtZWFucywgdGhhdCBlbmQtdXNlciBwcmVzcyB0aGUgcHJldmlvdXMgcGFnZSBidXR0b24uIEluIGdlbmVyYWwsIGl0IG1lYW5zIHRoYXQgb3B0aW9ucy5uZXdDdXJyZW50UGFnZSBpcyB0aGUgcHJldmlvdXMgcGFnZSBiZWZvcmUgb3B0aW9ucy5vbGRDdXJyZW50UGFnZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VOb1xuICAgKiBAc2VlIG5leHRQYWdlXG4gICAqIEBzZWUgcHJldlBhZ2VcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqIEBzZWUgb25DdXJyZW50UGFnZUNoYW5nZWRcbiAgICoqL1xuICBwdWJsaWMgb25DdXJyZW50UGFnZUNoYW5naW5nOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiB0aGUgY3VycmVudCBwYWdlIGhhcyBiZWVuIGNoYW5nZWQgdG8gYW5vdGhlciBwYWdlLiBUeXBpY2FsbHkgaXQgaGFwcGVucyB3aGVuIGEgdXNlciBjbGljayBvbiAnTmV4dCcgb3IgJ1ByZXYnIGJ1dHRvbnMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb24ub2xkQ3VycmVudFBhZ2VgIC0gYSBwcmV2aW91cyBjdXJyZW50L2FjdGl2ZSBwYWdlLlxuICAgKiA8YnIvPiBgb3B0aW9uLm5ld0N1cnJlbnRQYWdlYCAtIGEgbmV3IGN1cnJlbnQvYWN0aXZlIHBhZ2UuXG4gICAqIDxici8+IGBvcHRpb24uaXNOZXh0UGFnZWAgLSBjb21tb25seSBtZWFucywgdGhhdCBlbmQtdXNlciBwcmVzcyB0aGUgbmV4dCBwYWdlIGJ1dHRvbi4gSW4gZ2VuZXJhbCwgaXQgbWVhbnMgdGhhdCBvcHRpb25zLm5ld0N1cnJlbnRQYWdlIGlzIHRoZSBuZXh0IHBhZ2UgYWZ0ZXIgb3B0aW9ucy5vbGRDdXJyZW50UGFnZVxuICAgKiA8YnIvPiBgb3B0aW9uLmlzUHJldlBhZ2VgIC0gY29tbW9ubHkgbWVhbnMsIHRoYXQgZW5kLXVzZXIgcHJlc3MgdGhlIHByZXZpb3VzIHBhZ2UgYnV0dG9uLiBJbiBnZW5lcmFsLCBpdCBtZWFucyB0aGF0IG9wdGlvbnMubmV3Q3VycmVudFBhZ2UgaXMgdGhlIHByZXZpb3VzIHBhZ2UgYmVmb3JlIG9wdGlvbnMub2xkQ3VycmVudFBhZ2VcbiAgICogQHNlZSBjdXJyZW50UGFnZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlTm9cbiAgICogQHNlZSBuZXh0UGFnZVxuICAgKiBAc2VlIHByZXZQYWdlXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKiBAc2VlIG9uQ3VycmVudFBhZ2VDaGFuZ2luZ1xuICAgKi9cbiAgcHVibGljIG9uQ3VycmVudFBhZ2VDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHRoZSBxdWVzdGlvbiB2YWx1ZSAoYW5zd2VyKSBpcyBjaGFuZ2VkLiBJdCBjYW4gYmUgZG9uZSB2aWEgVUkgYnkgYSB1c2VyIG9yIHByb2dyYW1tYXRpY2FsbHkgb24gY2FsbGluZyB0aGUgYHNldFZhbHVlYCBtZXRob2QuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gdGhlIHZhbHVlIG5hbWUgdGhhdCBoYXMgYmVpbmcgY2hhbmdlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBxdWVzdGlvbiB3aGljaCBgcXVlc3Rpb24ubmFtZWAgZXF1YWxzIHRvIHRoZSB2YWx1ZSBuYW1lLiBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBxdWVzdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGUgZmlyc3QgcXVlc3Rpb24gaXMgdXNlZC4gSWYgdGhlcmUgaXMgbm8gc3VjaCBxdWVzdGlvbnMsIHRoZSBgb3B0aW9ucy5xdWVzdGlvbmAgaXMgbnVsbC5cbiAgICogPGJyLz4gYG9wdGlvbnMub2xkVmFsdWVgIC0gYW4gb2xkLCBwcmV2aW91cyB2YWx1ZS5cbiAgICogPGJyLz4gYG9wdGlvbnMudmFsdWVgIC0gYSBuZXcgdmFsdWUuIFlvdSBjYW4gY2hhbmdlIGl0LlxuICAgKiBAc2VlIHNldFZhbHVlXG4gICAqIEBzZWUgb25WYWx1ZUNoYW5nZWRcbiAgICovXG4gIHB1YmxpYyBvblZhbHVlQ2hhbmdpbmc6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSBxdWVzdGlvbiB2YWx1ZSAoaS5lLiwgYW5zd2VyKSBoYXMgYmVlbiBjaGFuZ2VkLiBUaGUgcXVlc3Rpb24gdmFsdWUgY2FuIGJlIGNoYW5nZWQgaW4gVUkgKGJ5IGEgdXNlcikgb3IgcHJvZ3JhbW1hdGljYWxseSAob24gY2FsbGluZyBgc2V0VmFsdWVgIG1ldGhvZCkuXG4gICAqIFVzZSB0aGUgYG9uRHluYW1pY1BhbmVsSXRlbVZhbHVlQ2hhbmdlZGAgYW5kIGBvbk1hdHJpeENlbGxWYWx1ZUNoYW5nZWRgIGV2ZW50cyB0byBoYW5kbGUgY2hhbmdlcyBpbiBhIHF1ZXN0aW9uIGluIHRoZSBQYW5lbCBEeW5hbWljIGFuZCBhIGNlbGwgcXVlc3Rpb24gaW4gbWF0cmljZXMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gdGhlIHZhbHVlIG5hbWUgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIHdoaWNoIGBxdWVzdGlvbi5uYW1lYCBlcXVhbHMgdG8gdGhlIHZhbHVlIG5hbWUuIElmIHRoZXJlIGFyZSBzZXZlcmFsIHF1ZXN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUsIHRoZSBmaXJzdCBxdWVzdGlvbiBpcyB1c2VkLiBJZiB0aGVyZSBpcyBubyBzdWNoIHF1ZXN0aW9ucywgdGhlIGBvcHRpb25zLnF1ZXN0aW9uYCBpcyBgbnVsbGAuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIGEgbmV3IHZhbHVlLlxuICAgKiBAc2VlIHNldFZhbHVlXG4gICAqIEBzZWUgb25WYWx1ZUNoYW5naW5nXG4gICAqIEBzZWUgb25EeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkXG4gICAqIEBzZWUgb25NYXRyaXhDZWxsVmFsdWVDaGFuZ2VkXG4gICAqL1xuICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIGEgcXVlc3Rpb24gdmlzaWJpbGl0eSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIHdoaWNoIHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSBhIHF1ZXN0aW9uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnZpc2libGVgIC0gYSBxdWVzdGlvbiBgdmlzaWJsZWAgYm9vbGVhbiB2YWx1ZS5cbiAgICogQHNlZSBRdWVzdGlvbi52aXNpYmlsZVxuICAgKiBAc2VlIFF1ZXN0aW9uLnZpc2liaWxlSWZcbiAgICovXG4gIHB1YmxpYyBvblZpc2libGVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2hhbmdpbmcgYSBwYWdlIHZpc2liaWxpdHkuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnBhZ2VgIC0gYSBwYWdlIHdoaWNoIHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMudmlzaWJsZWAgLSBhIHBhZ2UgYHZpc2libGVgIGJvb2xlYW4gdmFsdWUuXG4gICAqIEBzZWUgUGFnZU1vZGVsLnZpc2liaWxlXG4gICAqIEBzZWUgUGFnZU1vZGVsLnZpc2liaWxlSWZcbiAgICovXG4gIHB1YmxpYyBvblBhZ2VWaXNpYmxlQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGNoYW5naW5nIGEgcGFuZWwgdmlzaWJpbGl0eS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFuZWxgIC0gYSBwYW5lbCB3aGljaCB2aXNpYmlsaXR5IGhhcyBiZWVuIGNoYW5nZWQuXG4gICAqIDxici8+IGBvcHRpb25zLnZpc2libGVgIC0gYSBwYW5lbCBgdmlzaWJsZWAgYm9vbGVhbiB2YWx1ZS5cbiAgICogQHNlZSBQYW5lbE1vZGVsLnZpc2liaWxlXG4gICAqIEBzZWUgUGFuZWxNb2RlbC52aXNpYmlsZUlmXG4gICAqL1xuICBwdWJsaWMgb25QYW5lbFZpc2libGVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY3JlYXRpbmcgYSBuZXcgcXVlc3Rpb24uXG4gICAqIFVubGlrZSB0aGUgb25RdWVzdGlvbkFkZGVkIGV2ZW50LCB0aGlzIGV2ZW50IGNhbGxzIGZvciBhbGwgcXVlc3Rpb24gY3JlYXRlZCBpbiBzdXJ2ZXkgaW5jbHVkaW5nIGluc2lkZTogYSBwYWdlLCBwYW5lbCwgbWF0cml4IGNlbGwsIGR5bmFtaWMgcGFuZWwgYW5kIG11bHRpcGxlIHRleHQuXG4gICAqIG9yIGluc2lkZSBhIG1hdHJpeCBjZWxsIG9yIGl0IGNhbiBiZSBhIHRleHQgcXVlc3Rpb24gaW4gbXVsdGlwbGUgdGV4dCBpdGVtcyBvciBpbnNpZGUgYSBwYW5lbCBvZiBhIHBhbmVsIGR5bmFtaWMuXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdG8gc2V0IHVwIHByb3BlcnRpZXMgdG8gYSBxdWVzdGlvbiBiYXNlZCBvbiBpdCdzIHR5cGUgZm9yIGFsbCBxdWVzdGlvbnMsIHJlZ2FyZGxlc3Mgd2hlcmUgdGhleSBhcmUgbG9jYXRlZCwgb24gdGhlIHBhZ2Ugb3IgaW5zaWRlIGEgbWF0cml4IGNlbGwuXG4gICAqIFBsZWFzZSBub3RlOiBJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBldmVudCBmb3IgcXVlc3Rpb25zIGxvYWRlZCBmcm9tIEpTT04gdGhlbiB5b3UgaGF2ZSB0byBjcmVhdGUgc3VydmV5IHdpdGggZW1wdHkvbnVsbCBKU09OIHBhcmFtZXRlciwgYXNzaWduIHRoZSBldmVudCBhbmQgY2FsbCBzdXJ2ZXkuZnJvbUpTT04oeW91ckpTT04pIGZ1bmN0aW9uLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIG5ld2x5IGNyZWF0ZWQgcXVlc3Rpb24gb2JqZWN0LlxuICAgKiBAc2VlIFF1ZXN0aW9uXG4gICAqIEBzZWUgb25RdWVzdGlvbkFkZGVkXG4gICAqL1xuICBwdWJsaWMgb25RdWVzdGlvbkNyZWF0ZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBuZXcgcXVlc3Rpb24gaW50byBzdXJ2ZXkuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgbmV3bHkgYWRkZWQgcXVlc3Rpb24gb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIGEgcXVlc3Rpb24gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMuaW5kZXhgIC0gYW4gaW5kZXggb2YgdGhlIHF1ZXN0aW9uIGluIHRoZSBjb250YWluZXIgKHBhZ2Ugb3IgcGFuZWwpLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYXJlbnRQYW5lbGAgLSBhIGNvbnRhaW5lciB3aGVyZSBhIG5ldyBxdWVzdGlvbiBpcyBsb2NhdGVkLiBJdCBjYW4gYmUgYSBwYWdlIG9yIHBhbmVsLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb290UGFuZWxgIC0gdHlwaWNhbGx5LCBpdCBpcyBhIHBhZ2UuXG4gICAqIEBzZWUgUXVlc3Rpb25cbiAgICogQHNlZSBvblF1ZXN0aW9uQ3JlYXRlZFxuICAgKi9cbiAgcHVibGljIG9uUXVlc3Rpb25BZGRlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHJlbW92aW5nIGEgcXVlc3Rpb24gZnJvbSBzdXJ2ZXkuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcmVtb3ZlZCBxdWVzdGlvbiBvYmplY3QuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBxdWVzdGlvbiBuYW1lLlxuICAgKiBAc2VlIFF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25RdWVzdGlvblJlbW92ZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBwYW5lbCBpbnRvIHN1cnZleS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFuZWxgIC0gYSBuZXdseSBhZGRlZCBwYW5lbCBvYmplY3QuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBwYW5lbCBuYW1lLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5pbmRleGAgLSBhbiBpbmRleCBvZiB0aGUgcGFuZWwgaW4gdGhlIGNvbnRhaW5lciAoYSBwYWdlIG9yIHBhbmVsKS5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFyZW50UGFuZWxgIC0gYSBjb250YWluZXIgKGEgcGFnZSBvciBwYW5lbCkgd2hlcmUgYSBuZXcgcGFuZWwgaXMgbG9jYXRlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMucm9vdFBhbmVsYCAtIGEgcm9vdCBjb250YWluZXIsIHR5cGljYWxseSBpdCBpcyBhIHBhZ2UuXG4gICAqIEBzZWUgUGFuZWxNb2RlbFxuICAgKi9cbiAgcHVibGljIG9uUGFuZWxBZGRlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHJlbW92aW5nIGEgcGFuZWwgZnJvbSBzdXJ2ZXkuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIGEgcmVtb3ZlZCBwYW5lbCBvYmplY3QuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBwYW5lbCBuYW1lLlxuICAgKiBAc2VlIFBhbmVsTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvblBhbmVsUmVtb3ZlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGFkZGluZyBhIHBhZ2UgaW50byBzdXJ2ZXkuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnBhZ2VgIC0gYSBuZXdseSBhZGRlZCBgcGFuZWxgIG9iamVjdC5cbiAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25QYWdlQWRkZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiB2YWxpZGF0aW5nIHZhbHVlIGluIGEgcXVlc3Rpb24uIFlvdSBjYW4gc3BlY2lmeSBhIGN1c3RvbSBlcnJvciBtZXNzYWdlIHVzaW5nIGBvcHRpb25zLmVycm9yYC4gVGhlIHN1cnZleSBibG9ja3MgY29tcGxldGluZyB0aGUgc3VydmV5IG9yIGdvaW5nIHRvIHRoZSBuZXh0IHBhZ2Ugd2hlbiB0aGUgZXJyb3IgbWVzc2FnZXMgYXJlIGRpc3BsYXllZC5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSB2YWxpZGF0ZWQgcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBxdWVzdGlvbiBuYW1lLlxuICAgKiA8YnIvPiBgb3B0aW9ucy52YWx1ZWAgLSB0aGUgY3VycmVudCBxdWVzdGlvbiB2YWx1ZSAoYW5zd2VyKS5cbiAgICogPGJyLz4gYG9wdGlvbnMuZXJyb3JgIC0gYW4gZXJyb3Igc3RyaW5nLiBJdCBpcyBlbXB0eSBieSBkZWZhdWx0LlxuICAgKiBAc2VlIG9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnNcbiAgICogQHNlZSBvblNldHRpbmdRdWVzdGlvbkVycm9yc1xuICAgKi9cbiAgcHVibGljIG9uVmFsaWRhdGVRdWVzdGlvbjogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBlcnJvcnMgYXJlIGFzc2lnbmVkIHRvIGEgcXVlc3Rpb24uIFlvdSBtYXkgYWRkL3JlbW92ZS9tb2RpZnkgZXJyb3JzIGZvciBhIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHZhbGlkYXRlZCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMuZXJyb3JzYCAtIHRoZSBsaXN0IG9mIGVycm9ycy4gVGhlIGxpc3QgaXMgZW1wdHkgYnkgZGVmYXVsdCBhbmQgcmVtYWlucyBlbXB0eSBpZiBhIHZhbGlkYXRlZCBxdWVzdGlvbiBoYXMgbm8gZXJyb3JzLlxuICAgKiBAc2VlIG9uVmFsaWRhdGVRdWVzdGlvblxuICAgKi9cbiAgcHVibGljIG9uU2V0dGluZ1F1ZXN0aW9uRXJyb3JzOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byB2YWxpZGF0ZSBkYXRhIG9uIHlvdXIgc2VydmVyLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5kYXRhYCAtIHRoZSB2YWx1ZXMgb2YgYWxsIG5vbi1lbXB0eSBxdWVzdGlvbnMgb24gdGhlIGN1cnJlbnQgcGFnZS4gWW91IGNhbiBnZXQgYSBxdWVzdGlvbiB2YWx1ZSBhcyBgb3B0aW9ucy5kYXRhW1wibXlRdWVzdGlvbk5hbWVcIl1gLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lcnJvcnNgIC0gc2V0IHlvdXIgZXJyb3JzIHRvIHRoaXMgb2JqZWN0IGFzOiBgb3B0aW9ucy5lcnJvcnNbXCJteVF1ZXN0aW9uTmFtZVwiXSA9IFwiRXJyb3IgdGV4dFwiO2AuIEl0IHdpbGwgYmUgc2hvd24gYXMgYSBxdWVzdGlvbiBlcnJvci5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29tcGxldGUoKWAgLSBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gdGVsbCBzdXJ2ZXkgdGhhdCB5b3VyIHNlcnZlciBjYWxsYmFjayBoYXMgYmVlbiBwcm9jZXNzZWQuXG4gICAqIEBzZWUgb25WYWxpZGF0ZVF1ZXN0aW9uXG4gICAqIEBzZWUgb25WYWxpZGF0ZVBhbmVsXG4gICAqL1xuICBwdWJsaWMgb25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9uczogYW55ID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gbW9kaWZ5IHRoZSBIVE1MIGJlZm9yZSByZW5kZXJpbmcsIGZvciBleGFtcGxlIEhUTUwgb24gYSBjb21wbGV0ZWQgcGFnZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuaHRtbGAgLSBhbiBIVE1MIHRoYXQgeW91IG1heSBjaGFuZ2UgYmVmb3JlIHRleHQgcHJvY2Vzc2luZyBhbmQgdGhlbiByZW5kZXJpbmcuXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbFxuICAgKiBAc2VlIGxvYWRpbmdIdG1sXG4gICAqIEBzZWUgUXVlc3Rpb25IdG1sTW9kZWwuaHRtbFxuICAgKi9cbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiB2YWxpZGF0aW5nIGEgcGFuZWwuIFNldCB5b3VyIGVycm9yIHRvIGBvcHRpb25zLmVycm9yYCBhbmQgc3VydmV5IHdpbGwgc2hvdyB0aGUgZXJyb3IgZm9yIHRoZSBwYW5lbCBhbmQgYmxvY2sgY29tcGxldGluZyB0aGUgc3VydmV5IG9yIGdvaW5nIHRvIHRoZSBuZXh0IHBhZ2UuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gYSBwYW5lbCBuYW1lLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lcnJvcmAgLSBhbiBlcnJvciBzdHJpbmcuIEl0IGlzIGVtcHR5IGJ5IGRlZmF1bHQuXG4gICAqIEBzZWUgb25WYWxpZGF0ZVF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgb25WYWxpZGF0ZVBhbmVsOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGV2ZW50IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBlcnJvciB0ZXh0LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy50ZXh0YCAtIGFuIGVycm9yIHRleHQuXG4gICAqIDxici8+IGBvcHRpb25zLmVycm9yYCAtIGFuIGluc3RhbmNlIG9mIHRoZSBgU3VydmV5RXJyb3JgIG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSB0aGUgZXJyb3IgbmFtZS4gVGhlIGZvbGxvd2luZyBlcnJvciBuYW1lcyBhcmUgYXZhaWxhYmxlOlxuICAgKiByZXF1aXJlZCwgcmVxdWlyZW9uZWFuc3dlciwgcmVxdWlyZW51bWVyaWMsIGV4Y2VlZHNpemUsIHdlYnJlcXVlc3QsIHdlYnJlcXVlc3RlbXB0eSwgb3RoZXJlbXB0eSxcbiAgICogdXBsb2FkaW5nZmlsZSwgcmVxdWlyZWRpbmFsbHJvd3NlcnJvciwgbWlucm93Y291bnRlcnJvciwga2V5ZHVwbGljYXRpb25lcnJvciwgY3VzdG9tXG4gICAqL1xuICBwdWJsaWMgb25FcnJvckN1c3RvbVRleHQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGUgdGhpcyBldmVudCB0byBiZSBub3RpZmllZCB3aGVuIHRoZSBzdXJ2ZXkgZmluaXNoZWQgdmFsaWRhdGUgcXVlc3Rpb25zIG9uIHRoZSBjdXJyZW50IHBhZ2UuIEl0IGNvbW1vbmx5IGhhcHBlbnMgd2hlbiBhIHVzZXIgdHJ5IHRvIGdvIHRvIHRoZSBuZXh0IHBhZ2Ugb3IgY29tcGxldGUgdGhlIHN1cnZleVxuICAgKiBvcHRpb25zLnF1ZXN0aW9ucyAtIHRoZSBsaXN0IG9mIHF1ZXN0aW9ucyB0aGF0IGhhdmUgZXJyb3JzXG4gICAqIG9wdGlvbnMuZXJyb3JzIC0gdGhlIGxpc3Qgb2YgZXJyb3JzXG4gICAqIG9wdGlvbnMucGFnZSAtIHRoZSBwYWdlIHdoZXJlIHF1ZXN0aW9uKHMpIGFyZSBsb2NhdGVkXG4gICAqL1xuICBwdWJsaWMgb25WYWxpZGF0ZWRFcnJvcnNPbkN1cnJlbnRQYWdlOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIG1vZGlmeSB0aGUgSFRNTCBjb250ZW50IGJlZm9yZSByZW5kZXJpbmcsIGZvciBleGFtcGxlIGBjb21wbGV0ZUh0bWxgIG9yIGBsb2FkaW5nSHRtbGAuXG4gICAqIGBvcHRpb25zLmh0bWxgIC0gc3BlY2lmaWVzIHRoZSBtb2RpZmllZCBIVE1MIGNvbnRlbnQuXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbFxuICAgKiBAc2VlIGxvYWRpbmdIdG1sXG4gICAqL1xuICBwdWJsaWMgb25Qcm9jZXNzSHRtbDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gY2hhbmdlIHRoZSBxdWVzdGlvbiB0aXRsZSBpbiBjb2RlLiBJZiB5b3Ugd2FudCB0byByZW1vdmUgcXVlc3Rpb24gbnVtYmVyaW5nIHRoZW4gc2V0IHNob3dRdWVzdGlvbk51bWJlcnMgdG8gXCJvZmZcIi5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMudGl0bGVgIC0gYSBjYWxjdWxhdGVkIHF1ZXN0aW9uIHRpdGxlLCBiYXNlZCBvbiBxdWVzdGlvbiBgdGl0bGVgLCBgbmFtZWAuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcXVlc3Rpb24gb2JqZWN0LlxuICAgKiBAc2VlIHNob3dRdWVzdGlvbk51bWJlcnNcbiAgICogQHNlZSByZXF1aXJlZFRleHRcbiAgICovXG4gIHB1YmxpYyBvbkdldFF1ZXN0aW9uVGl0bGU6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGNoYW5nZSB0aGUgcXVlc3Rpb24gbm8gaW4gY29kZS4gSWYgeW91IHdhbnQgdG8gcmVtb3ZlIHF1ZXN0aW9uIG51bWJlcmluZyB0aGVuIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzIHRvIFwib2ZmXCIuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLm5vYCAtIGEgY2FsY3VsYXRlZCBxdWVzdGlvbiBubywgYmFzZWQgb24gcXVlc3Rpb24gYHZpc2libGVJbmRleGAsIHN1cnZleSBgLnF1ZXN0aW9uU3RhcnRJbmRleGAgcHJvcGVydGllcy4gWW91IGNhbiBjaGFuZ2UgaXQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcXVlc3Rpb24gb2JqZWN0LlxuICAgKiBAc2VlIHNob3dRdWVzdGlvbk51bWJlcnNcbiAgICogQHNlZSBxdWVzdGlvblN0YXJ0SW5kZXhcbiAgICovXG4gIHB1YmxpYyBvbkdldFF1ZXN0aW9uTm86IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGNoYW5nZSB0aGUgcHJvZ3Jlc3MgdGV4dCBpbiBjb2RlLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy50ZXh0YCAtIGEgcHJvZ3Jlc3MgdGV4dCwgdGhhdCBTdXJ2ZXlKUyB3aWxsIHJlbmRlciBpbiBwcm9ncmVzcyBiYXIuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uQ291bnRgIC0gYSBudW1iZXIgb2YgcXVlc3Rpb25zIHRoYXQgaGF2ZSBpbnB1dChzKS4gV2UgZG8gbm90IGNvdW50IGh0bWwgb3IgZXhwcmVzc2lvbiBxdWVzdGlvbnNcbiAgICogPGJyLz4gYG9wdGlvbnMuYW5zd2VyZWRRdWVzdGlvbkNvdW50YCAtIGEgbnVtYmVyIG9mIHF1ZXN0aW9ucyB0aGF0IGhhdmUgaW5wdXQocykgYW5kIGFuIHVzZXIgaGFzIGFuc3dlcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yZXF1aXJlZFF1ZXN0aW9uQ291bnRgIC0gYSBudW1iZXIgb2YgcmVxdWlyZWQgcXVlc3Rpb25zIHRoYXQgaGF2ZSBpbnB1dChzKS4gV2UgZG8gbm90IGNvdW50IGh0bWwgb3IgZXhwcmVzc2lvbiBxdWVzdGlvbnNcbiAgICogPGJyLz4gYG9wdGlvbnMucmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnRgIC0gYSBudW1iZXIgb2YgcmVxdWlyZWQgcXVlc3Rpb25zIHRoYXQgaGF2ZSBpbnB1dChzKSBhbmQgYW4gdXNlciBoYXMgYW5zd2VyZWQuXG4gICAqICBAc2VlIHByb2dyZXNzQmFyVHlwZVxuICAgKi9cbiAgcHVibGljIG9uUHJvZ3Jlc3NUZXh0OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBwcm9jZXNzIHRoZSBtYXJrZG93biB0ZXh0LlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lbGVtZW50YCAtIFN1cnZleUpTIGVsZW1lbnQgKGEgcXVlc3Rpb24sIHBhbmVsLCBwYWdlLCBvciBzdXJ2ZXkpIHdoZXJlIHRoZSBzdHJpbmcgaXMgZ29pbmcgdG8gYmUgcmVuZGVyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLnRleHRgIC0gYSB0ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVuZGVyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLmh0bWxgIC0gYW4gSFRNTCBjb250ZW50LiBJdCBpcyBgbnVsbGAgYnkgZGVmYXVsdC4gVXNlIHRoaXMgcHJvcGVydHkgdG8gc3BlY2lmeSB0aGUgSFRNTCBjb250ZW50IHJlbmRlcmVkIGluc3RlYWQgb2YgYG9wdGlvbnMudGV4dGAuXG4gICAqL1xuICBwdWJsaWMgb25UZXh0TWFya2Rvd246IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBmaXJlcyB3aGVuIGl0IGdldHMgcmVzcG9uc2UgZnJvbSB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2Ugb24gc2F2aW5nIHN1cnZleSByZXN1bHRzLiBVc2UgaXQgdG8gZmluZCBvdXQgaWYgdGhlIHJlc3VsdHMgaGF2ZSBiZWVuIHNhdmVkIHN1Y2Nlc3NmdWxseS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuc3VjY2Vzc2AgLSBpdCBpcyBgdHJ1ZWAgaWYgdGhlIHJlc3VsdHMgaGFzIGJlZW4gc2VudCB0byB0aGUgc2VydmljZSBzdWNjZXNzZnVsbHkuXG4gICAqIDxici8+IGBvcHRpb25zLnJlc3BvbnNlYCAtIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZS5cbiAgICovXG4gIHB1YmxpYyBvblNlbmRSZXN1bHQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSBpdCB0byBnZXQgcmVzdWx0cyBhZnRlciBjYWxsaW5nIHRoZSBgZ2V0UmVzdWx0YCBtZXRob2QuIEl0IHJldHVybnMgYSBzaW1wbGUgYW5hbHl0aWNzIGZyb20gW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnN1Y2Nlc3NgIC0gaXQgaXMgYHRydWVgIGlmIHRoZSByZXN1bHRzIHdlcmUgZ290IGZyb20gdGhlIHNlcnZpY2Ugc3VjY2Vzc2Z1bGx5LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5kYXRhYCAtIHRoZSBvYmplY3QgYHtBbnN3ZXJzQ291bnQsIFF1ZXN0aW9uUmVzdWx0IDoge30gfWAuIGBBbnN3ZXJzQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgcG9zdGVkIHN1cnZleSByZXN1bHRzLiBgUXVlc3Rpb25SZXN1bHRgIGlzIGFuIG9iamVjdCB3aXRoIGFsbCBwb3NzaWJsZSB1bmlxdWUgYW5zd2VycyB0byB0aGUgcXVlc3Rpb24gYW5kIG51bWJlciBvZiB0aGVzZSBhbnN3ZXJzLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5kYXRhTGlzdGAgLSBhbiBhcnJheSBvZiBvYmplY3RzIGB7bmFtZSwgdmFsdWV9YCwgd2hlcmUgYG5hbWVgIGlzIGEgdW5pcXVlIHZhbHVlL2Fuc3dlciB0byB0aGUgcXVlc3Rpb24gYW5kIGB2YWx1ZWAgaXMgYSBudW1iZXIvY291bnQgb2Ygc3VjaCBhbnN3ZXJzLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yZXNwb25zZWAgLSB0aGUgc2VydmVyIHJlc3BvbnNlLlxuICAgKiBAc2VlIGdldFJlc3VsdFxuICAgKi9cbiAgcHVibGljIG9uR2V0UmVzdWx0OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gdXBsb2FkaW5nIHRoZSBmaWxlIGluIFF1ZXN0aW9uRmlsZSB3aGVuIGBzdG9yZURhdGFBc1RleHRgIGlzIHNldCB0byBgZmFsc2VgLiBVc2UgdGhpcyBldmVudCB0byBjaGFuZ2UgdGhlIHVwbG9hZGVkIGZpbGUgbmFtZSBvciB0byBwcmV2ZW50IGEgcGFydGljdWxhciBmaWxlIGZyb20gYmVpbmcgdXBsb2FkZWQuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIHRoZSBmaWxlIHF1ZXN0aW9uIGluc3RhbmNlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIHRoZSBmaWxlIHF1ZXN0aW9uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLmZpbGVzYCAtIHRoZSBKYXZhc2NyaXB0IEZpbGUgb2JqZWN0cyBhcnJheSB0byB1cGxvYWQuXG4gICAqIEBzZWUgdXBsb2FkRmlsZXNcbiAgICogQHNlZSBRdWVzdGlvbkZpbGVNb2RlbC5zdG9yZURhdGFBc1RleHRcbiAgICovXG4gIHB1YmxpYyBvblVwbG9hZEZpbGVzOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gZG93bmxvYWRpbmcgYSBmaWxlIGluIFF1ZXN0aW9uRmlsZS4gVXNlIHRoaXMgZXZlbnQgdG8gcGFzcyB0aGUgZmlsZSB0byBhIHByZXZpZXcuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLm5hbWVgIC0gdGhlIHF1ZXN0aW9uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLmNvbnRlbnRgIC0gdGhlIGZpbGUgY29udGVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuZmlsZVZhbHVlYCAtIHNpbmdsZSBmaWxlIHF1ZXN0aW9uIHZhbHVlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jYWxsYmFja2AgLSBhIGNhbGwgYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIHN0YXR1cyBvbiBkb3dubG9hZGluZyB0aGUgZmlsZSBhbmQgdGhlIGRvd25sb2FkZWQgZmlsZSBjb250ZW50LlxuICAgKiBAc2VlIGRvd25sb2FkRmlsZVxuICAgKi9cbiAgcHVibGljIG9uRG93bmxvYWRGaWxlOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIG9uIGNsZWFyaW5nIHRoZSB2YWx1ZSBpbiBhIFF1ZXN0aW9uRmlsZS4gVXNlIHRoaXMgZXZlbnQgdG8gcmVtb3ZlIGZpbGVzIHN0b3JlZCBvbiB5b3VyIHNlcnZlci5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYHF1ZXN0aW9uYCAtIHRoZSBxdWVzdGlvbiBpbnN0YW5jZS5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSB0aGUgcXVlc3Rpb24gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMudmFsdWVgIC0gdGhlIHF1ZXN0aW9uIHZhbHVlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5maWxlTmFtZWAgLSBhIHJlbW92ZWQgZmlsZSdzIG5hbWUsIHNldCBpdCB0byBgbnVsbGAgdG8gY2xlYXIgYWxsIGZpbGVzLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jYWxsYmFja2AgLSBhIGNhbGwgYmFjayBmdW5jdGlvbiB0byBnZXQgdGhlIHN0YXR1cyBvbiBjbGVhcmluZyB0aGUgZmlsZXMgb3BlcmF0aW9uLlxuICAgKiBAc2VlIGNsZWFyRmlsZXNcbiAgICovXG4gIHB1YmxpYyBvbkNsZWFyRmlsZXM6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBhZnRlciBjaG9pY2VzIGZvciByYWRpb2dyb3VwLCBjaGVja2JveCwgYW5kIGRyb3Bkb3duIGhhcyBiZWVuIGxvYWRlZCBmcm9tIGEgUkVTVGZ1bCBzZXJ2aWNlIGFuZCBiZWZvcmUgdGhleSBhcmUgYXNzaWduZWQgdG8gYSBxdWVzdGlvbi5cbiAgICogWW91IG1heSBjaGFuZ2UgdGhlIGNob2ljZXMsIGJlZm9yZSB0aGV5IGFyZSBhc3NpZ25lZCBvciBkaXNhYmxlL2VuYWJsZWQgbWFrZSB2aXNpYmxlL2ludmlzaWJsZSBxdWVzdGlvbiwgYmFzZWQgb24gbG9hZGVkIHJlc3VsdHMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBxdWVzdGlvbmAgLSB0aGUgcXVlc3Rpb24gd2hlcmUgbG9hZGVkIGNob2ljZXMgYXJlIGdvaW5nIHRvIGJlIGFzc2lnbmVkLlxuICAgKiA8YnIvPiBgY2hvaWNlc2AgLSB0aGUgbG9hZGVkIGNob2ljZXMuIFlvdSBjYW4gY2hhbmdlIHRoZSBsb2FkZWQgY2hvaWNlcyB0byBiZWZvcmUgdGhleSBhcmUgYXNzaWduZWQgdG8gcXVlc3Rpb24uXG4gICAqIDxici8+IGBzZXJ2ZXJSZXN1bHRgIC0gYSByZXN1bHQgdGhhdCBjb21lcyBmcm9tIHRoZSBzZXJ2ZXIgYXMgaXQgaXMuXG4gICAqL1xuICBwdWJsaWMgb25Mb2FkQ2hvaWNlc0Zyb21TZXJ2ZXI6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBhZnRlciBzdXJ2ZXkgaXMgbG9hZGVkIGZyb20gYXBpLnN1cnZleWpzLmlvIHNlcnZpY2UuXG4gICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdG8gcGVyZm9ybSBtYW5pcHVsYXRpb24gd2l0aCB0aGUgc3VydmV5IG1vZGVsIGFmdGVyIGl0IHdhcyBsb2FkZWQgZnJvbSB0aGUgd2ViIHNlcnZpY2UuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIEBzZWUgc3VydmV5SWRcbiAgICogQHNlZSBsb2FkU3VydmV5RnJvbVNlcnZpY2VcbiAgICovXG4gIHB1YmxpYyBvbkxvYWRlZFN1cnZleUZyb21TZXJ2aWNlOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gcHJvY2Vzc2luZyB0aGUgdGV4dCB3aGVuIGl0IGZpbmRzIGEgdGV4dCBpbiBicmFja2V0czogYHtzb21ldmFsdWV9YC4gQnkgZGVmYXVsdCwgaXQgdXNlcyB0aGUgdmFsdWUgb2Ygc3VydmV5IHF1ZXN0aW9uIHZhbHVlcyBhbmQgdmFyaWFibGVzLlxuICAgKiBGb3IgZXhhbXBsZSwgeW91IG1heSB1c2UgdGhlIHRleHQgcHJvY2Vzc2luZyBpbiBsb2FkaW5nIGNob2ljZXMgZnJvbSB0aGUgd2ViLiBJZiB5b3VyIGBjaG9pY2VzQnlVcmwudXJsYCBlcXVhbHMgdG8gXCJVcmxUb1NlcnZpY2VUb0dldEFsbENpdGllcy97Y291bnRyeX0ve3N0YXRlfVwiLFxuICAgKiB5b3UgbWF5IHNldCBvbiB0aGlzIGV2ZW50IGBvcHRpb25zLnZhbHVlYCB0byBcImFsbFwiIG9yIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBcInN0YXRlXCIgdmFsdWUvcXVlc3Rpb24gaXMgbm9uIHNlbGVjdGVkIGJ5IGEgdXNlci5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMubmFtZWAgLSB0aGUgbmFtZSBvZiB0aGUgcHJvY2Vzc2luZyB2YWx1ZSwgZm9yIGV4YW1wbGUsIFwic3RhdGVcIiBpbiBvdXIgZXhhbXBsZS5cbiAgICogPGJyLz4gYG9wdGlvbnMudmFsdWVgIC0gdGhlIHZhbHVlIG9mIHRoZSBwcm9jZXNzaW5nIHRleHQuXG4gICAqIDxici8+IGBvcHRpb25zLmlzRXhpc3RzYCAtIGEgYm9vbGVhbiB2YWx1ZS4gU2V0IGl0IHRvIGB0cnVlYCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIHZhbHVlIGFuZCBzZXQgaXQgdG8gYGZhbHNlYCBpZiB5b3UgZG9uJ3QuXG4gICAqL1xuICBwdWJsaWMgb25Qcm9jZXNzVGV4dFZhbHVlOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHJlbmRlcmluZyBhIHF1ZXN0aW9uLiBVc2UgaXQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcXVlc3Rpb24gQ1NTIGNsYXNzZXMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcXVlc3Rpb24gZm9yIHdoaWNoIHlvdSBjYW4gY2hhbmdlIHRoZSBDU1MgY2xhc3Nlcy5cbiAgICogPGJyLz4gYG9wdGlvbnMuY3NzQ2xhc3Nlc2AgLSBhbiBvYmplY3Qgd2l0aCBDU1MgY2xhc3Nlcy4gRm9yIGV4YW1wbGUgYHtyb290OiBcInRhYmxlXCIsIGJ1dHRvbjogXCJidXR0b25cIn1gLiBZb3UgY2FuIGNoYW5nZSB0aGVtIHRvIHlvdXIgb3duIENTUyBjbGFzc2VzLlxuICAgKi9cbiAgcHVibGljIG9uVXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHJlbmRlcmluZyBhIHBhbmVsLiBVc2UgaXQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcGFuZWwgQ1NTIGNsYXNzZXMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsYCAtIGEgcGFuZWwgZm9yIHdoaWNoIHlvdSBjYW4gY2hhbmdlIHRoZSBDU1MgY2xhc3Nlcy5cbiAgICogPGJyLz4gYG9wdGlvbnMuY3NzQ2xhc3Nlc2AgLSBhbiBvYmplY3Qgd2l0aCBDU1MgY2xhc3Nlcy4gRm9yIGV4YW1wbGUgYHt0aXRsZTogXCJzdl9wX3RpdGxlXCIsIGRlc2NyaXB0aW9uOiBcInNtYWxsXCJ9YC4gWW91IGNhbiBjaGFuZ2UgdGhlbSB0byB5b3VyIG93biBDU1MgY2xhc3Nlcy5cbiAgICovXG4gIHB1YmxpYyBvblVwZGF0ZVBhbmVsQ3NzQ2xhc3NlczogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSByZW5kZXJpbmcgYSBwYWdlLiBVc2UgaXQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcGFnZSBDU1MgY2xhc3Nlcy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFnZWAgLSBhIHBhZ2UgZm9yIHdoaWNoIHlvdSBjYW4gY2hhbmdlIHRoZSBDU1MgY2xhc3Nlcy5cbiAgICogPGJyLz4gYG9wdGlvbnMuY3NzQ2xhc3Nlc2AgLSBhbiBvYmplY3Qgd2l0aCBDU1MgY2xhc3Nlcy4gRm9yIGV4YW1wbGUgYHt0aXRsZTogXCJzdl9wX3RpdGxlXCIsIGRlc2NyaXB0aW9uOiBcInNtYWxsXCJ9YC4gWW91IGNhbiBjaGFuZ2UgdGhlbSB0byB5b3VyIG93biBDU1MgY2xhc3Nlcy5cbiAgICovXG4gIHB1YmxpYyBvblVwZGF0ZVBhZ2VDc3NDbGFzc2VzOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYWZ0ZXIgc3VydmV5IGlzIHJlbmRlcmVkIGluIERPTS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMuaHRtbEVsZW1lbnRgIC0gYSByb290IEhUTUwgZWxlbWVudCBib3VuZCB0byB0aGUgc3VydmV5IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyU3VydmV5OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYWZ0ZXIgYSBwYWdlIGlzIHJlbmRlcmVkIGluIERPTS4gVXNlIGl0IHRvIG1vZGlmeSBIVE1MIGVsZW1lbnRzLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5odG1sRWxlbWVudGAgLSBhbiBIVE1MIGVsZW1lbnQgYm91bmQgdG8gdGhlIHN1cnZleSBoZWFkZXIgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXJIZWFkZXI6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBhIHBhZ2UgaXMgcmVuZGVyZWQgaW4gRE9NLiBVc2UgaXQgdG8gbW9kaWZ5IEhUTUwgZWxlbWVudHMuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnBhZ2VgIC0gYSBwYWdlIG9iamVjdCBmb3Igd2hpY2ggdGhlIGV2ZW50IGlzIGZpcmVkLiBUeXBpY2FsbHkgdGhlIGN1cnJlbnQvYWN0aXZlIHBhZ2UuXG4gICAqIDxici8+IGBvcHRpb25zLmh0bWxFbGVtZW50YCAtIGFuIEhUTUwgZWxlbWVudCBib3VuZCB0byB0aGUgcGFnZSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgb25BZnRlclJlbmRlclBhZ2U6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBhIHF1ZXN0aW9uIGlzIHJlbmRlcmVkIGluIERPTS4gVXNlIGl0IHRvIG1vZGlmeSBIVE1MIGVsZW1lbnRzLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIHF1ZXN0aW9uIG9iamVjdCBmb3Igd2hpY2ggdGhlIGV2ZW50IGlzIGZpcmVkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5odG1sRWxlbWVudGAgLSBhbiBIVE1MIGVsZW1lbnQgYm91bmQgdG8gdGhlIHF1ZXN0aW9uIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyUXVlc3Rpb246IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBhIG5vbi1jb21wb3NpdGUgcXVlc3Rpb24gKHRleHQsIGNvbW1lbnQsIGRyb3Bkb3duLCByYWRpb2dyb3VwLCBjaGVja2JveCkgaXMgcmVuZGVyZWQgaW4gRE9NLiBVc2UgaXQgdG8gbW9kaWZ5IEhUTUwgZWxlbWVudHMuXG4gICAqIFRoaXMgZXZlbnQgaXMgbm90IGZpcmVkIGZvciBtYXRyaWNlcywgcGFuZWxzLCBtdWx0aXBsZSB0ZXh0IGFuZCBpbWFnZSBwaWNrZXIuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcXVlc3Rpb24gb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWQuXG4gICAqIDxici8+IGBvcHRpb25zLmh0bWxFbGVtZW50YCAtIGFuIEhUTUwgZWxlbWVudCBib3VuZCB0byB0aGUgcXVlc3Rpb24gb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXJRdWVzdGlvbklucHV0OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgcmlnaHQgYWZ0ZXIgYSBwYW5lbCBpcyByZW5kZXJlZCBpbiBET00uIFVzZSBpdCB0byBtb2RpZnkgSFRNTCBlbGVtZW50cy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYW5lbGAgLSBhIHBhbmVsIG9iamVjdCBmb3Igd2hpY2ggdGhlIGV2ZW50IGlzIGZpcmVkXG4gICAqIDxici8+IGBvcHRpb25zLmh0bWxFbGVtZW50YCAtIGFuIEhUTUwgZWxlbWVudCBib3VuZCB0byB0aGUgcGFuZWwgb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgb25BZnRlclJlbmRlclBhbmVsOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgbmV3IHJvdyBpbiBNYXRyaXggRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIG1hdHJpeCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIGEgbmV3IGFkZGVkIHJvdy5cbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsLnZpc2libGVSb3dzXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhSb3dBZGRlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBhZGRpbmcgYSBuZXcgcm93IGluIE1hdHJpeCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jYW5BZGRSb3dgIC0gc3BlY2lmaWVzIHdoZXRoZXIgYSBuZXcgcm93IGNhbiBiZSBhZGRlZFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwudmlzaWJsZVJvd3NcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeEJlZm9yZVJvd0FkZGVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gcmVtb3ZpbmcgYSByb3cgZnJvbSBNYXRyaXggRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSBhIG1hdHJpeCBxdWVzdGlvblxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dJbmRleGAgLSBhIHJlbW92ZWQgcm93IGluZGV4XG4gICAqIDxici8+IGBvcHRpb25zLnJvd2AgLSBhIHJlbW92ZWQgcm93IG9iamVjdFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwudmlzaWJsZVJvd3NcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeFJvd1JlbW92ZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgcmVuZGVyaW5nIFwiUmVtb3ZlXCIgYnV0dG9uIGZvciByZW1vdmluZyBhIHJvdyBmcm9tIE1hdHJpeCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dJbmRleGAgLSBhIHJvdyBpbmRleC5cbiAgICogPGJyLz4gYG9wdGlvbnMucm93YCAtIGEgcm93IG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuYWxsb3dgIC0gYSBib29sZWFuIHByb3BlcnR5LiBTZXQgaXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIHRoZSByb3cgcmVtb3ZpbmcuXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeEFsbG93UmVtb3ZlUm93OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgZm9yIGV2ZXJ5IGNlbGwgY3JlYXRlZCBpbiBNYXRyaXggRHluYW1pYyBhbmQgTWF0cml4IERyb3Bkb3duIHF1ZXN0aW9ucy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gdGhlIG1hdHJpeCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMuY2VsbGAgLSB0aGUgbWF0cml4IGNlbGwuXG4gICAqIDxici8+IGBvcHRpb25zLmNlbGxRdWVzdGlvbmAgLSB0aGUgcXVlc3Rpb24vZWRpdG9yIGluIHRoZSBjZWxsLiBZb3UgbWF5IGN1c3RvbWl6ZSBpdCwgY2hhbmdlIGl0J3MgcHJvcGVydGllcywgbGlrZSBjaG9pY2VzIG9yIHZpc2libGUuXG4gICAqIDxici8+IGBvcHRpb25zLnJvd1ZhbHVlYCAtIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCByb3cuIFRvIGFjY2VzcyBhIHBhcnRpY3VsYXIgY29sdW1uJ3MgdmFsdWUgd2l0aGluIHRoZSBjdXJyZW50IHJvdywgdXNlOiBgb3B0aW9ucy5yb3dWYWx1ZVtcImNvbHVtblZhbHVlXCJdYC5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29sdW1uYCAtIHRoZSBtYXRyaXggY29sdW1uIG9iamVjdC5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29sdW1OYW1lYCAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnJvd2AgLSB0aGUgbWF0cml4IHJvdyBvYmplY3QuXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbENyZWF0ZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBmb3IgZXZlcnkgY2VsbCBhZnRlciBpcyBoYXMgYmVlbiByZW5kZXJlZCBpbiBET00uXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIHRoZSBtYXRyaXggcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLmNlbGxgIC0gdGhlIG1hdHJpeCBjZWxsLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jZWxsUXVlc3Rpb25gIC0gdGhlIHF1ZXN0aW9uL2VkaXRvciBpbiB0aGUgY2VsbC5cbiAgICogPGJyLz4gYG9wdGlvbnMuaHRtbEVsZW1lbnRgIC0gYW4gSFRNTCBlbGVtZW50IGJvdW5kIHRvIHRoZSBgY2VsbFF1ZXN0aW9uYCBvYmplY3QuXG4gICAqIDxici8+IGBvcHRpb25zLmNvbHVtbmAgLSB0aGUgbWF0cml4IGNvbHVtbiBvYmplY3QuXG4gICAqIDxici8+IGBvcHRpb25zLnJvd2AgLSB0aGUgbWF0cml4IHJvdyBvYmplY3QuXG4gICAqIEBzZWUgb25NYXRyaXhDZWxsQ3JlYXRlZFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhBZnRlckNlbGxSZW5kZXI6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIGNlbGwgdmFsdWUgaXMgY2hhbmdlZCBpbiBNYXRyaXggRHluYW1pYyBhbmQgTWF0cml4IERyb3Bkb3duIHF1ZXN0aW9ucy5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gdGhlIG1hdHJpeCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29sdW1OYW1lYCAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIGEgbmV3IHZhbHVlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gdGhlIG1hdHJpeCByb3cgb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5nZXRDZWxsUXVlc3Rpb24oY29sdW1uTmFtZSlgIC0gdGhlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY2VsbCBxdWVzdGlvbiBieSBjb2x1bW4gbmFtZS5cbiAgICogQHNlZSBvbk1hdHJpeENlbGxWYWx1ZUNoYW5naW5nXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIGNoYW5naW5nIGNlbGwgdmFsdWUgaW4gTWF0cml4IER5bmFtaWMgYW5kIE1hdHJpeCBEcm9wZG93biBxdWVzdGlvbnMuIFlvdSBtYXkgY2hhbmdlIHRoZSBgb3B0aW9ucy52YWx1ZWAgcHJvcGVydHkgdG8gY2hhbmdlIGEgY2VsbCB2YWx1ZS5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gdGhlIG1hdHJpeCBxdWVzdGlvbi5cbiAgICogPGJyLz4gYG9wdGlvbnMuY29sdW1OYW1lYCAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIGEgbmV3IHZhbHVlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5vbGRWYWx1ZWAgLSB0aGUgb2xkIHZhbHVlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gdGhlIG1hdHJpeCByb3cgb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5nZXRDZWxsUXVlc3Rpb24oY29sdW1uTmFtZSlgIC0gdGhlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGNlbGwgcXVlc3Rpb24gYnkgY29sdW1uIG5hbWUuXG4gICAqIEBzZWUgb25NYXRyaXhDZWxsVmFsdWVDaGFuZ2VkXG4gICAqIEBzZWUgb25NYXRyaXhCZWZvcmVSb3dBZGRlZFxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdpbmc6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIE1hdHJpeCBEeW5hbWljIGFuZCBNYXRyaXggRHJvcGRvd24gcXVlc3Rpb25zIHZhbGlkYXRlIHRoZSBjZWxsIHZhbHVlLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5xdWVzdGlvbmAgLSB0aGUgbWF0cml4IHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jb2x1bU5hbWVgIC0gdGhlIG1hdHJpeCBjb2x1bW4gbmFtZS5cbiAgICogPGJyLz4gYG9wdGlvbnMudmFsdWVgIC0gYSBjZWxsIHZhbHVlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5yb3dgIC0gdGhlIG1hdHJpeCByb3cgb2JqZWN0LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5nZXRDZWxsUXVlc3Rpb24oY29sdW1uTmFtZSlgIC0gdGhlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY2VsbCBxdWVzdGlvbiBieSBjb2x1bW4gbmFtZS5cbiAgICogQHNlZSBvbk1hdHJpeEJlZm9yZVJvd0FkZGVkXG4gICAqIEBzZWUgb25NYXRyaXhSb3dBZGRlZFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhDZWxsVmFsaWRhdGU6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBuZXcgcGFuZWwgaW4gUGFuZWwgRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBwYW5lbCBxdWVzdGlvbi5cbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5wYW5lbHNcbiAgICovXG4gIHB1YmxpYyBvbkR5bmFtaWNQYW5lbEFkZGVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gcmVtb3ZpbmcgYSBwYW5lbCBmcm9tIFBhbmVsIER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcGFuZWwgcXVlc3Rpb24uXG4gICAqIDxici8+IGBvcHRpb25zLnBhbmVsSW5kZXhgIC0gYSByZW1vdmVkIHBhbmVsIGluZGV4LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYW5lbGAgLSBhIHJlbW92ZWQgcGFuZWwuXG4gICAqIEBzZWUgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwucGFuZWxzXG4gICAqL1xuICBwdWJsaWMgb25EeW5hbWljUGFuZWxSZW1vdmVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgZXZlcnkgc2Vjb25kIGlmIHRoZSBtZXRob2QgYHN0YXJ0VGltZXJgIGhhcyBiZWVuIGNhbGxlZC5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgdGltZVNwZW50XG4gICAqIEBzZWUgUGFnZS50aW1lU3BlbnRcbiAgICovXG4gIHB1YmxpYyBvblRpbWVyOiBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LCBhbnk+ID0gbmV3IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksXG4gICAgYW55XG4gID4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBiZWZvcmUgZGlzcGxheWluZyBhIG5ldyBpbmZvcm1hdGlvbiBpbiB0aGUgVGltZXIgUGFuZWwuIFVzZSBpdCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMudGV4dGAgLSB0aGUgdGltZXIgcGFuZWwgaW5mbyB0ZXh0LlxuICAgKi9cbiAgcHVibGljIG9uVGltZXJQYW5lbEluZm9UZXh0OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgd2hlbiBpdGVtIHZhbHVlIGlzIGNoYW5nZWQgaW4gUGFuZWwgRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gdGhlIHBhbmVsIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5wYW5lbGAgLSB0aGUgZHluYW1pYyBwYW5lbCBpdGVtLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5uYW1lYCAtIHRoZSBpdGVtIG5hbWUuXG4gICAqIDxici8+IGBvcHRpb25zLnZhbHVlYCAtIGEgbmV3IHZhbHVlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5pdGVtSW5kZXhgIC0gdGhlIHBhbmVsIGl0ZW0gaW5kZXguXG4gICAqIDxici8+IGBvcHRpb25zLml0ZW1WYWx1ZWAgLSB0aGUgcGFuZWwgaXRlbSBvYmplY3QuXG4gICAqIEBzZWUgb25EeW5hbWljUGFuZWxBZGRlZFxuICAgKiBAc2VlIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbkR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGRlZmluZSwgd2hldGhlciBhbiBhbnN3ZXIgdG8gYSBxdWVzdGlvbiBpcyBjb3JyZWN0IG9yIG5vdC5cbiAgICogPGJyLz4gYHNlbmRlcmAgLSB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudC5cbiAgICogPGJyLz4gYG9wdGlvbnMucXVlc3Rpb25gIC0gYSBxdWVzdGlvbiBvbiB3aGljaCB5b3UgaGF2ZSB0byBkZWNpZGUgaWYgdGhlIGFuc3dlciBpcyBjb3JyZWN0IG9yIG5vdC5cbiAgICogPGJyLz4gYG9wdGlvbnMucmVzdWx0YCAtIHJldHVybnMgYHRydWVgLCBpZiBhbiBhbnN3ZXIgaXMgY29ycmVjdCwgb3IgYGZhbHNlYCwgaWYgdGhlIGFuc3dlciBpcyBub3QgY29ycmVjdC4gVXNlIHF1ZXN0aW9ucycgYHZhbHVlYCBhbmQgYGNvcnJlY3RBbnN3ZXJgIHByb3BlcnRpZXMgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jb3JyZWN0QW5zd2Vyc2AgLSB5b3UgbWF5IGNoYW5nZSB0aGUgZGVmYXVsdCBudW1iZXIgb2YgY29ycmVjdCBvciBpbmNvcnJlY3QgYW5zd2VycyBpbiB0aGUgcXVlc3Rpb24sIGZvciBleGFtcGxlIGZvciBtYXRyaXgsIHdoZXJlIGVhY2ggcm93IGlzIGEgcXVpeiBxdWVzdGlvbi5cbiAgICogQHNlZSBRdWVzdGlvbi52YWx1ZVxuICAgKiBAc2VlIFF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXJcbiAgICovXG4gIHB1YmxpYyBvbklzQW5zd2VyQ29ycmVjdDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gY29udHJvbCBkcmFnJmRyb3Agb3BlcmF0aW9ucyBkdXJpbmcgZGVzaWduIG1vZGUuXG4gICAqIDxici8+IGBzZW5kZXJgIC0gdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnQuXG4gICAqIDxici8+IGBvcHRpb25zLmFsbG93YCAtIHNldCBpdCB0byBgZmFsc2VgIHRvIGRpc2FibGUgZHJhZ2dpbmcuXG4gICAqIDxici8+IGBvcHRpb25zLnRhcmdldGAgLSBhIHRhcmdldCBlbGVtZW50IHRoYXQgaXMgZHJhZ2dlZC5cbiAgICogPGJyLz4gYG9wdGlvbnMuc291cmNlYCAtIGEgc291cmNlIGVsZW1lbnQuIEl0IGNhbiBiZSBgbnVsbGAsIGlmIGl0IGlzIGEgbmV3IGVsZW1lbnQsIGRyYWdnaW5nIGZyb20gdG9vbGJveC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFyZW50YCAtIGEgcGFnZSBvciBwYW5lbCB3aGVyZSB0YXJnZXQgZWxlbWVudCBpcyBkcmFnZ2luZy5cbiAgICogPGJyLz4gYG9wdGlvbnMuaW5zZXJ0QmVmb3JlYCAtIGFuIGVsZW1lbnQgYmVmb3JlIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBkcmFnZ2luZy4gSXQgY2FuIGJlIGBudWxsYCBpZiBwYXJlbnQgY29udGFpbmVyIChwYWdlIG9yIHBhbmVsKSBpcyBlbXB0eSBvciBkcmFnZ2luZyBhbiBlbGVtZW50IGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQgaW4gYSBjb250YWluZXIuXG4gICAqIDxici8+IGBvcHRpb25zLmluc2VydEFmdGVyYCAtIGFuIGVsZW1lbnQgYWZ0ZXIgdGhlIHRhcmdldCBlbGVtZW50IGlzIGRyYWdnaW5nLiBJdCBjYW4gYmUgYG51bGxgIGlmIHBhcmVudCBjb250YWluZXIgKHBhZ2Ugb3IgcGFuZWwpIGlzIGVtcHR5IG9yIGRyYWdnaW5nIGVsZW1lbnQgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIHdpdGhpbiB0aGUgcGFyZW50IGNvbnRhaW5lci5cbiAgICogQHNlZSBzZXREZXNpZ25Nb2RlXG4gICAqIEBzZWUgaXNEZXNpZ25Nb2RlXG4gICAqL1xuICBwdWJsaWMgb25EcmFnRHJvcEFsbG93OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBldmVudCB0byBjb250cm9sIHNjcm9sbGluZyBlbGVtZW50IHRvIHRvcC4gWW91IGNhbiBjYW5jZWwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYnkgc2V0dGluZyBvcHRpb25zLmNhbmNlbCBwcm9wZXJ0eSB0byB0cnVlLlxuICAgKiA8YnIvPiBgc2VuZGVyYCAtIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50LlxuICAgKiA8YnIvPiBgb3B0aW9ucy5lbGVtZW50YCAtIGFuIGVsZW1lbnQgdGhhdCBpcyBnb2luZyB0byBiZSBzY3JvbGxlZCBvbiB0b3AuXG4gICAqIDxici8+IGBvcHRpb25zLnF1ZXN0aW9uYCAtIGEgcXVlc3Rpb24gdGhhdCBpcyBnb2luZyB0byBiZSBzY3JvbGxlZCBvbiB0b3AuIEl0IGNhbiBiZSBudWxsIGlmIG9wdGlvbnMucGFnZSBpcyBub3QgbnVsbC5cbiAgICogPGJyLz4gYG9wdGlvbnMucGFnZWAgLSBhIHBhZ2UgdGhhdCBpcyBnb2luZyB0byBiZSBzY3JvbGxlZCBvbiB0b3AuIEl0IGNhbiBiZSBudWxsIGlmIG9wdGlvbnMucXVlc3Rpb24gaXMgbm90IG51bGwuXG4gICAqIDxici8+IGBvcHRpb25zLmVsZW1lbnRJZGAgLSB0aGUgdW5pcXVlIGVsZW1lbnQgRE9NIElkLlxuICAgKiA8YnIvPiBgb3B0aW9ucy5jYW5jZWxgIC0gc2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBjYW5jZWwgdGhlIGRlZmF1bHQgc2Nyb2xsaW5nLlxuICAgKi9cbiAgcHVibGljIG9uU2Nyb2xsaW5nRWxlbWVudFRvVG9wOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG5cbiAgcHVibGljIG9uTG9jYWxlQ2hhbmdlZEV2ZW50OiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgdmFsdWU6IHN0cmluZykgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksIGFueT4oKTtcblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZXJyb3JzIG9uIGxvYWRpbmcgc3VydmV5IEpTT04uIElmIHRoZSBsaXN0IGlzIGVtcHR5IGFmdGVyIGxvYWRpbmcgYSBKU09OLCB0aGVuIHRoZSBKU09OIGlzIGNvcnJlY3QgYW5kIGhhcyBubyBlcnJvcnMuXG4gICAqIEBzZWUgSnNvbkVycm9yXG4gICAqL1xuICBwdWJsaWMganNvbkVycm9yczogQXJyYXk8SnNvbkVycm9yPiA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoanNvbk9iajogYW55ID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIFN1cnZleU1vZGVsLnN0eWxlc01hbmFnZXIgPSBuZXcgU3R5bGVzTWFuYWdlcigpO1xuICAgIH1cbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImRlc2NyaXB0aW9uXCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJsb2dvXCIsIHRoaXMsIGZhbHNlKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVkSHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVkQmVmb3JlSHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibG9hZGluZ0h0bWxcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInN0YXJ0U3VydmV5VGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFnZVByZXZUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYWdlTmV4dFRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbXBsZXRlVGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicHJldmlld1RleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImVkaXRUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIiwgdGhpcywgdHJ1ZSk7XG5cbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3Nvci5vblByb2Nlc3MgPSBmdW5jdGlvbiAoXG4gICAgICB0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZVxuICAgICkge1xuICAgICAgc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlKTtcbiAgICB9O1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXG4gICAgICBcInBhZ2VzXCIsXG4gICAgICBmdW5jdGlvbiAodmFsdWU6IGFueSkge1xuICAgICAgICBzZWxmLmRvT25QYWdlQWRkZWQodmFsdWUpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uICh2YWx1ZTogYW55KSB7XG4gICAgICAgIHNlbGYuZG9PblBhZ2VSZW1vdmVkKHZhbHVlKTtcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJ0cmlnZ2Vyc1wiLCBmdW5jdGlvbiAodmFsdWU6IGFueSkge1xuICAgICAgdmFsdWUuc2V0T3duZXIoc2VsZik7XG4gICAgfSk7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcImNhbGN1bGF0ZWRWYWx1ZXNcIiwgZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcbiAgICAgIHZhbHVlLnNldE93bmVyKHNlbGYpO1xuICAgIH0pO1xuICAgIHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIiwgZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcbiAgICAgIHZhbHVlLmxvY093bmVyID0gc2VsZjtcbiAgICB9KTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwibmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uXCIsIGZ1bmN0aW9uICh2YWx1ZTogYW55KSB7XG4gICAgICB2YWx1ZS5sb2NPd25lciA9IHNlbGY7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcbiAgICAgIFwiZmlyc3RQYWdlSXNTdGFydGVkXCIsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYub25GaXJzdFBhZ2VJc1N0YXJ0ZWRDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwibW9kZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLm9uTW9kZUNoYW5nZWQoKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicHJvZ3Jlc3NCYXJUeXBlXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYudXBkYXRlUHJvZ3Jlc3NUZXh0KCk7XG4gICAgfSk7XG4gICAgdGhpcy5vblByb2dyZXNzVGV4dC5vbkNhbGxiYWNrc0NoYW5nZWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVByb2dyZXNzVGV4dCgpO1xuICAgIH07XG4gICAgdGhpcy5vbkJlZm9yZUNyZWF0aW5nKCk7XG4gICAgaWYgKGpzb25PYmopIHtcbiAgICAgIGlmICh0eXBlb2YganNvbk9iaiA9PT0gXCJzdHJpbmdcIiB8fCBqc29uT2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgIGpzb25PYmogPSBKU09OLnBhcnNlKGpzb25PYmogYXMgc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmIChqc29uT2JqICYmIGpzb25PYmouY2xpZW50SWQpIHtcbiAgICAgICAgdGhpcy5jbGllbnRJZCA9IGpzb25PYmouY2xpZW50SWQ7XG4gICAgICB9XG4gICAgICB0aGlzLmZyb21KU09OKGpzb25PYmopO1xuICAgICAgaWYgKHRoaXMuc3VydmV5SWQpIHtcbiAgICAgICAgdGhpcy5sb2FkU3VydmV5RnJvbVNlcnZpY2UodGhpcy5zdXJ2ZXlJZCwgdGhpcy5jbGllbnRJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25DcmVhdGluZygpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3VydmV5XCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKG5hbWUgPT09IFwicXVlc3Rpb25zT25QYWdlTW9kZVwiKSB7XG4gICAgICB0aGlzLm9uUXVlc3Rpb25zT25QYWdlTW9kZUNoYW5nZWQob2xkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgcGFnZXMgaW4gdGhlIHN1cnZleSwgaW5jbHVkaW5nIGludmlzaWJsZSBwYWdlcy5cbiAgICogQHNlZSBQYWdlTW9kZWxcbiAgICogQHNlZSB2aXNpYmxlUGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZXMoKTogQXJyYXk8UGFnZU1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhZ2VzXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRDc3MoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5jc3M7XG4gIH1cbiAgcHJpdmF0ZSBjc3NWYWx1ZTogYW55ID0gbnVsbDtcbiAgcHVibGljIGdldCBjc3MoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuY3NzVmFsdWUpIHtcbiAgICAgIHRoaXMuY3NzVmFsdWUgPSB7fTtcbiAgICAgIHRoaXMuY29weUNzc0NsYXNzZXModGhpcy5jc3NWYWx1ZSwgc3VydmV5Q3NzLmdldENzcygpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3NzVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjc3ModmFsdWU6IGFueSkge1xuICAgIHRoaXMubWVyZ2VWYWx1ZXModmFsdWUsIHRoaXMuY3NzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25Db21wbGV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXZpZ2F0aW9uQ3NzKFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbkJ1dHRvbixcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb24uY29tcGxldGVcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzTmF2aWdhdGlvblByZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmF2aWdhdGlvbkNzcyhcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24sXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uLnByZXZpZXdcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzTmF2aWdhdGlvbkVkaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmF2aWdhdGlvbkNzcyhcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24sXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uLmVkaXRcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzTmF2aWdhdGlvblByZXYoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmF2aWdhdGlvbkNzcyhcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24sXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uLnByZXZcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzTmF2aWdhdGlvblN0YXJ0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE5hdmlnYXRpb25Dc3MoXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uLFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5zdGFydFxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBjc3NOYXZpZ2F0aW9uTmV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXZpZ2F0aW9uQ3NzKFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbkJ1dHRvbixcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb24ubmV4dFxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBjb21wbGV0ZWRDc3MoKSB7XG4gICAgdmFyIGNzcyA9IHRoaXMuY3NzO1xuICAgIHJldHVybiBjc3MuYm9keSArIFwiIFwiICsgY3NzLmNvbXBsZXRlZFBhZ2U7XG4gIH1cbiAgcHJpdmF0ZSBnZXROYXZpZ2F0aW9uQ3NzKG1haW46IHN0cmluZywgYnRuOiBzdHJpbmcpIHtcbiAgICB2YXIgcmVzID0gXCJcIjtcbiAgICBpZiAobWFpbikgcmVzID0gbWFpbjtcbiAgICBpZiAoYnRuKSByZXMgKz0gXCIgXCIgKyBidG47XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgbGlzdCBvZiB0cmlnZ2VycyBpbiB0aGUgc3VydmV5LlxuICAgKiBAc2VlIFN1cnZleVRyaWdnZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgdHJpZ2dlcnMoKTogQXJyYXk8U3VydmV5VHJpZ2dlcj4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0cmlnZ2Vyc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRyaWdnZXJzKHZhbDogQXJyYXk8U3VydmV5VHJpZ2dlcj4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0cmlnZ2Vyc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBsaXN0IG9mIGNhbGN1bGF0ZWQgdmFsdWVzIGluIHRoZSBzdXJ2ZXkuXG4gICAqIEBzZWUgQ2FsY3VsYXRlZFZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhbGN1bGF0ZWRWYWx1ZXMoKTogQXJyYXk8Q2FsY3VsYXRlZFZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNhbGN1bGF0ZWRWYWx1ZXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBjYWxjdWxhdGVkVmFsdWVzKHZhbDogQXJyYXk8Q2FsY3VsYXRlZFZhbHVlPikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNhbGN1bGF0ZWRWYWx1ZXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGFuIGlkZW50aWZpZXIgb2YgYSBzdXJ2ZXkgbW9kZWwgbG9hZGVkIGZyb20gdGhlIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlLiBXaGVuIHNwZWNpZmllZCwgdGhlIHN1cnZleSBKU09OIGlzIGF1dG9tYXRpY2FsbHkgbG9hZGVkIGZyb20gW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UuXG4gICAqIEBzZWUgbG9hZFN1cnZleUZyb21TZXJ2aWNlXG4gICAqIEBzZWUgb25Mb2FkZWRTdXJ2ZXlGcm9tU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdXJ2ZXlJZFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1cnZleUlkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5SWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGFuIGlkZW50aWZpZXIgb2YgYSBzdXJ2ZXkgbW9kZWwgc2F2ZWQgdG8gdGhlIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlLiBXaGVuIHNwZWNpZmllZCwgdGhlIHN1cnZleSBkYXRhIGlzIGF1dG9tYXRpY2FsbHkgc2F2ZWQgdG8gdGhlIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlLlxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICogQHNlZSBzdXJ2ZXlTaG93RGF0YVNhdmluZ1xuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlQb3N0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5UG9zdElkXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3VydmV5UG9zdElkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5UG9zdElkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB1c2VyJ3MgaWRlbnRpZmllciAoZS5nLiwgZS1tYWlsIG9yIHVuaXF1ZSBjdXN0b21lciBpZCkgaW4geW91ciB3ZWIgYXBwbGljYXRpb24uXG4gICAqIElmIHlvdSBsb2FkIHN1cnZleSBvciBwb3N0IHN1cnZleSByZXN1bHRzIGZyb20vdG8gW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UsIHRoZW4gdGhlIGxpYnJhcnkgZG8gbm90IGFsbG93IHVzZXJzIHRvIHJ1biB0aGUgc2FtZSBzdXJ2ZXkgdGhlIHNlY29uZCB0aW1lLlxuICAgKiBPbiB0aGUgc2Vjb25kIHJ1biwgdGhlIHVzZXIgd2lsbCBzZWUgdGhlIHN1cnZleSBjb21wbGV0ZSBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBjbGllbnRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjbGllbnRJZFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsaWVudElkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2xpZW50SWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgY29va2llIG5hbWUgdXNlZCB0byBzYXZlIGluZm9ybWF0aW9uIGFib3V0IGNvbXBsZXRpbmcgdGhlIHN1cnZleS5cbiAgICogSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBlbXB0eSwgYmVmb3JlIHN0YXJ0aW5nIHRoZSBzdXJ2ZXksIHRoZSBTdXJ2ZXkgbGlicmFyeSBjaGVja3MgaWYgdGhlIGNvb2tpZSB3aXRoIHRoaXMgbmFtZSBleGlzdHMuXG4gICAqIElmIGl0IGlzIGB0cnVlYCwgdGhlIHN1cnZleSBnb2VzIHRvIGNvbXBsZXRlIG1vZGUgYW5kIGEgdXNlciBzZWVzIHRoZSBzdXJ2ZXkgY29tcGxldGUgcGFnZS4gT24gY29tcGxldGluZyB0aGUgc3VydmV5IHRoZSBjb29raWUgd2l0aCB0aGlzIG5hbWUgaXMgY3JlYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29va2llTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb29raWVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29va2llTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvb2tpZU5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdG8gc2F2ZSBzdXJ2ZXkgcmVzdWx0cyBvbiBjb21wbGV0aW5nIGV2ZXJ5IHBhZ2UuIElmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBzZXQgdG8gYHRydWVgLCB0aGUgYG9uUGFydGlhbFNlbmRgIGV2ZW50IGlzIGZpcmVkLlxuICAgKiBAc2VlIG9uUGFydGlhbFNlbmRcbiAgICogQHNlZSBjbGllbnRJZFxuICAgKi9cbiAgcHVibGljIGdldCBzZW5kUmVzdWx0T25QYWdlTmV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2VuZFJlc3VsdE9uUGFnZU5leHRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VuZFJlc3VsdE9uUGFnZU5leHQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2VuZFJlc3VsdE9uUGFnZU5leHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdG8gc2hvdyB0aGUgcHJvZ3Jlc3Mgb24gc2F2aW5nL3NlbmRpbmcgZGF0YSBpbnRvIHRoZSBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZS5cbiAgICogQHNlZSBzdXJ2ZXlQb3N0SWRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3VydmV5U2hvd0RhdGFTYXZpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVNob3dEYXRhU2F2aW5nXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1cnZleVNob3dEYXRhU2F2aW5nKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN1cnZleVNob3dEYXRhU2F2aW5nXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRoZSBmaXJzdCBpbnB1dCBpcyBmb2N1c2VkIG9uIHNob3dpbmcgYSBuZXh0IG9yIGEgcHJldmlvdXMgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRoZSBmaXJzdCBpbnB1dCBpcyBmb2N1c2VkIGlmIHRoZSBjdXJyZW50IHBhZ2UgaGFzIGVycm9ycy5cbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gYGZhbHNlYCAodGhlIGRlZmF1bHQgdmFsdWUgaXMgYHRydWVgKSBpZiB5b3UgZG8gbm90IHdhbnQgdG8gYnJpbmcgdGhlIGZvY3VzIHRvIHRoZSBmaXJzdCBxdWVzdGlvbiB0aGF0IGhhcyBlcnJvciBvbiB0aGUgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZm9jdXNPbkZpcnN0RXJyb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImZvY3VzT25GaXJzdEVycm9yXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgZm9jdXNPbkZpcnN0RXJyb3IodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNPbkZpcnN0RXJyb3JcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBuYXZpZ2F0aW9uIGJ1dHRvbnMgcG9zaXRpb24uXG4gICAqIFBvc3NpYmxlIHZhbHVlczogJ2JvdHRvbScgKGRlZmF1bHQpLCAndG9wJywgJ2JvdGgnIGFuZCAnbm9uZScuIFNldCBpdCB0byAnbm9uZScgdG8gaGlkZSAnUHJldicsICdOZXh0JyBhbmQgJ0NvbXBsZXRlJyBidXR0b25zLlxuICAgKiBJdCBtYWtlcyBzZW5zZSBpZiB5b3UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhIGN1c3RvbSBuYXZpZ2F0aW9uLCBoYXZlIG9ubHkgYSBzaW5nbGUgcGFnZSwgb3IgdGhlIGBnb05leHRQYWdlQXV0b21hdGljYCBwcm9wZXJ0eSBpcyBzZXQgdG8gYHRydWVgLlxuICAgKiBAc2VlIGdvTmV4dFBhZ2VBdXRvbWF0aWNcbiAgICogQHNlZSBzaG93UHJldkJ1dHRvblxuICAgKi9cbiAgcHVibGljIGdldCBzaG93TmF2aWdhdGlvbkJ1dHRvbnMoKTogc3RyaW5nIHwgYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd05hdmlnYXRpb25CdXR0b25zXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd05hdmlnYXRpb25CdXR0b25zKHZhbDogc3RyaW5nIHwgYW55KSB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsID0gXCJib3R0b21cIjtcbiAgICB9XG4gICAgaWYgKHZhbCA9PT0gZmFsc2UpIHtcbiAgICAgIHZhbCA9IFwibm9uZVwiO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93TmF2aWdhdGlvbkJ1dHRvbnNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdGhlIFN1cnZleSBkaXNwbGF5cyBcIlByZXZcIiBidXR0b24gaW4gaXRzIHBhZ2VzLiBTZXQgaXQgdG8gYGZhbHNlYCB0byBwcmV2ZW50IGVuZC11c2VycyBmcm9tIGdvaW5nIGJhY2sgdG8gdGhlaXIgYW5zd2Vycy5cbiAgICogQHNlZSBzaG93TmF2aWdhdGlvbkJ1dHRvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1ByZXZCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQcmV2QnV0dG9uXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1ByZXZCdXR0b24odmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1ByZXZCdXR0b25cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdGhlIFN1cnZleSBkaXNwbGF5cyBzdXJ2ZXkgdGl0bGUgaW4gaXRzIHBhZ2VzLiBTZXQgaXQgdG8gYGZhbHNlYCB0byBoaWRlIGEgc3VydmV5IHRpdGxlLlxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1RpdGxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUaXRsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0aGUgU3VydmV5IGRpc3BsYXlzIHBhZ2UgdGl0bGVzLiBTZXQgaXQgdG8gYGZhbHNlYCB0byBoaWRlIHBhZ2UgdGl0bGVzLlxuICAgKiBAc2VlIFBhZ2VNb2RlbC50aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UGFnZVRpdGxlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1BhZ2VUaXRsZXNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UGFnZVRpdGxlcyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZVRpdGxlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBPbiBmaW5pc2hpbmcgdGhlIHN1cnZleSB0aGUgY29tcGxldGUgcGFnZSBpcyBzaG93bi4gU2V0IHRoZSBwcm9wZXJ0eSB0byBgZmFsc2VgLCB0byBoaWRlIHRoZSBjb21wbGV0ZSBwYWdlLlxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqIEBzZWUgbmF2aWdhdGVUb1VybFxuICAgKi9cbiAgcHVibGljIGdldCBzaG93Q29tcGxldGVkUGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0NvbXBsZXRlZFBhZ2VcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93Q29tcGxldGVkUGFnZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93Q29tcGxldGVkUGFnZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBhIHVybCB5b3Ugd2FudCB0byBuYXZpZ2F0ZSBhZnRlciBhIHVzZXIgY29tcGxldGluZyB0aGUgc3VydmV5LlxuICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgYWZ0ZXIgY2FsbGluZyBvbkNvbXBsZXRlIGV2ZW50LiBJbiBjYXNlIGNhbGxpbmcgb3B0aW9ucy5zaG93RGF0YVNhdmluZyBjYWxsYmFjayBpbiBvbkNvbXBsZXRlIGV2ZW50LCBuYXZpZ2F0ZVRvVXJsIHdpbGwgYmUgdXNlZCBvbiBjYWxsaW5nIG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdTdWNjZXNzIGNhbGxiYWNrLlxuICAgKi9cbiAgcHVibGljIGdldCBuYXZpZ2F0ZVRvVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5hdmlnYXRlVG9VcmxcIik7XG4gIH1cbiAgcHVibGljIHNldCBuYXZpZ2F0ZVRvVXJsKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGVUb1VybFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBsaXN0IG9mIFVSTCBjb25kaXRpb24gaXRlbXMuIElmIHRoZSBleHByZXNzaW9uIG9mIHRoaXMgaXRlbSByZXR1cm5zIGB0cnVlYCwgdGhlbiBzdXJ2ZXkgd2lsbCBuYXZpZ2F0ZSB0byB0aGUgaXRlbSBVUkwuXG4gICAqIEBzZWUgVXJsQ29uZGl0aW9uSXRlbVxuICAgKiBAc2VlIG5hdmlnYXRlVG9VcmxcbiAgICovXG4gIHB1YmxpYyBnZXQgbmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uKCk6IEFycmF5PFVybENvbmRpdGlvbkl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uKHZhbDogQXJyYXk8VXJsQ29uZGl0aW9uSXRlbT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb25cIiwgdmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROYXZpZ2F0ZVRvVXJsKCk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmdldEV4cHJlc3Npb25JdGVtT25SdW5Db25kaXRpb24oXG4gICAgICB0aGlzLm5hdmlnYXRlVG9VcmxPbkNvbmRpdGlvblxuICAgICk7XG4gICAgdmFyIHVybCA9ICEhaXRlbSA/ICg8VXJsQ29uZGl0aW9uSXRlbT5pdGVtKS51cmwgOiB0aGlzLm5hdmlnYXRlVG9Vcmw7XG4gICAgaWYgKCEhdXJsKSB7XG4gICAgICB1cmwgPSB0aGlzLnByb2Nlc3NUZXh0KHVybCwgdHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvKCkge1xuICAgIHZhciB1cmwgPSB0aGlzLmdldE5hdmlnYXRlVG9VcmwoKTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgdXJsOiB1cmwgfTtcbiAgICB0aGlzLm9uTmF2aWdhdGVUb1VybC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIGlmICghb3B0aW9ucy51cmwgfHwgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhd2luZG93LmxvY2F0aW9uKVxuICAgICAgcmV0dXJuO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gb3B0aW9ucy51cmw7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgcmVxdWlyZWQgcXVlc3Rpb24gbWFyay4gVGhlIHJlcXVpcmVkIHF1ZXN0aW9uIG1hcmsgaXMgYSBjaGFyIG9yIHN0cmluZyB0aGF0IGlzIHJlbmRlcmVkIGluIHRoZSByZXF1aXJlZCBxdWVzdGlvbnMnIHRpdGxlcy5cbiAgICogQHNlZSBRdWVzdGlvbi50aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVxdWlyZWRUZXh0XCIsIFwiKlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlcXVpcmVkVGV4dFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0byBoaWRlIGFsbCByZXF1aXJlZCBlcnJvcnMuXG4gICAqL1xuICBwdWJsaWMgaGlkZVJlcXVpcmVkRXJyb3JzOiBib29sZWFuID0gZmFsc2U7XG4gIGJlZm9yZVNldHRpbmdRdWVzdGlvbkVycm9ycyhcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+XG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhpZGVSZXF1aXJlZEVycm9ycykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGVycm9yc1tpXS5nZXRFcnJvclR5cGUoKSA9PSBcInJlcXVpcmVkXCIpIHtcbiAgICAgICAgICBlcnJvcnNbaV0udmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25TZXR0aW5nUXVlc3Rpb25FcnJvcnMuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBlcnJvcnM6IGVycm9ycyxcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBmaXJzdCBxdWVzdGlvbiBpbmRleC4gVGhlIGZpcnN0IHF1ZXN0aW9uIGluZGV4IGlzICcxJyBieSBkZWZhdWx0LiBZb3UgbWF5IHN0YXJ0IGl0IGZyb20gJzEwMCcgb3IgZnJvbSAnQScsIGJ5IHNldHRpbmcgJzEwMCcgb3IgJ0EnIHRvIHRoaXMgcHJvcGVydHkuXG4gICAqIFlvdSBjYW4gc2V0IHRoZSBzdGFydCBpbmRleCB0byBcIigxKVwiIG9yIFwiIyBBKVwiIG9yIFwiYSlcIiB0byByZW5kZXIgcXVlc3Rpb24gbnVtYmVyIGFzICgxKSwgIyBBKSBhbmQgYSkgYWNjb3JkaW5nbHkuXG4gICAqIEBzZWUgUXVlc3Rpb24udGl0bGVcbiAgICogQHNlZSByZXF1aXJlZFRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25TdGFydEluZGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uU3RhcnRJbmRleCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0aGUgXCJPdGhlcnNcIiBvcHRpb24gdGV4dCBpcyBzdG9yZWQgYXMgcXVlc3Rpb24gY29tbWVudC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCB0aGUgZW50ZXJlZCB0ZXh0IGluIHRoZSBcIk90aGVyc1wiIGlucHV0IGluIHRoZSBjaGVja2JveC9yYWRpb2dyb3VwL2Ryb3Bkb3duIGlzIHN0b3JlZCBhcyBgXCJxdWVzdGlvbiBuYW1lIFwiICsgXCItQ29tbWVudFwiYC4gVGhlIHZhbHVlIGl0c2VsZiBpcyBgXCJxdWVzdGlvbiBuYW1lXCI6IFwib3RoZXJzXCJgLlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBgZmFsc2VgLCB0byBzdG9yZSB0aGUgZW50ZXJlZCB0ZXh0IGRpcmVjdGx5IGluIHRoZSBgXCJxdWVzdGlvbiBuYW1lXCJgIGtleS5cbiAgICogQHNlZSBjb21tZW50UHJlZml4XG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZGVmYXVsdCBtYXhpbXVtIGxlbmd0aCBmb3IgcXVlc3Rpb25zIGxpa2UgdGV4dCBhbmQgY29tbWVudCwgaW5jbHVkaW5nIG1hdHJpeCBjZWxsIHF1ZXN0aW9ucy5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgYDBgLCB0aGF0IG1lYW5zIHRoYXQgdGhlIHRleHQgYW5kIGNvbW1lbnQgaGF2ZSB0aGUgc2FtZSBtYXggbGVuZ3RoIGFzIHRoZSBzdGFuZGFyZCBIVE1MIGlucHV0IC0gNTI0Mjg4IGNoYXJhY3RlcnM6IGh0dHBzOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy9hdHRfaW5wdXRfbWF4bGVuZ3RoLmFzcC5cbiAgICogQHNlZSBtYXhPdGhlcnNMZW5ndGhcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4VGV4dExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUZXh0TGVuZ3RoXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VGV4dExlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFRleHRMZW5ndGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBkZWZhdWx0IG1heGltdW0gbGVuZ3RoIGZvciBxdWVzdGlvbiBjb21tZW50cyBhbmQgb3RoZXJzXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGAwYCwgdGhhdCBtZWFucyB0aGF0IHRoZSBxdWVzdGlvbiBjb21tZW50cyBoYXZlIHRoZSBzYW1lIG1heCBsZW5ndGggYXMgdGhlIHN0YW5kYXJkIEhUTUwgaW5wdXQgLSA1MjQyODggY2hhcmFjdGVyczogaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS90YWdzL2F0dF9pbnB1dF9tYXhsZW5ndGguYXNwLlxuICAgKiBAc2VlIFF1ZXN0aW9uLmhhc0NvbW1lbnRcbiAgICogQHNlZSBRdWVzdGlvbi5oYXNPdGhlclxuICAgKiBAc2VlIG1heFRleHRMZW5ndGhcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4T3RoZXJzTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heE90aGVyc0xlbmd0aFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heE90aGVyc0xlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heE90aGVyc0xlbmd0aFwiLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2VzIHdoZXRoZXIgYSB1c2VyIGNhbiBuYXZpZ2F0ZSB0aGUgbmV4dCBwYWdlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgYW5zd2VyaW5nIGFsbCB0aGUgcXVlc3Rpb25zIG9uIGEgcGFnZSB3aXRob3V0IHByZXNzaW5nIHRoZSBcIk5leHRcIiBidXR0b24uXG4gICAqIFRoZSBhdmFpbGFibGUgb3B0aW9uczpcbiAgICpcbiAgICogLSBgdHJ1ZWAgLSBuYXZpZ2F0ZSB0aGUgbmV4dCBwYWdlIGFuZCBzdWJtaXQgc3VydmV5IGRhdGEgYXV0b21hdGljYWxseS5cbiAgICogLSBgYXV0b2dvbmV4dGAgLSBuYXZpZ2F0ZSB0aGUgbmV4dCBwYWdlIGF1dG9tYXRpY2FsbHkgYnV0IGRvIG5vdCBzdWJtaXQgc3VydmV5IGRhdGEuXG4gICAqIC0gYGZhbHNlYCAtIGRvIG5vdCBuYXZpZ2F0ZSB0aGUgbmV4dCBwYWdlIGFuZCBkbyBub3Qgc3VibWl0IHN1cnZleSBkYXRhIGF1dG9tYXRpY2FsbHkuXG4gICAqIEBzZWUgc2hvd05hdmlnYXRpb25CdXR0b25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGdvTmV4dFBhZ2VBdXRvbWF0aWMoKTogYm9vbGVhbiB8IFwiYXV0b2dvbmV4dFwiIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZ29OZXh0UGFnZUF1dG9tYXRpY1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBnb05leHRQYWdlQXV0b21hdGljKHZhbDogYm9vbGVhbiB8IFwiYXV0b2dvbmV4dFwiKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZ29OZXh0UGFnZUF1dG9tYXRpY1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciBhIHN1cnZleSBpcyBhdXRvbWF0aWNhbGx5IGNvbXBsZXRlZCB3aGVuIGBnb05leHRQYWdlQXV0b21hdGljID0gdHJ1ZWAuIFNldCBpdCB0byBgZmFsc2VgIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzdWJtaXQgc3VydmV5IGF1dG9tYXRpY2FsbHkgb24gY29tcGxldGluZyB0aGUgbGFzdCBzdXJ2ZXkgcGFnZS5cbiAgICogQHNlZSBnb05leHRQYWdlQXV0b21hdGljXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93Q29tcGxldGVTdXJ2ZXlBdXRvbWF0aWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93Q29tcGxldGVTdXJ2ZXlBdXRvbWF0aWNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0NvbXBsZXRlU3VydmV5QXV0b21hdGljKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93Q29tcGxldGVTdXJ2ZXlBdXRvbWF0aWNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgdGhhdCBzcGVjaWZpZXMgaG93IHRoZSBzdXJ2ZXkgdmFsaWRhdGVzIHRoZSBxdWVzdGlvbiBhbnN3ZXJzLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgb25OZXh0UGFnZWAgKGRlZmF1bHQpIC0gY2hlY2sgZXJyb3JzIG9uIG5hdmlnYXRpbmcgdG8gdGhlIG5leHQgcGFnZSBvciBvbiBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkuXG4gICAqIC0gYG9uVmFsdWVDaGFuZ2VkYCAtIGNoZWNrIGVycm9ycyBvbiBldmVyeSBxdWVzdGlvbiB2YWx1ZSAoaS5lLiwgYW5zd2VyKSBjaGFuZ2luZy5cbiAgICogLSBgb25Db21wbGV0ZWAgLSB0byB2YWxpZGF0ZSBhbGwgdmlzaWJsZSBxdWVzdGlvbnMgb24gY29tcGxldGUgYnV0dG9uIGNsaWNrLiBJZiB0aGVyZSBhcmUgZXJyb3JzIG9uIHByZXZpb3VzIHBhZ2VzLCB0aGVuIHRoZSBwYWdlIHdpdGggdGhlIGZpcnN0IGVycm9yIGJlY29tZXMgdGhlIGN1cnJlbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNoZWNrRXJyb3JzTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaGVja0Vycm9yc01vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBjaGVja0Vycm9yc01vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaGVja0Vycm9yc01vZGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgdGhhdCBzcGVjaWZpZXMgaG93IHRoZSBzdXJ2ZXkgdXBkYXRlcyBpdHMgcXVlc3Rpb25zJyB0ZXh0IHZhbHVlcy5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYG9uQmx1cmAgKGRlZmF1bHQpIC0gdGhlIHZhbHVlIGlzIHVwZGF0ZWQgYWZ0ZXIgYW4gaW5wdXQgbG9zZXMgdGhlIGZvY3VzLlxuICAgKiAtIGBvblR5cGluZ2AgLSB1cGRhdGUgdGhlIHZhbHVlIG9mIHRleHQgcXVlc3Rpb25zLCBcInRleHRcIiBhbmQgXCJjb21tZW50XCIsIG9uIGV2ZXJ5IGtleSBwcmVzcy5cbiAgICpcbiAgICogTm90ZSwgdGhhdCBzZXR0aW5nIHRvIFwib25UeXBpbmdcIiBtYXkgbGVhZCB0byBhIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLCBpbiBjYXNlIHlvdSBoYXZlIG1hbnkgZXhwcmVzc2lvbnMgaW4gdGhlIHN1cnZleS5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGV4dFVwZGF0ZU1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGV4dFVwZGF0ZU1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCB0ZXh0VXBkYXRlTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRleHRVcGRhdGVNb2RlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIHRoYXQgc3BlY2lmaWVzIGhvdyB0aGUgaW52aXNpYmxlIGRhdGEgaXMgaW5jbHVkZWQgaW4gc3VydmV5IGRhdGEuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKlxuICAgKiAtIGBub25lYCAtIGluY2x1ZGUgdGhlIGludmlzaWJsZSB2YWx1ZXMgaW50byB0aGUgc3VydmV5IGRhdGEuXG4gICAqIC0gYG9uSGlkZGVuYCAtIGNsZWFyIHRoZSBxdWVzdGlvbiB2YWx1ZSB3aGVuIGl0IGJlY29tZXMgaW52aXNpYmxlLiBJZiBhIHF1ZXN0aW9uIGhhcyB2YWx1ZSBhbmQgaXQgd2FzIGludmlzaWJsZSBpbml0aWFsbHkgdGhlbiBzdXJ2ZXkgY2xlYXJzIHRoZSB2YWx1ZSBvbiBjb21wbGV0aW5nLlxuICAgKiAtIGBvbkNvbXBsZXRlYCAoZGVmYXVsdCkgLSBjbGVhciBpbnZpc2libGUgcXVlc3Rpb24gdmFsdWVzIG9uIHN1cnZleSBjb21wbGV0ZS4gSW4gdGhpcyBjYXNlLCB0aGUgaW52aXNpYmxlIHF1ZXN0aW9ucyB3aWxsIG5vdCBiZSBzdG9yZWQgb24gdGhlIHNlcnZlci5cbiAgICogQHNlZSBRdWVzdGlvbi52aXNpYmxlXG4gICAqIEBzZWUgb25Db21wbGV0ZVxuICAgKi9cbiAgcHVibGljIGdldCBjbGVhckludmlzaWJsZVZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjbGVhckludmlzaWJsZVZhbHVlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNsZWFySW52aXNpYmxlVmFsdWVzKHZhbDogYW55KSB7XG4gICAgaWYgKHZhbCA9PT0gdHJ1ZSkgdmFsID0gXCJvbkNvbXBsZXRlXCI7XG4gICAgaWYgKHZhbCA9PT0gZmFsc2UpIHZhbCA9IFwibm9uZVwiO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNsZWFySW52aXNpYmxlVmFsdWVzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZW1vdmUgYWxsIHF1ZXN0aW9uIHZhbHVlcyBmcm9tIHRoZSBzdXJ2ZXksIHRoYXQgZW5kLXVzZXIgd2lsbCBub3QgYmUgYWJsZSB0byBlbnRlci5cbiAgICogRm9yIGV4YW1wbGUgdGhlIHZhbHVlIHRoYXQgZG9lc24ndCBleGlzdHMgaW4gYSByYWRpb2dyb3VwL2Ryb3Bkb3duL2NoZWNrYm94IGNob2ljZXMgb3IgbWF0cml4IHJvd3MvY29sdW1ucy5cbiAgICogUGxlYXNlIG5vdGUsIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBjbGVhciB2YWx1ZXMgZm9yIGludmlzaWJsZSBxdWVzdGlvbnMgb3IgdmFsdWVzIHRoYXQgZG9lc24ndCBhc3NvY2lhdGVkIHdpdGggcXVlc3Rpb25zLlxuICAgKiBJbiBmYWN0IHRoaXMgZnVuY3Rpb24ganVzdCBjYWxsIGNsZWFySW5jb3JyZWN0VmFsdWVzIGZ1bmN0aW9uIG9mIGFsbCBxdWVzdGlvbnMgaW4gdGhlIHN1cnZleVxuICAgKiBAcGFyYW0gcmVtb3ZlTm9uRXhpc2luZ1Jvb3RLZXlzIC0gc2V0IHRoaXMgcGFyYW1ldGVyIHRvIHRydWUgdG8gcmVtb3ZlIGtleXMgZnJvbSBzdXJ2ZXkuZGF0YSB0aGF0IGRvZXNuJ3QgaGF2ZSBjb3JyZXNwb25kZWQgcXVlc3Rpb25zIGFuZCBjYWxjdWxhdGVkIHZhbHVlc1xuICAgKiBAc2VlIFF1ZXN0aW9uLmNsZWFySW5jb3JyZWN0VmFsdWVzXG4gICAqIEBzZWUgUGFnZS5jbGVhckluY29ycmVjdFZhbHVlc1xuICAgKiBAc2VlIFBhbmVsLmNsZWFySW5jb3JyZWN0VmFsdWVzXG4gICAqL1xuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMocmVtb3ZlTm9uRXhpc2luZ1Jvb3RLZXlzOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICB9XG4gICAgaWYoIXJlbW92ZU5vbkV4aXNpbmdSb290S2V5cykgcmV0dXJuO1xuICAgIHZhciBkYXRhID0gdGhpcy5kYXRhO1xuICAgIHZhciBoYXNDaGFuZ2VzID0gZmFsc2U7XG4gICAgZm9yKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgaWYoISF0aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoa2V5KSkgY29udGludWU7XG4gICAgICB2YXIgY2FsY1ZhbHVlID0gdGhpcy5nZXRDYWxjdWxhdGVkVmFsdWVCeU5hbWUoa2V5KTtcbiAgICAgIGlmKCEhY2FsY1ZhbHVlICYmIGNhbGNWYWx1ZS5pbmNsdWRlSW50b1Jlc3VsdCkgY29udGludWU7XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgfVxuICAgIGlmKGhhc0NoYW5nZXMpIHtcbiAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgc3VydmV5IGxvY2FsZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXQgaXMgZW1wdHksIHRoaXMgbWVhbnMgdGhlICdlbicgbG9jYWxlIGlzIHVzZWQuXG4gICAqIFlvdSBjYW4gc2V0IGl0IHRvICdkZScgLSBHZXJtYW4sICdmcicgLSBGcmVuY2ggYW5kIHNvIG9uLiBUaGUgbGlicmFyeSBoYXMgYnVpbHQtaW4gbG9jYWxpemF0aW9uIGZvciBzZXZlcmFsIGxhbmd1YWdlcy4gVGhlIGxpYnJhcnkgaGFzIGEgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydCBhcyB3ZWxsLlxuICAgKi9cbiAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGVWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgc3VydmV5TG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGUgPSB2YWx1ZTtcbiAgICB0aGlzLmxvY2FsZVZhbHVlID0gc3VydmV5TG9jYWxpemF0aW9uLmN1cnJlbnRMb2NhbGU7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibG9jYWxlXCIsIHRoaXMubG9jYWxlVmFsdWUpO1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHRoaXMub25Mb2NhbGVDaGFuZ2VkKCk7XG4gICAgdGhpcy5vbkxvY2FsZUNoYW5nZWRFdmVudC5maXJlKHRoaXMsIHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBsb2NhbGVzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIHN1cnZleSdzIHRyYW5zbGF0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldFVzZWRMb2NhbGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBsb2NzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICB0aGlzLmFkZFVzZWRMb2NhbGVzKGxvY3MpO1xuICAgIC8vUmVwbGFjZSB0aGUgZGVmYXVsdCBsb2NhbGUgd2l0aCB0aGUgcmVhbCBvbmVcbiAgICB2YXIgaW5kZXggPSBsb2NzLmluZGV4T2YoXCJkZWZhdWx0XCIpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB2YXIgZGVmYXVsdExvYyA9IHN1cnZleUxvY2FsaXphdGlvbi5kZWZhdWx0TG9jYWxlO1xuICAgICAgLy9SZW1vdmUgdGhlIGRlZmF1bHRMb2NcbiAgICAgIHZhciBkZWZJbmRleCA9IGxvY3MuaW5kZXhPZihkZWZhdWx0TG9jKTtcbiAgICAgIGlmIChkZWZJbmRleCA+IC0xKSB7XG4gICAgICAgIGxvY3Muc3BsaWNlKGRlZkluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIGluZGV4ID0gbG9jcy5pbmRleE9mKFwiZGVmYXVsdFwiKTtcbiAgICAgIGxvY3NbaW5kZXhdID0gZGVmYXVsdExvYztcbiAgICB9XG4gICAgcmV0dXJuIGxvY3M7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9jYWxlQ2hhbmdlZCgpIHt9XG4gIC8vSUxvY2FsaXphYmxlT3duZXJcbiAgZ2V0TG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZTtcbiAgfVxuICBwdWJsaWMgbG9jU3Ryc0NoYW5nZWQoKSB7XG4gICAgc3VwZXIubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB0aGlzLnVwZGF0ZVByb2dyZXNzVGV4dCgpO1xuICAgIGlmICh0aGlzLmlzU3RhcnRlZFN0YXRlICYmIHRoaXMuc3RhcnRlZFBhZ2UpIHtcbiAgICAgIHRoaXMuc3RhcnRlZFBhZ2UubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UubG9jU3Ryc0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFN1cnZleU1hcmtkb3duSHRtbCh0aGlzLCB0ZXh0KTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzVGV4dCh0ZXh0LCB0cnVlKTtcbiAgfVxuICBnZXRMb2NTdHJpbmcoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhzdHIpO1xuICB9XG4gIC8vSVN1cnZleUVycm9yT3duZXJcbiAgZ2V0RXJyb3JDdXN0b21UZXh0KHRleHQ6IHN0cmluZywgZXJyb3I6IFN1cnZleUVycm9yKTogc3RyaW5nIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgdGV4dDogdGV4dCwgbmFtZTogZXJyb3IuZ2V0RXJyb3JUeXBlKCksIGVycm9yOiBlcnJvciB9O1xuICAgIHRoaXMub25FcnJvckN1c3RvbVRleHQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy50ZXh0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gdGhlcmUgYXJlIG5vIGFueSB2aXNpYmxlIHBhZ2VzIGFuZCBxdWVzdGlvbmEuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVtcHR5U3VydmV5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcImVtcHR5U3VydmV5XCIpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBzdXJ2ZXkgdGl0bGUuXG4gICAqIEBzZWUgZGVzY3JpcHRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHN1cnZleSBkZXNjcmlwdGlvbi4gVGhlIHN1cnZleSBkZXNjcmlwdGlvbiBpcyBkaXNwbGF5ZWQgdW5kZXIgYSBzdXJ2ZXkgdGl0bGUuXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImRlc2NyaXB0aW9uXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHN1cnZleSBsb2dvLlxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvZ28oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsb2dvXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9nbyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsb2dvXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jTG9nbygpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJsb2dvXCIpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBzdXJ2ZXkgbG9nbyB3aWR0aC5cbiAgICogQHNlZSBsb2dvXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxvZ29XaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJsb2dvV2lkdGhcIiwgMzAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvZ29XaWR0aCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibG9nb1dpZHRoXCIsIHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgc3VydmV5IGxvZ28gaGVpZ2h0LlxuICAgKiBAc2VlIGxvZ29cbiAgICovXG4gIHB1YmxpYyBnZXQgbG9nb0hlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJsb2dvSGVpZ2h0XCIsIDIwMCk7XG4gIH1cbiAgcHVibGljIHNldCBsb2dvSGVpZ2h0KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJsb2dvSGVpZ2h0XCIsIHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgc3VydmV5IGxvZ28gcG9zaXRpb24uXG4gICAqIEBzZWUgbG9nb1xuICAgKi9cbiAgcHVibGljIGdldCBsb2dvUG9zaXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibG9nb1Bvc2l0aW9uXCIsIFwibGVmdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvZ29Qb3NpdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibG9nb1Bvc2l0aW9uXCIsIHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0xvZ28oKSB7XG4gICAgcmV0dXJuICEhdGhpcy5sb2dvICYmIHRoaXMubG9nb1Bvc2l0aW9uICE9PSBcIm5vbmVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzTG9nb0JlZm9yZSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5oYXNMb2dvICYmXG4gICAgICAodGhpcy5sb2dvUG9zaXRpb24gPT09IFwibGVmdFwiIHx8IHRoaXMubG9nb1Bvc2l0aW9uID09PSBcInRvcFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBpc0xvZ29BZnRlcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5oYXNMb2dvICYmXG4gICAgICAodGhpcy5sb2dvUG9zaXRpb24gPT09IFwicmlnaHRcIiB8fCB0aGlzLmxvZ29Qb3NpdGlvbiA9PT0gXCJib3R0b21cIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9nb0NsYXNzTmFtZXMoKTogc3RyaW5nIHtcbiAgICB2YXIgbG9nb0NsYXNzZXM6IHsgW2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIGxlZnQ6IFwic3YtbG9nby0tbGVmdFwiLFxuICAgICAgcmlnaHQ6IFwic3YtbG9nby0tcmlnaHRcIixcbiAgICAgIHRvcDogXCJzdi1sb2dvLS10b3BcIixcbiAgICAgIGJvdHRvbTogXCJzdi1sb2dvLS1ib3R0b21cIixcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmNzcy5sb2dvICsgXCIgXCIgKyBsb2dvQ2xhc3Nlc1t0aGlzLmxvZ29Qb3NpdGlvbl07XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsb2dvIGZpdCBtb2RlLlxuICAgKiBAc2VlIGxvZ29cbiAgICovXG4gIHB1YmxpYyBnZXQgbG9nb0ZpdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJsb2dvRml0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9nb0ZpdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImxvZ29GaXRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBIVE1MIGNvbnRlbnQgZGlzcGxheWVkIG9uIHRoZSBjb21wbGV0ZSBwYWdlLiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgY29tcGxldGUgcGFnZSB0ZXh0LlxuICAgKiBAc2VlIHNob3dDb21wbGV0ZWRQYWdlXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbE9uQ29uZGl0aW9uXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRIdG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGxldGVkSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jQ29tcGxldGVkSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRIdG1sXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBIVE1MIGNvbmRpdGlvbiBpdGVtcy4gSWYgdGhlIGV4cHJlc3Npb24gb2YgdGhpcyBpdGVtIHJldHVybnMgYHRydWVgLCB0aGVuIGEgc3VydmV5IHdpbGwgdXNlIHRoaXMgaXRlbSBIVE1MIGluc3RlYWQgb2YgYGNvbXBsZXRlZEh0bWxgLlxuICAgKiBAc2VlIEh0bWxDb25kaXRpb25JdGVtXG4gICAqIEBzZWUgY29tcGxldGVIdG1sXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbigpOiBBcnJheTxIdG1sQ29uZGl0aW9uSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBjb21wbGV0ZWRIdG1sT25Db25kaXRpb24odmFsOiBBcnJheTxIdG1sQ29uZGl0aW9uSXRlbT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb25cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBhIGdpdmVuIGV4cHJlc3Npb24gYW5kIHJldHVybnMgYSByZXN1bHQgdmFsdWUuXG4gICAqIEBwYXJhbSBleHByZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgcnVuRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghZXhwcmVzc2lvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uUnVubmVyKGV4cHJlc3Npb24pLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIGEgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgcmV0dXJucyBgdHJ1ZWAgb3IgYGZhbHNlYC5cbiAgICogQHBhcmFtIGV4cHJlc3Npb25cbiAgICovXG4gIHB1YmxpYyBydW5Db25kaXRpb24oZXhwcmVzc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFleHByZXNzaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgcmV0dXJuIG5ldyBDb25kaXRpb25SdW5uZXIoZXhwcmVzc2lvbikucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgLyoqXG4gICAqIFJ1biBhbGwgdHJpZ2dlcnMgdGhhdCBwZXJmb3JtcyBvbiB2YWx1ZSBjaGFuZ2VkIGFuZCBub3Qgb24gbW92aW5nIHRvIHRoZSBuZXh0IHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgcnVuVHJpZ2dlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5jaGVja1RyaWdnZXJzKHRoaXMuZGF0YSwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRDb21wbGV0ZWRIdG1sKCk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLmdldEV4cHJlc3Npb25JdGVtT25SdW5Db25kaXRpb24oXG4gICAgICB0aGlzLmNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvblxuICAgICk7XG4gICAgcmV0dXJuICEhaXRlbSA/ICg8SHRtbENvbmRpdGlvbkl0ZW0+aXRlbSkuaHRtbCA6IHRoaXMuY29tcGxldGVkSHRtbDtcbiAgfVxuICBwcml2YXRlIGdldEV4cHJlc3Npb25JdGVtT25SdW5Db25kaXRpb24oXG4gICAgaXRlbXM6IEFycmF5PEV4cHJlc3Npb25JdGVtPlxuICApOiBFeHByZXNzaW9uSXRlbSB7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXRlbXNbaV0ucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcykpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1zW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSFRNTCBjb250ZW50IGRpc3BsYXllZCB0byBhbiBlbmQgdXNlciB0aGF0IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgc3VydmV5LlxuICAgKiBAc2VlIGNsaWVudElkXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZEJlZm9yZUh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGxldGVkQmVmb3JlSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jQ29tcGxldGVkQmVmb3JlSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgSFRNTCB0aGF0IHNob3dzIG9uIGxvYWRpbmcgc3VydmV5IEpzb24gZnJvbSB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UuXG4gICAqIEBzZWUgc3VydmV5SWRcbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgbG9hZGluZ0h0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsb2FkaW5nSHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvYWRpbmdIdG1sKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxvYWRpbmdIdG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jTG9hZGluZ0h0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibG9hZGluZ0h0bWxcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgJ1N0YXJ0JyBidXR0b24gY2FwdGlvbi5cbiAgICogVGhlICdTdGFydCcgYnV0dG9uIGlzIHNob3duIG9uIHRoZSBzdGFydGVkIHBhZ2UuIFNldCB0aGUgYGZpcnN0UGFnZUlzU3RhcnRlZGAgcHJvcGVydHkgdG8gYHRydWVgLCB0byBkaXNwbGF5IHRoZSBzdGFydGVkIHBhZ2UuXG4gICAqIEBzZWUgZmlyc3RQYWdlSXNTdGFydGVkXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXJ0U3VydmV5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwic3RhcnRTdXJ2ZXlUZXh0XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInN0YXJ0U3VydmV5VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBzdGFydFN1cnZleVRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwic3RhcnRTdXJ2ZXlUZXh0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jU3RhcnRTdXJ2ZXlUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInN0YXJ0U3VydmV5VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSAnUHJldicgYnV0dG9uIGNhcHRpb24uXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2VQcmV2VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFnZVByZXZUZXh0XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInBhZ2VQcmV2VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlUHJldlRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZVByZXZUZXh0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jUGFnZVByZXZUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhZ2VQcmV2VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSAnTmV4dCcgYnV0dG9uIGNhcHRpb24uXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2VOZXh0VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFnZU5leHRUZXh0XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInBhZ2VOZXh0VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlTmV4dFRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZU5leHRUZXh0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jUGFnZU5leHRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhZ2VOZXh0VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogIEdldHMgb3Igc2V0cyB0aGUgJ0NvbXBsZXRlJyBidXR0b24gY2FwdGlvbi5cbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tcGxldGVUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJjb21wbGV0ZVRleHRcIixcbiAgICAgIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGVUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbXBsZXRlVGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZVRleHRcIiwgbmV3VmFsdWUpO1xuICB9XG4gIGdldCBsb2NDb21wbGV0ZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiAgR2V0cyBvciBzZXRzIHRoZSAnUHJldmlldycgYnV0dG9uIGNhcHRpb24uXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqIEBzZWUgc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZVxuICAgKiBAc2VlIGVkaXRUZXh0XG4gICAqIEBzZWUgc2hvd1ByZXZpZXdcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJldmlld1RleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInByZXZpZXdUZXh0XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInByZXZpZXdUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHByZXZpZXdUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInByZXZpZXdUZXh0XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jUHJldmlld1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicHJldmlld1RleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqICBHZXRzIG9yIHNldHMgdGhlICdFZGl0JyBidXR0b24gY2FwdGlvbi5cbiAgICogQHNlZSBsb2NhbGVcbiAgICogQHNlZSBzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXG4gICAqIEBzZWUgcHJldmlld1RleHRcbiAgICogQHNlZSBjYW5jZWxQcmV2aWV3XG4gICAqL1xuICBwdWJsaWMgZ2V0IGVkaXRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJlZGl0VGV4dFwiLFxuICAgICAgdGhpcy5nZXRMb2NTdHJpbmcoXCJlZGl0VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBlZGl0VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJlZGl0VGV4dFwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0VkaXRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImVkaXRUZXh0XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcGF0dGVybiBmb3IgcXVlc3Rpb24gdGl0bGUuIERlZmF1bHQgaXMgXCJudW1UaXRsZVJlcXVpcmVcIiwgMS4gV2hhdCBpcyB5b3VyIG5hbWU/ICosXG4gICAqIFlvdSBjYW4gc2V0IGl0IHRvIG51bVJlcXVpcmVUaXRsZTogMS4gKiBXaGF0IGlzIHlvdXIgbmFtZT9cbiAgICogWW91IGNhbiBzZXQgaXQgdG8gcmVxdWlyZU51bVRpdGxlOiAqIDEuIFdoYXQgaXMgeW91ciBuYW1lP1xuICAgKiBZb3UgY2FuIHNldCBpdCB0byBudW1UaXRsZSAocmVtb3ZlIHJlcXVpcmUgc3ltYm9sIGNvbXBsZXRlbHkpOiAxLiBXaGF0IGlzIHlvdXIgbmFtZT9cbiAgICogQHNlZSBRdWVzdGlvbk1vZGVsLnRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVQYXR0ZXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uVGl0bGVQYXR0ZXJuXCIsIFwibnVtVGl0bGVSZXF1aXJlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25UaXRsZVBhdHRlcm4odmFsOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICB2YWwgIT09IFwibnVtUmVxdWlyZVRpdGxlXCIgJiZcbiAgICAgIHZhbCAhPT0gXCJyZXF1aXJlTnVtVGl0bGVcIiAmJlxuICAgICAgdmFsICE9IFwibnVtVGl0bGVcIlxuICAgICkge1xuICAgICAgdmFsID0gXCJudW1UaXRsZVJlcXVpcmVcIjtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZVBhdHRlcm5cIiwgdmFsKTtcbiAgfVxuICBnZXRRdWVzdGlvblRpdGxlUGF0dGVybk9wdGlvbnMoKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgdmFyIHRpdGxlID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJxdWVzdGlvblRpdGxlUGF0dGVyblRleHRcIik7XG4gICAgdmFyIG51bSA9ICEhdGhpcy5xdWVzdGlvblN0YXJ0SW5kZXggPyB0aGlzLnF1ZXN0aW9uU3RhcnRJbmRleCA6IFwiMS5cIjtcbiAgICByZXMucHVzaCh7XG4gICAgICB2YWx1ZTogXCJudW1UaXRsZVJlcXVpcmVcIixcbiAgICAgIHRleHQ6IG51bSArIFwiIFwiICsgdGl0bGUgKyBcIiBcIiArIHRoaXMucmVxdWlyZWRUZXh0LFxuICAgIH0pO1xuICAgIHJlcy5wdXNoKHtcbiAgICAgIHZhbHVlOiBcIm51bVJlcXVpcmVUaXRsZVwiLFxuICAgICAgdGV4dDogbnVtICsgXCIgXCIgKyB0aGlzLnJlcXVpcmVkVGV4dCArIFwiIFwiICsgdGl0bGUsXG4gICAgfSk7XG4gICAgcmVzLnB1c2goe1xuICAgICAgdmFsdWU6IFwicmVxdWlyZU51bVRpdGxlXCIsXG4gICAgICB0ZXh0OiB0aGlzLnJlcXVpcmVkVGV4dCArIFwiIFwiICsgbnVtICsgXCIgXCIgKyB0aXRsZSxcbiAgICB9KTtcbiAgICByZXMucHVzaCh7XG4gICAgICB2YWx1ZTogXCJudW1UaXRsZVwiLFxuICAgICAgdGV4dDogbnVtICsgXCIgXCIgKyB0aXRsZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBxdWVzdGlvbiB0aXRsZSB0ZW1wbGF0ZS4gT2Jzb2xldGUsIHBsZWFzZSB1c2UgcXVlc3Rpb25UaXRsZVBhdHRlcm5cbiAgICogQHNlZSBRdWVzdGlvbk1vZGVsLnRpdGxlXG4gICAqIEBzZWUgcXVlc3Rpb25UaXRsZVBhdHRlcm5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25UaXRsZVRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25UaXRsZVRlbXBsYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLCB2YWx1ZSk7XG4gICAgdGhpcy5xdWVzdGlvblRpdGxlUGF0dGVybiA9IHRoaXMuZ2V0TmV3VGl0bGVQYXR0ZXJuKHZhbHVlKTtcbiAgICB0aGlzLnF1ZXN0aW9uU3RhcnRJbmRleCA9IHRoaXMuZ2V0TmV3UXVlc3Rpb25UaXRsZUVsZW1lbnQoXG4gICAgICB2YWx1ZSxcbiAgICAgIFwibm9cIixcbiAgICAgIHRoaXMucXVlc3Rpb25TdGFydEluZGV4LFxuICAgICAgXCIxXCJcbiAgICApO1xuICAgIHRoaXMucmVxdWlyZWRUZXh0ID0gdGhpcy5nZXROZXdRdWVzdGlvblRpdGxlRWxlbWVudChcbiAgICAgIHZhbHVlLFxuICAgICAgXCJyZXF1aXJlXCIsXG4gICAgICB0aGlzLnJlcXVpcmVkVGV4dCxcbiAgICAgIFwiKlwiXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldE5ld1RpdGxlUGF0dGVybih0ZW1wbGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoISF0ZW1wbGF0ZSkge1xuICAgICAgdmFyIHN0cnMgPSBbXTtcbiAgICAgIHdoaWxlICh0ZW1wbGF0ZS5pbmRleE9mKFwie1wiKSA+IC0xKSB7XG4gICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUuc3Vic3RyKHRlbXBsYXRlLmluZGV4T2YoXCJ7XCIpICsgMSk7XG4gICAgICAgIHZhciBpbmQgPSB0ZW1wbGF0ZS5pbmRleE9mKFwifVwiKTtcbiAgICAgICAgaWYgKGluZCA8IDApIGJyZWFrO1xuICAgICAgICBzdHJzLnB1c2godGVtcGxhdGUuc3Vic3RyKDAsIGluZCkpO1xuICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLnN1YnN0cihpbmQgKyAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaWYgKHN0cnNbMF0gPT0gXCJyZXF1aXJlXCIpIHJldHVybiBcInJlcXVpcmVOdW1UaXRsZVwiO1xuICAgICAgICBpZiAoc3Ryc1sxXSA9PSBcInJlcXVpcmVcIiAmJiBzdHJzLmxlbmd0aCA9PSAzKSByZXR1cm4gXCJudW1SZXF1aXJlVGl0bGVcIjtcbiAgICAgICAgaWYgKHN0cnMuaW5kZXhPZihcInJlcXVpcmVcIikgPCAwKSByZXR1cm4gXCJudW1UaXRsZVwiO1xuICAgICAgfVxuICAgICAgaWYgKHN0cnMubGVuZ3RoID09IDEgJiYgc3Ryc1swXSA9PSBcInRpdGxlXCIpIHtcbiAgICAgICAgcmV0dXJuIFwibnVtVGl0bGVcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwibnVtVGl0bGVSZXF1aXJlXCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXROZXdRdWVzdGlvblRpdGxlRWxlbWVudChcbiAgICB0ZW1wbGF0ZTogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjdXJyZW50VmFsdWU6IHN0cmluZyxcbiAgICBkZWZhdWx0VmFsdWU6IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIG5hbWUgPSBcIntcIiArIG5hbWUgKyBcIn1cIjtcbiAgICBpZiAoIXRlbXBsYXRlIHx8IHRlbXBsYXRlLmluZGV4T2YobmFtZSkgPCAwKSByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgIHZhciBpbmQgPSB0ZW1wbGF0ZS5pbmRleE9mKG5hbWUpO1xuICAgIHZhciBwcmVmaXggPSBcIlwiO1xuICAgIHZhciBwb3N0Zml4ID0gXCJcIjtcbiAgICB2YXIgaSA9IGluZCAtIDE7XG4gICAgZm9yICg7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAodGVtcGxhdGVbaV0gPT0gXCJ9XCIpIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoaSA8IGluZCAtIDEpIHtcbiAgICAgIHByZWZpeCA9IHRlbXBsYXRlLnN1YnN0cihpICsgMSwgaW5kIC0gaSAtIDEpO1xuICAgIH1cbiAgICBpbmQgKz0gbmFtZS5sZW5ndGg7XG4gICAgaSA9IGluZDtcbiAgICBmb3IgKDsgaSA8IHRlbXBsYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGVtcGxhdGVbaV0gPT0gXCJ7XCIpIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoaSA+IGluZCkge1xuICAgICAgcG9zdGZpeCA9IHRlbXBsYXRlLnN1YnN0cihpbmQsIGkgLSBpbmQpO1xuICAgIH1cbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IHByZWZpeC5sZW5ndGggJiYgcHJlZml4LmNoYXJDb2RlQXQoaSkgPCAzMykgaSsrO1xuICAgIHByZWZpeCA9IHByZWZpeC5zdWJzdHIoaSk7XG4gICAgaSA9IHBvc3RmaXgubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoaSA+PSAwICYmIHBvc3RmaXguY2hhckNvZGVBdChpKSA8IDMzKSBpLS07XG4gICAgcG9zdGZpeCA9IHBvc3RmaXguc3Vic3RyKDAsIGkgKyAxKTtcbiAgICBpZiAoIXByZWZpeCAmJiAhcG9zdGZpeCkgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB2YXIgdmFsdWUgPSAhIWN1cnJlbnRWYWx1ZSA/IGN1cnJlbnRWYWx1ZSA6IGRlZmF1bHRWYWx1ZTtcbiAgICByZXR1cm4gcHJlZml4ICsgdmFsdWUgKyBwb3N0Zml4O1xuICB9XG4gIGdldCBsb2NRdWVzdGlvblRpdGxlVGVtcGxhdGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIpO1xuICB9XG4gIGdldFVwZGF0ZWRRdWVzdGlvblRpdGxlKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9uR2V0UXVlc3Rpb25UaXRsZS5pc0VtcHR5KSByZXR1cm4gdGl0bGU7XG4gICAgdmFyIG9wdGlvbnMgPSB7IHF1ZXN0aW9uOiBxdWVzdGlvbiwgdGl0bGU6IHRpdGxlIH07XG4gICAgdGhpcy5vbkdldFF1ZXN0aW9uVGl0bGUuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy50aXRsZTtcbiAgfVxuICBnZXRVcGRhdGVkUXVlc3Rpb25ObyhxdWVzdGlvbjogSVF1ZXN0aW9uLCBubzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vbkdldFF1ZXN0aW9uTm8uaXNFbXB0eSkgcmV0dXJuIG5vO1xuICAgIHZhciBvcHRpb25zID0geyBxdWVzdGlvbjogcXVlc3Rpb24sIG5vOiBubyB9O1xuICAgIHRoaXMub25HZXRRdWVzdGlvbk5vLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMubm87XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRoZSBzdXJ2ZXkgZGlzcGxheXMgcGFnZSBudW1iZXJzIG9uIHBhZ2VzIHRpdGxlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1BhZ2VOdW1iZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZU51bWJlcnNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1BhZ2VOdW1iZXJzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnNob3dQYWdlTnVtYmVycykgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQYWdlTnVtYmVyc1wiLCB2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyBob3cgdGhlIHF1ZXN0aW9uIG51bWJlcnMgYXJlIGRpc3BsYXllZC5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYG9uYCAtIGRpc3BsYXkgcXVlc3Rpb24gbnVtYmVyc1xuICAgKiAtIGBvbnBhZ2VgIC0gZGlzcGxheSBxdWVzdGlvbiBudW1iZXJzLCBzdGFydCBudW1iZXJpbmcgb24gZXZlcnkgcGFnZVxuICAgKiAtIGBvZmZgIC0gdHVybiBvZmYgdGhlIG51bWJlcmluZyBmb3IgcXVlc3Rpb25zIHRpdGxlc1xuICAgKi9cbiAgcHVibGljIGdldCBzaG93UXVlc3Rpb25OdW1iZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsdWUgPSB2YWx1ZSA9PT0gXCJvbnBhZ2VcIiA/IFwib25QYWdlXCIgOiB2YWx1ZTtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycykgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIiwgdmFsdWUpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBzdXJ2ZXkgcHJvZ3Jlc3MgYmFyIHBvc2l0aW9uLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgdG9wYCAtIHNob3cgcHJvZ3Jlc3MgYmFyIGluIHRoZSB0b3BcbiAgICogLSBgYm90dG9tYCAtIHNob3cgcHJvZ3Jlc3MgYmFyIGluIHRoZSBib3R0b21cbiAgICogLSBgYm90aGAgLSBzaG93IHByb2dyZXNzIGJhciBpbiBib3RoIHNpZGVzOiB0b3AgYW5kIGJvdHRvbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1Byb2dyZXNzQmFyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQcm9ncmVzc0JhclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dQcm9ncmVzc0JhcihuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1Byb2dyZXNzQmFyXCIsIG5ld1ZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHR5cGUgb2YgaW5mbyBpbiB0aGUgcHJvZ3Jlc3MgYmFyLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgcGFnZXNgIChkZWZhdWx0KSxcbiAgICogLSBgcXVlc3Rpb25zYCxcbiAgICogLSBgcmVxdWlyZWRRdWVzdGlvbnNgLFxuICAgKiAtIGBjb3JyZWN0UXVlc3Rpb25zYC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvZ3Jlc3NCYXJUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInByb2dyZXNzQmFyVHlwZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHByb2dyZXNzQmFyVHlwZShuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicHJvZ3Jlc3NCYXJUeXBlXCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU2hvd1Byb2dyZXNzQmFyT25Ub3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1Byb2dyZXNzQmFyID09PSBcInRvcFwiIHx8IHRoaXMuc2hvd1Byb2dyZXNzQmFyID09PSBcImJvdGhcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU2hvd1Byb2dyZXNzQmFyT25Cb3R0b20oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1Byb2dyZXNzQmFyID09PSBcImJvdHRvbVwiIHx8IHRoaXMuc2hvd1Byb2dyZXNzQmFyID09PSBcImJvdGhcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dC9IVE1MIHRoYXQgaXMgcmVuZGVyZWQgYXMgYSBzdXJ2ZXkgdGl0bGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZFRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmxvY1RpdGxlLnJlbmRlcmVkSHRtbDtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBxdWVzdGlvbiB0aXRsZSBsb2NhdGlvbi5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYGJvdHRvbWAgLSBzaG93IGEgcXVlc3Rpb24gdGl0bGUgdG8gYm90dG9tXG4gICAqIC0gYGxlZnRgIC0gc2hvdyBhIHF1ZXN0aW9uIHRpdGxlIHRvIGxlZnRcbiAgICogLSBgdG9wYCAtIHNob3cgYSBxdWVzdGlvbiB0aXRsZSB0byB0b3AuXG4gICAqXG4gICAqID4gU29tZSBxdWVzdGlvbnMsIGZvciBleGFtcGxlIG1hdHJpeGVzLCBkbyBub3Qgc3VwcG9ydCAnbGVmdCcgdmFsdWUuIFRoZSB0aXRsZSBmb3IgdGhlbSB3aWxsIGJlIGRpc3BsYXllZCB0byB0aGUgdG9wLlxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25UaXRsZUxvY2F0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIiwgdmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRDc3MoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUVsZW1lbnRDc3MoKSB7XG4gICAgdmFyIHBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFnZXNbaV0udXBkYXRlRWxlbWVudENzcygpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBlcnJvciBtZXNzYWdlIHBvc2l0aW9uLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgdG9wYCAtIHRvIHNob3cgcXVlc3Rpb24gZXJyb3Iocykgb3ZlciB0aGUgcXVlc3Rpb24sXG4gICAqIC0gYGJvdHRvbWAgLSB0byBzaG93IHF1ZXN0aW9uIGVycm9yKHMpIHVuZGVyIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25FcnJvckxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uRXJyb3JMb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uRXJyb3JMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25FcnJvckxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHF1ZXN0aW9uIGRlc2NyaXB0aW9uIHBvc2l0aW9uLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgdW5kZXJUaXRsZWAgLSBzaG93IHF1ZXN0aW9uIGRlc2NyaXB0aW9uIHVuZGVyIHRoZSBxdWVzdGlvbiB0aXRsZSxcbiAgICogLSBgdW5kZXJJbnB1dGAgLSBzaG93IHF1ZXN0aW9uIGRlc2NyaXB0aW9uIHVuZGVyIHRoZSBxdWVzdGlvbiBpbnB1dCBpbnN0ZWFkIG9mIHF1ZXN0aW9uIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvbkRlc2NyaXB0aW9uTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25EZXNjcmlwdGlvbkxvY2F0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbkRlc2NyaXB0aW9uTG9jYXRpb25cIiwgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIHN1cnZleSBlZGl0IG1vZGUuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKlxuICAgKiAtIGBlZGl0YCAoZGVmYXVsdCkgLSBtYWtlIGEgc3VydmV5IGVkaXRhYmxlLFxuICAgKiAtIGBkaXNwbGF5YCAtIG1ha2UgYSBzdXJ2ZXkgcmVhZC1vbmx5LlxuICAgKi9cbiAgcHVibGljIGdldCBtb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBtb2RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbHVlID09IHRoaXMubW9kZSkgcmV0dXJuO1xuICAgIGlmICh2YWx1ZSAhPSBcImVkaXRcIiAmJiB2YWx1ZSAhPSBcImRpc3BsYXlcIikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1vZGVcIiwgdmFsdWUpO1xuICB9XG4gIHByaXZhdGUgb25Nb2RlQ2hhbmdlZCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5wYWdlc1tpXTtcbiAgICAgIHBhZ2Uuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVhZE9ubHlcIiwgcGFnZS5pc1JlYWRPbmx5KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhbiBvYmplY3QgdGhhdCBzdG9yZXMgdGhlIHN1cnZleSByZXN1bHRzL2RhdGEuIFlvdSBjYW4gc2V0IGl0IGRpcmVjdGx5IGFzIGB7ICdxdWVzdGlvbiBuYW1lJzogcXVlc3Rpb25WYWx1ZSwgLi4uIH1gXG4gICAqXG4gICAqID4gSWYgeW91IHNldCB0aGUgYGRhdGFgIHByb3BlcnR5IGFmdGVyIGNyZWF0aW5nIHRoZSBzdXJ2ZXksIHlvdSBtYXkgbmVlZCB0byBzZXQgdGhlIGBjdXJyZW50UGFnZU5vYCB0byBgMGAsIGlmIHlvdSBhcmUgdXNpbmcgYHZpc2libGVJZmAgcHJvcGVydGllcyBmb3IgcXVlc3Rpb25zL3BhZ2VzL3BhbmVscyB0byBlbnN1cmUgdGhhdCB5b3UgYXJlIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IHBhZ2UuXG4gICAqIEBzZWUgc2V0VmFsdWVcbiAgICogQHNlZSBnZXRWYWx1ZVxuICAgKiBAc2VlIG1lcmdlRGF0YVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlTm9cbiAgICovXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIHZhciBrZXlzID0gdGhpcy5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSArKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgZGF0YVZhbHVlID0gdGhpcy5nZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5KTtcbiAgICAgIGlmIChkYXRhVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IGRhdGFWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZXRDYWxjdWF0ZWRWYWx1ZXNJbnRvUmVzdWx0KHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgc2V0IGRhdGEoZGF0YTogYW55KSB7XG4gICAgdGhpcy52YWx1ZXNIYXNoID0ge307XG4gICAgdGhpcy5zZXREYXRhQ29yZShkYXRhKTtcbiAgfVxuICAvKipcbiAgICogTWVyZ2UgdGhlIHZhbHVlcyBpbnRvIHN1cnZleS5kYXRhLiBJdCB3b3JrcyBhcyBzdXJ2ZXkuZGF0YSwgZXhjZXB0IGl0IGRvZXNuJ3QgY2xlYW4gdGhlIGV4aXN0aW5nIGRhdGEsIGJ1dCBvdmVycmlkZXMgdGhlbS5cbiAgICogQHBhcmFtIGRhdGEgZGF0YSB0byBtZXJnZS4gSXQgc2hvdWxkIGJlIGFuIG9iamVjdCB7a2V5VmFsdWU6IFZhbHVlLCAuLi59XG4gICAqIEBzZWUgZGF0YVxuICAgKiBAc2VlIHNldFZhbHVlXG4gICAqL1xuICBwdWJsaWMgbWVyZ2VEYXRhKGRhdGE6IGFueSkge1xuICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0RGF0YUNvcmUoZGF0YSk7XG4gIH1cbiAgcHVibGljIHNldERhdGFDb3JlKGRhdGE6IGFueSkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgICB0aGlzLnNldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBrZXksIGRhdGFba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlQWxsUXVlc3Rpb25zVmFsdWUoKTtcbiAgICB0aGlzLm5vdGlmeUFsbFF1ZXN0aW9uc09uVmFsdWVDaGFuZ2VkKCk7XG4gICAgdGhpcy5ub3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZChcIlwiKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGVkaXRpbmdPYmooKSA6IEJhc2Uge1xuICAgIHJldHVybiB0aGlzLmVkaXRpbmdPYmpWYWx1ZTtcbiAgfVxuICBwcml2YXRlIG9uRWRpdGluZ09ialByb3BlcnR5Q2hhbmdlZCA6IChzZW5kZXI6IEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gdm9pZDtcbiAgcHVibGljIHNldCBlZGl0aW5nT2JqKHZhbDogQmFzZSkge1xuICAgIGlmKHRoaXMuZWRpdGluZ09iaiA9PSB2YWwpIHJldHVybjtcbiAgICBpZighIXRoaXMuZWRpdGluZ09iaikge1xuICAgICAgdGhpcy5lZGl0aW5nT2JqLm9uUHJvcGVydHlDaGFuZ2VkLnJlbW92ZSh0aGlzLm9uRWRpdGluZ09ialByb3BlcnR5Q2hhbmdlZClcbiAgICB9XG4gICAgdGhpcy5lZGl0aW5nT2JqVmFsdWUgPSB2YWw7XG4gICAgdGhpcy5zZXREYXRhQ29yZSh7fSk7XG4gICAgaWYoISF0aGlzLmVkaXRpbmdPYmopIHtcbiAgICAgIHRoaXMub25FZGl0aW5nT2JqUHJvcGVydHlDaGFuZ2VkID0gKHNlbmRlcjogQmFzZSwgb3B0aW9uczogYW55KSA9PntcbiAgICAgICAgdGhpcy51cGRhdGVPblNldFZhbHVlKG9wdGlvbnMubmFtZSwgb3B0aW9ucy5uZXdWYWx1ZSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5lZGl0aW5nT2JqLm9uUHJvcGVydHlDaGFuZ2VkLmFkZCh0aGlzLm9uRWRpdGluZ09ialByb3BlcnR5Q2hhbmdlZCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2V0Q2FsY3VhdGVkVmFsdWVzSW50b1Jlc3VsdChyZXN1bHQ6IGFueSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxjdWxhdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2FsVmFsdWUgPSB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXNbaV07XG4gICAgICBpZiAoXG4gICAgICAgIGNhbFZhbHVlLmluY2x1ZGVJbnRvUmVzdWx0ICYmXG4gICAgICAgICEhY2FsVmFsdWUubmFtZSAmJlxuICAgICAgICB0aGlzLmdldFZhcmlhYmxlKGNhbFZhbHVlLm5hbWUpICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICByZXN1bHRbY2FsVmFsdWUubmFtZV0gPSB0aGlzLmdldFZhcmlhYmxlKGNhbFZhbHVlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHN1cnZleSByZXN1bHQgZGF0YSBhcyBhbiBhcnJheSBvZiBwbGFpbiBvYmplY3RzOiB3aXRoIHF1ZXN0aW9uIGB0aXRsZWAsIGBuYW1lYCwgYHZhbHVlYCwgYW5kIGBkaXNwbGF5VmFsdWVgLlxuICAgKlxuICAgKiBGb3IgY29tcGxleCBxdWVzdGlvbnMgKGxpa2UgbWF0cml4LCBldGMuKSBgaXNOb2RlYCBmbGFnIGlzIHNldCB0byBgdHJ1ZWAgYW5kIGRhdGEgY29udGFpbnMgYXJyYXkgb2YgbmVzdGVkIG9iamVjdHMgKHJvd3MpLlxuICAgKlxuICAgKiBTZXQgYG9wdGlvbnMuaW5jbHVkZUVtcHR5YCB0byBgZmFsc2VgIGlmIHlvdSB3YW50IHRvIHNraXAgZW1wdHkgYW5zd2Vycy5cbiAgICovXG4gIHB1YmxpYyBnZXRQbGFpbkRhdGEoXG4gICAgb3B0aW9uczoge1xuICAgICAgaW5jbHVkZUVtcHR5PzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVRdWVzdGlvblR5cGVzPzogYm9vbGVhbjtcbiAgICAgIGNhbGN1bGF0aW9ucz86IEFycmF5PHtcbiAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICB9ID0ge1xuICAgICAgaW5jbHVkZUVtcHR5OiB0cnVlLFxuICAgICAgaW5jbHVkZVF1ZXN0aW9uVHlwZXM6IGZhbHNlLFxuICAgIH1cbiAgKSB7XG4gICAgdmFyIHJlc3VsdDogQXJyYXk8YW55PiA9IFtdO1xuICAgIHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCkuZm9yRWFjaCgocXVlc3Rpb24pID0+IHtcbiAgICAgIHZhciByZXN1bHRJdGVtID0gKDxRdWVzdGlvbj5xdWVzdGlvbikuZ2V0UGxhaW5EYXRhKG9wdGlvbnMpO1xuICAgICAgaWYgKCEhcmVzdWx0SXRlbSkge1xuICAgICAgICByZXN1bHQucHVzaChyZXN1bHRJdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgdmFyIHZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFyaWFibGVzSGFzaCkgdmFsdWVzW2tleV0gPSB0aGlzLnZhcmlhYmxlc0hhc2hba2V5XTtcbiAgICB2YXIga2V5cyA9IHRoaXMuZ2V0VmFsdWVzS2V5cygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkgKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgdmFsdWVzW2tleV0gPSB0aGlzLmdldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIGdldEZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIHJldHVybiB7IHN1cnZleTogdGhpcyB9O1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVzS2V5cygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBpZighdGhpcy5lZGl0aW5nT2JqKSByZXR1cm4gT2JqZWN0LmtleXModGhpcy52YWx1ZXNIYXNoKTtcbiAgICB2YXIgcHJvcHMgPSBTZXJpYWxpemVyLmdldFByb3BlcnRpZXNCeU9iaih0aGlzLmVkaXRpbmdPYmopO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpICsrKSB7XG4gICAgICByZXMucHVzaChwcm9wc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgZ2V0RGF0YVZhbHVlQ29yZSh2YWx1ZXNIYXNoOiBhbnksIGtleTogc3RyaW5nKSB7XG4gICAgaWYoISF0aGlzLmVkaXRpbmdPYmopIHJldHVybiB0aGlzLmVkaXRpbmdPYmouZ2V0UHJvcGVydHlWYWx1ZShrZXkpO1xuICAgIHJldHVybiB2YWx1ZXNIYXNoW2tleV07XG4gIH1cbiAgcHVibGljIHNldERhdGFWYWx1ZUNvcmUodmFsdWVzSGFzaDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmKCEhdGhpcy5lZGl0aW5nT2JqKSB7XG4gICAgICAoPGFueT50aGlzLmVkaXRpbmdPYmopW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWVzSGFzaFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBkZWxldGVEYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcpIHtcbiAgICBpZighIXRoaXMuZWRpdGluZ09iaikge1xuICAgICAgKDxhbnk+dGhpcy5lZGl0aW5nT2JqKVtrZXldID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlc0hhc2hba2V5XTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGNvbW1lbnRzIGZyb20gdGhlIGRhdGEuXG4gICAqIEBzZWUgZGF0YVxuICAgKi9cbiAgcHVibGljIGdldCBjb21tZW50cygpOiBhbnkge1xuICAgIHZhciByZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIHZhciBrZXlzID0gdGhpcy5nZXRWYWx1ZXNLZXlzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSArKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICBpZiAoa2V5LmluZGV4T2YodGhpcy5jb21tZW50UHJlZml4KSA+IDApIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmdldERhdGFWYWx1ZUNvcmUodGhpcy52YWx1ZXNIYXNoLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB2aXNpYmxlIHBhZ2VzLiBJZiBhbGwgcGFnZXMgYXJlIHZpc2libGUsIHRoZW4gdGhpcyBwcm9wZXJ0eSByZXR1cm5zIHRoZSBzYW1lIGxpc3QgYXMgdGhlIGBwYWdlc2AgcHJvcGVydHkuXG4gICAqIEBzZWUgcGFnZXNcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJsZVxuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVBhZ2VzKCk6IEFycmF5PFBhZ2VNb2RlbD4ge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuIHRoaXMucGFnZXM7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxQYWdlTW9kZWw+KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wYWdlc1tpXS5pc1Zpc2libGUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5wYWdlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzdXJ2ZXkgY29udGFpbnMgbm8gcGFnZXMuIFRoZSBzdXJ2ZXkgaXMgZW1wdHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXMubGVuZ3RoID09IDA7XG4gIH1cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQuIFVzZSB0aGUgYHBhZ2VDb3VudGAgcHJvcGVydHkgaW5zdGVhZC5cbiAgICovXG4gIGdldCBQYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlQ291bnQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1cnZleSBwYWdlIGNvdW50LlxuICAgKiBAc2VlIHZpc2libGVQYWdlQ291bnRcbiAgICogQHNlZSBwYWdlc1xuICAgKi9cbiAgcHVibGljIGdldCBwYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlcy5sZW5ndGg7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBudW1iZXIgb2YgdmlzaWJsZSBwYWdlcyB3aXRoaW4gdGhlIHN1cnZleS5cbiAgICogQHNlZSBwYWdlQ291bnRcbiAgICogQHNlZSB2aXNpYmxlUGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVQYWdlcy5sZW5ndGg7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YXJ0ZWQgcGFnZS4gVGhpcyBwcm9wZXJ0eSB3b3JrcyBpZiB0aGUgYGZpcnN0UGFnZUlzU3RhcnRlZGAgcHJvcGVydHkgaXMgc2V0IHRvIGB0cnVlYC5cbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRlZFBhZ2UoKTogUGFnZU1vZGVsIHtcbiAgICB2YXIgcGFnZSA9XG4gICAgICB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCAmJiB0aGlzLnBhZ2VzLmxlbmd0aCA+IDAgPyB0aGlzLnBhZ2VzWzBdIDogbnVsbDtcbiAgICBpZiAoISFwYWdlKSB7XG4gICAgICBwYWdlLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICAgIHBhZ2Uuc2V0V2FzU2hvd24odHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiBwYWdlO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGN1cnJlbnQgc3VydmV5IHBhZ2UuIElmIGEgc3VydmV5IGlzIHJlbmRlcmVkLCB0aGVuIHRoaXMgcHJvcGVydHkgcmV0dXJucyBhIHBhZ2UgdGhhdCBhIHVzZXIgY2FuIHNlZS9lZGl0LlxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50UGFnZSgpOiBhbnkge1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZVZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmICh2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlVmFsdWUpIDwgMCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRoaXMub25Db250YWluc1BhZ2VDYWxsYmFjayB8fFxuICAgICAgICAgICF0aGlzLm9uQ29udGFpbnNQYWdlQ2FsbGJhY2sodGhpcy5jdXJyZW50UGFnZVZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZVZhbHVlID09IG51bGwgJiYgdlBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB2UGFnZXNbMF07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjdXJyZW50UGFnZSh2YWx1ZTogYW55KSB7XG4gICAgdmFyIG5ld1BhZ2UgPSB0aGlzLmdldFBhZ2VCeU9iamVjdCh2YWx1ZSk7XG4gICAgaWYgKCEhdmFsdWUgJiYgIW5ld1BhZ2UpIHJldHVybjtcbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgaWYgKG5ld1BhZ2UgIT0gbnVsbCAmJiB2UGFnZXMuaW5kZXhPZihuZXdQYWdlKSA8IDApIHJldHVybjtcbiAgICBpZiAobmV3UGFnZSA9PSB0aGlzLmN1cnJlbnRQYWdlVmFsdWUpIHJldHVybjtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmN1cnJlbnRQYWdlVmFsdWU7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRQYWdlQ2hhbmdpbmcobmV3UGFnZSwgb2xkVmFsdWUpKSByZXR1cm47XG4gICAgaWYgKCEhbmV3UGFnZSkge1xuICAgICAgbmV3UGFnZS5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFBhZ2VWYWx1ZSA9IG5ld1BhZ2U7XG4gICAgaWYgKCEhbmV3UGFnZSkge1xuICAgICAgbmV3UGFnZS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgICBuZXdQYWdlLnNldFdhc1Nob3duKHRydWUpO1xuICAgIH1cbiAgICB0aGlzLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgdGhpcy5jdXJyZW50UGFnZUNoYW5nZWQobmV3UGFnZSwgb2xkVmFsdWUpO1xuICB9XG4gIHByaXZhdGUgZ2V0UGFnZUJ5T2JqZWN0KHZhbHVlOiBhbnkpOiBQYWdlTW9kZWwge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgIGlmICh2YWx1ZS5nZXRUeXBlICYmIHZhbHVlLmdldFR5cGUoKSA9PSBcInBhZ2VcIikgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpXG4gICAgICByZXR1cm4gdGhpcy5nZXRQYWdlQnlOYW1lKFN0cmluZyh2YWx1ZSkpO1xuICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICB2YXIgaW5kZXggPSBOdW1iZXIodmFsdWUpO1xuICAgICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+PSB2UGFnZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB2UGFnZXNbaW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBjdXJyZW50IHBhZ2UgaW4gdGhlIHZpc2libGUgcGFnZXMgYXJyYXkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRQYWdlTm8oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbnRQYWdlTm8odmFsdWU6IG51bWJlcikge1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IHZQYWdlcy5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdlBhZ2VzW3ZhbHVlXTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBxdWVzdGlvbiBkaXNwbGF5IG9yZGVyLiBVc2UgdGhpcyBwcm9wZXJ0eSB0byByYW5kb21pemUgcXVlc3Rpb25zLiBZb3UgY2FuIHJhbmRvbWl6ZSBxdWVzdGlvbnMgb24gYSBzcGVjaWZpYyBwYWdlLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICpcbiAgICogLSBgcmFuZG9tYCAtIHJhbmRvbWl6ZSBxdWVzdGlvbnNcbiAgICogLSBgaW5pdGlhbGAgLSBrZWVwIHF1ZXN0aW9ucyBpbiB0aGUgc2FtZSBvcmRlciwgYXMgaW4gYSBzdXJ2ZXkgbW9kZWwuXG4gICAqIEBzZWUgU3VydmV5UGFnZS5xdWVzdGlvbnNPcmRlclxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvbnNPcmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT3JkZXJcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbnNPcmRlcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uc09yZGVyXCIsIHZhbCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgaW5wdXQgZm9jdXMgdG8gdGhlIGZpcnN0IHF1ZXN0aW9uIHdpdGggdGhlIGlucHV0IGZpZWxkLlxuICAgKi9cbiAgcHVibGljIGZvY3VzRmlyc3RRdWVzdGlvbigpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgaWYgKHBhZ2UpIHtcbiAgICAgIHBhZ2Uuc2Nyb2xsVG9Ub3AoKTtcbiAgICAgIHBhZ2UuZm9jdXNGaXJzdFF1ZXN0aW9uKCk7XG4gICAgfVxuICB9XG4gIHNjcm9sbFRvVG9wT25QYWdlQ2hhbmdlKCkge1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAoIXBhZ2UpIHJldHVybjtcbiAgICBwYWdlLnNjcm9sbFRvVG9wKCk7XG4gICAgaWYgKHRoaXMuZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljKSB7XG4gICAgICBwYWdlLmZvY3VzRmlyc3RRdWVzdGlvbigpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdXJ2ZXkgc3RhdGU6XG4gICAqXG4gICAqIC0gYGxvYWRpbmdgIC0gbG9hZGluZyBmcm9tIHRoZSBKU09OLFxuICAgKiAtIGBjb21wbGV0ZWRgIC0gYSB1c2VyIGhhcyBjb21wbGV0ZWQgdGhlIHN1cnZleSxcbiAgICogLSBgc3RhcnRpbmdgIC0gdGhlIHN0YXJ0ZWQgcGFnZSBpcyBzaG93aW5nLFxuICAgKiAtIGBydW5uaW5nYCAtIGEgdXNlciBhbnN3ZXJzIHF1ZXN0aW9ucyByaWdodCBub3csXG4gICAqIC0gYGVtcHR5YCAtIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2hvdyBpbiB0aGUgY3VycmVudCBzdXJ2ZXkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nKSByZXR1cm4gXCJsb2FkaW5nXCI7XG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWQpIHJldHVybiBcImNvbXBsZXRlZFwiO1xuICAgIGlmICh0aGlzLmlzQ29tcGxldGVkQmVmb3JlKSByZXR1cm4gXCJjb21wbGV0ZWRiZWZvcmVcIjtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc0Rlc2lnbk1vZGUgJiZcbiAgICAgIHRoaXMuaXNFZGl0TW9kZSAmJlxuICAgICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSAmJlxuICAgICAgdGhpcy5zdGFydGVkUGFnZVxuICAgIClcbiAgICAgIHJldHVybiBcInN0YXJ0aW5nXCI7XG4gICAgaWYgKHRoaXMuaXNTaG93aW5nUHJldmlldykgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2UgPyBcInByZXZpZXdcIiA6IFwiZW1wdHlcIjtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZSA/IFwicnVubmluZ1wiIDogXCJlbXB0eVwiO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzQ29tcGxldGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0NvbXBsZXRlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXQgaXNDb21wbGV0ZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNDb21wbGV0ZWRcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc1Nob3dpbmdQcmV2aWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1Nob3dpbmdQcmV2aWV3XCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc1Nob3dpbmdQcmV2aWV3KHZhbDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmlzU2hvd2luZ1ByZXZpZXcgPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNTaG93aW5nUHJldmlld1wiLCB2YWwpO1xuICAgIHRoaXMub25TaG93aW5nUHJldmlld0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIGdldCBpc1N0YXJ0ZWRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNTdGFydGVkU3RhdGVcIiwgZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgc2V0IGlzU3RhcnRlZFN0YXRlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzU3RhcnRlZFN0YXRlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNDb21wbGV0ZWRCZWZvcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzQ29tcGxldGVkQmVmb3JlXCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc0NvbXBsZXRlZEJlZm9yZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0NvbXBsZXRlZEJlZm9yZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNMb2FkaW5nXCIsIGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIHNldCBpc0xvYWRpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNMb2FkaW5nXCIsIHZhbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbXBsZXRlZFN0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVkU3RhdGVWYWx1ZTtcbiAgfVxuICBnZXQgY29tcGxldGVkU3RhdGVUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGxldGVkU3RhdGVUZXh0VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENvbXBsZXRlZFN0YXRlKHZhbHVlOiBzdHJpbmcsIHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuY29tcGxldGVkU3RhdGVWYWx1ZSA9IHZhbHVlO1xuICAgIGlmICghdGV4dCkge1xuICAgICAgaWYgKHZhbHVlID09IFwic2F2aW5nXCIpIHRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInNhdmluZ0RhdGFcIik7XG4gICAgICBpZiAodmFsdWUgPT0gXCJlcnJvclwiKSB0ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJzYXZpbmdEYXRhRXJyb3JcIik7XG4gICAgICBpZiAodmFsdWUgPT0gXCJzdWNjZXNzXCIpIHRleHQgPSB0aGlzLmdldExvY1N0cmluZyhcInNhdmluZ0RhdGFTdWNjZXNzXCIpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlID0gdGV4dDtcbiAgfVxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBzdXJ2ZXkgZGF0YSBhbmQgc3RhdGUuIElmIHRoZSBzdXJ2ZXkgaGFzIGEgYGNvbXBsZXRlZGAgc3RhdGUsIGl0IHdpbGwgZ2V0IGEgYHJ1bm5pbmdgIHN0YXRlLlxuICAgKiBAcGFyYW0gY2xlYXJEYXRhIGNsZWFyIHRoZSBkYXRhXG4gICAqIEBwYXJhbSBnb3RvRmlyc3RQYWdlIG1ha2UgdGhlIGZpcnN0IHBhZ2UgYXMgYSBjdXJyZW50IHBhZ2UuXG4gICAqIEBzZWUgZGF0YVxuICAgKiBAc2VlIHN0YXRlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VcbiAgICovXG4gIHB1YmxpYyBjbGVhcihjbGVhckRhdGE6IGJvb2xlYW4gPSB0cnVlLCBnb3RvRmlyc3RQYWdlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChjbGVhckRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YSA9IG51bGw7XG4gICAgICB0aGlzLnZhcmlhYmxlc0hhc2ggPSB7fTtcbiAgICB9XG4gICAgdGhpcy50aW1lU3BlbnQgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS50aW1lU3BlbnQgPSAwO1xuICAgICAgdGhpcy5wYWdlc1tpXS5zZXRXYXNTaG93bihmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuaXNDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ29tcGxldGVkQmVmb3JlID0gZmFsc2U7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmlzU3RhcnRlZFN0YXRlID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQ7XG4gICAgaWYgKGdvdG9GaXJzdFBhZ2UgJiYgdGhpcy52aXNpYmxlUGFnZUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMudmlzaWJsZVBhZ2VzWzBdO1xuICAgIH1cbiAgICBpZiAoY2xlYXJEYXRhKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlc1dpdGhEZWZhdWx0cygpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgbWVyZ2VWYWx1ZXMoc3JjOiBhbnksIGRlc3Q6IGFueSkge1xuICAgIGlmICghZGVzdCB8fCAhc3JjKSByZXR1cm47XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgdmFyIHZhbHVlID0gc3JjW2tleV07XG4gICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGlmICghZGVzdFtrZXldKSBkZXN0W2tleV0gPSB7fTtcbiAgICAgICAgdGhpcy5tZXJnZVZhbHVlcyh2YWx1ZSwgZGVzdFtrZXldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlc3Rba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIHVwZGF0ZVZhbHVlc1dpdGhEZWZhdWx0cygpIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUgfHwgdGhpcy5pc0xvYWRpbmcpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhZ2VzW2ldLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHF1ZXN0aW9uc1tqXS51cGRhdGVWYWx1ZVdpdGhEZWZhdWx0cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQ3VzdG9tV2lkZ2V0cyhwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBpZiAoIXBhZ2UpIHJldHVybjtcbiAgICBwYWdlLnVwZGF0ZUN1c3RvbVdpZGdldHMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3VycmVudFBhZ2VDaGFuZ2luZyhuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBvbGRDdXJyZW50UGFnZTogb2xkVmFsdWUsXG4gICAgICBuZXdDdXJyZW50UGFnZTogbmV3VmFsdWUsXG4gICAgICBhbGxvd0NoYW5naW5nOiB0cnVlLFxuICAgICAgaXNOZXh0UGFnZTogdGhpcy5pc05leHRQYWdlKG5ld1ZhbHVlLCBvbGRWYWx1ZSksXG4gICAgICBpc1ByZXZQYWdlOiB0aGlzLmlzUHJldlBhZ2UobmV3VmFsdWUsIG9sZFZhbHVlKSxcbiAgICB9O1xuICAgIHRoaXMub25DdXJyZW50UGFnZUNoYW5naW5nLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuYWxsb3dDaGFuZ2luZztcbiAgfVxuICBwcm90ZWN0ZWQgY3VycmVudFBhZ2VDaGFuZ2VkKG5ld1ZhbHVlOiBQYWdlTW9kZWwsIG9sZFZhbHVlOiBQYWdlTW9kZWwpIHtcbiAgICB0aGlzLm9uQ3VycmVudFBhZ2VDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgb2xkQ3VycmVudFBhZ2U6IG9sZFZhbHVlLFxuICAgICAgbmV3Q3VycmVudFBhZ2U6IG5ld1ZhbHVlLFxuICAgICAgaXNOZXh0UGFnZTogdGhpcy5pc05leHRQYWdlKG5ld1ZhbHVlLCBvbGRWYWx1ZSksXG4gICAgICBpc1ByZXZQYWdlOiB0aGlzLmlzUHJldlBhZ2UobmV3VmFsdWUsIG9sZFZhbHVlKSxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGlzTmV4dFBhZ2UobmV3VmFsdWU6IFBhZ2VNb2RlbCwgb2xkVmFsdWU6IFBhZ2VNb2RlbCk6IGJvb2xlYW4ge1xuICAgIGlmICghbmV3VmFsdWUgfHwgIW9sZFZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIG5ld1ZhbHVlLnZpc2libGVJbmRleCA9PSBvbGRWYWx1ZS52aXNpYmxlSW5kZXggKyAxO1xuICB9XG4gIHByaXZhdGUgaXNQcmV2UGFnZShuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKTogYm9vbGVhbiB7XG4gICAgaWYgKCFuZXdWYWx1ZSB8fCAhb2xkVmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gbmV3VmFsdWUudmlzaWJsZUluZGV4ICsgMSA9PSBvbGRWYWx1ZS52aXNpYmxlSW5kZXg7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb2dyZXNzIHRoYXQgYSB1c2VyIG1hZGUgd2hpbGUgZ29pbmcgdGhyb3VnaCB0aGUgc3VydmV5LlxuICAgKiBJdCBkZXBlbmRzIGZyb20gcHJvZ3Jlc3NCYXJUeXBlIHByb3BlcnR5XG4gICAqIEBzZWUgcHJvZ3Jlc3NCYXJUeXBlXG4gICAqIEBzZWUgcHJvZ3Jlc3NWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgaWYgKHRoaXMucHJvZ3Jlc3NCYXJUeXBlICE9PSBcInBhZ2VzXCIpIHtcbiAgICAgIHZhciBpbmZvID0gdGhpcy5nZXRQcm9ncmVzc0luZm8oKTtcbiAgICAgIGlmICh0aGlzLnByb2dyZXNzQmFyVHlwZSA9PT0gXCJyZXF1aXJlZFF1ZXN0aW9uc1wiKSB7XG4gICAgICAgIHJldHVybiBpbmZvLnJlcXVpcmVkUXVlc3Rpb25Db3VudCA+IDFcbiAgICAgICAgICA/IE1hdGguY2VpbChcbiAgICAgICAgICAgICAgKGluZm8ucmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnQgKiAxMDApIC9cbiAgICAgICAgICAgICAgICBpbmZvLnJlcXVpcmVkUXVlc3Rpb25Db3VudFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogMTAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluZm8ucXVlc3Rpb25Db3VudCA+IDFcbiAgICAgICAgPyBNYXRoLmNlaWwoKGluZm8uYW5zd2VyZWRRdWVzdGlvbkNvdW50ICogMTAwKSAvIGluZm8ucXVlc3Rpb25Db3VudClcbiAgICAgICAgOiAxMDA7XG4gICAgfVxuICAgIHZhciBpbmRleCA9IHRoaXMudmlzaWJsZVBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSkgKyAxO1xuICAgIHJldHVybiBNYXRoLmNlaWwoKGluZGV4ICogMTAwKSAvIHRoaXMudmlzaWJsZVBhZ2VDb3VudCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb2dyZXNzIHRoYXQgYSB1c2VyIG1hZGUgd2hpbGUgZ29pbmcgdGhyb3VnaCB0aGUgc3VydmV5LlxuICAgKiBJdCBkZXBlbmRzIGZyb20gcHJvZ3Jlc3NCYXJUeXBlIHByb3BlcnR5XG4gICAqIEBzZWUgcHJvZ3Jlc3NCYXJUeXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2dyZXNzVmFsdWUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicHJvZ3Jlc3NWYWx1ZVwiLCAwKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmF2aWdhdGlvbiBidXR0b25zIChpLmUuLCAnUHJldicsICdOZXh0Jywgb3IgJ0NvbXBsZXRlJykgcG9zaXRpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gXCJub25lXCI7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmICghcGFnZSkgcmV0dXJuIFwibm9uZVwiO1xuICAgIGlmIChwYWdlLm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eSA9PT0gXCJzaG93XCIpIHtcbiAgICAgIHJldHVybiBcImJvdHRvbVwiO1xuICAgIH1cbiAgICBpZiAocGFnZS5uYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkgPT09IFwiaGlkZVwiKSB7XG4gICAgICByZXR1cm4gXCJub25lXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3dOYXZpZ2F0aW9uQnV0dG9ucztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHN1cnZleSBpcyBpbiBlZGl0IG1vZGUuXG4gICAqIEBzZWUgbW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0VkaXRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gXCJlZGl0XCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0NvbXBsZXRlQnV0dG9uVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc0VkaXRNb2RlICYmXG4gICAgICAoIXRoaXMuaXNTaG93UHJldmlld0JlZm9yZUNvbXBsZXRlIHx8IHRoaXMuc3RhdGUgPT0gXCJwcmV2aWV3XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUHJldmlld0J1dHRvblZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNFZGl0TW9kZSAmJlxuICAgICAgdGhpcy5pc1Nob3dQcmV2aWV3QmVmb3JlQ29tcGxldGUgJiZcbiAgICAgIHRoaXMuc3RhdGUgPT0gXCJydW5uaW5nXCJcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDYW5jZWxQcmV2aWV3QnV0dG9uVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc0VkaXRNb2RlICYmXG4gICAgICB0aGlzLmlzU2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZSAmJlxuICAgICAgdGhpcy5zdGF0ZSA9PSBcInByZXZpZXdcIlxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBzdXJ2ZXkgaXMgaW4gZGlzcGxheSBtb2RlIG9yIGluIHByZXZpZXcgbW9kZS5cbiAgICogQHNlZSBtb2RlXG4gICAqIEBzZWUgc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0Rpc3BsYXlNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gXCJkaXNwbGF5XCIgfHwgdGhpcy5zdGF0ZSA9PSBcInByZXZpZXdcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVXBkYXRlVmFsdWVUZXh0T25UeXBpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFVwZGF0ZU1vZGUgPT0gXCJvblR5cGluZ1wiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3VydmV5IGlzIGluIGRlc2lnbiBtb2RlLiBJdCBpcyB1c2VkIGJ5IFN1cnZleUpTIEVkaXRvci5cbiAgICogQHNlZSBzZXREZXNpZ25Nb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRGVzaWduTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNEZXNpZ25Nb2RlO1xuICB9XG4gIHByaXZhdGUgX2lzRGVzaWduTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0cyB0aGUgc3VydmV5IGludG8gZGVzaWduIG1vZGUuXG4gICAqIEBwYXJhbSB2YWx1ZSB1c2UgdHJ1ZSB0byBzZXQgdGhlIHN1cnZleSBpbnRvIHRoZSBkZXNpZ24gbW9kZS5cbiAgICovXG4gIHB1YmxpYyBzZXREZXNpZ25Nb2RlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEZXNpZ25Nb2RlID0gdmFsdWU7XG4gICAgdGhpcy5vblF1ZXN0aW9uc09uUGFnZU1vZGVDaGFuZ2VkKFwic3RhbmRhcmRcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRvIHNob3cgYWxsIGVsZW1lbnRzIGluIHRoZSBzdXJ2ZXksIHJlZ2FyZGxlc3MgdGhlaXIgdmlzaWJpbGl0eS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd0ludmlzaWJsZUVsZW1lbnRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93SW52aXNpYmxlRWxlbWVudHNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0ludmlzaWJsZUVsZW1lbnRzKHZhbDogYm9vbGVhbikge1xuICAgIHZhciB2aXNQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dJbnZpc2libGVFbGVtZW50c1wiLCB2YWwpO1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gICAgdGhpcy51cGRhdGVBbGxFbGVtZW50c1Zpc2liaWxpdHkodmlzUGFnZXMpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQWxsRWxlbWVudHNWaXNpYmlsaXR5KHZpc1BhZ2VzOiBBcnJheTxQYWdlTW9kZWw+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICBwYWdlLnVwZGF0ZUVsZW1lbnRWaXNpYmlsaXR5KCk7XG4gICAgICBpZiAodmlzUGFnZXMuaW5kZXhPZihwYWdlKSA+IC0xICE9IHBhZ2UuaXNWaXNpYmxlKSB7XG4gICAgICAgIHRoaXMub25QYWdlVmlzaWJsZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICB2aXNpYmxlOiBwYWdlLmlzVmlzaWJsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRGVzaWduTW9kZSB8fCB0aGlzLnNob3dJbnZpc2libGVFbGVtZW50cztcbiAgfVxuICBwdWJsaWMgZ2V0IGFyZUVtcHR5RWxlbWVudHNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNTaG93aW5nUHJldmlldyAmJlxuICAgICAgdGhpcy5zaG93UHJldmlld0JlZm9yZUNvbXBsZXRlID09IFwic2hvd0Fuc3dlcmVkUXVlc3Rpb25zXCJcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCwgaWYgYSB1c2VyIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgc3VydmV5IGluIHRoaXMgYnJvd3NlciBhbmQgdGhlcmUgaXMgYSBjb29raWUgYWJvdXQgaXQuIFN1cnZleSBnb2VzIHRvIGBjb21wbGV0ZWRgIHN0YXRlIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYC5cbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqIEBzZWUgc2V0Q29va2llXG4gICAqIEBzZWUgZGVsZXRlQ29va2llXG4gICAqIEBzZWUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzQ29va2llKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jb29raWVOYW1lIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llO1xuICAgIHJldHVybiBjb29raWVzICYmIGNvb2tpZXMuaW5kZXhPZih0aGlzLmNvb2tpZU5hbWUgKyBcIj10cnVlXCIpID4gLTE7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgY29va2llIHdpdGggYGNvb2tpZU5hbWVgIGluIHVzZXIncyBicm93c2VyLiBJdCBpcyBkb25lIGF1dG9tYXRpY2FsbHkgb24gc3VydmV5IGNvbXBsZXRlIGlmIHRoZSBgY29va2llTmFtZWAgcHJvcGVydHkgdmFsdWUgaXMgbm90IGVtcHR5LlxuICAgKiBAc2VlIGNvb2tpZU5hbWVcbiAgICogQHNlZSBoYXNDb29raWVcbiAgICogQHNlZSBkZWxldGVDb29raWVcbiAgICovXG4gIHB1YmxpYyBzZXRDb29raWUoKSB7XG4gICAgaWYgKCF0aGlzLmNvb2tpZU5hbWUgfHwgdHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgZG9jdW1lbnQuY29va2llID1cbiAgICAgIHRoaXMuY29va2llTmFtZSArIFwiPXRydWU7IGV4cGlyZXM9RnJpLCAzMSBEZWMgOTk5OSAwOjA6MCBHTVRcIjtcbiAgfVxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgY29va2llIHdpdGggYGNvb2tpZU5hbWVgIGZyb20gdGhlIGJyb3dzZXIuXG4gICAqIEBzZWUgY29va2llTmFtZVxuICAgKiBAc2VlIGhhc0Nvb2tpZVxuICAgKiBAc2VlIHNldENvb2tpZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUNvb2tpZSgpIHtcbiAgICBpZiAoIXRoaXMuY29va2llTmFtZSkgcmV0dXJuO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IHRoaXMuY29va2llTmFtZSArIFwiPTtcIjtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHdoZXRoZXIgdGhlIHN1cnZleSBtdXN0IGlnbm9yZSB2YWxpZGF0aW9uIGxpa2UgcmVxdWlyZWQgcXVlc3Rpb25zIGFuZCBvdGhlcnMsIG9uIGBuZXh0UGFnZWAgYW5kIGBjb21wbGV0ZUxhc3RQYWdlYCBmdW5jdGlvbiBjYWxscy4gVGhlIGRlZmF1bHQgaXMgYGZhbHNlYC5cbiAgICogQHNlZSBuZXh0UGFnZVxuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICogQHNlZSBtb2RlXG4gICAqL1xuICBwdWJsaWMgaWdub3JlVmFsaWRhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogTmF2aWdhdGVzIHVzZXIgdG8gdGhlIG5leHQgcGFnZS5cbiAgICpcbiAgICogUmV0dXJucyBgZmFsc2VgIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gICAqXG4gICAqIC0gaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBwYWdlLlxuICAgKiAtIGlmIHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgZXJyb3JzIChmb3IgZXhhbXBsZSwgYSByZXF1aXJlZCBxdWVzdGlvbiBpcyBlbXB0eSkuXG4gICAqIEBzZWUgaXNDdXJyZW50UGFnZUhhc0Vycm9yc1xuICAgKiBAc2VlIHByZXZQYWdlXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKi9cbiAgcHVibGljIG5leHRQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzTGFzdFBhZ2UpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kb0N1cnJlbnRQYWdlQ29tcGxldGUoZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JzT25OYXZpZ2F0ZShkb0NvbXBsZXRlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaWdub3JlVmFsaWRhdGlvbiB8fCAhdGhpcy5pc0VkaXRNb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuY2hlY2tFcnJvcnNNb2RlID09IFwib25Db21wbGV0ZVwiKSB7XG4gICAgICBpZiAoIXRoaXMuaXNMYXN0UGFnZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHRoaXMuaGFzRXJyb3JzKHRydWUsIHRydWUpKSByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaXNDdXJyZW50UGFnZUhhc0Vycm9ycykgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNoZWNrRm9yQXN5bmNRdWVzdGlvblZhbGlkYXRpb24oZG9Db21wbGV0ZSk7XG4gIH1cbiAgcHJpdmF0ZSBhc3luY1ZhbGlkYXRpb25RdWVzaXRvbnM6IEFycmF5PFF1ZXN0aW9uPjtcbiAgcHJpdmF0ZSBjaGVja0ZvckFzeW5jUXVlc3Rpb25WYWxpZGF0aW9uKGRvQ29tcGxldGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICB0aGlzLmNsZWFyQXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zKCk7XG4gICAgdmFyIHF1ZXN0aW9uczogQXJyYXk8UXVlc3Rpb24+ID0gdGhpcy5jdXJyZW50UGFnZS5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0uaXNSdW5uaW5nVmFsaWRhdG9ycykge1xuICAgICAgICBxdWVzdGlvbnNbaV0ub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMgPSAoaGFzRXJyb3JzOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbkNvbXBsZXRlZEFzeW5jUXVlc3Rpb25WYWxpZGF0b3JzKGRvQ29tcGxldGUsIGhhc0Vycm9ycyk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zLnB1c2gocXVlc3Rpb25zW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zLmxlbmd0aCA+IDA7XG4gIH1cbiAgcHJpdmF0ZSBjbGVhckFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucygpIHtcbiAgICBpZiAoISF0aGlzLmFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucykge1xuICAgICAgdmFyIGFzeW5RdWVzdGlvbnMgPSB0aGlzLmFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN5blF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhc3luUXVlc3Rpb25zW2ldLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hc3luY1ZhbGlkYXRpb25RdWVzaXRvbnMgPSBbXTtcbiAgfVxuICBwcml2YXRlIG9uQ29tcGxldGVkQXN5bmNRdWVzdGlvblZhbGlkYXRvcnMoXG4gICAgZG9Db21wbGV0ZTogYm9vbGVhbixcbiAgICBoYXNFcnJvcnM6IGJvb2xlYW5cbiAgKSB7XG4gICAgaWYgKGhhc0Vycm9ycykge1xuICAgICAgdGhpcy5jbGVhckFzeW5jVmFsaWRhdGlvblF1ZXNpdG9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgYXN5blF1ZXN0aW9ucyA9IHRoaXMuYXN5bmNWYWxpZGF0aW9uUXVlc2l0b25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN5blF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFzeW5RdWVzdGlvbnNbaV0uaXNSdW5uaW5nVmFsaWRhdG9ycykgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRvQ3VycmVudFBhZ2VDb21wbGV0ZUNvcmUoZG9Db21wbGV0ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgLCBpZiB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGVycm9ycywgZm9yIGV4YW1wbGUsIHRoZSByZXF1aXJlZCBxdWVzdGlvbiBpcyBlbXB0eSBvciBhIHF1ZXN0aW9uIHZhbGlkYXRpb24gaXMgZmFpbGVkLlxuICAgKiBAc2VlIG5leHRQYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQ3VycmVudFBhZ2VIYXNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tJc0N1cnJlbnRQYWdlSGFzRXJyb3JzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgLCBpZiBhbnkgb2YgdGhlIHN1cnZleSBwYWdlcyBjb250YWlucyBlcnJvcnMuXG4gICAqIEBwYXJhbSBmaXJlQ2FsbGJhY2sgc2V0IGl0IHRvIGB0cnVlYCwgdG8gc2hvdyBlcnJvcnMgaW4gVUkuXG4gICAqIEBwYXJhbSBmb2N1c09uRmlyc3RFcnJvciBzZXQgaXQgdG8gYHRydWVgIHRvIGZvY3VzIG9uIHRoZSBmaXJzdCBxdWVzdGlvbiB0aGF0IGRvZXNuJ3QgcGFzcyB0aGUgdmFsaWRhdGlvbiBhbmQgbWFrZSB0aGUgcGFnZSwgd2hlcmUgdGhlIHF1ZXN0aW9uIGlzIGxvY2F0ZWQsIHRoZSBjdXJyZW50LlxuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICBmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGZvY3VzT25GaXJzdEVycm9yOiBib29sZWFuID0gZmFsc2VcbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIHZpc1BhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgdmFyIGZpcnN0RXJyb3JQYWdlID0gbnVsbDtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZpc1BhZ2VzW2ldLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIGZhbHNlKSkge1xuICAgICAgICBpZiAoIWZpcnN0RXJyb3JQYWdlKSBmaXJzdEVycm9yUGFnZSA9IHZpc1BhZ2VzW2ldO1xuICAgICAgICByZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZm9jdXNPbkZpcnN0RXJyb3IgJiYgISFmaXJzdEVycm9yUGFnZSkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IGZpcnN0RXJyb3JQYWdlO1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IGZpcnN0RXJyb3JQYWdlLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChxdWVzdGlvbnNbaV0uZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBxdWVzdGlvbnNbaV0uZm9jdXModHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgc3VydmV5IGVsZW1lbnRzIChwYWdlcywgcGFuZWxzLCBhbmQgcXVlc3Rpb25zKSBoYXZlIHVuaXF1ZSBxdWVzdGlvbiBuYW1lcy5cbiAgICogWW91IGNhbiBjaGVjayBmb3IgdW5pcXVlIG5hbWVzIGZvciBpbmRpdmlkdWFsIHBhZ2UgYW5kIHBhbmVsIChhbmQgYWxsIHRoZWlyIGVsZW1lbnRzKSBvciBhIHF1ZXN0aW9uLlxuICAgKiBJZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gYSBzdXJ2ZXkgY2hlY2tzIHRoYXQgYWxsIGl0cyBlbGVtZW50cyBoYXZlIHVuaXF1ZSBuYW1lcy5cbiAgICogQHBhcmFtIGVsZW1lbnQgcGFnZSwgcGFuZWwgb3IgcXVlc3Rpb24sIGl0IGlzIGBudWxsYCBieSBkZWZhdWx0LCB0aGF0IG1lYW5zIGFsbCBzdXJ2ZXkgZWxlbWVudHMgd2lsbCBiZSBjaGVja2VkXG4gICAqL1xuICBwdWJsaWMgZW5zdXJlVW5pcXVlTmFtZXMoZWxlbWVudDogSVN1cnZleUVsZW1lbnQgPSBudWxsKSB7XG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZW5zdXJlVW5pcXVlTmFtZSh0aGlzLnBhZ2VzW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbnN1cmVVbmlxdWVOYW1lKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGVuc3VyZVVuaXF1ZU5hbWUoZWxlbWVudDogSVN1cnZleUVsZW1lbnQpIHtcbiAgICBpZiAoZWxlbWVudC5pc1BhZ2UpIHtcbiAgICAgIHRoaXMuZW5zdXJlVW5pcXVlUGFnZU5hbWUoZWxlbWVudCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmlzUGFuZWwpIHtcbiAgICAgIHRoaXMuZW5zdXJlVW5pcXVlUGFuZWxOYW1lKGVsZW1lbnQpO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC5pc1BhZ2UgfHwgZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICB2YXIgZWxlbWVudHMgPSAoPElQYW5lbD5lbGVtZW50KS5lbGVtZW50cztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5lbnN1cmVVbmlxdWVOYW1lcyhlbGVtZW50c1tpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW5zdXJlVW5pcXVlUXVlc3Rpb25OYW1lKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGVuc3VyZVVuaXF1ZVBhZ2VOYW1lKGVsZW1lbnQ6IElTdXJ2ZXlFbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlVW5pcXVlRWxlbWVudE5hbWUoXG4gICAgICBlbGVtZW50LFxuICAgICAgKG5hbWU6IHN0cmluZyk6IElTdXJ2ZXlFbGVtZW50ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFnZUJ5TmFtZShuYW1lKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByaXZhdGUgZW5zdXJlVW5pcXVlUGFuZWxOYW1lKGVsZW1lbnQ6IElTdXJ2ZXlFbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlVW5pcXVlRWxlbWVudE5hbWUoXG4gICAgICBlbGVtZW50LFxuICAgICAgKG5hbWU6IHN0cmluZyk6IElTdXJ2ZXlFbGVtZW50ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFuZWxCeU5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGVuc3VyZVVuaXF1ZVF1ZXN0aW9uTmFtZShlbGVtZW50OiBJU3VydmV5RWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLmVuc3VyZVVuaXF1ZUVsZW1lbnROYW1lKFxuICAgICAgZWxlbWVudCxcbiAgICAgIChuYW1lOiBzdHJpbmcpOiBJU3VydmV5RWxlbWVudCA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVVbmlxdWVFbGVtZW50TmFtZShcbiAgICBlbGVtZW50OiBJU3VydmV5RWxlbWVudCxcbiAgICBnZXRFbGVtZW50QnlOYW1lOiAobmFtZTogc3RyaW5nKSA9PiBJU3VydmV5RWxlbWVudFxuICApIHtcbiAgICB2YXIgZXhpc3RpbmdFbGVtZW50ID0gZ2V0RWxlbWVudEJ5TmFtZShlbGVtZW50Lm5hbWUpO1xuICAgIGlmICghZXhpc3RpbmdFbGVtZW50IHx8IGV4aXN0aW5nRWxlbWVudCA9PSBlbGVtZW50KSByZXR1cm47XG4gICAgdmFyIG5ld05hbWUgPSB0aGlzLmdldE5ld05hbWUoZWxlbWVudC5uYW1lKTtcbiAgICB3aGlsZSAoISFnZXRFbGVtZW50QnlOYW1lKG5ld05hbWUpKSB7XG4gICAgICB2YXIgbmV3TmFtZSA9IHRoaXMuZ2V0TmV3TmFtZShlbGVtZW50Lm5hbWUpO1xuICAgIH1cbiAgICBlbGVtZW50Lm5hbWUgPSBuZXdOYW1lO1xuICB9XG4gIHByaXZhdGUgZ2V0TmV3TmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBwb3MgPSBuYW1lLmxlbmd0aDtcbiAgICB3aGlsZSAocG9zID4gMCAmJiBuYW1lW3BvcyAtIDFdID49IFwiMFwiICYmIG5hbWVbcG9zIC0gMV0gPD0gXCI5XCIpIHtcbiAgICAgIHBvcy0tO1xuICAgIH1cbiAgICB2YXIgYmFzZSA9IG5hbWUuc3Vic3RyKDAsIHBvcyk7XG4gICAgdmFyIG51bSA9IDA7XG4gICAgaWYgKHBvcyA8IG5hbWUubGVuZ3RoKSB7XG4gICAgICBudW0gPSBwYXJzZUludChuYW1lLnN1YnN0cihwb3MpKTtcbiAgICB9XG4gICAgbnVtKys7XG4gICAgcmV0dXJuIGJhc2UgKyBudW07XG4gIH1cbiAgcHJpdmF0ZSBjaGVja0lzQ3VycmVudFBhZ2VIYXNFcnJvcnMoXG4gICAgaXNGb2N1c2VPbkZpcnN0RXJyb3I6IGJvb2xlYW4gPSB1bmRlZmluZWRcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tJc1BhZ2VIYXNFcnJvcnModGhpcy5jdXJyZW50UGFnZSwgaXNGb2N1c2VPbkZpcnN0RXJyb3IpO1xuICB9XG4gIHByaXZhdGUgY2hlY2tJc1BhZ2VIYXNFcnJvcnMoXG4gICAgcGFnZTogUGFnZU1vZGVsLFxuICAgIGlzRm9jdXNlT25GaXJzdEVycm9yOiBib29sZWFuID0gdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0ZvY3VzZU9uRmlyc3RFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpc0ZvY3VzZU9uRmlyc3RFcnJvciA9IHRoaXMuZm9jdXNPbkZpcnN0RXJyb3I7XG4gICAgfVxuICAgIGlmICghcGFnZSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIHJlcyA9IHBhZ2UuaGFzRXJyb3JzKHRydWUsIGlzRm9jdXNlT25GaXJzdEVycm9yKTtcbiAgICB0aGlzLmZpcmVWYWxpZGF0ZWRFcnJvcnNPblBhZ2UocGFnZSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGZpcmVWYWxpZGF0ZWRFcnJvcnNPblBhZ2UocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgaWYgKHRoaXMub25WYWxpZGF0ZWRFcnJvcnNPbkN1cnJlbnRQYWdlLmlzRW1wdHkgfHwgIXBhZ2UpIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zT25QYWdlID0gcGFnZS5xdWVzdGlvbnM7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IG5ldyBBcnJheTxRdWVzdGlvbj4oKTtcbiAgICB2YXIgZXJyb3JzID0gbmV3IEFycmF5PFN1cnZleUVycm9yPigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zT25QYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHF1ZXN0aW9uc09uUGFnZVtpXTtcbiAgICAgIGlmIChxLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHF1ZXN0aW9ucy5wdXNoKHEpO1xuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHEuZXJyb3JzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2gocS5lcnJvcnNbal0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub25WYWxpZGF0ZWRFcnJvcnNPbkN1cnJlbnRQYWdlLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb25zOiBxdWVzdGlvbnMsXG4gICAgICBlcnJvcnM6IGVycm9ycyxcbiAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB1c2VyIHRvIGEgcHJldmlvdXMgcGFnZS4gSWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3QgcGFnZSwgYHByZXZQYWdlYCByZXR1cm5zIGBmYWxzZWAuIGBwcmV2UGFnZWAgZG9lcyBub3QgcGVyZm9ybSBhbnkgY2hlY2tzLCByZXF1aXJlZCBxdWVzdGlvbnMgY2FuIGJlIGVtcHR5LlxuICAgKiBAc2VlIGlzRmlyc3RQYWdlXG4gICAqL1xuICBwdWJsaWMgcHJldlBhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdFBhZ2UpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnJlc2V0TmF2aWdhdGlvbkJ1dHRvbigpO1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICB2YXIgaW5kZXggPSB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdlBhZ2VzW2luZGV4IC0gMV07XG4gIH1cbiAgLyoqXG4gICAqIENvbXBsZXRlcyB0aGUgc3VydmV5LCBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBsYXN0IG9uZS4gSXQgcmV0dXJucyBgZmFsc2VgIGlmIHRoZSBsYXN0IHBhZ2UgaGFzIGVycm9ycy5cbiAgICogSWYgdGhlIGxhc3QgcGFnZSBoYXMgbm8gZXJyb3JzLCBgY29tcGxldGVMYXN0UGFnZWAgY2FsbHMgYGRvQ29tcGxldGVgIGFuZCByZXR1cm5zIGB0cnVlYC5cbiAgICogQHNlZSBpc0N1cnJlbnRQYWdlSGFzRXJyb3JzXG4gICAqIEBzZWUgbmV4dFBhZ2VcbiAgICogQHNlZSBkb0NvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgY29tcGxldGVMYXN0UGFnZSgpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gdGhpcy5kb0N1cnJlbnRQYWdlQ29tcGxldGUodHJ1ZSk7XG4gICAgaWYgKHJlcykge1xuICAgICAgdGhpcy5jYW5jZWxQcmV2aWV3KCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBpc05hdmlnYXRpb25CdXR0b25QcmVzc2VkOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBuYXZpZ2F0aW9uTW91c2VEb3duKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuaXNOYXZpZ2F0aW9uQnV0dG9uUHJlc3NlZCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSByZXNldE5hdmlnYXRpb25CdXR0b24oKSB7XG4gICAgdGhpcy5pc05hdmlnYXRpb25CdXR0b25QcmVzc2VkID0gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFNob3cgcHJldmlldyBmb3IgdGhlIHN1cnZleS4gR28gdG8gdGhlIFwicHJldmlld1wiIHN0YXRlXG4gICAqIEBzZWUgc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZVxuICAgKiBAc2VlIGNhbmNlbFByZXZpZXdcbiAgICogQHNlZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHNob3dQcmV2aWV3KCk6IGJvb2xlYW4ge1xuICAgIHRoaXMucmVzZXROYXZpZ2F0aW9uQnV0dG9uKCk7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3JzT25OYXZpZ2F0ZSh0cnVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuaXNTaG93aW5nUHJldmlldyA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIENhbmVsIHByZXZpZXcgYW5kIGdvIGJhY2sgdG8gdGhlIFwicnVubmluZ1wiIHN0YXRlLlxuICAgKiBAcGFyYW0gY3VyUGFnZSAtIGEgbmV3IGN1cnJlbnQgcGFnZS4gSWYgdGhlIHBhcmFtZXRlciBpcyB1bmRlcmZpbmVkIHRoZW4gdGhlIGxhc3QgcGFnZSBiZWNvbWVzIGN1cnJlbnQuXG4gICAqIEBzZWUgc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZVxuICAgKiBAc2VlIHNob3dQcmV2aWV3XG4gICAqIEBzZWUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBjYW5jZWxQcmV2aWV3KGN1clBhZ2U6IGFueSA9IG51bGwpIHtcbiAgICBpZiAoIXRoaXMuaXNTaG93aW5nUHJldmlldykgcmV0dXJuO1xuICAgIHRoaXMuaXNTaG93aW5nUHJldmlldyA9IGZhbHNlO1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShjdXJQYWdlKSAmJiB0aGlzLnZpc2libGVQYWdlQ291bnQgPiAwKSB7XG4gICAgICBjdXJQYWdlID0gdGhpcy52aXNpYmxlUGFnZUNvdW50IC0gMTtcbiAgICB9XG4gICAgaWYgKGN1clBhZ2UgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBjdXJQYWdlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2FuY2VsUHJldmlld0J5UGFnZShwYW5lbDogSVBhbmVsKTogYW55IHtcbiAgICB0aGlzLmNhbmNlbFByZXZpZXcoKDxhbnk+cGFuZWwpW1wib3JpZ2luYWxQYWdlXCJdKTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9DdXJyZW50UGFnZUNvbXBsZXRlKGRvQ29tcGxldGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICB0aGlzLnJlc2V0TmF2aWdhdGlvbkJ1dHRvbigpO1xuICAgIGlmICh0aGlzLmhhc0Vycm9yc09uTmF2aWdhdGUoZG9Db21wbGV0ZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5kb0N1cnJlbnRQYWdlQ29tcGxldGVDb3JlKGRvQ29tcGxldGUpO1xuICB9XG4gIHByaXZhdGUgZG9DdXJyZW50UGFnZUNvbXBsZXRlQ29yZShkb0NvbXBsZXRlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZG9TZXJ2ZXJWYWxpZGF0aW9uKGRvQ29tcGxldGUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRvQ29tcGxldGUpIHtcbiAgICAgIHRoaXMuZG9Db21wbGV0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRvTmV4dFBhZ2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIE9ic29sZXRlIHVzZSB0aGUgYHF1ZXN0aW9uc09uUGFnZU1vZGVgIHByb3BlcnR5IGluc3RlYWQuXG4gICAqIEBzZWUgcXVlc3Rpb25zT25QYWdlTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBpc1NpbmdsZVBhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25zT25QYWdlTW9kZSA9PSBcInNpbmdsZVBhZ2VcIjtcbiAgfVxuICBwdWJsaWMgc2V0IGlzU2luZ2xlUGFnZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnF1ZXN0aW9uc09uUGFnZU1vZGUgPSB2YWwgPyBcInNpbmdsZVBhZ2VcIiA6IFwic3RhbmRhcmRcIjtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgdGhhdCBzcGVjaWZpZXMgaG93IHRoZSBzdXJ2ZXkgY29tYmluZXMgcXVlc3Rpb25zLCBwYW5lbHMsIGFuZCBwYWdlcy5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqXG4gICAqIC0gYHNpbmdsZVBhZ2VgIC0gY29tYmluZSBhbGwgc3VydmV5IHBhZ2VzIGluIGEgc2luZ2xlIHBhZ2UuIFBhZ2VzIHdpbGwgYmUgY29udmVydGVkIHRvIHBhbmVscy5cbiAgICogLSBgcXVlc3Rpb25QZXJQYWdlYCAtIHNob3cgb25lIHF1ZXN0aW9uIHBlciBwYWdlLiBTdXJ2ZXkgd2lsbCBjcmVhdGUgYSBzZXBhcmF0ZSBwYWdlIGZvciBldmVyeSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zT25QYWdlTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbnNPblBhZ2VNb2RlXCIsIFwic3RhbmRhcmRcIik7XG4gIH1cbiAgcHVibGljIHNldCBxdWVzdGlvbnNPblBhZ2VNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT25QYWdlTW9kZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgd2hldGhlciB0aGUgZmlyc3Qgc3VydmV5IHBhZ2UgaXMgYSBzdGFydCBwYWdlLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBgdHJ1ZWAsIHRvIG1ha2UgdGhlIGZpcnN0IHBhZ2UgYSBzdGFydGluZyBwYWdlLlxuICAgKiBBbiBlbmQgdXNlciBjYW5ub3QgbmF2aWdhdGUgdG8gdGhlIHN0YXJ0IHBhZ2UgYW5kIHRoZSBzdGFydCBwYWdlIGRvZXMgbm90IGFmZmVjdCBhIHN1cnZleSBwcm9ncmVzcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZmlyc3RQYWdlSXNTdGFydGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmaXJzdFBhZ2VJc1N0YXJ0ZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZmlyc3RQYWdlSXNTdGFydGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImZpcnN0UGFnZUlzU3RhcnRlZFwiLCB2YWwpO1xuICB9XG4gIGlzUGFnZVN0YXJ0ZWQocGFnZTogSVBhZ2UpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgJiYgdGhpcy5wYWdlcy5sZW5ndGggPiAwICYmIHRoaXMucGFnZXNbMF0gPT09IHBhZ2VcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcInNob3dBbGxRdWVzdGlvbnNcIiBvciBcInNob3dBbnN3ZXJlZFF1ZXN0aW9uc1wiIHRvIHByZXZpZXcgcmVzdWx0cyB0byBhIHVzZXIgYmVmb3JlIGhlL3NoZSBjb21wbGV0ZXMgdGhlIHN1cnZleS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXCIsIFwibm9QcmV2aWV3XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQcmV2aWV3QmVmb3JlQ29tcGxldGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZSgpOiBib29sZWFuIHtcbiAgICB2YXIgcHJldmlldyA9IHRoaXMuc2hvd1ByZXZpZXdCZWZvcmVDb21wbGV0ZTtcbiAgICByZXR1cm4gcHJldmlldyA9PSBcInNob3dBbGxRdWVzdGlvbnNcIiB8fCBwcmV2aWV3ID09IFwic2hvd0Fuc3dlcmVkUXVlc3Rpb25zXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uRmlyc3RQYWdlSXNTdGFydGVkQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5wYWdlcy5sZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuaXNTdGFydGVkU3RhdGUgPSB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZDtcbiAgICB0aGlzLnBhZ2VWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLnBhZ2VzWzBdLCAhdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQpO1xuICB9XG4gIHJ1bm5pbmdQYWdlczogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBvblNob3dpbmdQcmV2aWV3Q2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc1Nob3dpbmdQcmV2aWV3KSB7XG4gICAgICB0aGlzLnJ1bm5pbmdQYWdlcyA9IHRoaXMucGFnZXMuc2xpY2UoMCwgdGhpcy5wYWdlcy5sZW5ndGgpO1xuICAgICAgdGhpcy5zZXR1cFBhZ2VzRm9yUGFnZU1vZGVzKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5ydW5uaW5nUGFnZXMpIHtcbiAgICAgICAgdGhpcy5yZXN0b3JlT3JpZ2lvbmFsUGFnZXModGhpcy5ydW5uaW5nUGFnZXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5ydW5uaW5nUGFnZXMgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUFsbEVsZW1lbnRzVmlzaWJpbGl0eSh0aGlzLnBhZ2VzKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5jdXJyZW50UGFnZU5vID0gMDtcbiAgfVxuICBvcmlnaW9uYWxQYWdlczogYW55ID0gbnVsbDtcbiAgcHJvdGVjdGVkIG9uUXVlc3Rpb25zT25QYWdlTW9kZUNoYW5nZWQob2xkVmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzU2hvd2luZ1ByZXZpZXcpIHJldHVybjtcbiAgICBpZiAodGhpcy5xdWVzdGlvbnNPblBhZ2VNb2RlID09IFwic3RhbmRhcmRcIiB8fCB0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgaWYgKHRoaXMub3JpZ2lvbmFsUGFnZXMpIHtcbiAgICAgICAgdGhpcy5yZXN0b3JlT3JpZ2lvbmFsUGFnZXModGhpcy5vcmlnaW9uYWxQYWdlcyk7XG4gICAgICB9XG4gICAgICB0aGlzLm9yaWdpb25hbFBhZ2VzID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFvbGRWYWx1ZSB8fCBvbGRWYWx1ZSA9PSBcInN0YW5kYXJkXCIpIHtcbiAgICAgICAgdGhpcy5vcmlnaW9uYWxQYWdlcyA9IHRoaXMucGFnZXMuc2xpY2UoMCwgdGhpcy5wYWdlcy5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXR1cFBhZ2VzRm9yUGFnZU1vZGVzKHRoaXMuaXNTaW5nbGVQYWdlKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gIH1cbiAgcHJpdmF0ZSByZXN0b3JlT3JpZ2lvbmFsUGFnZXMob3JpZ2luYWxQYWdlczogQXJyYXk8UGFnZU1vZGVsPikge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNDbGVhcigpO1xuICAgIHRoaXMucGFnZXMuc3BsaWNlKDAsIHRoaXMucGFnZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yaWdpbmFsUGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXMucHVzaChvcmlnaW5hbFBhZ2VzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZXR1cFBhZ2VzRm9yUGFnZU1vZGVzKGlzU2luZ2xlUGFnZTogYm9vbGVhbikge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNDbGVhcigpO1xuICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgPyAxIDogMDtcbiAgICBzdXBlci5zdGFydExvYWRpbmdGcm9tSnNvbigpO1xuICAgIHZhciBuZXdQYWdlcyA9IHRoaXMuY3JlYXRlUGFnZXNGb3JRdWVzdGlvbk9uUGFnZU1vZGUoXG4gICAgICBpc1NpbmdsZVBhZ2UsXG4gICAgICBzdGFydEluZGV4XG4gICAgKTtcbiAgICB2YXIgZGVsZXRlZExlbiA9IHRoaXMucGFnZXMubGVuZ3RoIC0gc3RhcnRJbmRleDtcbiAgICB0aGlzLnBhZ2VzLnNwbGljZShzdGFydEluZGV4LCBkZWxldGVkTGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1BhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzLnB1c2gobmV3UGFnZXNbaV0pO1xuICAgIH1cbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1BhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuZXdQYWdlc1tpXS5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICAgIG5ld1BhZ2VzW2ldLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgfVxuICAgIHRoaXMuZG9FbGVtZW50c09uTG9hZCgpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlUGFnZXNGb3JRdWVzdGlvbk9uUGFnZU1vZGUoXG4gICAgaXNTaW5nbGVQYWdlOiBib29sZWFuLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlclxuICApOiBBcnJheTxQYWdlTW9kZWw+IHtcbiAgICBpZiAoaXNTaW5nbGVQYWdlKSB7XG4gICAgICByZXR1cm4gW3RoaXMuY3JlYXRlU2luZ2xlUGFnZShzdGFydEluZGV4KV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhZ2VzRm9yRXZlcnlRdWVzdGlvbihzdGFydEluZGV4KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVNpbmdsZVBhZ2Uoc3RhcnRJbmRleDogbnVtYmVyKTogUGFnZU1vZGVsIHtcbiAgICB2YXIgc2luZ2xlID0gdGhpcy5jcmVhdGVOZXdQYWdlKFwiYWxsXCIpO1xuICAgIHNpbmdsZS5zZXRTdXJ2ZXlJbXBsKHRoaXMpO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgdmFyIHBhbmVsID0gU2VyaWFsaXplci5jcmVhdGVDbGFzcyhcInBhbmVsXCIpO1xuICAgICAgcGFuZWwub3JpZ2luYWxQYWdlID0gcGFnZTtcbiAgICAgIHNpbmdsZS5hZGRQYW5lbChwYW5lbCk7XG4gICAgICB2YXIganNvbiA9IG5ldyBKc29uT2JqZWN0KCkudG9Kc29uT2JqZWN0KHBhZ2UpO1xuICAgICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBwYW5lbCk7XG4gICAgICBpZiAoIXRoaXMuc2hvd1BhZ2VUaXRsZXMpIHtcbiAgICAgICAgcGFuZWwudGl0bGUgPSBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2luZ2xlO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlUGFnZXNGb3JFdmVyeVF1ZXN0aW9uKHN0YXJ0SW5kZXg6IG51bWJlcik6IEFycmF5PFBhZ2VNb2RlbD4ge1xuICAgIHZhciByZXM6IEFycmF5PFBhZ2VNb2RlbD4gPSBbXTtcbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvcmlnaW5hbFBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgLy8gSW5pdGlhbGl6ZSByYW5kb21pemF0aW9uXG4gICAgICBvcmlnaW5hbFBhZ2Uuc2V0V2FzU2hvd24odHJ1ZSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG9yaWdpbmFsUGFnZS5lbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgb3JpZ2luYWxFbGVtZW50ID0gb3JpZ2luYWxQYWdlLmVsZW1lbnRzW2pdO1xuICAgICAgICB2YXIgZWxlbWVudCA9IFNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3Mob3JpZ2luYWxFbGVtZW50LmdldFR5cGUoKSk7XG4gICAgICAgIGlmICghZWxlbWVudCkgY29udGludWU7XG4gICAgICAgIHZhciBqc29uT2JqID0gbmV3IEpzb25PYmplY3QoKTtcbiAgICAgICAgLy9EZXNlcmlhbGl6ZSBwYWdlIHByb3BlcnRpZXMgb25seSwgZXhjbHVkaW5nIGVsZW1lbnRzXG4gICAgICAgIGpzb25PYmoubGlnaHRTZXJpYWxpemluZyA9IHRydWU7XG4gICAgICAgIHZhciBwYWdlSnNvbiA9IGpzb25PYmoudG9Kc29uT2JqZWN0KG9yaWdpbmFsUGFnZSk7XG5cbiAgICAgICAgdmFyIHBhZ2UgPSA8UGFnZU1vZGVsPlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3Mob3JpZ2luYWxQYWdlLmdldFR5cGUoKSk7XG4gICAgICAgIHBhZ2UuZnJvbUpTT04ocGFnZUpzb24pO1xuICAgICAgICBwYWdlLm5hbWUgPSBcInBhZ2VcIiArIChyZXMubGVuZ3RoICsgMSk7XG4gICAgICAgIHBhZ2Uuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICAgICAgcmVzLnB1c2gocGFnZSk7XG4gICAgICAgIHZhciBqc29uID0gbmV3IEpzb25PYmplY3QoKS50b0pzb25PYmplY3Qob3JpZ2luYWxFbGVtZW50KTtcbiAgICAgICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBlbGVtZW50KTtcbiAgICAgICAgcGFnZS5hZGRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHBhZ2UucXVlc3Rpb25zLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlc0FkZGVkKHBhZ2UucXVlc3Rpb25zW2tdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3Qgb25lLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSA9PSAwO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJldkJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0UGFnZSB8fCAhdGhpcy5zaG93UHJldkJ1dHRvbikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBwYWdlID0gdGhpcy52aXNpYmxlUGFnZXNbdGhpcy5jdXJyZW50UGFnZU5vIC0gMV07XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKSA8PSAwO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgbGFzdCBvbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTGFzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHJldHVybiB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSA9PSB2UGFnZXMubGVuZ3RoIC0gMTtcbiAgfVxuICAvKipcbiAgICogQ29tcGxldGVzIHRoZSBzdXJ2ZXkuXG4gICAqXG4gICAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHRhc2tzOlxuICAgKlxuICAgKiAtIHdyaXRlcyBjb29raWUgaWYgdGhlIGBjb29raWVOYW1lYCBwcm9wZXJ0eSBpcyBub3QgZW1wdHlcbiAgICogLSBzZXRzIHRoZSBzdXJ2ZXkgaW50byBgY29tcGxldGVkYCBzdGF0ZVxuICAgKiAtIGZpcmVzIHRoZSBgb25Db21wbGV0ZWAgZXZlbnRcbiAgICogLSBjYWxscyBgc2VuZFJlc3VsdGAgZnVuY3Rpb24uXG4gICAqXG4gICAqIENhbGxpbmcgdGhlIGBkb0NvbXBsZXRlYCBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGFueSB2YWxpZGF0aW9uLCB1bmxpa2UgdGhlIGBjb21wbGV0ZUxhc3RQYWdlYCBmdW5jdGlvbi5cbiAgICogSXQgY2FsbHMgYG5hdmlnYXRlVG9VcmxgIGFmdGVyIGNhbGxpbmcgYG9uQ29tcGxldGVgIGV2ZW50LlxuICAgKiBJbiBjYXNlIGNhbGxpbmcgYG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdgIGNhbGxiYWNrIGluIHRoZSBgb25Db21wbGV0ZWAgZXZlbnQsIGBuYXZpZ2F0ZVRvVXJsYCBpcyB1c2VkIG9uIGNhbGxpbmcgYG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdTdWNjZXNzYCBjYWxsYmFjay5cbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqIEBzZWUgY29va2llTmFtZVxuICAgKiBAc2VlIHN0YXRlXG4gICAqIEBzZWUgb25Db21wbGV0ZVxuICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgKiBAc2VlIGNvbXBsZXRlTGFzdFBhZ2VcbiAgICogQHNlZSBuYXZpZ2F0ZVRvVXJsXG4gICAqIEBzZWUgbmF2aWdhdGVUb1VybE9uQ29uZGl0aW9uXG4gICAqL1xuICBwdWJsaWMgZG9Db21wbGV0ZShpc0NvbXBsZXRlT25UcmlnZ2VyOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB2YXIgb25Db21wbGV0aW5nT3B0aW9ucyA9IHtcbiAgICAgIGFsbG93Q29tcGxldGU6IHRydWUsXG4gICAgICBpc0NvbXBsZXRlT25UcmlnZ2VyOiBpc0NvbXBsZXRlT25UcmlnZ2VyLFxuICAgIH07XG4gICAgdGhpcy5vbkNvbXBsZXRpbmcuZmlyZSh0aGlzLCBvbkNvbXBsZXRpbmdPcHRpb25zKTtcbiAgICBpZiAoIW9uQ29tcGxldGluZ09wdGlvbnMuYWxsb3dDb21wbGV0ZSkgcmV0dXJuO1xuICAgIGxldCBwcmV2aW91c0Nvb2tpZSA9IHRoaXMuaGFzQ29va2llO1xuICAgIHRoaXMuc3RvcFRpbWVyKCk7XG4gICAgdGhpcy5zZXRDb21wbGV0ZWQoKTtcbiAgICB0aGlzLmNsZWFyVW51c2VkVmFsdWVzKCk7XG4gICAgdGhpcy5zZXRDb29raWUoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHNhdmluZ0RhdGFTdGFydGVkID0gZmFsc2U7XG4gICAgdmFyIG9uQ29tcGxldGVPcHRpb25zID0ge1xuICAgICAgaXNDb21wbGV0ZU9uVHJpZ2dlcjogaXNDb21wbGV0ZU9uVHJpZ2dlcixcbiAgICAgIHNob3dEYXRhU2F2aW5nOiBmdW5jdGlvbiAodGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNhdmluZ0RhdGFTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcInNhdmluZ1wiLCB0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBzaG93RGF0YVNhdmluZ0Vycm9yOiBmdW5jdGlvbiAodGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJlcnJvclwiLCB0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBzaG93RGF0YVNhdmluZ1N1Y2Nlc3M6IGZ1bmN0aW9uICh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcInN1Y2Nlc3NcIiwgdGV4dCk7XG4gICAgICAgIHNlbGYubmF2aWdhdGVUbygpO1xuICAgICAgfSxcbiAgICAgIHNob3dEYXRhU2F2aW5nQ2xlYXI6IGZ1bmN0aW9uICh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcIlwiLCBcIlwiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLm9uQ29tcGxldGUuZmlyZSh0aGlzLCBvbkNvbXBsZXRlT3B0aW9ucyk7XG4gICAgaWYgKCFwcmV2aW91c0Nvb2tpZSAmJiB0aGlzLnN1cnZleVBvc3RJZCkge1xuICAgICAgdGhpcy5zZW5kUmVzdWx0KCk7XG4gICAgfVxuICAgIGlmICghc2F2aW5nRGF0YVN0YXJ0ZWQpIHtcbiAgICAgIHRoaXMubmF2aWdhdGVUbygpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU3RhcnRzIHRoZSBzdXJ2ZXkuIENoYW5nZXMgdGhlIHN1cnZleSBtb2RlIGZyb20gXCJzdGFydGluZ1wiIHRvIFwicnVubmluZ1wiLiBDYWxsIHRoaXMgZnVuY3Rpb24gaWYgeW91ciBzdXJ2ZXkgaGFzIGEgc3RhcnQgcGFnZSwgb3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLlxuICAgKiBAc2VlIGZpcnN0UGFnZUlzU3RhcnRlZFxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5jaGVja0lzUGFnZUhhc0Vycm9ycyh0aGlzLnN0YXJ0ZWRQYWdlLCB0cnVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuaXNTdGFydGVkU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0VGltZXJGcm9tVUkoKTtcbiAgICB0aGlzLm9uU3RhcnRlZC5maXJlKHRoaXMsIHt9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSBxdWVzdGlvbiB2YWx1ZXMgb24gdGhlIGN1cnJlbnQgcGFnZSBhcmUgdmFsaWRhdGluZyBvbiB0aGUgc2VydmVyIGF0IHRoZSBjdXJyZW50IG1vbWVudC5cbiAgICogQHNlZSBvblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmFsaWRhdGluZ09uU2VydmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc1ZhbGlkYXRpbmdPblNlcnZlclwiLCBmYWxzZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRJc1ZhbGlkYXRpbmdPblNlcnZlcih2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsID09IHRoaXMuaXNWYWxpZGF0aW5nT25TZXJ2ZXIpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1ZhbGlkYXRpbmdPblNlcnZlclwiLCB2YWwpO1xuICAgIHRoaXMub25Jc1ZhbGlkYXRpbmdPblNlcnZlckNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Jc1ZhbGlkYXRpbmdPblNlcnZlckNoYW5nZWQoKSB7fVxuICBwcm90ZWN0ZWQgZG9TZXJ2ZXJWYWxpZGF0aW9uKGRvQ29tcGxldGU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5vblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zIHx8XG4gICAgICB0aGlzLm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnMuaXNFbXB0eVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZighZG9Db21wbGV0ZSAmJiB0aGlzLmNoZWNrRXJyb3JzTW9kZSA9PT0gXCJvbkNvbXBsZXRlXCIpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBkYXRhOiA8eyBbaW5kZXg6IHN0cmluZ106IGFueSB9Pnt9LFxuICAgICAgZXJyb3JzOiB7fSxcbiAgICAgIHN1cnZleTogdGhpcyxcbiAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuY29tcGxldGVTZXJ2ZXJWYWxpZGF0aW9uKG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICB9O1xuICAgIGlmKGRvQ29tcGxldGUgJiYgdGhpcy5jaGVja0Vycm9yc01vZGUgPT09IFwib25Db21wbGV0ZVwiKSB7XG4gICAgICBvcHRpb25zLmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jdXJyZW50UGFnZS5xdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5jdXJyZW50UGFnZS5xdWVzdGlvbnNbaV07XG4gICAgICAgIGlmICghcXVlc3Rpb24udmlzaWJsZSkgY29udGludWU7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkpO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKSlcbiAgICAgICAgICBvcHRpb25zLmRhdGFbcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2V0SXNWYWxpZGF0aW5nT25TZXJ2ZXIodHJ1ZSk7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLm9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgY29tcGxldGVTZXJ2ZXJWYWxpZGF0aW9uKG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuc2V0SXNWYWxpZGF0aW5nT25TZXJ2ZXIoZmFsc2UpO1xuICAgIGlmICghb3B0aW9ucyAmJiAhb3B0aW9ucy5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IG9wdGlvbnMuc3VydmV5O1xuICAgIHZhciBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBpZiAob3B0aW9ucy5lcnJvcnMpIHtcbiAgICAgIHZhciBoYXNUb0ZvY3VzID0gdGhpcy5mb2N1c09uRmlyc3RFcnJvcjtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucy5lcnJvcnMpIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gc2VsZi5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uICYmIHF1ZXN0aW9uW1wiZXJyb3JzXCJdKSB7XG4gICAgICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgICAgICBxdWVzdGlvbi5hZGRFcnJvcihuZXcgQ3VzdG9tRXJyb3Iob3B0aW9ucy5lcnJvcnNbbmFtZV0sIHRoaXMpKTtcbiAgICAgICAgICBpZiAoaGFzVG9Gb2N1cykge1xuICAgICAgICAgICAgaGFzVG9Gb2N1cyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYoISFxdWVzdGlvbi5wYWdlKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBxdWVzdGlvbi5wYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVlc3Rpb24uZm9jdXModHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzRXJyb3JzKSB7XG4gICAgICBpZiAoc2VsZi5pc0xhc3RQYWdlKSBzZWxmLmRvQ29tcGxldGUoKTtcbiAgICAgIGVsc2Ugc2VsZi5kb05leHRQYWdlKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBkb05leHRQYWdlKCkge1xuICAgIHZhciBjdXJQYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICB0aGlzLmNoZWNrT25QYWdlVHJpZ2dlcnMoKTtcbiAgICBpZiAoIXRoaXMuaXNDb21wbGV0ZWQpIHtcbiAgICAgIGlmICh0aGlzLnNlbmRSZXN1bHRPblBhZ2VOZXh0KSB7XG4gICAgICAgIHRoaXMuc2VuZFJlc3VsdCh0aGlzLnN1cnZleVBvc3RJZCwgdGhpcy5jbGllbnRJZCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoY3VyUGFnZSA9PT0gdGhpcy5jdXJyZW50UGFnZSkge1xuICAgICAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgICAgIHZhciBpbmRleCA9IHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdlBhZ2VzW2luZGV4ICsgMV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9Db21wbGV0ZSh0cnVlKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldENvbXBsZXRlZCgpIHtcbiAgICB0aGlzLmlzQ29tcGxldGVkID0gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgSFRNTCBjb250ZW50IGZvciB0aGUgY29tcGxldGUgcGFnZS5cbiAgICogQHNlZSBjb21wbGV0ZWRIdG1sXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZENvbXBsZXRlZEh0bWwoKTogc3RyaW5nIHtcbiAgICB2YXIgaHRtbCA9IHRoaXMucmVuZGVyZWRDb21wbGV0ZWRIdG1sO1xuICAgIGlmIChodG1sKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSHRtbChodG1sKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiPGgzPlwiICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJjb21wbGV0aW5nU3VydmV5XCIpICsgXCI8L2gzPlwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBIVE1MIGNvbnRlbnQsIHRoYXQgaXMgc2hvd24gdG8gYSB1c2VyIHRoYXQgaGFkIGNvbXBsZXRlZCB0aGUgc3VydmV5IGJlZm9yZS5cbiAgICogQHNlZSBjb21wbGV0ZWRIdG1sXG4gICAqIEBzZWUgY29va2llTmFtZVxuICAgKi9cbiAgcHVibGljIGdldCBwcm9jZXNzZWRDb21wbGV0ZWRCZWZvcmVIdG1sKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY29tcGxldGVkQmVmb3JlSHRtbCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0h0bWwodGhpcy5jb21wbGV0ZWRCZWZvcmVIdG1sKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiPGgzPlwiICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJjb21wbGV0aW5nU3VydmV5QmVmb3JlXCIpICsgXCI8L2gzPlwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBIVE1MIGNvbnRlbnQsIHRoYXQgaXMgc2hvd3Mgd2hlbiBhIHN1cnZleSBsb2FkcyB0aGUgc3VydmV5IEpTT04uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZExvYWRpbmdIdG1sKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubG9hZGluZ0h0bWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdG1sKHRoaXMubG9hZGluZ0h0bWwpO1xuICAgIH1cbiAgICByZXR1cm4gXCI8aDM+XCIgKyB0aGlzLmdldExvY1N0cmluZyhcImxvYWRpbmdTdXJ2ZXlcIikgKyBcIjwvaDM+XCI7XG4gIH1cbiAgcHVibGljIGdldFByb2dyZXNzSW5mbygpOiBJUHJvZ3Jlc3NJbmZvIHtcbiAgICByZXR1cm4gU3VydmV5RWxlbWVudC5nZXRQcm9ncmVzc0luZm9CeUVsZW1lbnRzKHRoaXMudmlzaWJsZVBhZ2VzLCBmYWxzZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBjdXJyZW50IHByb2dyZXNzLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm9ncmVzc1RleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicHJvZ3Jlc3NUZXh0XCIsIFwiXCIpO1xuICAgIGlmICghcmVzKSB7XG4gICAgICB0aGlzLnVwZGF0ZVByb2dyZXNzVGV4dCgpO1xuICAgICAgcmVzID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicHJvZ3Jlc3NUZXh0XCIsIFwiXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVQcm9ncmVzc1RleHQob25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIGlmIChcbiAgICAgIG9uVmFsdWVDaGFuZ2VkICYmXG4gICAgICB0aGlzLnByb2dyZXNzQmFyVHlwZSA9PSBcInBhZ2VzXCIgJiZcbiAgICAgIHRoaXMub25Qcm9ncmVzc1RleHQuaXNFbXB0eVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwcm9ncmVzc1RleHRcIiwgdGhpcy5nZXRQcm9ncmVzc1RleHQoKSk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicHJvZ3Jlc3NWYWx1ZVwiLCB0aGlzLmdldFByb2dyZXNzKCkpO1xuICB9XG4gIHB1YmxpYyBnZXRQcm9ncmVzc1RleHQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUgfHwgdGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICBhbnN3ZXJlZFF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICByZXF1aXJlZFF1ZXN0aW9uQ291bnQ6IDAsXG4gICAgICByZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudDogMCxcbiAgICAgIHRleHQ6IFwiXCIsXG4gICAgfTtcbiAgICB2YXIgdHlwZSA9IHRoaXMucHJvZ3Jlc3NCYXJUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKFxuICAgICAgdHlwZSA9PT0gXCJxdWVzdGlvbnNcIiB8fFxuICAgICAgdHlwZSA9PT0gXCJyZXF1aXJlZHF1ZXN0aW9uc1wiIHx8XG4gICAgICB0eXBlID09PSBcImNvcnJlY3RxdWVzdGlvbnNcIiB8fFxuICAgICAgIXRoaXMub25Qcm9ncmVzc1RleHQuaXNFbXB0eVxuICAgICkge1xuICAgICAgdmFyIGluZm8gPSB0aGlzLmdldFByb2dyZXNzSW5mbygpO1xuICAgICAgb3B0aW9ucy5xdWVzdGlvbkNvdW50ID0gaW5mby5xdWVzdGlvbkNvdW50O1xuICAgICAgb3B0aW9ucy5hbnN3ZXJlZFF1ZXN0aW9uQ291bnQgPSBpbmZvLmFuc3dlcmVkUXVlc3Rpb25Db3VudDtcbiAgICAgIG9wdGlvbnMucmVxdWlyZWRRdWVzdGlvbkNvdW50ID0gaW5mby5yZXF1aXJlZFF1ZXN0aW9uQ291bnQ7XG4gICAgICBvcHRpb25zLnJlcXVpcmVkQW5zd2VyZWRRdWVzdGlvbkNvdW50ID1cbiAgICAgICAgaW5mby5yZXF1aXJlZEFuc3dlcmVkUXVlc3Rpb25Db3VudDtcbiAgICB9XG5cbiAgICBvcHRpb25zLnRleHQgPSB0aGlzLmdldFByb2dyZXNzVGV4dENvcmUob3B0aW9ucyk7XG4gICAgdGhpcy5vblByb2dyZXNzVGV4dC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnRleHQ7XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9ncmVzc1RleHRDb3JlKGluZm86IElQcm9ncmVzc0luZm8pOiBzdHJpbmcge1xuICAgIHZhciB0eXBlID0gdGhpcy5wcm9ncmVzc0JhclR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodHlwZSA9PT0gXCJxdWVzdGlvbnNcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicXVlc3Rpb25zUHJvZ3Jlc3NUZXh0XCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICBpbmZvLmFuc3dlcmVkUXVlc3Rpb25Db3VudCxcbiAgICAgICAgaW5mby5xdWVzdGlvbkNvdW50XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJyZXF1aXJlZHF1ZXN0aW9uc1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJxdWVzdGlvbnNQcm9ncmVzc1RleHRcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgIGluZm8ucmVxdWlyZWRBbnN3ZXJlZFF1ZXN0aW9uQ291bnQsXG4gICAgICAgIGluZm8ucmVxdWlyZWRRdWVzdGlvbkNvdW50XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gXCJjb3JyZWN0cXVlc3Rpb25zXCIpIHtcbiAgICAgIHZhciBjb3JyZWN0QW5zd2Vyc0NvdW50ID0gdGhpcy5nZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudCgpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicXVlc3Rpb25zUHJvZ3Jlc3NUZXh0XCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICBjb3JyZWN0QW5zd2Vyc0NvdW50LFxuICAgICAgICBpbmZvLnF1ZXN0aW9uQ291bnRcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICB2YXIgaW5kZXggPSB2UGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSArIDE7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwicHJvZ3Jlc3NUZXh0XCIpW1wiZm9ybWF0XCJdKGluZGV4LCB2UGFnZXMubGVuZ3RoKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWZ0ZXJSZW5kZXJTdXJ2ZXkoaHRtbEVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMub25BZnRlclJlbmRlclN1cnZleS5maXJlKHRoaXMsIHtcbiAgICAgIHN1cnZleTogdGhpcyxcbiAgICAgIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudCxcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXMocXVlc3Rpb246IElRdWVzdGlvbiwgY3NzQ2xhc3NlczogYW55KSB7XG4gICAgdGhpcy5vblVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3Nlcy5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIGNzc0NsYXNzZXM6IGNzc0NsYXNzZXMsXG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlUGFuZWxDc3NDbGFzc2VzKHBhbmVsOiBJUGFuZWwsIGNzc0NsYXNzZXM6IGFueSkge1xuICAgIHRoaXMub25VcGRhdGVQYW5lbENzc0NsYXNzZXMuZmlyZSh0aGlzLCB7XG4gICAgICBwYW5lbDogcGFuZWwsXG4gICAgICBjc3NDbGFzc2VzOiBjc3NDbGFzc2VzLFxuICAgIH0pO1xuICB9XG4gIHVwZGF0ZVBhZ2VDc3NDbGFzc2VzKHBhZ2U6IElQYWdlLCBjc3NDbGFzc2VzOiBhbnkpIHtcbiAgICB0aGlzLm9uVXBkYXRlUGFnZUNzc0NsYXNzZXMuZmlyZSh0aGlzLCB7XG4gICAgICBwYWdlOiBwYWdlLFxuICAgICAgY3NzQ2xhc3NlczogY3NzQ2xhc3NlcyxcbiAgICB9KTtcbiAgfVxuICBhZnRlclJlbmRlclBhZ2UoaHRtbEVsZW1lbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLm9uQWZ0ZXJSZW5kZXJQYWdlLmlzRW1wdHkpIHJldHVybjtcbiAgICB0aGlzLm9uQWZ0ZXJSZW5kZXJQYWdlLmZpcmUodGhpcywge1xuICAgICAgcGFnZTogdGhpcy5jdXJyZW50UGFnZSxcbiAgICAgIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudCxcbiAgICB9KTtcbiAgfVxuICBhZnRlclJlbmRlckhlYWRlcihodG1sRWxlbWVudDogYW55KSB7XG4gICAgaWYgKHRoaXMub25BZnRlclJlbmRlckhlYWRlci5pc0VtcHR5KSByZXR1cm47XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVySGVhZGVyLmZpcmUodGhpcywge1xuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50LFxuICAgIH0pO1xuICB9XG4gIGFmdGVyUmVuZGVyUXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbiwgaHRtbEVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMub25BZnRlclJlbmRlclF1ZXN0aW9uLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50LFxuICAgIH0pO1xuICB9XG4gIGFmdGVyUmVuZGVyUXVlc3Rpb25JbnB1dChxdWVzdGlvbjogSVF1ZXN0aW9uLCBodG1sRWxlbWVudDogYW55KSB7XG4gICAgaWYgKHRoaXMub25BZnRlclJlbmRlclF1ZXN0aW9uSW5wdXQuaXNFbXB0eSkgcmV0dXJuO1xuICAgIGxldCBpZCA9ICg8UXVlc3Rpb24+cXVlc3Rpb24pLmlucHV0SWQ7XG4gICAgaWYgKCEhaWQgJiYgaHRtbEVsZW1lbnQuaWQgIT09IGlkICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgbGV0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgaWYgKCEhZWwpIHtcbiAgICAgICAgaHRtbEVsZW1lbnQgPSBlbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbkFmdGVyUmVuZGVyUXVlc3Rpb25JbnB1dC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudCxcbiAgICB9KTtcbiAgfVxuICBhZnRlclJlbmRlclBhbmVsKHBhbmVsOiBJRWxlbWVudCwgaHRtbEVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMub25BZnRlclJlbmRlclBhbmVsLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50LFxuICAgIH0pO1xuICB9XG4gIG1hdHJpeEJlZm9yZVJvd0FkZGVkKG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMub25NYXRyaXhCZWZvcmVSb3dBZGRlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG1hdHJpeFJvd0FkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHJvdzogYW55KSB7XG4gICAgdGhpcy5vbk1hdHJpeFJvd0FkZGVkLmZpcmUodGhpcywgeyBxdWVzdGlvbjogcXVlc3Rpb24sIHJvdzogcm93IH0pO1xuICB9XG4gIGdldFF1ZXN0aW9uQnlWYWx1ZU5hbWVGcm9tQXJyYXkoXG4gICAgdmFsdWVOYW1lOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKTogSVF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZUNvcmUodmFsdWVOYW1lKTtcbiAgICBpZiAoIXF1ZXN0aW9ucykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmVzID0gcXVlc3Rpb25zW2ldLmdldFF1ZXN0aW9uRnJvbUFycmF5KG5hbWUsIGluZGV4KTtcbiAgICAgIGlmICghIXJlcykgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgbWF0cml4Um93UmVtb3ZlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCByb3dJbmRleDogbnVtYmVyLCByb3c6IGFueSkge1xuICAgIHRoaXMub25NYXRyaXhSb3dSZW1vdmVkLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgcm93OiByb3csXG4gICAgfSk7XG4gIH1cbiAgbWF0cml4QWxsb3dSZW1vdmVSb3coXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIHJvdzogYW55XG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgcm93OiByb3csXG4gICAgICBhbGxvdzogdHJ1ZSxcbiAgICB9O1xuICAgIHRoaXMub25NYXRyaXhBbGxvd1JlbW92ZVJvdy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93O1xuICB9XG4gIG1hdHJpeENlbGxDcmVhdGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbENyZWF0ZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhBZnRlckNlbGxSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25NYXRyaXhBZnRlckNlbGxSZW5kZXIuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhDZWxsVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG1hdHJpeENlbGxWYWx1ZUNoYW5naW5nKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSkge1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdpbmcuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBtYXRyaXhDZWxsVmFsaWRhdGUocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogU3VydmV5RXJyb3Ige1xuICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB0aGlzLm9uTWF0cml4Q2VsbFZhbGlkYXRlLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuZXJyb3IgPyBuZXcgQ3VzdG9tRXJyb3Iob3B0aW9ucy5lcnJvciwgdGhpcykgOiBudWxsO1xuICB9XG4gIGR5bmFtaWNQYW5lbEFkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pIHtcbiAgICB0aGlzLm9uRHluYW1pY1BhbmVsQWRkZWQuZmlyZSh0aGlzLCB7IHF1ZXN0aW9uOiBxdWVzdGlvbiB9KTtcbiAgfVxuICBkeW5hbWljUGFuZWxSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHBhbmVsSW5kZXg6IG51bWJlciwgcGFuZWw6IElQYW5lbCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSAhIXBhbmVsID8gKDxQYW5lbE1vZGVsQmFzZT5wYW5lbCkucXVlc3Rpb25zIDogW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhck9uRGVsZXRpbmdDb250YWluZXIoKTtcbiAgICB9XG4gICAgdGhpcy5vbkR5bmFtaWNQYW5lbFJlbW92ZWQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBwYW5lbEluZGV4OiBwYW5lbEluZGV4LFxuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgIH0pO1xuICB9XG4gIGR5bmFtaWNQYW5lbEl0ZW1WYWx1ZUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25EeW5hbWljUGFuZWxJdGVtVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgZHJhZ0FuZERyb3BBbGxvdyhvcHRpb25zOiBhbnkpOiBib29sZWFuIHtcbiAgICBvcHRpb25zLmFsbG93ID0gdHJ1ZTtcbiAgICB0aGlzLm9uRHJhZ0Ryb3BBbGxvdy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmFsbG93O1xuICB9XG5cbiAgc2Nyb2xsRWxlbWVudFRvVG9wKFxuICAgIGVsZW1lbnQ6IElTdXJ2ZXlFbGVtZW50LFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgcGFnZTogSVBhZ2UsXG4gICAgaWQ6IHN0cmluZ1xuICApOiBhbnkge1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICBlbGVtZW50SWQ6IGlkLFxuICAgICAgY2FuY2VsOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMub25TY3JvbGxpbmdFbGVtZW50VG9Ub3AuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMuY2FuY2VsKSB7XG4gICAgICBTdXJ2ZXlFbGVtZW50LlNjcm9sbEVsZW1lbnRUb1RvcChvcHRpb25zLmVsZW1lbnRJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgYSBmaWxlIHRvIHNlcnZlci5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIGEgZmlsZSBxdWVzdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIG5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBmaWxlcyBmaWxlcyB0byB1cGxvYWRcbiAgICogQHBhcmFtIHVwbG9hZGluZ0NhbGxiYWNrIGEgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3RhdHVzIG9uIHVwbG9hZGluZyB0aGUgZmlsZXNcbiAgICovXG4gIHB1YmxpYyB1cGxvYWRGaWxlcyhcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmaWxlczogRmlsZVtdLFxuICAgIHVwbG9hZGluZ0NhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gYW55XG4gICkge1xuICAgIGlmICh0aGlzLm9uVXBsb2FkRmlsZXMuaXNFbXB0eSkge1xuICAgICAgdXBsb2FkaW5nQ2FsbGJhY2soXCJlcnJvclwiLCBmaWxlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25VcGxvYWRGaWxlcy5maXJlKHRoaXMsIHtcbiAgICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBmaWxlczogZmlsZXMgfHwgW10sXG4gICAgICAgIGNhbGxiYWNrOiB1cGxvYWRpbmdDYWxsYmFjayxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXlQb3N0SWQpIHtcbiAgICAgIHRoaXMudXBsb2FkRmlsZXNDb3JlKG5hbWUsIGZpbGVzLCB1cGxvYWRpbmdDYWxsYmFjayk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBEb3dubG9hZHMgYSBmaWxlIGZyb20gc2VydmVyXG4gICAqIEBwYXJhbSBuYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gZmlsZVZhbHVlIGEgc2luZ2xlIGZpbGUgcXVlc3Rpb24gdmFsdWVcbiAgICogQHBhcmFtIGNhbGxiYWNrIGEgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3RhdHVzIG9uIGRvd25sb2FkaW5nIHRoZSBmaWxlIGFuZCB0aGUgZG93bmxvYWRlZCBmaWxlIGNvbnRlbnRcbiAgICovXG4gIHB1YmxpYyBkb3dubG9hZEZpbGUoXG4gICAgcXVlc3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgZmlsZVZhbHVlOiBhbnksXG4gICAgY2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZywgZGF0YTogYW55KSA9PiBhbnlcbiAgKSB7XG4gICAgaWYgKHRoaXMub25Eb3dubG9hZEZpbGUuaXNFbXB0eSkge1xuICAgICAgISFjYWxsYmFjayAmJiBjYWxsYmFjayhcInN1Y2Nlc3NcIiwgZmlsZVZhbHVlLmNvbnRlbnQgfHwgZmlsZVZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5vbkRvd25sb2FkRmlsZS5maXJlKHRoaXMsIHtcbiAgICAgIG5hbWU6IHF1ZXN0aW9uTmFtZSxcbiAgICAgIGNvbnRlbnQ6IGZpbGVWYWx1ZS5jb250ZW50IHx8IGZpbGVWYWx1ZSxcbiAgICAgIGZpbGVWYWx1ZTogZmlsZVZhbHVlLFxuICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDbGVhcnMgZmlsZXMgZnJvbSBzZXJ2ZXIuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiBxdWVzdGlvblxuICAgKiBAcGFyYW0gbmFtZSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSB2YWx1ZSBmaWxlIHF1ZXN0aW9uIHZhbHVlXG4gICAqIEBwYXJhbSBjYWxsYmFjayBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdGF0dXMgb2YgdGhlIGNsZWFyaW5nIG9wZXJhdGlvblxuICAgKi9cbiAgcHVibGljIGNsZWFyRmlsZXMoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBmaWxlTmFtZTogc3RyaW5nLFxuICAgIGNhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gYW55XG4gICkge1xuICAgIGlmICh0aGlzLm9uQ2xlYXJGaWxlcy5pc0VtcHR5KSB7XG4gICAgICAhIWNhbGxiYWNrICYmIGNhbGxiYWNrKFwic3VjY2Vzc1wiLCB2YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMub25DbGVhckZpbGVzLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGZpbGVOYW1lOiBmaWxlTmFtZSxcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVDaG9pY2VzRnJvbVNlcnZlcihcbiAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgIGNob2ljZXM6IEFycmF5PEl0ZW1WYWx1ZT4sXG4gICAgc2VydmVyUmVzdWx0OiBhbnlcbiAgKTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBjaG9pY2VzOiBjaG9pY2VzLFxuICAgICAgc2VydmVyUmVzdWx0OiBzZXJ2ZXJSZXN1bHQsXG4gICAgfTtcbiAgICB0aGlzLm9uTG9hZENob2ljZXNGcm9tU2VydmVyLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIG9wdGlvbnMuY2hvaWNlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXlTZXJ2aWNlKCk6IGR4U3VydmV5U2VydmljZSB7XG4gICAgcmV0dXJuIG5ldyBkeFN1cnZleVNlcnZpY2UoKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBsb2FkRmlsZXNDb3JlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmaWxlczogRmlsZVtdLFxuICAgIHVwbG9hZGluZ0NhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gYW55XG4gICkge1xuICAgIHZhciByZXNwb25zZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spIHVwbG9hZGluZ0NhbGxiYWNrKFwidXBsb2FkaW5nXCIsIGZpbGUpO1xuICAgICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkuc2VuZEZpbGUoXG4gICAgICAgIHRoaXMuc3VydmV5UG9zdElkLFxuICAgICAgICBmaWxlLFxuICAgICAgICAoc3VjY2VzczogYm9vbGVhbiwgcmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICByZXNwb25zZXMucHVzaCh7IGNvbnRlbnQ6IHJlc3BvbnNlLCBmaWxlOiBmaWxlIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlcy5sZW5ndGggPT09IGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spIHVwbG9hZGluZ0NhbGxiYWNrKFwic3VjY2Vzc1wiLCByZXNwb25zZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spXG4gICAgICAgICAgICAgIHVwbG9hZGluZ0NhbGxiYWNrKFwiZXJyb3JcIiwgeyByZXNwb25zZTogcmVzcG9uc2UsIGZpbGU6IGZpbGUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIGdldFBhZ2UoaW5kZXg6IG51bWJlcik6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXNbaW5kZXhdO1xuICB9XG4gIC8qKlxuICAgKiBBZGRzIGFuIGV4aXN0aW5nIHBhZ2UgdG8gdGhlIHN1cnZleS5cbiAgICogQHBhcmFtIHBhZ2UgYSBuZXdseSBhZGRlZCBwYWdlXG4gICAqIEBwYXJhbSBpbmRleCAtIGEgcGFnZSBpbmRleCB0byB3aGVyZSBpbnNlcnQgYSBwYWdlLiBJdCBpcyAtMSBieSBkZWZhdWx0IGFuZCB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIGludG8gdGhlIGVuZC5cbiAgICogQHNlZSBhZGROZXdQYWdlXG4gICAqL1xuICBwdWJsaWMgYWRkUGFnZShwYWdlOiBQYWdlTW9kZWwsIGluZGV4OiBudW1iZXIgPSAtMSkge1xuICAgIGlmIChwYWdlID09IG51bGwpIHJldHVybjtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucGFnZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnBhZ2VzLnB1c2gocGFnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZXMuc3BsaWNlKGluZGV4LCAwLCBwYWdlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGFnZSBhbmQgYWRkcyBpdCB0byBhIHN1cnZleS4gR2VuZXJhdGVzIGEgbmV3IG5hbWUgaWYgdGhlIGBuYW1lYCBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZC5cbiAgICogQHBhcmFtIG5hbWUgYSBwYWdlIG5hbWVcbiAgICogQHBhcmFtIGluZGV4IC0gYSBwYWdlIGluZGV4IHRvIHdoZXJlIGluc2VydCBhIG5ldyBwYWdlLiBJdCBpcyAtMSBieSBkZWZhdWx0IGFuZCB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIGludG8gdGhlIGVuZC5cbiAgICogQHNlZSBhZGRQYWdlXG4gICAqL1xuICBwdWJsaWMgYWRkTmV3UGFnZShuYW1lOiBzdHJpbmcgPSBudWxsLCBpbmRleDogbnVtYmVyID0gLTEpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3JlYXRlTmV3UGFnZShuYW1lKTtcbiAgICB0aGlzLmFkZFBhZ2UocGFnZSwgaW5kZXgpO1xuICAgIHJldHVybiBwYWdlO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgcGFnZSBmcm9tIGEgc3VydmV5LlxuICAgKiBAcGFyYW0gcGFnZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhZ2UocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5wYWdlcy5pbmRleE9mKHBhZ2UpO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcbiAgICB0aGlzLnBhZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSA9PSBwYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlcy5sZW5ndGggPiAwID8gdGhpcy5wYWdlc1swXSA6IG51bGw7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcXVlc3Rpb24gYnkgaXRzIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlOYW1lKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBRdWVzdGlvbiB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoY2FzZUluc2Vuc2l0aXZlKSB7XG4gICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICB2YXIgaGFzaDogSGFzaFRhYmxlPGFueT4gPSAhIWNhc2VJbnNlbnNpdGl2ZVxuICAgICAgPyB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzSW5zZW5zaXRpdmVcbiAgICAgIDogdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lcztcbiAgICB2YXIgcmVzID0gaGFzaFtuYW1lXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlc1swXTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHF1ZXN0aW9uIGJ5IGl0cyB2YWx1ZSBuYW1lXG4gICAqIEBwYXJhbSB2YWx1ZU5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBjYXNlSW5zZW5zaXRpdmVcbiAgICogQHNlZSBnZXRRdWVzdGlvbkJ5TmFtZVxuICAgKiBAc2VlIFF1ZXN0aW9uLnZhbHVlTmFtZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoXG4gICAgdmFsdWVOYW1lOiBzdHJpbmcsXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2VcbiAgKTogSVF1ZXN0aW9uIHtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZUNvcmUodmFsdWVOYW1lLCBjYXNlSW5zZW5zaXRpdmUpO1xuICAgIHJldHVybiAhIXJlcyA/IHJlc1swXSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldENhbGN1bGF0ZWRWYWx1ZUJ5TmFtZShuYW1lOiBzdHJpbmcpOiBDYWxjdWxhdGVkVmFsdWUge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXMubGVuZ3RoOyBpICsrKSB7XG4gICAgICBpZihuYW1lID09IHRoaXMuY2FsY3VsYXRlZFZhbHVlc1tpXS5uYW1lKSByZXR1cm4gdGhpcy5jYWxjdWxhdGVkVmFsdWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcml2YXRlIGdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lQ29yZShcbiAgICB2YWx1ZU5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTxRdWVzdGlvbj4ge1xuICAgIHZhciBoYXNoOiBIYXNoVGFibGU8YW55PiA9ICEhY2FzZUluc2Vuc2l0aXZlXG4gICAgICA/IHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lc0luc2Vuc2l0aXZlXG4gICAgICA6IHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lcztcbiAgICB2YXIgcmVzID0gaGFzaFt2YWx1ZU5hbWVdO1xuICAgIGlmICghcmVzKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIGEgbGlzdCBvZiBxdWVzdGlvbnMgYnkgdGhlaXIgbmFtZXMuXG4gICAqIEBwYXJhbSBuYW1lcyBhbiBhcnJheSBvZiBxdWVzdGlvbiBuYW1lc1xuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25zQnlOYW1lcyhcbiAgICBuYW1lczogc3RyaW5nW10sXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2VcbiAgKTogSVF1ZXN0aW9uW10ge1xuICAgIHZhciByZXN1bHQ6IElRdWVzdGlvbltdID0gW107XG4gICAgaWYgKCFuYW1lcykgcmV0dXJuIHJlc3VsdDtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghbmFtZXNbaV0pIGNvbnRpbnVlO1xuICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lc1tpXSwgY2FzZUluc2Vuc2l0aXZlKTtcbiAgICAgIGlmIChxdWVzdGlvbikgcmVzdWx0LnB1c2gocXVlc3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcGFnZSBvbiB3aGljaCBhbiBlbGVtZW50IChxdWVzdGlvbiBvciBwYW5lbCkgaXMgcGxhY2VkLlxuICAgKiBAcGFyYW0gZWxlbWVudCBRdWVzdGlvbiBvciBQYW5lbFxuICAgKi9cbiAgcHVibGljIGdldFBhZ2VCeUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBQYWdlTW9kZWwge1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMucGFnZXNbaV07XG4gICAgICBpZiAocGFnZS5jb250YWluc0VsZW1lbnQoZWxlbWVudCkpIHJldHVybiBwYWdlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHBhZ2Ugb24gd2hpY2ggYSBxdWVzdGlvbiBpcyBsb2NhdGVkLlxuICAgKiBAcGFyYW0gcXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlQnlRdWVzdGlvbihxdWVzdGlvbjogSVF1ZXN0aW9uKTogUGFnZU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlQnlFbGVtZW50KHF1ZXN0aW9uKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHBhZ2UgYnkgaXQncyBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZVxuICAgKi9cbiAgcHVibGljIGdldFBhZ2VCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZU1vZGVsIHtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucGFnZXNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy5wYWdlc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIHBhZ2VzIGJ5IHRoZWlyIG5hbWVzLlxuICAgKiBAcGFyYW0gbmFtZXMgYSBsaXN0IG9mIHBhZ2UgbmFtZXNcbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlc0J5TmFtZXMobmFtZXM6IHN0cmluZ1tdKTogUGFnZU1vZGVsW10ge1xuICAgIHZhciByZXN1bHQ6IFBhZ2VNb2RlbFtdID0gW107XG4gICAgaWYgKCFuYW1lcykgcmV0dXJuIHJlc3VsdDtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghbmFtZXNbaV0pIGNvbnRpbnVlO1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLmdldFBhZ2VCeU5hbWUobmFtZXNbaV0pO1xuICAgICAgaWYgKHBhZ2UpIHJlc3VsdC5wdXNoKHBhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgcXVlc3Rpb25zIGluIGEgc3VydmV5LlxuICAgKiBAcGFyYW0gdmlzaWJsZU9ubHkgc2V0IGl0IGB0cnVlYCwgaWYgeW91IHdhbnQgdG8gZ2V0IG9ubHkgdmlzaWJsZSBxdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxRdWVzdGlvbnMoXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8UXVlc3Rpb24+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PFF1ZXN0aW9uPigpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLmFkZFF1ZXN0aW9uc1RvTGlzdChcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICB2aXNpYmxlT25seSxcbiAgICAgICAgaW5jbHVkaW5nRGVzaWduVGltZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBxdWl6IHF1ZXN0aW9ucy4gQWxsIHZpc2libGUgcXVlc3Rpb25zIHRoYXQgaGFzIGlucHV0KHMpIHdpZGdldHMuXG4gICAqIEBzZWUgZ2V0UXVpelF1ZXN0aW9uQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXRRdWl6UXVlc3Rpb25zKCk6IEFycmF5PElRdWVzdGlvbj4ge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8SVF1ZXN0aW9uPigpO1xuICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgPyAxIDogMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5wYWdlc1tpXS5pc1Zpc2libGUpIGNvbnRpbnVlO1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucGFnZXNbaV0ucXVlc3Rpb25zO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBxdWVzdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbal07XG4gICAgICAgIGlmIChxLnF1aXpRdWVzdGlvbkNvdW50ID4gMCkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYW5lbCBieSBpdHMgbmFtZS5cbiAgICogQHBhcmFtIG5hbWUgYSBwYW5lbCBuYW1lXG4gICAqIEBwYXJhbSBjYXNlSW5zZW5zaXRpdmVcbiAgICogQHNlZSBnZXRRdWVzdGlvbkJ5TmFtZVxuICAgKi9cbiAgcHVibGljIGdldFBhbmVsQnlOYW1lKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUGFuZWwge1xuICAgIHZhciBwYW5lbHMgPSB0aGlzLmdldEFsbFBhbmVscygpO1xuICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhbmVsTmFtZSA9IHBhbmVsc1tpXS5uYW1lO1xuICAgICAgaWYgKGNhc2VJbnNlbnNpdGl2ZSkgcGFuZWxOYW1lID0gcGFuZWxOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAocGFuZWxOYW1lID09IG5hbWUpIHJldHVybiBwYW5lbHNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc3VydmV5J3MgcGFuZWxzLlxuICAgKi9cbiAgcHVibGljIGdldEFsbFBhbmVscyhcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTxJUGFuZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PElQYW5lbD4oKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5hZGRQYW5lbHNJbnRvTGlzdChyZXN1bHQsIHZpc2libGVPbmx5LCBpbmNsdWRpbmdEZXNpZ25UaW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBwYWdlLCBidXQgZG8gbm90IGFkZCBpdCBpbnRvIHRoZSBzdXJ2ZXkuXG4gICAqIFlvdSBjYW4gdXNlIGFkZFBhZ2UocGFnZSkgZnVuY3Rpb24gdG8gYWRkIGl0IGludG8gc3VydmV5IGxhdGVyLlxuICAgKiBAc2VlIGFkZFBhZ2VcbiAgICogQHNlZSBhZGROZXdQYWdlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTmV3UGFnZShuYW1lOiBzdHJpbmcpOiBQYWdlTW9kZWwge1xuICAgIHJldHVybiBuZXcgUGFnZU1vZGVsKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBxdWVzdGlvbk9uVmFsdWVDaGFuZ2luZyh2YWx1ZU5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMub25WYWx1ZUNoYW5naW5nLmlzRW1wdHkpIHJldHVybiBuZXdWYWx1ZTtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIG5hbWU6IHZhbHVlTmFtZSxcbiAgICAgIHF1ZXN0aW9uOiB0aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUodmFsdWVOYW1lKSxcbiAgICAgIHZhbHVlOiBIZWxwZXJzLmdldFVuYmluZFZhbHVlKG5ld1ZhbHVlKSxcbiAgICAgIG9sZFZhbHVlOiB0aGlzLmdldFZhbHVlKHZhbHVlTmFtZSksXG4gICAgfTtcbiAgICB0aGlzLm9uVmFsdWVDaGFuZ2luZy5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLnZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVRdWVzdGlvblZhbHVlKHZhbHVlTmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnNCeVZhbHVlTmFtZUNvcmUodmFsdWVOYW1lKTtcbiAgICBpZiAoISFxdWVzdGlvbnMpIHtcbiAgICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuaXNUd29WYWx1ZUVxdWFscyhxdWVzdGlvbnNbaV0udmFsdWUsIG5ld1ZhbHVlKSkgY29udGludWU7XG4gICAgICAgIHF1ZXN0aW9uc1tpXS51cGRhdGVWYWx1ZUZyb21TdXJ2ZXkobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGNoZWNrUXVlc3Rpb25FcnJvck9uVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmlzTmF2aWdhdGlvbkJ1dHRvblByZXNzZWQgJiZcbiAgICAgICh0aGlzLmNoZWNrRXJyb3JzTW9kZSA9PSBcIm9uVmFsdWVDaGFuZ2VkXCIgfHwgcXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDApXG4gICAgKSB7XG4gICAgICB2YXIgb2xkRXJyb3JDb3VudCA9IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGg7XG4gICAgICBxdWVzdGlvbi5oYXNFcnJvcnModHJ1ZSwgeyBpc09uVmFsdWVDaGFuZ2VkOiB0cnVlIH0pO1xuICAgICAgaWYgKFxuICAgICAgICAhIXF1ZXN0aW9uLnBhZ2UgJiZcbiAgICAgICAgKG9sZEVycm9yQ291bnQgPiAwIHx8IHF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZmlyZVZhbGlkYXRlZEVycm9yc09uUGFnZSg8UGFnZU1vZGVsPnF1ZXN0aW9uLnBhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgbm90aWZ5UXVlc3Rpb25PblZhbHVlQ2hhbmdlZCh2YWx1ZU5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKHZhbHVlTmFtZSk7XG4gICAgaWYgKCEhcXVlc3Rpb25zKSB7XG4gICAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgICAgdGhpcy5jaGVja1F1ZXN0aW9uRXJyb3JPblZhbHVlQ2hhbmdlZChxdWVzdGlvbik7XG4gICAgICAgIHF1ZXN0aW9uLm9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcbiAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgICAgICBuYW1lOiB2YWx1ZU5hbWUsXG4gICAgICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIG5hbWU6IHZhbHVlTmFtZSxcbiAgICAgICAgcXVlc3Rpb246IG51bGwsXG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uY2hlY2tCaW5kaW5ncyh2YWx1ZU5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5ub3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZCh2YWx1ZU5hbWUpO1xuICB9XG4gIHByaXZhdGUgbm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gPT09IFwicHJvY2Vzc2luZ1wiKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNSdW5uaW5nQ29uZGl0aW9ucykge1xuICAgICAgdGhpcy5jb25kaXRpb25Ob3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzRW5kTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgdXBkYXRlQWxsUXVlc3Rpb25zVmFsdWUoKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSA8UXVlc3Rpb24+cXVlc3Rpb25zW2ldO1xuICAgICAgdmFyIHZhbE5hbWUgPSBxLmdldFZhbHVlTmFtZSgpO1xuICAgICAgcS51cGRhdGVWYWx1ZUZyb21TdXJ2ZXkodGhpcy5nZXRWYWx1ZSh2YWxOYW1lKSk7XG4gICAgICBpZiAocS5yZXF1aXJlVXBkYXRlQ29tbWVudFZhbHVlKSB7XG4gICAgICAgIHEudXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkodGhpcy5nZXRDb21tZW50KHZhbE5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlBbGxRdWVzdGlvbnNPblZhbHVlQ2hhbmdlZCgpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0ub25TdXJ2ZXlWYWx1ZUNoYW5nZWQoXG4gICAgICAgIHRoaXMuZ2V0VmFsdWUocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjaGVja09uUGFnZVRyaWdnZXJzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKHRydWUpO1xuICAgIHZhciB2YWx1ZXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XG4gICAgICB2YXIgbmFtZSA9IHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpO1xuICAgICAgdmFsdWVzW25hbWVdID0gdGhpcy5nZXRWYWx1ZShuYW1lKTtcbiAgICB9XG4gICAgdGhpcy5jaGVja1RyaWdnZXJzKHZhbHVlcywgdHJ1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDdXJyZW50UGFnZVF1ZXN0aW9ucyhcbiAgICBpbmNsdWRlSW52c2libGU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTxRdWVzdGlvbj4ge1xuICAgIHZhciByZXN1bHQ6IEFycmF5PFF1ZXN0aW9uPiA9IFtdO1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAoIXBhZ2UpIHJldHVybiByZXN1bHQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlLnF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9uID0gcGFnZS5xdWVzdGlvbnNbaV07XG4gICAgICBpZiAoKCFpbmNsdWRlSW52c2libGUgJiYgIXF1ZXN0aW9uLnZpc2libGUpIHx8ICFxdWVzdGlvbi5uYW1lKSBjb250aW51ZTtcbiAgICAgIHJlc3VsdC5wdXNoKHF1ZXN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGlzVHJpZ2dlcklzUnVubmluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHRyaWdnZXJWYWx1ZXM6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgdHJpZ2dlcktleXM6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgY2hlY2tUcmlnZ2VycyhrZXk6IGFueSwgaXNPbk5leHRQYWdlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWQgfHwgdGhpcy50cmlnZ2Vycy5sZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzVHJpZ2dlcklzUnVubmluZykge1xuICAgICAgdGhpcy50cmlnZ2VyVmFsdWVzID0gdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICAgICAgZm9yICh2YXIgayBpbiBrZXkpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyS2V5c1trXSA9IGtleVtrXTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc1RyaWdnZXJJc1J1bm5pbmcgPSB0cnVlO1xuICAgIHRoaXMudHJpZ2dlcktleXMgPSBrZXk7XG4gICAgdGhpcy50cmlnZ2VyVmFsdWVzID0gdGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy50cmlnZ2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRyaWdnZXIgPSB0aGlzLnRyaWdnZXJzW2ldO1xuICAgICAgaWYgKHRyaWdnZXIuaXNPbk5leHRQYWdlID09IGlzT25OZXh0UGFnZSkge1xuICAgICAgICB0cmlnZ2VyLmNoZWNrRXhwcmVzc2lvbihcbiAgICAgICAgICB0aGlzLnRyaWdnZXJLZXlzLFxuICAgICAgICAgIHRoaXMudHJpZ2dlclZhbHVlcyxcbiAgICAgICAgICBwcm9wZXJ0aWVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaXNUcmlnZ2VySXNSdW5uaW5nID0gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBkb0VsZW1lbnRzT25Mb2FkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5vblN1cnZleUxvYWQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjb25kaXRpb25WYWx1ZXM6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgZ2V0IGlzUnVubmluZ0NvbmRpdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb25kaXRpb25WYWx1ZXM7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlQ2hhbmdlZE9uUnVubmluZ0NvbmRpdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGNvbmRpdGlvblJ1bm5lckNvdW50ZXI6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgY29uZGl0aW9uVXBkYXRlVmlzaWJsZUluZGV4ZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBjb25kaXRpb25Ob3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnMoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc0NvbXBsZXRlZCB8fFxuICAgICAgdGhpcy5pc0VuZExvYWRpbmdGcm9tSnNvbiA9PT0gXCJwcm9jZXNzaW5nXCIgfHxcbiAgICAgIHRoaXMuaXNSdW5uaW5nQ29uZGl0aW9uc1xuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmNvbmRpdGlvblZhbHVlcyA9IHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gICAgdmFyIG9sZEN1cnJlbnRQYWdlSW5kZXggPSB0aGlzLnBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZVZhbHVlKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnNDb3JlKHByb3BlcnRpZXMpO1xuICAgIHRoaXMuY2hlY2tJZk5ld1BhZ2VzQmVjb21lVmlzaWJsZShvbGRDdXJyZW50UGFnZUluZGV4KTtcbiAgICB0aGlzLmNvbmRpdGlvblZhbHVlcyA9IG51bGw7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1ZhbHVlQ2hhbmdlZE9uUnVubmluZ0NvbmRpdGlvbiAmJlxuICAgICAgdGhpcy5jb25kaXRpb25SdW5uZXJDb3VudGVyIDxcbiAgICAgICAgc2V0dGluZ3MubWF4aW11bUNvbmRpdGlvblJ1bkNvdW50T25WYWx1ZUNoYW5nZWRcbiAgICApIHtcbiAgICAgIHRoaXMuaXNWYWx1ZUNoYW5nZWRPblJ1bm5pbmdDb25kaXRpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuY29uZGl0aW9uUnVubmVyQ291bnRlcisrO1xuICAgICAgdGhpcy5ydW5Db25kaXRpb25zKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNWYWx1ZUNoYW5nZWRPblJ1bm5pbmdDb25kaXRpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuY29uZGl0aW9uUnVubmVyQ291bnRlciA9IDA7XG4gICAgICBpZiAodGhpcy5jb25kaXRpb25VcGRhdGVWaXNpYmxlSW5kZXhlcykge1xuICAgICAgICB0aGlzLmNvbmRpdGlvblVwZGF0ZVZpc2libGVJbmRleGVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmRpdGlvbk5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uTm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ub3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZChcIlwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBydW5Db25kaXRpb25PblZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmdDb25kaXRpb25zKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvblZhbHVlc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgdGhpcy5pc1ZhbHVlQ2hhbmdlZE9uUnVubmluZ0NvbmRpdGlvbiA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnNDb3JlKHByb3BlcnRpZXM6IGFueSkge1xuICAgIHZhciBwYWdlcyA9IHRoaXMucGFnZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlZFZhbHVlc1tpXS5yZXNldENhbGN1bGF0aW9uKCk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxjdWxhdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZWRWYWx1ZXNbaV0uZG9DYWxjdWxhdGlvbihcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkVmFsdWVzLFxuICAgICAgICB0aGlzLmNvbmRpdGlvblZhbHVlcyxcbiAgICAgICAgcHJvcGVydGllc1xuICAgICAgKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFnZXNbaV0ucnVuQ29uZGl0aW9uKHRoaXMuY29uZGl0aW9uVmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjaGVja0lmTmV3UGFnZXNCZWNvbWVWaXNpYmxlKG9sZEN1cnJlbnRQYWdlSW5kZXg6IG51bWJlcikge1xuICAgIHZhciBuZXdDdXJyZW50UGFnZUluZGV4ID0gdGhpcy5wYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSk7XG4gICAgaWYgKG5ld0N1cnJlbnRQYWdlSW5kZXggPD0gb2xkQ3VycmVudFBhZ2VJbmRleCArIDEpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gb2xkQ3VycmVudFBhZ2VJbmRleCArIDE7IGkgPCBuZXdDdXJyZW50UGFnZUluZGV4OyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnBhZ2VzW2ldLmlzVmlzaWJsZSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlc1tpXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZW5kcyBhIHN1cnZleSByZXN1bHQgdG8gdGhlIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlLlxuICAgKiBAcGFyYW0gcG9zdElkIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlIHBvc3RJZFxuICAgKiBAcGFyYW0gY2xpZW50SWQgVHlwaWNhbGx5IGEgY3VzdG9tZXIgZS1tYWlsIG9yIGFuIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIGlzUGFydGlhbENvbXBsZXRlZCBTZXQgaXQgdG8gYHRydWVgIGlmIHRoZSBzdXJ2ZXkgaXMgbm90IGNvbXBsZXRlZCB5ZXQgYW5kIHRoZSByZXN1bHRzIGFyZSBpbnRlcm1lZGlhdGVcbiAgICogQHNlZSBzdXJ2ZXlQb3N0SWRcbiAgICogQHNlZSBjbGllbnRJZFxuICAgKi9cbiAgcHVibGljIHNlbmRSZXN1bHQoXG4gICAgcG9zdElkOiBzdHJpbmcgPSBudWxsLFxuICAgIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLFxuICAgIGlzUGFydGlhbENvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSByZXR1cm47XG4gICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCAmJiB0aGlzLm9uUGFydGlhbFNlbmQpIHtcbiAgICAgIHRoaXMub25QYXJ0aWFsU2VuZC5maXJlKHRoaXMsIG51bGwpO1xuICAgIH1cblxuICAgIGlmICghcG9zdElkICYmIHRoaXMuc3VydmV5UG9zdElkKSB7XG4gICAgICBwb3N0SWQgPSB0aGlzLnN1cnZleVBvc3RJZDtcbiAgICB9XG4gICAgaWYgKCFwb3N0SWQpIHJldHVybjtcbiAgICBpZiAoY2xpZW50SWQpIHtcbiAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcbiAgICB9XG4gICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCAmJiAhdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAodGhpcy5zdXJ2ZXlTaG93RGF0YVNhdmluZykge1xuICAgICAgdGhpcy5zZXRDb21wbGV0ZWRTdGF0ZShcInNhdmluZ1wiLCBcIlwiKTtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkuc2VuZFJlc3VsdChcbiAgICAgIHBvc3RJZCxcbiAgICAgIHRoaXMuZGF0YSxcbiAgICAgIGZ1bmN0aW9uIChzdWNjZXNzOiBib29sZWFuLCByZXNwb25zZTogYW55LCByZXF1ZXN0OiBhbnkpIHtcbiAgICAgICAgaWYgKHNlbGYuc3VydmV5U2hvd0RhdGFTYXZpbmcpIHtcbiAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcInN1Y2Nlc3NcIiwgXCJcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJlcnJvclwiLCByZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNlbGYub25TZW5kUmVzdWx0LmZpcmUoc2VsZiwge1xuICAgICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3MsXG4gICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3QsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHRoaXMuY2xpZW50SWQsXG4gICAgICBpc1BhcnRpYWxDb21wbGV0ZWRcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBDYWxscyB0aGUgW2FwaS5zdXJ2ZXlqcy5pb10oaHR0cHM6Ly9hcGkuc3VydmV5anMuaW8pIHNlcnZpY2UgYW5kLCBvbiBjYWxsYmFjaywgZmlyZXMgdGhlIGBvbkdldFJlc3VsdGAgZXZlbnQgd2l0aCBhbGwgYW5zd2VycyB0aGF0IHlvdXIgdXNlcnMgbWFkZSBmb3IgYSBxdWVzdGlvbi5cbiAgICogQHBhcmFtIHJlc3VsdElkIFthcGkuc3VydmV5anMuaW9dKGh0dHBzOi8vYXBpLnN1cnZleWpzLmlvKSBzZXJ2aWNlIHJlc3VsdElkXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBxdWVzdGlvbiBuYW1lXG4gICAqIEBzZWUgb25HZXRSZXN1bHRcbiAgICovXG4gIHB1YmxpYyBnZXRSZXN1bHQocmVzdWx0SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLmdldFJlc3VsdChyZXN1bHRJZCwgbmFtZSwgZnVuY3Rpb24gKFxuICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgIGRhdGE6IGFueSxcbiAgICAgIGRhdGFMaXN0OiBhbnlbXSxcbiAgICAgIHJlc3BvbnNlOiBhbnlcbiAgICApIHtcbiAgICAgIHNlbGYub25HZXRSZXN1bHQuZmlyZShzZWxmLCB7XG4gICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3MsXG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGRhdGFMaXN0OiBkYXRhTGlzdCxcbiAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBzdXJ2ZXkgSlNPTiBmcm9tIHRoZSBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZS5cbiAgICogSWYgYGNsaWVudElkYCBpcyBub3QgYG51bGxgIGFuZCBhIHVzZXIgaGFkIGNvbXBsZXRlZCBhIHN1cnZleSBiZWZvcmUsIHRoZSBzdXJ2ZXkgc3dpdGNoZXMgdG8gYGNvbXBsZXRlZGJlZm9yZWAgc3RhdGUuXG4gICAqIEBwYXJhbSBzdXJ2ZXlJZCBbYXBpLnN1cnZleWpzLmlvXShodHRwczovL2FwaS5zdXJ2ZXlqcy5pbykgc2VydmljZSBzdXJ2ZXlJZFxuICAgKiBAcGFyYW0gY2xpZW50SWQgdXNlcnMnIGluZGVudGlmaWVyLCBmb3IgZXhhbXBsZSBhbiBlLW1haWwgb3IgYSB1bmlxdWUgY3VzdG9tZXIgaWQgaW4geW91ciB3ZWIgYXBwbGljYXRpb24uXG4gICAqIEBzZWUgc3RhdGVcbiAgICogQHNlZSBvbkxvYWRlZFN1cnZleUZyb21TZXJ2aWNlXG4gICAqL1xuICBwdWJsaWMgbG9hZFN1cnZleUZyb21TZXJ2aWNlKFxuICAgIHN1cnZleUlkOiBzdHJpbmcgPSBudWxsLFxuICAgIGNsaWVuZElkOiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIGlmIChzdXJ2ZXlJZCkge1xuICAgICAgdGhpcy5zdXJ2ZXlJZCA9IHN1cnZleUlkO1xuICAgIH1cbiAgICBpZiAoY2xpZW5kSWQpIHtcbiAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbmRJZDtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLm9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCk7XG4gICAgaWYgKGNsaWVuZElkKSB7XG4gICAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5nZXRTdXJ2ZXlKc29uQW5kSXNDb21wbGV0ZWQoXG4gICAgICAgIHRoaXMuc3VydmV5SWQsXG4gICAgICAgIHRoaXMuY2xpZW50SWQsXG4gICAgICAgIGZ1bmN0aW9uIChcbiAgICAgICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgICAgIGpzb246IHN0cmluZyxcbiAgICAgICAgICBpc0NvbXBsZXRlZDogc3RyaW5nLFxuICAgICAgICAgIHJlc3BvbnNlOiBhbnlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VsZi5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgc2VsZi5pc0NvbXBsZXRlZEJlZm9yZSA9IGlzQ29tcGxldGVkID09IFwiY29tcGxldGVkXCI7XG4gICAgICAgICAgICBzZWxmLmxvYWRTdXJ2ZXlGcm9tU2VydmljZUpzb24oanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5sb2FkU3VydmV5KHRoaXMuc3VydmV5SWQsIGZ1bmN0aW9uIChcbiAgICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgICAgcmVzdWx0OiBzdHJpbmcsXG4gICAgICAgIHJlc3BvbnNlOiBhbnlcbiAgICAgICkge1xuICAgICAgICBzZWxmLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIHNlbGYubG9hZFN1cnZleUZyb21TZXJ2aWNlSnNvbihyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBsb2FkU3VydmV5RnJvbVNlcnZpY2VKc29uKGpzb246IGFueSkge1xuICAgIGlmICghanNvbikgcmV0dXJuO1xuICAgIHRoaXMuZnJvbUpTT04oanNvbik7XG4gICAgdGhpcy5ub3RpZnlBbGxRdWVzdGlvbnNPblZhbHVlQ2hhbmdlZCgpO1xuICAgIHRoaXMub25Mb2FkU3VydmV5RnJvbVNlcnZpY2UoKTtcbiAgICB0aGlzLm9uTG9hZGVkU3VydmV5RnJvbVNlcnZpY2UuZmlyZSh0aGlzLCB7fSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCkge31cbiAgcHJvdGVjdGVkIG9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCkge31cbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlSW5kZXhlcygpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCAhIXRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzUnVubmluZ0NvbmRpdGlvbnMgJiZcbiAgICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZC5pc0VtcHR5ICYmXG4gICAgICB0aGlzLm9uUGFnZVZpc2libGVDaGFuZ2VkLmlzRW1wdHlcbiAgICApIHtcbiAgICAgIC8vUnVuIHVwZGF0ZSB2aXNpYmxlIGluZGV4IG9ubHkgb25lIHRpbWUgb24gZmluaXNoaW5nIHJ1bm5pbmcgY29uZGl0aW9uc1xuICAgICAgdGhpcy5jb25kaXRpb25VcGRhdGVWaXNpYmxlSW5kZXhlcyA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXBkYXRlUGFnZVZpc2libGVJbmRleGVzKHRoaXMuc2hvd1BhZ2VOdW1iZXJzKTtcbiAgICBpZiAodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25QYWdlXCIpIHtcbiAgICAgIHZhciB2aXNQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2aXNQYWdlc1tpXS5zZXRWaXNpYmxlSW5kZXgoMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9uXCIgPyAwIDogLTE7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW5kZXggKz0gdGhpcy5wYWdlc1tpXS5zZXRWaXNpYmxlSW5kZXgoaW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVByb2dyZXNzVGV4dCh0cnVlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVBhZ2VWaXNpYmxlSW5kZXhlcyhzaG93SW5kZXg6IGJvb2xlYW4pIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlzUGFnZVZpc2libGUgPSB0aGlzLnBhZ2VzW2ldLmlzVmlzaWJsZTtcbiAgICAgIHRoaXMucGFnZXNbaV0udmlzaWJsZUluZGV4ID0gaXNQYWdlVmlzaWJsZSA/IGluZGV4KysgOiAtMTtcbiAgICAgIHRoaXMucGFnZXNbaV0ubnVtID1cbiAgICAgICAgc2hvd0luZGV4ICYmIGlzUGFnZVZpc2libGUgPyB0aGlzLnBhZ2VzW2ldLnZpc2libGVJbmRleCArIDEgOiAtMTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGZyb21KU09OKGpzb246IGFueSkge1xuICAgIGlmICghanNvbikgcmV0dXJuO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNDbGVhcigpO1xuICAgIHRoaXMuanNvbkVycm9ycyA9IG51bGw7XG4gICAgdmFyIGpzb25Db252ZXJ0ZXIgPSBuZXcgSnNvbk9iamVjdCgpO1xuICAgIGpzb25Db252ZXJ0ZXIudG9PYmplY3QoanNvbiwgdGhpcyk7XG4gICAgaWYgKGpzb25Db252ZXJ0ZXIuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuanNvbkVycm9ycyA9IGpzb25Db252ZXJ0ZXIuZXJyb3JzO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0SnNvbk9iamVjdChqc29uT2JqOiBhbnkpIHtcbiAgICB0aGlzLmZyb21KU09OKGpzb25PYmopO1xuICB9XG4gIHByaXZhdGUgaXNFbmRMb2FkaW5nRnJvbUpzb246IHN0cmluZyA9IG51bGw7XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICB0aGlzLmlzRW5kTG9hZGluZ0Zyb21Kc29uID0gXCJwcm9jZXNzaW5nXCI7XG4gICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSA9IHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkO1xuICAgIHRoaXMub25RdWVzdGlvbnNPblBhZ2VNb2RlQ2hhbmdlZChcInN0YW5kYXJkXCIpO1xuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIGlmICh0aGlzLmhhc0Nvb2tpZSkge1xuICAgICAgdGhpcy5kb0NvbXBsZXRlKCk7XG4gICAgfVxuICAgIHRoaXMuZG9FbGVtZW50c09uTG9hZCgpO1xuICAgIHRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gPSBcImNvbmRpdGlvbnNcIjtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKFwiXCIpO1xuICAgIHRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gPSBudWxsO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CZWZvcmVDcmVhdGluZygpIHt9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge31cbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzLmdldFByb2Nlc3NlZFRleHRWYWx1ZUNvcmUodGV4dFZhbHVlKTtcbiAgICBpZiAoIXRoaXMub25Qcm9jZXNzVGV4dFZhbHVlLmlzRW1wdHkpIHtcbiAgICAgIHZhciB3YXNFbXB0eSA9IHRoaXMuaXNWYWx1ZUVtcHR5KHRleHRWYWx1ZS52YWx1ZSk7XG4gICAgICB0aGlzLm9uUHJvY2Vzc1RleHRWYWx1ZS5maXJlKHRoaXMsIHRleHRWYWx1ZSk7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPVxuICAgICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgfHwgKHdhc0VtcHR5ICYmICF0aGlzLmlzVmFsdWVFbXB0eSh0ZXh0VmFsdWUudmFsdWUpKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWVDb3JlKHRleHRWYWx1ZTogVGV4dFByZVByb2Nlc3NvclZhbHVlKTogdm9pZCB7XG4gICAgdmFyIG5hbWUgPSB0ZXh0VmFsdWUubmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIGlmIChbXCJub1wiLCBcInJlcXVpcmVcIiwgXCJ0aXRsZVwiXS5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJwYWdlbm9cIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHBhZ2UgIT0gbnVsbCA/IHRoaXMudmlzaWJsZVBhZ2VzLmluZGV4T2YocGFnZSkgKyAxIDogMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwicGFnZWNvdW50XCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLnZpc2libGVQYWdlQ291bnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImxvY2FsZVwiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gISF0aGlzLmxvY2FsZVxuICAgICAgICA/IHRoaXMubG9jYWxlXG4gICAgICAgIDogc3VydmV5TG9jYWxpemF0aW9uLmRlZmF1bHRMb2NhbGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImNvcnJlY3RlZGFuc3dlcnNcIiB8fCBuYW1lID09PSBcImNvcnJlY3RlZGFuc3dlcmNvdW50XCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLmdldENvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImluY29ycmVjdGVkYW5zd2Vyc1wiIHx8IG5hbWUgPT09IFwiaW5jb3JyZWN0ZWRhbnN3ZXJjb3VudFwiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdGhpcy5nZXRJbkNvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcInF1ZXN0aW9uY291bnRcIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMuZ2V0UXVpelF1ZXN0aW9uQ291bnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGZpcnN0TmFtZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRGaXJzdE5hbWUobmFtZSwgdGhpcy5kYXRhKTtcbiAgICB2YXIgdmFyaWFibGUgPSB0aGlzLmdldFZhcmlhYmxlKG5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdmFyaWFibGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghIWZpcnN0TmFtZSkgZmlyc3ROYW1lID0gZmlyc3ROYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKGZpcnN0TmFtZSwgdHJ1ZSk7XG4gICAgaWYgKHF1ZXN0aW9uKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgbmFtZSA9IHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpICsgbmFtZS5zdWJzdHIoZmlyc3ROYW1lLmxlbmd0aCk7XG4gICAgICBuYW1lID0gbmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgdmFyIHZhbHVlczogeyBbaW5kZXg6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICB2YWx1ZXNbZmlyc3ROYW1lXSA9IHRleHRWYWx1ZS5yZXR1cm5EaXNwbGF5VmFsdWVcbiAgICAgICAgPyBxdWVzdGlvbi5nZXREaXNwbGF5VmFsdWUoZmFsc2UsIHVuZGVmaW5lZClcbiAgICAgICAgOiBxdWVzdGlvbi52YWx1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZShuYW1lLCB2YWx1ZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKHRleHRWYWx1ZS5uYW1lKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNsZWFyVW51c2VkVmFsdWVzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhclVudXNlZFZhbHVlcygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jbGVhckludmlzaWJsZVZhbHVlcyAhPSBcIm5vbmVcIikge1xuICAgICAgdGhpcy5jbGVhckludmlzaWJsZVF1ZXN0aW9uVmFsdWVzKCk7XG4gICAgfVxuICB9XG4gIGhhc1Zpc2libGVRdWVzdGlvbkJ5VmFsdWVOYW1lKHZhbHVlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKHZhbHVlTmFtZSk7XG4gICAgaWYgKCFxdWVzdGlvbnMpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmlzVmlzaWJsZSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBxdWVzdGlvbkNvdW50QnlWYWx1ZU5hbWUodmFsdWVOYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1ZXN0aW9uc0J5VmFsdWVOYW1lQ29yZSh2YWx1ZU5hbWUpO1xuICAgIHJldHVybiAhIXF1ZXN0aW9ucyA/IHF1ZXN0aW9ucy5sZW5ndGggOiAwO1xuICB9XG4gIHByaXZhdGUgY2xlYXJJbnZpc2libGVRdWVzdGlvblZhbHVlcygpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0uY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdmFyaWFibGUgdmFsdWUuIFZhcmlhYmxlLCB1bmxpa2UgdmFsdWVzLCBhcmUgbm90IHN0b3JlZCBpbiB0aGUgc3VydmV5IHJlc3VsdHMuXG4gICAqIEBwYXJhbSBuYW1lIEEgdmFyaWFibGUgbmFtZVxuICAgKiBAc2VlIFNldFZhcmlhYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0VmFyaWFibGUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHJlcyA9IHRoaXMudmFyaWFibGVzSGFzaFtuYW1lXTtcbiAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHJlcykpIHJldHVybiByZXM7XG4gICAgaWYgKG5hbWUuaW5kZXhPZihcIi5cIikgPiAtMSB8fCBuYW1lLmluZGV4T2YoXCJbXCIpID4gLTEpIHtcbiAgICAgIGlmIChuZXcgUHJvY2Vzc1ZhbHVlKCkuaGFzVmFsdWUobmFtZSwgdGhpcy52YXJpYWJsZXNIYXNoKSlcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZShuYW1lLCB0aGlzLnZhcmlhYmxlc0hhc2gpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIGEgdmFyaWFibGUgdmFsdWUuIFZhcmlhYmxlLCB1bmxpa2UgdmFsdWVzLCBhcmUgbm90IHN0b3JlZCBpbiB0aGUgc3VydmV5IHJlc3VsdHMuXG4gICAqIEBwYXJhbSBuYW1lIEEgdmFyaWFibGUgbmFtZVxuICAgKiBAcGFyYW0gbmV3VmFsdWUgQSB2YXJpYWJsZSBuZXcgdmFsdWVcbiAgICogQHNlZSBHZXRWYXJpYWJsZVxuICAgKi9cbiAgcHVibGljIHNldFZhcmlhYmxlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy52YXJpYWJsZXNIYXNoW25hbWVdID0gbmV3VmFsdWU7XG4gICAgdGhpcy5ub3RpZnlFbGVtZW50c09uQW55VmFsdWVPclZhcmlhYmxlQ2hhbmdlZChuYW1lKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbk9uVmFsdWVDaGFuZ2VkKG5hbWUsIG5ld1ZhbHVlKTtcbiAgfVxuICAvL0lTdXJ2ZXkgZGF0YVxuICBwcm90ZWN0ZWQgZ2V0VW5iaW5kVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUodmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcXVlc3Rpb24gdmFsdWUgKGFuc3dlcikgYnkgYSBxdWVzdGlvbidzIG5hbWUuXG4gICAqIEBwYXJhbSBuYW1lIEEgcXVlc3Rpb24gbmFtZVxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBzZXRWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFuYW1lIHx8IG5hbWUubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIG5hbWUpO1xuICAgIHJldHVybiB0aGlzLmdldFVuYmluZFZhbHVlKHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2V0cyBhIHF1ZXN0aW9uIHZhbHVlIChhbnN3ZXIpLiBJdCBydW5zIGFsbCB0cmlnZ2VycyBhbmQgY29uZGl0aW9ucyAoYHZpc2libGVJZmAgcHJvcGVydGllcykuXG4gICAqXG4gICAqIEdvZXMgdG8gdGhlIG5leHQgcGFnZSBpZiBgZ29OZXh0UGFnZUF1dG9tYXRpY2AgaXMgYHRydWVgIGFuZCBhbGwgcXVlc3Rpb25zIG9uIHRoZSBjdXJyZW50IHBhZ2UgYXJlIGFuc3dlcmVkIGNvcnJlY3RseS5cbiAgICogQHBhcmFtIG5hbWUgQSBxdWVzdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSBBIG5ldyBxdWVzdGlvbiB2YWx1ZVxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBnZXRWYWx1ZVxuICAgKiBAc2VlIFBhZ2VNb2RlbC52aXNpYmxlSWZcbiAgICogQHNlZSBRdWVzdGlvbi52aXNpYmxlSWZcbiAgICogQHNlZSBnb05leHRQYWdlQXV0b21hdGljXG4gICAqL1xuICBwdWJsaWMgc2V0VmFsdWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1F1ZXN0aW9uVmFsdWU6IGFueSxcbiAgICBsb2NOb3RpZmljYXRpb246IGFueSA9IGZhbHNlLFxuICAgIGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB2YXIgbmV3VmFsdWUgPSBuZXdRdWVzdGlvblZhbHVlO1xuICAgIGlmIChhbGxvd05vdGlmeVZhbHVlQ2hhbmdlZClcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy5xdWVzdGlvbk9uVmFsdWVDaGFuZ2luZyhuYW1lLCBuZXdRdWVzdGlvblZhbHVlKTtcbiAgICBpZiAoIXRoaXMuZWRpdGluZ09iaiAmJlxuICAgICAgdGhpcy5pc1ZhbHVlRXF1YWwobmFtZSwgbmV3VmFsdWUpICYmXG4gICAgICB0aGlzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIG5ld1F1ZXN0aW9uVmFsdWUpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlRGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMuZ2V0VW5iaW5kVmFsdWUobmV3VmFsdWUpO1xuICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwgbmFtZSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZU9uU2V0VmFsdWUobmFtZSwgbmV3VmFsdWUsIGxvY05vdGlmaWNhdGlvbiwgYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlT25TZXRWYWx1ZShuYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICBsb2NOb3RpZmljYXRpb246IGFueSA9IGZhbHNlLFxuICAgIGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uVmFsdWUobmFtZSwgbmV3VmFsdWUpO1xuICAgIGlmIChsb2NOb3RpZmljYXRpb24gPT09IHRydWUpIHJldHVybjtcbiAgICB2YXIgdHJpZ2dlcktleXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIHRyaWdnZXJLZXlzW25hbWVdID0gbmV3VmFsdWU7XG4gICAgdGhpcy5jaGVja1RyaWdnZXJzKHRyaWdnZXJLZXlzLCBmYWxzZSk7XG4gICAgdGhpcy5ydW5Db25kaXRpb25PblZhbHVlQ2hhbmdlZChuYW1lLCBuZXdWYWx1ZSk7XG4gICAgaWYgKGFsbG93Tm90aWZ5VmFsdWVDaGFuZ2VkKVxuICAgICAgdGhpcy5ub3RpZnlRdWVzdGlvbk9uVmFsdWVDaGFuZ2VkKG5hbWUsIG5ld1ZhbHVlKTtcbiAgICBpZiAobG9jTm90aWZpY2F0aW9uICE9PSBcInRleHRcIikge1xuICAgICAgdGhpcy50cnlHb05leHRQYWdlQXV0b21hdGljKG5hbWUpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVByb2dyZXNzVGV4dCh0cnVlKTtcbiAgfVxuICBwcml2YXRlIGlzVmFsdWVFcXVhbChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAobmV3VmFsdWUgPT09IFwiXCIgfHwgbmV3VmFsdWUgPT09IHVuZGVmaW5lZCkgbmV3VmFsdWUgPSBudWxsO1xuICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUobmFtZSk7XG4gICAgaWYgKG9sZFZhbHVlID09PSBcIlwiIHx8IG9sZFZhbHVlID09PSB1bmRlZmluZWQpIG9sZFZhbHVlID0gbnVsbDtcbiAgICBpZiAobmV3VmFsdWUgPT09IG51bGwgfHwgb2xkVmFsdWUgPT09IG51bGwpIHJldHVybiBuZXdWYWx1ZSA9PT0gb2xkVmFsdWU7XG4gICAgcmV0dXJuIHRoaXMuaXNUd29WYWx1ZUVxdWFscyhuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBkb09uUGFnZUFkZGVkKHBhZ2U6IFBhZ2VNb2RlbCkge1xuICAgIHBhZ2Uuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICBpZiAoIXBhZ2UubmFtZSkgcGFnZS5uYW1lID0gdGhpcy5nZW5lcmF0ZU5ld05hbWUodGhpcy5wYWdlcywgXCJwYWdlXCIpO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNQYW5lbEFkZGVkKHBhZ2UpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcGFnZTogcGFnZSB9O1xuICAgIHRoaXMub25QYWdlQWRkZWQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9PblBhZ2VSZW1vdmVkKHBhZ2U6IFBhZ2VNb2RlbCkge1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICBwcml2YXRlIGdlbmVyYXRlTmV3TmFtZShlbGVtZW50czogQXJyYXk8YW55PiwgYmFzZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIGtleXM6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIGtleXNbZWxlbWVudHNbaV1bXCJuYW1lXCJdXSA9IHRydWU7XG4gICAgdmFyIGluZGV4ID0gMTtcbiAgICB3aGlsZSAoa2V5c1tiYXNlTmFtZSArIGluZGV4XSkgaW5kZXgrKztcbiAgICByZXR1cm4gYmFzZU5hbWUgKyBpbmRleDtcbiAgfVxuICBwcm90ZWN0ZWQgdHJ5R29OZXh0UGFnZUF1dG9tYXRpYyhuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICAhIXRoaXMuaXNFbmRMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgICF0aGlzLmdvTmV4dFBhZ2VBdXRvbWF0aWMgfHxcbiAgICAgICF0aGlzLmN1cnJlbnRQYWdlXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj50aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUobmFtZSk7XG4gICAgaWYgKFxuICAgICAgIXF1ZXN0aW9uIHx8XG4gICAgICAoISFxdWVzdGlvbiAmJlxuICAgICAgICAoIXF1ZXN0aW9uLnZpc2libGUgfHwgIXF1ZXN0aW9uLnN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkpKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAocXVlc3Rpb24uaGFzRXJyb3JzKGZhbHNlKSAmJiAhcXVlc3Rpb24uc3VwcG9ydEdvTmV4dFBhZ2VFcnJvcigpKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0Q3VycmVudFBhZ2VRdWVzdGlvbnMoKTtcbiAgICBpZiAocXVlc3Rpb25zLmluZGV4T2YocXVlc3Rpb24pIDwgMCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmhhc0lucHV0ICYmIHF1ZXN0aW9uc1tpXS5pc0VtcHR5KCkpIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNoZWNrSXNDdXJyZW50UGFnZUhhc0Vycm9ycyhmYWxzZSkpIHtcbiAgICAgIGlmICghdGhpcy5pc0xhc3RQYWdlKSB7XG4gICAgICAgIHRoaXMubmV4dFBhZ2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmdvTmV4dFBhZ2VBdXRvbWF0aWMgPT09IHRydWUgJiZcbiAgICAgICAgICB0aGlzLmFsbG93Q29tcGxldGVTdXJ2ZXlBdXRvbWF0aWNcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZUxhc3RQYWdlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbW1lbnQgdmFsdWUuXG4gICAqIEBwYXJhbSBuYW1lIEEgY29tbWVudCdzIG5hbWUuXG4gICAqIEBzZWUgc2V0Q29tbWVudFxuICAgKi9cbiAgcHVibGljIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhW25hbWUgKyB0aGlzLmNvbW1lbnRQcmVmaXhdO1xuICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gXCJcIjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIGEgY29tbWVudCB2YWx1ZS5cbiAgICogQHBhcmFtIG5hbWUgQSBjb21tZW50IG5hbWUuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSBBIG5ldyBjb21tZW50IHZhbHVlLlxuICAgKiBAc2VlIGdldENvbW1lbnRcbiAgICovXG4gIHB1YmxpYyBzZXRDb21tZW50KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBuZXdWYWx1ZTogc3RyaW5nLFxuICAgIGxvY05vdGlmaWNhdGlvbjogYW55ID0gZmFsc2VcbiAgKSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgbmV3VmFsdWUgPSBcIlwiO1xuICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIHRoaXMuZ2V0Q29tbWVudChuYW1lKSkpIHJldHVybjtcbiAgICB2YXIgY29tbWVudE5hbWUgPSBuYW1lICsgdGhpcy5jb21tZW50UHJlZml4O1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShuZXdWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlRGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGNvbW1lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwgY29tbWVudE5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zQnlWYWx1ZU5hbWVDb3JlKG5hbWUpO1xuICAgIGlmICghIXF1ZXN0aW9ucykge1xuICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBxdWVzdGlvbnNbaV0udXBkYXRlQ29tbWVudEZyb21TdXJ2ZXkobmV3VmFsdWUpO1xuICAgICAgICB0aGlzLmNoZWNrUXVlc3Rpb25FcnJvck9uVmFsdWVDaGFuZ2VkKHF1ZXN0aW9uc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsb2NOb3RpZmljYXRpb24gIT09IFwidGV4dFwiKSB7XG4gICAgICB0aGlzLnRyeUdvTmV4dFBhZ2VBdXRvbWF0aWMobmFtZSk7XG4gICAgfVxuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgaWYgKHF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgICBuYW1lOiBjb21tZW50TmFtZSxcbiAgICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBzdXJ2ZXkgcmVzdWx0cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbHVlLiBUeXBpY2FsbHkgaXQgaXMgYSBxdWVzdGlvbiBuYW1lLlxuICAgKi9cbiAgcHVibGljIGNsZWFyVmFsdWUobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShuYW1lLCBudWxsKTtcbiAgICB0aGlzLnNldENvbW1lbnQobmFtZSwgbnVsbCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB3aGV0aGVyIHRvIGNsZWFyIHZhbHVlIG9uIGRpc2FibGUgaXRlbXMgaW4gY2hlY2tib3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucy5cbiAgICogQnkgZGVmYXVsdCwgdmFsdWVzIGFyZSBub3QgY2xlYXJlZCBvbiBkaXNhYmxlZCB0aGUgY29ycmVzcG9uZGVkIGl0ZW1zLiBUaGlzIHByb3BlcnR5IGlzIG5vdCBwZXJzaXN0ZWQgaW4gc3VydmV5IEpTT04gYW5kIHlvdSBoYXZlIHRvIHNldCBpdCBpbiBjb2RlLlxuICAgKi9cbiAgcHVibGljIGdldCBjbGVhclZhbHVlT25EaXNhYmxlSXRlbXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNsZWFyVmFsdWVPbkRpc2FibGVJdGVtc1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBjbGVhclZhbHVlT25EaXNhYmxlSXRlbXModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJWYWx1ZU9uRGlzYWJsZUl0ZW1zXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGlzQ2xlYXJWYWx1ZU9uSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsZWFySW52aXNpYmxlVmFsdWVzID09IFwib25IaWRkZW5cIjtcbiAgfVxuICBxdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICB2aXNpYmxlOiBuZXdWYWx1ZSxcbiAgICB9KTtcbiAgfVxuICBwYWdlVmlzaWJpbGl0eUNoYW5nZWQocGFnZTogSVBhZ2UsIG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYWdlVmlzaWJsZUNoYW5nZWQuZmlyZSh0aGlzLCB7IHBhZ2U6IHBhZ2UsIHZpc2libGU6IG5ld1ZhbHVlIH0pO1xuICB9XG4gIHBhbmVsVmlzaWJpbGl0eUNoYW5nZWQocGFuZWw6IElQYW5lbCwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblBhbmVsVmlzaWJsZUNoYW5nZWQuZmlyZSh0aGlzLCB7IHBhbmVsOiBwYW5lbCwgdmlzaWJsZTogbmV3VmFsdWUgfSk7XG4gIH1cbiAgcXVlc3Rpb25DcmVhdGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBhbnkge1xuICAgIHRoaXMub25RdWVzdGlvbkNyZWF0ZWQuZmlyZSh0aGlzLCB7IHF1ZXN0aW9uOiBxdWVzdGlvbiB9KTtcbiAgfVxuICBxdWVzdGlvbkFkZGVkKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBwYXJlbnRQYW5lbDogYW55LFxuICAgIHJvb3RQYW5lbDogYW55XG4gICkge1xuICAgIGlmICghcXVlc3Rpb24ubmFtZSkge1xuICAgICAgcXVlc3Rpb24ubmFtZSA9IHRoaXMuZ2VuZXJhdGVOZXdOYW1lKFxuICAgICAgICB0aGlzLmdldEFsbFF1ZXN0aW9ucyhmYWxzZSwgdHJ1ZSksXG4gICAgICAgIFwicXVlc3Rpb25cIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKDxRdWVzdGlvbj5xdWVzdGlvbikucGFnZSkge1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlc0FkZGVkKDxRdWVzdGlvbj5xdWVzdGlvbik7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUXVlc3Rpb25BZGRlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBwYXJlbnRQYW5lbDogcGFyZW50UGFuZWwsXG4gICAgICByb290UGFuZWw6IHJvb3RQYW5lbCxcbiAgICB9KTtcbiAgfVxuICBxdWVzdGlvblJlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbikge1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNSZW1vdmVkKFxuICAgICAgPFF1ZXN0aW9uPnF1ZXN0aW9uLFxuICAgICAgcXVlc3Rpb24ubmFtZSxcbiAgICAgIHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblF1ZXN0aW9uUmVtb3ZlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgfSk7XG4gIH1cbiAgcXVlc3Rpb25SZW5hbWVkKFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgb2xkTmFtZTogc3RyaW5nLFxuICAgIG9sZFZhbHVlTmFtZTogc3RyaW5nXG4gICk6IGFueSB7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlc1JlbW92ZWQoPFF1ZXN0aW9uPnF1ZXN0aW9uLCBvbGROYW1lLCBvbGRWYWx1ZU5hbWUpO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNBZGRlZCg8UXVlc3Rpb24+cXVlc3Rpb24pO1xuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoZXMgPSB7XG4gICAgbmFtZXM6IHt9LFxuICAgIG5hbWVzSW5zZW5zaXRpdmU6IHt9LFxuICAgIHZhbHVlTmFtZXM6IHt9LFxuICAgIHZhbHVlTmFtZXNJbnNlbnNpdGl2ZToge30sXG4gIH07XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoZXNDbGVhcigpIHtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzID0ge307XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlcy5uYW1lc0luc2Vuc2l0aXZlID0ge307XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlcy52YWx1ZU5hbWVzID0ge307XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hlcy52YWx1ZU5hbWVzSW5zZW5zaXRpdmUgPSB7fTtcbiAgfVxuICBwcml2YXRlIHF1ZXN0aW9uSGFzaGVzUGFuZWxBZGRlZChwYW5lbDogUGFuZWxNb2RlbEJhc2UpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbnMgPSBwYW5lbC5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXNBZGRlZChxdWVzdGlvbnNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHF1ZXN0aW9uSGFzaGVzQWRkZWQocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgdGhpcy5xdWVzdGlvbkhhc2hBZGRlZENvcmUoXG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzLFxuICAgICAgcXVlc3Rpb24sXG4gICAgICBxdWVzdGlvbi5uYW1lXG4gICAgKTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaEFkZGVkQ29yZShcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMubmFtZXNJbnNlbnNpdGl2ZSxcbiAgICAgIHF1ZXN0aW9uLFxuICAgICAgcXVlc3Rpb24ubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgICB0aGlzLnF1ZXN0aW9uSGFzaEFkZGVkQ29yZShcbiAgICAgIHRoaXMucXVlc3Rpb25IYXNoZXMudmFsdWVOYW1lcyxcbiAgICAgIHF1ZXN0aW9uLFxuICAgICAgcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKClcbiAgICApO1xuICAgIHRoaXMucXVlc3Rpb25IYXNoQWRkZWRDb3JlKFxuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy52YWx1ZU5hbWVzSW5zZW5zaXRpdmUsXG4gICAgICBxdWVzdGlvbixcbiAgICAgIHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpLnRvTG93ZXJDYXNlKClcbiAgICApO1xuICB9XG4gIHByaXZhdGUgcXVlc3Rpb25IYXNoZXNSZW1vdmVkKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgaWYgKCEhbmFtZSkge1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hSZW1vdmVkQ29yZSh0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzLCBxdWVzdGlvbiwgbmFtZSk7XG4gICAgICB0aGlzLnF1ZXN0aW9uSGFzaFJlbW92ZWRDb3JlKFxuICAgICAgICB0aGlzLnF1ZXN0aW9uSGFzaGVzLm5hbWVzSW5zZW5zaXRpdmUsXG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghIXZhbHVlTmFtZSkge1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hSZW1vdmVkQ29yZShcbiAgICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy52YWx1ZU5hbWVzLFxuICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgdmFsdWVOYW1lXG4gICAgICApO1xuICAgICAgdGhpcy5xdWVzdGlvbkhhc2hSZW1vdmVkQ29yZShcbiAgICAgICAgdGhpcy5xdWVzdGlvbkhhc2hlcy52YWx1ZU5hbWVzSW5zZW5zaXRpdmUsXG4gICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICB2YWx1ZU5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBxdWVzdGlvbkhhc2hBZGRlZENvcmUoaGFzaDogYW55LCBxdWVzdGlvbjogUXVlc3Rpb24sIG5hbWU6IHN0cmluZykge1xuICAgIHZhciByZXMgPSBoYXNoW25hbWVdO1xuICAgIGlmICghIXJlcykge1xuICAgICAgdmFyIHJlcyA9IGhhc2hbbmFtZV07XG4gICAgICBpZiAocmVzLmluZGV4T2YocXVlc3Rpb24pIDwgMCkge1xuICAgICAgICByZXMucHVzaChxdWVzdGlvbik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhc2hbbmFtZV0gPSBbcXVlc3Rpb25dO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHF1ZXN0aW9uSGFzaFJlbW92ZWRDb3JlKGhhc2g6IGFueSwgcXVlc3Rpb246IFF1ZXN0aW9uLCBuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgcmVzID0gaGFzaFtuYW1lXTtcbiAgICBpZiAoIXJlcykgcmV0dXJuO1xuICAgIHZhciBpbmRleCA9IHJlcy5pbmRleE9mKHF1ZXN0aW9uKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgcmVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIGlmIChyZXMubGVuZ3RoID09IDApIHtcbiAgICAgIGRlbGV0ZSBoYXNoW25hbWVdO1xuICAgIH1cbiAgfVxuICBwYW5lbEFkZGVkKHBhbmVsOiBJRWxlbWVudCwgaW5kZXg6IG51bWJlciwgcGFyZW50UGFuZWw6IGFueSwgcm9vdFBhbmVsOiBhbnkpIHtcbiAgICBpZiAoIXBhbmVsLm5hbWUpIHtcbiAgICAgIHBhbmVsLm5hbWUgPSB0aGlzLmdlbmVyYXRlTmV3TmFtZShcbiAgICAgICAgdGhpcy5nZXRBbGxQYW5lbHMoZmFsc2UsIHRydWUpLFxuICAgICAgICBcInBhbmVsXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucXVlc3Rpb25IYXNoZXNQYW5lbEFkZGVkKDxQYW5lbE1vZGVsQmFzZT4oPGFueT5wYW5lbCkpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUGFuZWxBZGRlZC5maXJlKHRoaXMsIHtcbiAgICAgIHBhbmVsOiBwYW5lbCxcbiAgICAgIG5hbWU6IHBhbmVsLm5hbWUsXG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBwYXJlbnRQYW5lbDogcGFyZW50UGFuZWwsXG4gICAgICByb290UGFuZWw6IHJvb3RQYW5lbCxcbiAgICB9KTtcbiAgfVxuICBwYW5lbFJlbW92ZWQocGFuZWw6IElFbGVtZW50KSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYW5lbFJlbW92ZWQuZmlyZSh0aGlzLCB7IHBhbmVsOiBwYW5lbCwgbmFtZTogcGFuZWwubmFtZSB9KTtcbiAgfVxuICB2YWxpZGF0ZVF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKHRoaXMub25WYWxpZGF0ZVF1ZXN0aW9uLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgbmFtZTogcXVlc3Rpb24ubmFtZSxcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHZhbHVlOiBxdWVzdGlvbi52YWx1ZSxcbiAgICAgIGVycm9yOiA8YW55Pm51bGwsXG4gICAgfTtcbiAgICB0aGlzLm9uVmFsaWRhdGVRdWVzdGlvbi5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmVycm9yID8gbmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3IsIHRoaXMpIDogbnVsbDtcbiAgfVxuICB2YWxpZGF0ZVBhbmVsKHBhbmVsOiBJUGFuZWwpOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKHRoaXMub25WYWxpZGF0ZVBhbmVsLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgbmFtZTogcGFuZWwubmFtZSxcbiAgICAgIHBhbmVsOiBwYW5lbCxcbiAgICAgIGVycm9yOiA8YW55Pm51bGwsXG4gICAgfTtcbiAgICB0aGlzLm9uVmFsaWRhdGVQYW5lbC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmVycm9yID8gbmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3IsIHRoaXMpIDogbnVsbDtcbiAgfVxuICBwcm9jZXNzSHRtbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBvcHRpb25zID0geyBodG1sOiBodG1sIH07XG4gICAgdGhpcy5vblByb2Nlc3NIdG1sLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1RleHQob3B0aW9ucy5odG1sLCB0cnVlKTtcbiAgfVxuICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1RleHRFeCh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUsIGZhbHNlKS50ZXh0O1xuICB9XG4gIHByb2Nlc3NUZXh0RXgoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbixcbiAgICBkb0VuY29kaW5nOiBib29sZWFuXG4gICk6IGFueSB7XG4gICAgdmFyIHJlcyA9IHtcbiAgICAgIHRleHQ6IHRoaXMucHJvY2Vzc1RleHRDb3JlKHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSwgZG9FbmNvZGluZyksXG4gICAgICBoYXNBbGxWYWx1ZXNPbkxhc3RSdW46IHRydWUsXG4gICAgfTtcbiAgICByZXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuID0gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLmhhc0FsbFZhbHVlc09uTGFzdFJ1bjtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgcHJvY2Vzc1RleHRDb3JlKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4sXG4gICAgZG9FbmNvZGluZzogYm9vbGVhbiA9IGZhbHNlXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gdGV4dDtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLnByb2Nlc3ModGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlLCBkb0VuY29kaW5nKTtcbiAgfVxuICBnZXRTdXJ2ZXlNYXJrZG93bkh0bWwoZWxlbWVudDogQmFzZSwgdGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgZWxlbWVudDogZWxlbWVudCwgdGV4dDogdGV4dCwgaHRtbDogPGFueT5udWxsIH07XG4gICAgdGhpcy5vblRleHRNYXJrZG93bi5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmh0bWw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYW1vdW50IG9mIGNvcnJlY3RlZCBxdWl6IGFuc3dlcnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudENvcmUodHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgcXVpeiBxdWVzdGlvbiBudW1iZXIuIEl0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSBgZ2V0UXVpelF1ZXN0aW9ucy5sZW5ndGhgIGJlY2F1c2Ugc29tZSB3aWRnZXRzIGxpa2UgbWF0cml4IG1heSBoYXZlIHNldmVyYWwgcXVlc3Rpb25zLlxuICAgKiBAc2VlIGdldFF1aXpRdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBnZXRRdWl6UXVlc3Rpb25Db3VudCgpOiBudW1iZXIge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1aXpRdWVzdGlvbnMoKTtcbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzICs9ICg8UXVlc3Rpb24+cXVlc3Rpb25zW2ldKS5xdWl6UXVlc3Rpb25Db3VudDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbiBhbW91bnQgb2YgaW5jb3JyZWN0IHF1aXogYW5zd2Vycy5cbiAgICovXG4gIHB1YmxpYyBnZXRJbkNvcnJlY3RlZEFuc3dlckNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29ycmVjdGVkQW5zd2VyQ291bnRDb3JlKGZhbHNlKTtcbiAgfVxuICBwcml2YXRlIGdldENvcnJlY3RlZEFuc3dlckNvdW50Q29yZShpc0NvcnJlY3Q6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1aXpRdWVzdGlvbnMoKTtcbiAgICB2YXIgY291bnRlciA9IDA7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBxdWVzdGlvbjogPElRdWVzdGlvbj5udWxsLFxuICAgICAgcmVzdWx0OiBmYWxzZSxcbiAgICAgIGNvcnJlY3RBbnN3ZXJzOiAwLFxuICAgICAgaW5jb3JyZWN0QW5zd2VyczogMCxcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IDxRdWVzdGlvbj5xdWVzdGlvbnNbaV07XG4gICAgICB2YXIgcXVpelF1ZXN0aW9uQ291bnQgPSBxLnF1aXpRdWVzdGlvbkNvdW50O1xuICAgICAgb3B0aW9ucy5xdWVzdGlvbiA9IHE7XG4gICAgICBvcHRpb25zLmNvcnJlY3RBbnN3ZXJzID0gcS5jb3JyZWN0QW5zd2VyQ291bnQ7XG4gICAgICBvcHRpb25zLmluY29ycmVjdEFuc3dlcnMgPSBxdWl6UXVlc3Rpb25Db3VudCAtIG9wdGlvbnMuY29ycmVjdEFuc3dlcnM7XG4gICAgICBvcHRpb25zLnJlc3VsdCA9IG9wdGlvbnMucXVlc3Rpb24uaXNBbnN3ZXJDb3JyZWN0KCk7XG4gICAgICB0aGlzLm9uSXNBbnN3ZXJDb3JyZWN0LmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgICBpZiAoaXNDb3JyZWN0KSB7XG4gICAgICAgIGlmIChvcHRpb25zLnJlc3VsdCB8fCBvcHRpb25zLmNvcnJlY3RBbnN3ZXJzIDwgcXVpelF1ZXN0aW9uQ291bnQpIHtcbiAgICAgICAgICB2YXIgYWRkQ291bnQgPSBvcHRpb25zLmNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICAgIGlmIChhZGRDb3VudCA9PSAwICYmIG9wdGlvbnMucmVzdWx0KSBhZGRDb3VudCA9IDE7XG4gICAgICAgICAgY291bnRlciArPSBhZGRDb3VudDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFvcHRpb25zLnJlc3VsdCB8fCBvcHRpb25zLmluY29ycmVjdEFuc3dlcnMgPCBxdWl6UXVlc3Rpb25Db3VudCkge1xuICAgICAgICAgIGNvdW50ZXIgKz0gb3B0aW9ucy5pbmNvcnJlY3RBbnN3ZXJzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudGVyO1xuICB9XG4gIGdldENvcnJlY3RlZEFuc3dlcnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudCgpO1xuICB9XG4gIGdldEluQ29ycmVjdGVkQW5zd2VycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldEluQ29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgdGltZXIgcGFuZWwgcG9zaXRpb24uIFRoZSB0aW1lciBwYW5lbCBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgbXVjaCB0aW1lIGFuIGVuZCB1c2VyIHNwZW5kcyBvbiBhIHN1cnZleS9wYWdlLlxuICAgKlxuICAgKiBUaGUgYXZhaWxhYmxlIG9wdGlvbnM6XG4gICAqIC0gYHRvcGAgLSBkaXNwbGF5IHRpbWVyIHBhbmVsIGluIHRoZSB0b3AuXG4gICAqIC0gYGJvdHRvbWAgLSBkaXNwbGF5IHRpbWVyIHBhbmVsIGluIHRoZSBib3R0b20uXG4gICAqIC0gYG5vbmVgIC0gZG8gbm90IGRpc3BsYXkgYSB0aW1lciBwYW5lbC5cbiAgICpcbiAgICogSWYgdGhlIHZhbHVlIGlzIG5vdCBlcXVhbCB0byAnbm9uZScsIHRoZSBzdXJ2ZXkgY2FsbHMgdGhlIGBzdGFydFRpbWVyKClgIG1ldGhvZCBvbiBzdXJ2ZXkgcmVuZGVyaW5nLlxuICAgKiBAc2VlIHNob3dUaW1lclBhbmVsTW9kZVxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBzdG9wVGltZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1RpbWVyUGFuZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpbWVyUGFuZWxcIiwgXCJub25lXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1RpbWVyUGFuZWwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNUaW1lclBhbmVsU2hvd2luZ09uVG9wKCkge1xuICAgIHJldHVybiB0aGlzLmlzVGltZXJTdGFydGVkICYmIHRoaXMuc2hvd1RpbWVyUGFuZWwgPT0gXCJ0b3BcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVGltZXJQYW5lbFNob3dpbmdPbkJvdHRvbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RpbWVyU3RhcnRlZCAmJiB0aGlzLnNob3dUaW1lclBhbmVsID09IFwiYm90dG9tXCI7XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0IGEgdmFsdWUgdGhhdCBzcGVjaWZpZXMgd2hldGhlciB0aGUgdGltZXIgZGlzcGxheXMgaW5mb3JtYXRpb24gZm9yIHRoZSBwYWdlIG9yIGZvciB0aGUgZW50aXJlIHN1cnZleS5cbiAgICpcbiAgICogVGhlIGF2YWlsYWJsZSBvcHRpb25zOlxuICAgKlxuICAgKiAtIGBwYWdlYCAtIHNob3cgdGltZXIgaW5mb3JtYXRpb24gZm9yIHBhZ2VcbiAgICogLSBgc3VydmV5YCAtIHNob3cgdGltZXIgaW5mb3JtYXRpb24gZm9yIHN1cnZleVxuICAgKlxuICAgKiBVc2UgdGhlIGBvblRpbWVyUGFuZWxJbmZvVGV4dGAgZXZlbnQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAqIEBzZWUgc2hvd1RpbWVyUGFuZWxcbiAgICogQHNlZSBvblRpbWVyUGFuZWxJbmZvVGV4dFxuICAgKi9cbiAgcHVibGljIGdldCBzaG93VGltZXJQYW5lbE1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpbWVyUGFuZWxNb2RlXCIsIFwiYWxsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1RpbWVyUGFuZWxNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpbWVyUGFuZWxNb2RlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0aW1lckluZm9UZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIG9wdGlvbnMgPSB7IHRleHQ6IHRoaXMuZ2V0VGltZXJJbmZvVGV4dCgpIH07XG4gICAgdGhpcy5vblRpbWVyUGFuZWxJbmZvVGV4dC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHZhciBsb2MgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcodGhpcywgdHJ1ZSk7XG4gICAgbG9jLnRleHQgPSBvcHRpb25zLnRleHQ7XG4gICAgcmV0dXJuIGxvYy50ZXh0T3JIdG1sO1xuICB9XG4gIHByaXZhdGUgZ2V0VGltZXJJbmZvVGV4dCgpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgaWYgKCFwYWdlKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgcGFnZVNwZW50ID0gdGhpcy5nZXREaXNwbGF5VGltZShwYWdlLnRpbWVTcGVudCk7XG4gICAgdmFyIHN1cnZleVNwZW50ID0gdGhpcy5nZXREaXNwbGF5VGltZSh0aGlzLnRpbWVTcGVudCk7XG4gICAgdmFyIHBhZ2VMaW1pdFNlYyA9IHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKTtcbiAgICB2YXIgcGFnZUxpbWl0ID0gdGhpcy5nZXREaXNwbGF5VGltZShwYWdlTGltaXRTZWMpO1xuICAgIHZhciBzdXJ2ZXlMaW1pdCA9IHRoaXMuZ2V0RGlzcGxheVRpbWUodGhpcy5tYXhUaW1lVG9GaW5pc2gpO1xuICAgIGlmICh0aGlzLnNob3dUaW1lclBhbmVsTW9kZSA9PSBcInBhZ2VcIilcbiAgICAgIHJldHVybiB0aGlzLmdldFRpbWVySW5mb1BhZ2VUZXh0KHBhZ2UsIHBhZ2VTcGVudCwgcGFnZUxpbWl0KTtcbiAgICBpZiAodGhpcy5zaG93VGltZXJQYW5lbE1vZGUgPT0gXCJzdXJ2ZXlcIilcbiAgICAgIHJldHVybiB0aGlzLmdldFRpbWVySW5mb1N1cnZleVRleHQoc3VydmV5U3BlbnQsIHN1cnZleUxpbWl0KTtcbiAgICBpZiAodGhpcy5zaG93VGltZXJQYW5lbE1vZGUgPT0gXCJhbGxcIikge1xuICAgICAgaWYgKHBhZ2VMaW1pdFNlYyA8PSAwICYmIHRoaXMubWF4VGltZVRvRmluaXNoIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJTcGVudEFsbFwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgICBwYWdlU3BlbnQsXG4gICAgICAgICAgc3VydmV5U3BlbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYWdlTGltaXRTZWMgPiAwICYmIHRoaXMubWF4VGltZVRvRmluaXNoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lckxpbWl0QWxsXCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICAgIHBhZ2VTcGVudCxcbiAgICAgICAgICBwYWdlTGltaXQsXG4gICAgICAgICAgc3VydmV5U3BlbnQsXG4gICAgICAgICAgc3VydmV5TGltaXRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxldCBwYWdlVGV4dCA9IHRoaXMuZ2V0VGltZXJJbmZvUGFnZVRleHQocGFnZSwgcGFnZVNwZW50LCBwYWdlTGltaXQpO1xuICAgICAgbGV0IHN1cnZleVRleHQgPSB0aGlzLmdldFRpbWVySW5mb1N1cnZleVRleHQoc3VydmV5U3BlbnQsIHN1cnZleUxpbWl0KTtcbiAgICAgIHJldHVybiBwYWdlVGV4dCArIFwiIFwiICsgc3VydmV5VGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUaW1lckluZm9QYWdlVGV4dChcbiAgICBwYWdlOiBQYWdlTW9kZWwsXG4gICAgcGFnZVNwZW50OiBzdHJpbmcsXG4gICAgcGFnZUxpbWl0OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlTWF4VGltZVRvRmluaXNoKHBhZ2UpID4gMFxuICAgICAgPyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyTGltaXRQYWdlXCIpW1wiZm9ybWF0XCJdKHBhZ2VTcGVudCwgcGFnZUxpbWl0KVxuICAgICAgOiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU3BlbnRQYWdlXCIpW1wiZm9ybWF0XCJdKHBhZ2VTcGVudCwgcGFnZUxpbWl0KTtcbiAgfVxuICBwcml2YXRlIGdldFRpbWVySW5mb1N1cnZleVRleHQoXG4gICAgc3VydmV5U3BlbnQ6IHN0cmluZyxcbiAgICBzdXJ2ZXlMaW1pdDogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWF4VGltZVRvRmluaXNoID4gMFxuICAgICAgPyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyTGltaXRTdXJ2ZXlcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgc3VydmV5U3BlbnQsXG4gICAgICAgICAgc3VydmV5TGltaXRcbiAgICAgICAgKVxuICAgICAgOiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU3BlbnRTdXJ2ZXlcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgc3VydmV5U3BlbnQsXG4gICAgICAgICAgc3VydmV5TGltaXRcbiAgICAgICAgKTtcbiAgfVxuICBwcml2YXRlIGdldERpc3BsYXlUaW1lKHZhbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICB2YXIgbWluID0gTWF0aC5mbG9vcih2YWwgLyA2MCk7XG4gICAgdmFyIHNlYyA9IHZhbCAlIDYwO1xuICAgIHZhciByZXMgPSBcIlwiO1xuICAgIGlmIChtaW4gPiAwKSB7XG4gICAgICByZXMgKz0gbWluICsgXCIgXCIgKyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyTWluXCIpO1xuICAgIH1cbiAgICBpZiAocmVzICYmIHNlYyA9PSAwKSByZXR1cm4gcmVzO1xuICAgIGlmIChyZXMpIHJlcyArPSBcIiBcIjtcbiAgICByZXR1cm4gcmVzICsgc2VjICsgXCIgXCIgKyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU2VjXCIpO1xuICB9XG4gIHByaXZhdGUgdGltZXJGdW5jOiBhbnkgPSBudWxsO1xuICAvKipcbiAgICogU3RhcnRzIGEgdGltZXIgdGhhdCB3aWxsIGNhbGN1bGF0ZSBob3cgbXVjaCB0aW1lIGVuZC11c2VyIHNwZW5kcyBvbiB0aGUgc3VydmV5IG9yIG9uIHBhZ2VzLlxuICAgKiBAc2VlIHN0b3BUaW1lclxuICAgKiBAc2VlIHRpbWVTcGVudFxuICAgKi9cbiAgcHVibGljIHN0YXJ0VGltZXIoKSB7XG4gICAgaWYgKHRoaXMuaXNUaW1lclN0YXJ0ZWQgfHwgdGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50aW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmRvVGltZXIoKTtcbiAgICB9O1xuICAgIHRoaXMuaXNUaW1lclN0YXJ0ZWQgPSB0cnVlO1xuICAgIFN1cnZleVRpbWVyLmluc3RhbmNlLnN0YXJ0KHRoaXMudGltZXJGdW5jKTtcbiAgfVxuICBzdGFydFRpbWVyRnJvbVVJKCkge1xuICAgIGlmICh0aGlzLnNob3dUaW1lclBhbmVsICE9IFwibm9uZVwiICYmIHRoaXMuc3RhdGUgPT09IFwicnVubmluZ1wiKSB7XG4gICAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSB0aW1lci5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgdGltZVNwZW50XG4gICAqL1xuICBwdWJsaWMgc3RvcFRpbWVyKCkge1xuICAgIGlmICghdGhpcy5pc1RpbWVyU3RhcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNUaW1lclN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBTdXJ2ZXlUaW1lci5pbnN0YW5jZS5zdG9wKHRoaXMudGltZXJGdW5jKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGltZSBpbiBzZWNvbmRzIGFuIGVuZCB1c2VyIHNwZW5kcyBvbiB0aGUgc3VydmV5XG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIFBhZ2VNb2RlbC50aW1lU3BlbnRcbiAgICovXG4gIHB1YmxpYyB0aW1lU3BlbnQgPSAwO1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IGVuZCB1c2VyIGhhcyB0byBjb21wbGV0ZSBhIHN1cnZleS4gSWYgdGhlIHZhbHVlIGlzIDAgb3IgbGVzcywgYW4gZW5kIHVzZXIgaGFzIG5vIHRpbWUgbGltaXQgdG8gZmluaXNoIGEgc3VydmV5LlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBtYXhUaW1lVG9GaW5pc2hQYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFRpbWVUb0ZpbmlzaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUaW1lVG9GaW5pc2godmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IGVuZCB1c2VyIGhhcyB0byBjb21wbGV0ZSBhIHBhZ2UgaW4gdGhlIHN1cnZleS4gSWYgdGhlIHZhbHVlIGlzIDAgb3IgbGVzcywgYW4gZW5kIHVzZXIgaGFzIG5vIHRpbWUgbGltaXQuXG4gICAqXG4gICAqIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyB2YWx1ZSBmb3IgZXZlcnkgcGFnZS5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgbWF4VGltZVRvRmluaXNoXG4gICAqIEBzZWUgUGFnZU1vZGVsLm1heFRpbWVUb0ZpbmlzaFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhUaW1lVG9GaW5pc2hQYWdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFRpbWVUb0ZpbmlzaFBhZ2VcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUaW1lVG9GaW5pc2hQYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4VGltZVRvRmluaXNoUGFnZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBpZiAoIXBhZ2UgfHwgcGFnZS5tYXhUaW1lVG9GaW5pc2ggPCAwKSByZXR1cm4gMDtcbiAgICByZXR1cm4gcGFnZS5tYXhUaW1lVG9GaW5pc2ggPiAwXG4gICAgICA/IHBhZ2UubWF4VGltZVRvRmluaXNoXG4gICAgICA6IHRoaXMubWF4VGltZVRvRmluaXNoUGFnZTtcbiAgfVxuICBwcm90ZWN0ZWQgZG9UaW1lcigpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgaWYgKHBhZ2UpIHtcbiAgICAgIHBhZ2UudGltZVNwZW50ID0gcGFnZS50aW1lU3BlbnQgKyAxO1xuICAgIH1cbiAgICB0aGlzLnRpbWVTcGVudCA9IHRoaXMudGltZVNwZW50ICsgMTtcbiAgICB0aGlzLm9uVGltZXIuZmlyZSh0aGlzLCB7fSk7XG4gICAgaWYgKHRoaXMubWF4VGltZVRvRmluaXNoID4gMCAmJiB0aGlzLm1heFRpbWVUb0ZpbmlzaCA9PSB0aGlzLnRpbWVTcGVudCkge1xuICAgICAgdGhpcy5jb21wbGV0ZUxhc3RQYWdlKCk7XG4gICAgfVxuICAgIGlmIChwYWdlKSB7XG4gICAgICB2YXIgcGFnZUxpbWl0ID0gdGhpcy5nZXRQYWdlTWF4VGltZVRvRmluaXNoKHBhZ2UpO1xuICAgICAgaWYgKHBhZ2VMaW1pdCA+IDAgJiYgcGFnZUxpbWl0ID09IHBhZ2UudGltZVNwZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlTGFzdFBhZ2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9JU3VydmV5SW1wbGVtZW50b3JcbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy9JU3VydmV5VHJpZ2dlck93bmVyXG4gIGdldE9iamVjdHMocGFnZXM6IHN0cmluZ1tdLCBxdWVzdGlvbnM6IHN0cmluZ1tdKTogYW55W10ge1xuICAgIHZhciByZXN1bHQ6IGFueVtdID0gW107XG4gICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmVzdWx0LCB0aGlzLmdldFBhZ2VzQnlOYW1lcyhwYWdlcykpO1xuICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHJlc3VsdCwgdGhpcy5nZXRRdWVzdGlvbnNCeU5hbWVzKHF1ZXN0aW9ucykpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc2V0VHJpZ2dlclZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgaXNWYXJpYWJsZTogYm9vbGVhbikge1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgIGlmIChpc1ZhcmlhYmxlKSB7XG4gICAgICB0aGlzLnNldFZhcmlhYmxlKG5hbWUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICAgIGlmICghIXF1ZXN0aW9uKSB7XG4gICAgICAgIHF1ZXN0aW9uLnZhbHVlID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcHJvY2Vzc29yID0gbmV3IFByb2Nlc3NWYWx1ZSgpO1xuICAgICAgICB2YXIgZmlyc3ROYW1lID0gcHJvY2Vzc29yLmdldEZpcnN0TmFtZShuYW1lKTtcbiAgICAgICAgaWYgKGZpcnN0TmFtZSA9PSBuYW1lKSB7XG4gICAgICAgICAgdGhpcy5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKGZpcnN0TmFtZSkpIHJldHVybjtcbiAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuZ2V0VW5iaW5kVmFsdWUodGhpcy5nZXRGaWx0ZXJlZFZhbHVlcygpKTtcbiAgICAgICAgICBwcm9jZXNzb3Iuc2V0VmFsdWUoZGF0YSwgbmFtZSwgdmFsdWUpO1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWUoZmlyc3ROYW1lLCBkYXRhW2ZpcnN0TmFtZV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvcHlUcmlnZ2VyVmFsdWUobmFtZTogc3RyaW5nLCBmcm9tTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFuYW1lIHx8ICFmcm9tTmFtZSkgcmV0dXJuO1xuICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgUHJvY2Vzc1ZhbHVlKCk7XG4gICAgdmFyIHZhbHVlID0gcHJvY2Vzc29yLmdldFZhbHVlKGZyb21OYW1lLCB0aGlzLmdldEZpbHRlcmVkVmFsdWVzKCkpO1xuICAgIHRoaXMuc2V0VHJpZ2dlclZhbHVlKG5hbWUsIHZhbHVlLCBmYWxzZSk7XG4gIH1cbiAgZm9jdXNRdWVzdGlvbihuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUsIHRydWUpO1xuICAgIGlmICghcXVlc3Rpb24gfHwgIXF1ZXN0aW9uLmlzVmlzaWJsZSB8fCAhcXVlc3Rpb24ucGFnZSkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSBxdWVzdGlvbi5wYWdlO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcXVlc3Rpb24uZm9jdXMoKSwgMTtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGRpc3Bvc2Ugc3VydmV5IG1vZGVsIHByb3Blcmx5LlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5wYWdlcy5zcGxpY2UoMCwgdGhpcy5wYWdlcy5sZW5ndGgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXCJzdXJ2ZXlcIiwgW1xuICB7XG4gICAgbmFtZTogXCJsb2NhbGVcIixcbiAgICBjaG9pY2VzOiAoKSA9PiB7XG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldExvY2FsZXMoKTtcbiAgICB9LFxuICAgIG9uR2V0VmFsdWU6IChvYmo6IGFueSk6IGFueSA9PiB7XG4gICAgICByZXR1cm4gb2JqLmxvY2FsZSA9PSBzdXJ2ZXlMb2NhbGl6YXRpb24uZGVmYXVsdExvY2FsZSA/IG51bGwgOiBvYmoubG9jYWxlO1xuICAgIH0sXG4gIH0sXG4gIHsgbmFtZTogXCJ0aXRsZVwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGl0bGVcIiB9LFxuICB7IG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGVzY3JpcHRpb25cIiB9LFxuICB7IG5hbWU6IFwibG9nb1wiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTG9nb1wiIH0sXG4gIHsgbmFtZTogXCJsb2dvV2lkdGg6bnVtYmVyXCIsIGRlZmF1bHQ6IDMwMCwgbWluVmFsdWU6IDAgfSxcbiAgeyBuYW1lOiBcImxvZ29IZWlnaHQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDIwMCwgbWluVmFsdWU6IDAgfSxcbiAge1xuICAgIG5hbWU6IFwibG9nb0ZpdFwiLFxuICAgIGRlZmF1bHQ6IFwiY29udGFpblwiLFxuICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJjb250YWluXCIsIFwiY292ZXJcIiwgXCJmaWxsXCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJsb2dvUG9zaXRpb25cIixcbiAgICBkZWZhdWx0OiBcImxlZnRcIixcbiAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwibGVmdFwiLCBcInJpZ2h0XCIsIFwidG9wXCIsIFwiYm90dG9tXCJdLFxuICB9LFxuICB7IG5hbWU6IFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwiZm9jdXNPbkZpcnN0RXJyb3I6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJjb21wbGV0ZWRIdG1sOmh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbXBsZXRlZEh0bWxcIiB9LFxuICB7XG4gICAgbmFtZTogXCJjb21wbGV0ZWRCZWZvcmVIdG1sOmh0bWxcIixcbiAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tcGxldGVkQmVmb3JlSHRtbFwiLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJjb21wbGV0ZWRIdG1sT25Db25kaXRpb246aHRtbGNvbmRpdGlvbnNcIixcbiAgICBjbGFzc05hbWU6IFwiaHRtbGNvbmRpdGlvbml0ZW1cIixcbiAgfSxcbiAgeyBuYW1lOiBcImxvYWRpbmdIdG1sOmh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0xvYWRpbmdIdG1sXCIgfSxcbiAgeyBuYW1lOiBcInBhZ2VzOnN1cnZleXBhZ2VzXCIsIGNsYXNzTmFtZTogXCJwYWdlXCIgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25zXCIsXG4gICAgYWx0ZXJuYXRpdmVOYW1lOiBcImVsZW1lbnRzXCIsXG4gICAgYmFzZUNsYXNzTmFtZTogXCJxdWVzdGlvblwiLFxuICAgIHZpc2libGU6IGZhbHNlLFxuICAgIGlzTGlnaHRTZXJpYWxpemFibGU6IGZhbHNlLFxuICAgIG9uR2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSk6IGFueSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIG9uU2V0VmFsdWU6IGZ1bmN0aW9uIChvYmo6IGFueSwgdmFsdWU6IGFueSwganNvbkNvbnZlcnRlcjogYW55KSB7XG4gICAgICB2YXIgcGFnZSA9IG9iai5hZGROZXdQYWdlKFwiXCIpO1xuICAgICAganNvbkNvbnZlcnRlci50b09iamVjdCh7IHF1ZXN0aW9uczogdmFsdWUgfSwgcGFnZSk7XG4gICAgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwidHJpZ2dlcnM6dHJpZ2dlcnNcIixcbiAgICBiYXNlQ2xhc3NOYW1lOiBcInN1cnZleXRyaWdnZXJcIixcbiAgICBjbGFzc05hbWVQYXJ0OiBcInRyaWdnZXJcIixcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiY2FsY3VsYXRlZFZhbHVlczpjYWxjdWxhdGVkdmFsdWVzXCIsXG4gICAgY2xhc3NOYW1lOiBcImNhbGN1bGF0ZWR2YWx1ZVwiLFxuICB9LFxuICB7IG5hbWU6IFwic3VydmV5SWRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgeyBuYW1lOiBcInN1cnZleVBvc3RJZFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICB7IG5hbWU6IFwic3VydmV5U2hvd0RhdGFTYXZpbmc6Ym9vbGVhblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICBcImNvb2tpZU5hbWVcIixcbiAgXCJzZW5kUmVzdWx0T25QYWdlTmV4dDpib29sZWFuXCIsXG4gIHtcbiAgICBuYW1lOiBcInNob3dOYXZpZ2F0aW9uQnV0dG9uc1wiLFxuICAgIGRlZmF1bHQ6IFwiYm90dG9tXCIsXG4gICAgY2hvaWNlczogW1wibm9uZVwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImJvdGhcIl0sXG4gIH0sXG4gIHsgbmFtZTogXCJzaG93UHJldkJ1dHRvbjpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcInNob3dUaXRsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcInNob3dQYWdlVGl0bGVzOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwic2hvd0NvbXBsZXRlZFBhZ2U6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIFwibmF2aWdhdGVUb1VybFwiLFxuICB7XG4gICAgbmFtZTogXCJuYXZpZ2F0ZVRvVXJsT25Db25kaXRpb246dXJsY29uZGl0aW9uc1wiLFxuICAgIGNsYXNzTmFtZTogXCJ1cmxjb25kaXRpb25pdGVtXCIsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uc09yZGVyXCIsXG4gICAgZGVmYXVsdDogXCJpbml0aWFsXCIsXG4gICAgY2hvaWNlczogW1wiaW5pdGlhbFwiLCBcInJhbmRvbVwiXSxcbiAgfSxcbiAgXCJzaG93UGFnZU51bWJlcnM6Ym9vbGVhblwiLFxuICB7XG4gICAgbmFtZTogXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsXG4gICAgZGVmYXVsdDogXCJvblwiLFxuICAgIGNob2ljZXM6IFtcIm9uXCIsIFwib25QYWdlXCIsIFwib2ZmXCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIixcbiAgICBkZWZhdWx0OiBcInRvcFwiLFxuICAgIGNob2ljZXM6IFtcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIl0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uRGVzY3JpcHRpb25Mb2NhdGlvblwiLFxuICAgIGRlZmF1bHQ6IFwidW5kZXJUaXRsZVwiLFxuICAgIGNob2ljZXM6IFtcInVuZGVySW5wdXRcIiwgXCJ1bmRlclRpdGxlXCJdLFxuICB9LFxuICB7IG5hbWU6IFwicXVlc3Rpb25FcnJvckxvY2F0aW9uXCIsIGRlZmF1bHQ6IFwidG9wXCIsIGNob2ljZXM6IFtcInRvcFwiLCBcImJvdHRvbVwiXSB9LFxuICB7XG4gICAgbmFtZTogXCJzaG93UHJvZ3Jlc3NCYXJcIixcbiAgICBkZWZhdWx0OiBcIm9mZlwiLFxuICAgIGNob2ljZXM6IFtcIm9mZlwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImJvdGhcIl0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInByb2dyZXNzQmFyVHlwZVwiLFxuICAgIGRlZmF1bHQ6IFwicGFnZXNcIixcbiAgICBjaG9pY2VzOiBbXCJwYWdlc1wiLCBcInF1ZXN0aW9uc1wiLCBcInJlcXVpcmVkUXVlc3Rpb25zXCIsIFwiY29ycmVjdFF1ZXN0aW9uc1wiXSxcbiAgfSxcbiAgeyBuYW1lOiBcIm1vZGVcIiwgZGVmYXVsdDogXCJlZGl0XCIsIGNob2ljZXM6IFtcImVkaXRcIiwgXCJkaXNwbGF5XCJdIH0sXG4gIHsgbmFtZTogXCJzdG9yZU90aGVyc0FzQ29tbWVudDpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcIm1heFRleHRMZW5ndGg6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIG1pblZhbHVlOiAwIH0sXG4gIHsgbmFtZTogXCJtYXhPdGhlcnNMZW5ndGg6bnVtYmVyXCIsIGRlZmF1bHQ6IDAsIG1pblZhbHVlOiAwIH0sXG4gIFwiZ29OZXh0UGFnZUF1dG9tYXRpYzpib29sZWFuXCIsXG4gIHtcbiAgICBuYW1lOiBcImNsZWFySW52aXNpYmxlVmFsdWVzXCIsXG4gICAgZGVmYXVsdDogXCJvbkNvbXBsZXRlXCIsXG4gICAgY2hvaWNlczogW1wibm9uZVwiLCBcIm9uQ29tcGxldGVcIiwgXCJvbkhpZGRlblwiXSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiY2hlY2tFcnJvcnNNb2RlXCIsXG4gICAgZGVmYXVsdDogXCJvbk5leHRQYWdlXCIsXG4gICAgY2hvaWNlczogW1wib25OZXh0UGFnZVwiLCBcIm9uVmFsdWVDaGFuZ2VkXCIsIFwib25Db21wbGV0ZVwiXSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwidGV4dFVwZGF0ZU1vZGVcIixcbiAgICBkZWZhdWx0OiBcIm9uQmx1clwiLFxuICAgIGNob2ljZXM6IFtcIm9uQmx1clwiLCBcIm9uVHlwaW5nXCJdLFxuICB9LFxuICB7IG5hbWU6IFwic3RhcnRTdXJ2ZXlUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NTdGFydFN1cnZleVRleHRcIiB9LFxuICB7IG5hbWU6IFwicGFnZVByZXZUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYWdlUHJldlRleHRcIiB9LFxuICB7IG5hbWU6IFwicGFnZU5leHRUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQYWdlTmV4dFRleHRcIiB9LFxuICB7IG5hbWU6IFwiY29tcGxldGVUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb21wbGV0ZVRleHRcIiB9LFxuICB7IG5hbWU6IFwicHJldmlld1RleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1ByZXZpZXdUZXh0XCIgfSxcbiAgeyBuYW1lOiBcImVkaXRUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NFZGl0VGV4dFwiIH0sXG4gIHsgbmFtZTogXCJyZXF1aXJlZFRleHRcIiwgZGVmYXVsdDogXCIqXCIgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25TdGFydEluZGV4XCIsXG4gICAgZGVwZW5kc09uOiBbXCJzaG93UXVlc3Rpb25OdW1iZXJzXCJdLFxuICAgIHZpc2libGVJZjogZnVuY3Rpb24gKHN1cnZleTogYW55KSB7XG4gICAgICByZXR1cm4gIXN1cnZleSB8fCBzdXJ2ZXkuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPT0gXCJvZmZcIjtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvblRpdGxlUGF0dGVyblwiLFxuICAgIGRlZmF1bHQ6IFwibnVtVGl0bGVSZXF1aXJlXCIsXG4gICAgZGVwZW5kc09uOiBbXCJxdWVzdGlvblN0YXJ0SW5kZXhcIiwgXCJyZXF1aXJlZFRleHRcIl0sXG4gICAgY2hvaWNlczogKG9iajogYW55KSA9PiB7XG4gICAgICBpZiAoIW9iaikgcmV0dXJuIFtdO1xuICAgICAgcmV0dXJuIG9iai5nZXRRdWVzdGlvblRpdGxlUGF0dGVybk9wdGlvbnMoKTtcbiAgICB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIixcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBpc1NlcmlhbGl6YWJsZTogZmFsc2UsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1F1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLFxuICB9LFxuICB7IG5hbWU6IFwiZmlyc3RQYWdlSXNTdGFydGVkOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UgfSxcbiAge1xuICAgIG5hbWU6IFwiaXNTaW5nbGVQYWdlOmJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICBpc1NlcmlhbGl6YWJsZTogZmFsc2UsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInF1ZXN0aW9uc09uUGFnZU1vZGVcIixcbiAgICBkZWZhdWx0OiBcInN0YW5kYXJkXCIsXG4gICAgY2hvaWNlczogW1wic2luZ2xlUGFnZVwiLCBcInN0YW5kYXJkXCIsIFwicXVlc3Rpb25QZXJQYWdlXCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJzaG93UHJldmlld0JlZm9yZUNvbXBsZXRlXCIsXG4gICAgZGVmYXVsdDogXCJub1ByZXZpZXdcIixcbiAgICBjaG9pY2VzOiBbXCJub1ByZXZpZXdcIiwgXCJzaG93QWxsUXVlc3Rpb25zXCIsIFwic2hvd0Fuc3dlcmVkUXVlc3Rpb25zXCJdLFxuICB9LFxuICB7IG5hbWU6IFwibWF4VGltZVRvRmluaXNoOm51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICB7IG5hbWU6IFwibWF4VGltZVRvRmluaXNoUGFnZTpudW1iZXJcIiwgZGVmYXVsdDogMCwgbWluVmFsdWU6IDAgfSxcbiAge1xuICAgIG5hbWU6IFwic2hvd1RpbWVyUGFuZWxcIixcbiAgICBkZWZhdWx0OiBcIm5vbmVcIixcbiAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwidG9wXCIsIFwiYm90dG9tXCJdLFxuICB9LFxuICB7XG4gICAgbmFtZTogXCJzaG93VGltZXJQYW5lbE1vZGVcIixcbiAgICBkZWZhdWx0OiBcImFsbFwiLFxuICAgIGNob2ljZXM6IFtcImFsbFwiLCBcInBhZ2VcIiwgXCJzdXJ2ZXlcIl0sXG4gIH0sXG5dKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXkudHMiLCJpbXBvcnQgeyBCYXNlLCBTdXJ2ZXlFcnJvciwgSVN1cnZleUVycm9yT3duZXIgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciwgUmVxdXJlTnVtZXJpY0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFZhbGlkYXRvclJlc3VsdCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB2YWx1ZTogYW55LCBwdWJsaWMgZXJyb3I6IFN1cnZleUVycm9yID0gbnVsbCkge31cbn1cbi8qKlxuICogQmFzZSBTdXJ2ZXlKUyB2YWxpZGF0b3IgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlWYWxpZGF0b3IgZXh0ZW5kcyBCYXNlIHtcbiAgcHVibGljIGVycm9yT3duZXI6IElTdXJ2ZXlFcnJvck93bmVyO1xuICBwdWJsaWMgb25Bc3luY0NvbXBsZXRlZDogKHJlc3VsdDogVmFsaWRhdG9yUmVzdWx0KSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ0ZXh0XCIsIHRoaXMsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRleHRcIik7XG4gIH1cbiAgcHVibGljIHNldCB0ZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRleHRcIiwgdmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNWYWxpZGF0ZUFsbFZhbHVlcygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGV4dFwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RXJyb3JUZXh0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudGV4dCkgcmV0dXJuIHRoaXMudGV4dDtcbiAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0RXJyb3JUZXh0KG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgbmFtZTogc3RyaW5nID0gbnVsbCxcbiAgICB2YWx1ZXM6IGFueSA9IG51bGwsXG4gICAgcHJvcGVydGllczogYW55ID0gbnVsbFxuICApOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSdW5uaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQXN5bmMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMuZXJyb3JPd25lciA/IHRoaXMuZXJyb3JPd25lci5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5lcnJvck93bmVyID8gdGhpcy5lcnJvck93bmVyLmdldE1hcmtkb3duSHRtbCh0ZXh0KSA6IG51bGw7XG4gIH1cbiAgZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMuZXJyb3JPd25lciA/IHRoaXMuZXJyb3JPd25lci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpIDogdGV4dDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQ3VzdG9tRXJyb3IobmFtZTogc3RyaW5nKTogU3VydmV5RXJyb3Ige1xuICAgIHJldHVybiBuZXcgQ3VzdG9tRXJyb3IodGhpcy5nZXRFcnJvclRleHQobmFtZSksIHRoaXMuZXJyb3JPd25lcik7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0VHlwZSgpLnJlcGxhY2UoXCJ2YWxpZGF0b3JcIiwgXCJcIik7XG4gICAgaWYgKCEhdGhpcy50ZXh0KSB7XG4gICAgICByZXMgKz0gXCIsIFwiICsgdGhpcy50ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIElWYWxpZGF0b3JPd25lciB7XG4gIGdldFZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5VmFsaWRhdG9yPjtcbiAgdmFsaWRhdGVkVmFsdWU6IGFueTtcbiAgZ2V0VmFsaWRhdG9yVGl0bGUoKTogc3RyaW5nO1xuICBnZXREYXRhRmlsdGVyZWRWYWx1ZXMoKTogYW55O1xuICBnZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueTtcbn1cbmV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSdW5uZXIge1xuICBwcml2YXRlIGFzeW5jVmFsaWRhdG9yczogQXJyYXk8U3VydmV5VmFsaWRhdG9yPjtcbiAgcHVibGljIG9uQXN5bmNDb21wbGV0ZWQ6IChlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikgPT4gdm9pZDtcbiAgcHVibGljIHJ1bihvd25lcjogSVZhbGlkYXRvck93bmVyKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIHZhbHVlcyA9IG51bGw7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBudWxsO1xuICAgIHRoaXMucHJlcGFyZUFzeW5jVmFsaWRhdG9ycygpO1xuICAgIHZhciBhc3luY1Jlc3VsdHM6IEFycmF5PFN1cnZleUVycm9yPiA9IFtdO1xuICAgIHZhciB2YWxpZGF0b3JzID0gb3duZXIuZ2V0VmFsaWRhdG9ycygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsaWRhdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbGlkYXRvciA9IHZhbGlkYXRvcnNbaV07XG4gICAgICBpZiAoIXZhbHVlcyAmJiB2YWxpZGF0b3IuaXNWYWxpZGF0ZUFsbFZhbHVlcykge1xuICAgICAgICB2YWx1ZXMgPSBvd25lci5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKTtcbiAgICAgICAgcHJvcGVydGllcyA9IG93bmVyLmdldERhdGFGaWx0ZXJlZFByb3BlcnRpZXMoKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZGF0b3IuaXNBc3luYykge1xuICAgICAgICB0aGlzLmFzeW5jVmFsaWRhdG9ycy5wdXNoKHZhbGlkYXRvcik7XG4gICAgICAgIHZhbGlkYXRvci5vbkFzeW5jQ29tcGxldGVkID0gKHJlc3VsdDogVmFsaWRhdG9yUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKCEhcmVzdWx0ICYmICEhcmVzdWx0LmVycm9yKSBhc3luY1Jlc3VsdHMucHVzaChyZXN1bHQuZXJyb3IpO1xuICAgICAgICAgIGlmICghdGhpcy5vbkFzeW5jQ29tcGxldGVkKSByZXR1cm47XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFzeW5jVmFsaWRhdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXN5bmNWYWxpZGF0b3JzW2ldLmlzUnVubmluZykgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uQXN5bmNDb21wbGV0ZWQoYXN5bmNSZXN1bHRzKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsaWRhdG9ycyA9IG93bmVyLmdldFZhbGlkYXRvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWxpZGF0b3IgPSB2YWxpZGF0b3JzW2ldO1xuXG4gICAgICB2YXIgdmFsaWRhdG9yUmVzdWx0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKFxuICAgICAgICBvd25lci52YWxpZGF0ZWRWYWx1ZSxcbiAgICAgICAgb3duZXIuZ2V0VmFsaWRhdG9yVGl0bGUoKSxcbiAgICAgICAgdmFsdWVzLFxuICAgICAgICBwcm9wZXJ0aWVzXG4gICAgICApO1xuICAgICAgaWYgKCEhdmFsaWRhdG9yUmVzdWx0ICYmICEhdmFsaWRhdG9yUmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHJlcy5wdXNoKHZhbGlkYXRvclJlc3VsdC5lcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmFzeW5jVmFsaWRhdG9ycy5sZW5ndGggPT0gMCAmJiAhIXRoaXMub25Bc3luY0NvbXBsZXRlZClcbiAgICAgIHRoaXMub25Bc3luY0NvbXBsZXRlZChbXSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHByZXBhcmVBc3luY1ZhbGlkYXRvcnMoKSB7XG4gICAgaWYgKCEhdGhpcy5hc3luY1ZhbGlkYXRvcnMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hc3luY1ZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5hc3luY1ZhbGlkYXRvcnNbaV0ub25Bc3luY0NvbXBsZXRlZCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYXN5bmNWYWxpZGF0b3JzID0gW107XG4gIH1cbn1cbi8qKlxuICogVmFsaWRhdGUgbnVtZXJpYyB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOdW1lcmljVmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IobWluVmFsdWU6IG51bWJlciA9IG51bGwsIG1heFZhbHVlOiBudW1iZXIgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1pblZhbHVlID0gbWluVmFsdWU7XG4gICAgdGhpcy5tYXhWYWx1ZSA9IG1heFZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibnVtZXJpY3ZhbGlkYXRvclwiO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgdmFsdWVzOiBhbnkgPSBudWxsLFxuICAgIHByb3BlcnRpZXM6IGFueSA9IG51bGxcbiAgKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIUhlbHBlcnMuaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmV3IFJlcXVyZU51bWVyaWNFcnJvcihudWxsLCB0aGlzLmVycm9yT3duZXIpXG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gbmV3IFZhbGlkYXRvclJlc3VsdChwYXJzZUZsb2F0KHZhbHVlKSk7XG4gICAgaWYgKHRoaXMubWluVmFsdWUgIT09IG51bGwgJiYgdGhpcy5taW5WYWx1ZSA+IHJlc3VsdC52YWx1ZSkge1xuICAgICAgcmVzdWx0LmVycm9yID0gdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGlmICh0aGlzLm1heFZhbHVlICE9PSBudWxsICYmIHRoaXMubWF4VmFsdWUgPCByZXN1bHQudmFsdWUpIHtcbiAgICAgIHJlc3VsdC5lcnJvciA9IHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiID8gbnVsbCA6IHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGVmYXVsdEVycm9yVGV4dChuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgdk5hbWUgPSBuYW1lID8gbmFtZSA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ2YWx1ZVwiKTtcbiAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gbnVsbCAmJiB0aGlzLm1heFZhbHVlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgIC5nZXRTdHJpbmcoXCJudW1lcmljTWluTWF4XCIpXG4gICAgICAgIFtcImZvcm1hdFwiXSh2TmFtZSwgdGhpcy5taW5WYWx1ZSwgdGhpcy5tYXhWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm1pblZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgICAuZ2V0U3RyaW5nKFwibnVtZXJpY01pblwiKVxuICAgICAgICAgIFtcImZvcm1hdFwiXSh2TmFtZSwgdGhpcy5taW5WYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgIC5nZXRTdHJpbmcoXCJudW1lcmljTWF4XCIpXG4gICAgICAgIFtcImZvcm1hdFwiXSh2TmFtZSwgdGhpcy5tYXhWYWx1ZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluVmFsdWUgcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pblZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pblZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluVmFsdWUodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5WYWx1ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4VmFsdWUgcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VmFsdWUodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhWYWx1ZVwiLCB2YWwpO1xuICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIHRleHQgdmFsdWVzLlxuICovXG5leHBvcnQgY2xhc3MgVGV4dFZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1pbkxlbmd0aDogbnVtYmVyID0gMCxcbiAgICBtYXhMZW5ndGg6IG51bWJlciA9IDAsXG4gICAgYWxsb3dEaWdpdHMgPSB0cnVlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5taW5MZW5ndGggPSBtaW5MZW5ndGg7XG4gICAgdGhpcy5tYXhMZW5ndGggPSBtYXhMZW5ndGg7XG4gICAgdGhpcy5hbGxvd0RpZ2l0cyA9IGFsbG93RGlnaXRzO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidGV4dHZhbGlkYXRvclwiO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIG5hbWU6IHN0cmluZyA9IG51bGwsXG4gICAgdmFsdWVzOiBhbnkgPSBudWxsLFxuICAgIHByb3BlcnRpZXM6IGFueSA9IG51bGxcbiAgKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAodmFsdWUgIT09IFwiXCIgJiYgSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMuYWxsb3dEaWdpdHMpIHtcbiAgICAgIHZhciByZWcgPSAvXltBLVphLXpcXHNdKiQvO1xuICAgICAgaWYgKCFyZWcudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQobnVsbCwgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLm1pbkxlbmd0aCA+IDAgJiYgdmFsdWUubGVuZ3RoIDwgdGhpcy5taW5MZW5ndGgpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KG51bGwsIHRoaXMuY3JlYXRlQ3VzdG9tRXJyb3IobmFtZSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhMZW5ndGggPiAwICYmIHZhbHVlLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChudWxsLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWluTGVuZ3RoID4gMCAmJiB0aGlzLm1heExlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgIC5nZXRTdHJpbmcoXCJ0ZXh0TWluTWF4TGVuZ3RoXCIpXG4gICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pbkxlbmd0aCwgdGhpcy5tYXhMZW5ndGgpO1xuICAgIGlmICh0aGlzLm1pbkxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgIC5nZXRTdHJpbmcoXCJ0ZXh0TWluTGVuZ3RoXCIpXG4gICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pbkxlbmd0aCk7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcInRleHRNYXhMZW5ndGhcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1heExlbmd0aCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5MZW5ndGggcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pbkxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5MZW5ndGhcIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW5MZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5MZW5ndGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heExlbmd0aCBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heExlbmd0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heExlbmd0aCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heExlbmd0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgYWxsb3dEaWdpdHMgcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93RGlnaXRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd0RpZ2l0c1wiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93RGlnaXRzKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93RGlnaXRzXCIsIHZhbCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFuc3dlckNvdW50VmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IobWluQ291bnQ6IG51bWJlciA9IG51bGwsIG1heENvdW50OiBudW1iZXIgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1pbkNvdW50ID0gbWluQ291bnQ7XG4gICAgdGhpcy5tYXhDb3VudCA9IG1heENvdW50O1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYW5zd2VyY291bnR2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuY29uc3RydWN0b3IgIT0gQXJyYXkpIHJldHVybiBudWxsO1xuICAgIHZhciBjb3VudCA9IHZhbHVlLmxlbmd0aDtcbiAgICBpZiAodGhpcy5taW5Db3VudCAmJiBjb3VudCA8IHRoaXMubWluQ291bnQpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KFxuICAgICAgICBudWxsLFxuICAgICAgICB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKFxuICAgICAgICAgIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAgICAgLmdldFN0cmluZyhcIm1pblNlbGVjdEVycm9yXCIpXG4gICAgICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5Db3VudClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4Q291bnQgJiYgY291bnQgPiB0aGlzLm1heENvdW50KSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihcbiAgICAgICAgICBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgICAgIC5nZXRTdHJpbmcoXCJtYXhTZWxlY3RFcnJvclwiKVxuICAgICAgICAgICAgW1wiZm9ybWF0XCJdKHRoaXMubWF4Q291bnQpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluQ291bnQgcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pbkNvdW50XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5Db3VudFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4Q291bnQgcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heENvdW50XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhDb3VudFwiLCB2YWwpO1xuICB9XG59XG4vKipcbiAqIFVzZSBpdCB0byB2YWxpZGF0ZSB0aGUgdGV4dCBieSByZWd1bGFyIGV4cHJlc3Npb25zLlxuICovXG5leHBvcnQgY2xhc3MgUmVnZXhWYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihyZWdleDogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZWdleCA9IHJlZ2V4O1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmVnZXh2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLnJlZ2V4IHx8IEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHJlID0gbmV3IFJlZ0V4cCh0aGlzLnJlZ2V4KTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuaGFzRXJyb3IocmUsIHZhbHVlW2ldLCBuYW1lKTtcbiAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaGFzRXJyb3IocmUsIHZhbHVlLCBuYW1lKTtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9yKHJlOiBSZWdFeHAsIHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHJlLnRlc3QodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdCh2YWx1ZSwgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSByZWdleCBwcm9wZXJ0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVnZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVnZXhcIik7XG4gIH1cbiAgcHVibGljIHNldCByZWdleCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlZ2V4XCIsIHZhbCk7XG4gIH1cbn1cbi8qKlxuICogVmFsaWRhdGUgZS1tYWlsIGFkZHJlc3MgaW4gdGhlIHRleHQgaW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYWlsVmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSByZSA9IC9eKChbXjw+KClcXFtcXF1cXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVxcW1xcXVxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFtePD4oKT1bXFxdXFwuLDs6XFxzQFxcXCJdK1xcLikrW148PigpPVtcXF1cXC4sOzpcXHNAXFxcIl17Mix9KSQvaTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImVtYWlsdmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgbmFtZTogc3RyaW5nID0gbnVsbCxcbiAgICB2YWx1ZXM6IGFueSA9IG51bGwsXG4gICAgcHJvcGVydGllczogYW55ID0gbnVsbFxuICApOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLnJlLnRlc3QodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdCh2YWx1ZSwgdGhpcy5jcmVhdGVDdXN0b21FcnJvcihuYW1lKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJpbnZhbGlkRW1haWxcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93IGVycm9yIGlmIGV4cHJlc3Npb24gcmV0dXJucyBmYWxzZVxuICovXG5leHBvcnQgY2xhc3MgRXhwcmVzc2lvblZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIHByaXZhdGUgY29uZGl0aW9uUnVubmVyOiBDb25kaXRpb25SdW5uZXIgPSBudWxsO1xuICBwcml2YXRlIGlzUnVubmluZ1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJleHByZXNzaW9udmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1ZhbGlkYXRlQWxsVmFsdWVzKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBc3luYygpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZW5zdXJlQ29uZGl0aW9uUnVubmVyKCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25SdW5uZXIuaXNBc3luYztcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUnVubmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1J1bm5pbmdWYWx1ZTtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICBuYW1lOiBzdHJpbmcgPSBudWxsLFxuICAgIHZhbHVlczogYW55ID0gbnVsbCxcbiAgICBwcm9wZXJ0aWVzOiBhbnkgPSBudWxsXG4gICk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLmVuc3VyZUNvbmRpdGlvblJ1bm5lcigpKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gcmVzID0+IHtcbiAgICAgIHRoaXMuaXNSdW5uaW5nVmFsdWUgPSBmYWxzZTtcbiAgICAgIGlmICghIXRoaXMub25Bc3luY0NvbXBsZXRlZCkge1xuICAgICAgICB0aGlzLm9uQXN5bmNDb21wbGV0ZWQodGhpcy5nZW5lcmF0ZUVycm9yKHJlcywgdmFsdWUpKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuaXNSdW5uaW5nVmFsdWUgPSB0cnVlO1xuICAgIHZhciByZXMgPSB0aGlzLmNvbmRpdGlvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAodGhpcy5jb25kaXRpb25SdW5uZXIuaXNBc3luYykgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5pc1J1bm5pbmdWYWx1ZSA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRXJyb3IocmVzLCB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdlbmVyYXRlRXJyb3IocmVzOiBib29sZWFuLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCFyZXMpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KHZhbHVlLCB0aGlzLmNyZWF0ZUN1c3RvbUVycm9yKG5hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcImludmFsaWRFeHByZXNzaW9uXCIpXG4gICAgICBbXCJmb3JtYXRcIl0odGhpcy5leHByZXNzaW9uKTtcbiAgfVxuICBwcm90ZWN0ZWQgZW5zdXJlQ29uZGl0aW9uUnVubmVyKCk6IGJvb2xlYW4ge1xuICAgIGlmICghIXRoaXMuY29uZGl0aW9uUnVubmVyKSB7XG4gICAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5leHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghdGhpcy5leHByZXNzaW9uKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBleHByZXNzaW9uIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCB2YWwpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXCJzdXJ2ZXl2YWxpZGF0b3JcIiwgW1xuICB7IG5hbWU6IFwidGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGV4dFwiIH1cbl0pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJudW1lcmljdmFsaWRhdG9yXCIsXG4gIFtcIm1pblZhbHVlOm51bWJlclwiLCBcIm1heFZhbHVlOm51bWJlclwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBOdW1lcmljVmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInRleHR2YWxpZGF0b3JcIixcbiAgW1wibWluTGVuZ3RoOm51bWJlclwiLCBcIm1heExlbmd0aDpudW1iZXJcIiwgXCJhbGxvd0RpZ2l0czpib29sZWFuXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFRleHRWYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiYW5zd2VyY291bnR2YWxpZGF0b3JcIixcbiAgW1wibWluQ291bnQ6bnVtYmVyXCIsIFwibWF4Q291bnQ6bnVtYmVyXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEFuc3dlckNvdW50VmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInJlZ2V4dmFsaWRhdG9yXCIsXG4gIFtcInJlZ2V4XCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFJlZ2V4VmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImVtYWlsdmFsaWRhdG9yXCIsXG4gIFtdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEVtYWlsVmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiZXhwcmVzc2lvbnZhbGlkYXRvclwiLFxuICBbXCJleHByZXNzaW9uOmNvbmRpdGlvblwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uVmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvdmFsaWRhdG9yLnRzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi4vcGFnZVwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudEJhc2UgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbEJhc2UgfSBmcm9tIFwiLi4vcGFuZWxcIjtcbmltcG9ydCB7IFN1cnZleVBhbmVsQmFzZSB9IGZyb20gXCIuL3BhbmVsLWJhc2VcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVBhZ2UgZXh0ZW5kcyBTdXJ2ZXlQYW5lbEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRQYW5lbEJhc2UoKTogUGFuZWxNb2RlbEJhc2Uge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnBhZ2U7XG4gIH1cbiAgcHVibGljIGdldCBwYWdlKCk6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxCYXNlIGFzIFBhZ2VNb2RlbDtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVuZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5jYW5SZW5kZXIoKSAmJiAhIXRoaXMuc3VydmV5ICYmICEhdGhpcy5wYWdlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgdGl0bGUgPSB0aGlzLnJlbmRlclRpdGxlKCk7XG4gICAgdmFyIGRlc2NyaXB0aW9uID0gdGhpcy5yZW5kZXJEZXNjcmlwdGlvbigpO1xuICAgIHZhciByb3dzID0gdGhpcy5yZW5kZXJSb3dzKHRoaXMucGFuZWxCYXNlLmNzc0NsYXNzZXMpO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJlZj17dGhpcy5yb290UmVmfSBjbGFzc05hbWU9e3RoaXMucGFuZWxCYXNlLmNzc0NsYXNzZXMucGFnZS5yb290fT5cbiAgICAgICAge3RpdGxlfVxuICAgICAgICB7ZGVzY3JpcHRpb259XG4gICAgICAgIHtyb3dzfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyVGl0bGUoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5wYWdlLl9zaG93VGl0bGUpIHJldHVybiBudWxsO1xuICAgIHZhciB0ZXh0ID0gU3VydmV5RWxlbWVudEJhc2UucmVuZGVyTG9jU3RyaW5nKHRoaXMucGFnZS5sb2NUaXRsZSk7XG4gICAgcmV0dXJuIDxoNCBjbGFzc05hbWU9e3RoaXMucGFuZWxCYXNlLmNzc0NsYXNzZXMucGFnZS50aXRsZX0+e3RleHR9PC9oND47XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckRlc2NyaXB0aW9uKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoIXRoaXMucGFnZS5fc2hvd0Rlc2NyaXB0aW9uKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdGV4dCA9IFN1cnZleUVsZW1lbnRCYXNlLnJlbmRlckxvY1N0cmluZyh0aGlzLnBhZ2UubG9jRGVzY3JpcHRpb24pO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5wYW5lbEJhc2UuY3NzQ2xhc3Nlcy5wYWdlLmRlc2NyaXB0aW9ufT57dGV4dH08L2Rpdj5cbiAgICApO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcGFnZS50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFJlYWN0U3VydmV5TW9kZWwgfSBmcm9tIFwiLi9yZWFjdHN1cnZleW1vZGVsXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQYWdlIH0gZnJvbSBcIi4vcGFnZVwiO1xuaW1wb3J0IHsgU3VydmV5TmF2aWdhdGlvbiB9IGZyb20gXCIuL3JlYWN0U3VydmV5TmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IsIEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IElTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvblwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbmltcG9ydCB7IFN1cnZleVByb2dyZXNzIH0gZnJvbSBcIi4vcmVhY3RTdXJ2ZXlQcm9ncmVzc1wiO1xuaW1wb3J0IHsgU3VydmV5VGltZXJQYW5lbCB9IGZyb20gXCIuL3JlYWN0dGltZXJwYW5lbFwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudEJhc2UsIFN1cnZleUxvY1N0cmluZyB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi4vcGFnZVwiO1xuaW1wb3J0IHsgU3R5bGVzTWFuYWdlciB9IGZyb20gXCIuLi9zdHlsZXNtYW5hZ2VyXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleSBleHRlbmRzIFN1cnZleUVsZW1lbnRCYXNlIGltcGxlbWVudHMgSVN1cnZleUNyZWF0b3Ige1xuICBwcml2YXRlIHByZXZpb3VzSlNPTiA9IHt9O1xuICBwcml2YXRlIHJvb3RSZWY6IFJlYWN0LlJlZk9iamVjdDxIVE1MRGl2RWxlbWVudD47XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGNzc1R5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5Q3NzLmN1cnJlbnRUeXBlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0IGNzc1R5cGUodmFsdWU6IHN0cmluZykge1xuICAgIFN0eWxlc01hbmFnZXIuYXBwbHlUaGVtZSh2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHN1cnZleTogUmVhY3RTdXJ2ZXlNb2RlbDtcbiAgcHJpdmF0ZSBpc0N1cnJlbnRQYWdlQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIG9uQ3VycmVudFBhZ2VDaGFuZ2VkSGFuZGxlciA9IChzZW5kZXI6IGFueSwgb3B0aW9uczogYW55KTogYW55ID0+IHtcbiAgICB0aGlzLmlzQ3VycmVudFBhZ2VDaGFuZ2VkID0gdHJ1ZTtcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlVHJ5QWdhaW5DbGljayA9IHRoaXMuaGFuZGxlVHJ5QWdhaW5DbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlU3VydmV5KHByb3BzKTtcbiAgICB0aGlzLnVwZGF0ZVN1cnZleShwcm9wcywge30pO1xuICAgIC8vc2V0IHRoZSBmaXJzdCBwYWdlXG4gICAgdmFyIGR1bW15ID0gdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2U7XG4gICAgdGhpcy5yb290UmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0YXRlRWxlbWVudCgpOiBCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXk7XG4gIH1cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wczogYW55LCBuZXh0U3RhdGU6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTW9kZWxKU09OQ2hhbmdlZChuZXh0UHJvcHMpKSB7XG4gICAgICB0aGlzLmNyZWF0ZVN1cnZleShuZXh0UHJvcHMpO1xuICAgICAgdGhpcy51cGRhdGVTdXJ2ZXkobmV4dFByb3BzLCB7fSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IGFueSwgcHJldlN0YXRlOiBhbnkpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpO1xuICAgIGlmICh0aGlzLmlzQ3VycmVudFBhZ2VDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmlzQ3VycmVudFBhZ2VDaGFuZ2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnN1cnZleS5zY3JvbGxUb1RvcE9uUGFnZUNoYW5nZSgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVN1cnZleSh0aGlzLnByb3BzLCBwcmV2UHJvcHMpO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgdmFyIGVsID0gdGhpcy5yb290UmVmLmN1cnJlbnQ7XG4gICAgaWYgKGVsICYmIHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5kb0FmdGVyUmVuZGVyU3VydmV5KGVsKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnN0YXJ0VGltZXJGcm9tVUkoKTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnN0b3BUaW1lcigpO1xuICAgICAgdGhpcy5zdXJ2ZXkub25DdXJyZW50UGFnZUNoYW5nZWQucmVtb3ZlKHRoaXMub25DdXJyZW50UGFnZUNoYW5nZWRIYW5kbGVyKTtcbiAgICB9XG4gIH1cbiAgZG9SZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciByZW5kZXJSZXN1bHQ7XG4gICAgaWYgKHRoaXMuc3VydmV5LnN0YXRlID09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgIHJlbmRlclJlc3VsdCA9IHRoaXMucmVuZGVyQ29tcGxldGVkKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN1cnZleS5zdGF0ZSA9PSBcImNvbXBsZXRlZGJlZm9yZVwiKSB7XG4gICAgICByZW5kZXJSZXN1bHQgPSB0aGlzLnJlbmRlckNvbXBsZXRlZEJlZm9yZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdXJ2ZXkuc3RhdGUgPT0gXCJsb2FkaW5nXCIpIHtcbiAgICAgIHJlbmRlclJlc3VsdCA9IHRoaXMucmVuZGVyTG9hZGluZygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdXJ2ZXkuc3RhdGUgPT0gXCJzdGFydGluZ1wiKSB7XG4gICAgICByZW5kZXJSZXN1bHQgPSB0aGlzLnJlbmRlclN0YXJ0UGFnZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW5kZXJSZXN1bHQgPSB0aGlzLnJlbmRlclN1cnZleSgpO1xuICAgIH1cbiAgICB2YXIgaGVhZGVyID0gdGhpcy5yZW5kZXJIZWFkZXIoKTtcbiAgICB2YXIgb25TdWJtaXQgPSBmdW5jdGlvbiAoZXZlbnQ6IFJlYWN0LkZvcm1FdmVudDxIVE1MRm9ybUVsZW1lbnQ+KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgdmFyIGN1c3RvbUhlYWRlciA9IDxkaXYgY2xhc3NOYW1lPVwic3ZfY3VzdG9tX2hlYWRlclwiIC8+O1xuICAgIGlmICh0aGlzLnN1cnZleS5oYXNMb2dvKSB7XG4gICAgICBjdXN0b21IZWFkZXIgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiByZWY9e3RoaXMucm9vdFJlZn0gY2xhc3NOYW1lPXt0aGlzLmNzcy5yb290fT5cbiAgICAgICAgPGZvcm0gb25TdWJtaXQ9e29uU3VibWl0fT5cbiAgICAgICAgICB7Y3VzdG9tSGVhZGVyfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy5jb250YWluZXJ9PlxuICAgICAgICAgICAge2hlYWRlcn1cbiAgICAgICAgICAgIHtyZW5kZXJSZXN1bHR9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmRvUmVuZGVyKCk7XG4gIH1cbiAgcHVibGljIGdldCBjc3MoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkuY3NzO1xuICB9XG4gIHB1YmxpYyBzZXQgY3NzKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnN1cnZleS5jc3MgPSB2YWx1ZTtcbiAgfVxuICBoYW5kbGVUcnlBZ2FpbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnN1cnZleS5kb0NvbXBsZXRlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckNvbXBsZXRlZCgpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnN1cnZleS5zaG93Q29tcGxldGVkUGFnZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGNvbXBsZXRlZFN0YXRlID0gbnVsbDtcbiAgICBpZiAodGhpcy5zdXJ2ZXkuY29tcGxldGVkU3RhdGUpIHtcbiAgICAgIHZhciB0cnlBZ2FpbkJ1dHRvbiA9IG51bGw7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkuY29tcGxldGVkU3RhdGUgPT0gXCJlcnJvclwiKSB7XG4gICAgICAgIHZhciBidG5UZXh0ID0gdGhpcy5zdXJ2ZXkuZ2V0TG9jU3RyaW5nKFwic2F2ZUFnYWluQnV0dG9uXCIpO1xuICAgICAgICB0cnlBZ2FpbkJ1dHRvbiA9IChcbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9e1wiYnV0dG9uXCJ9XG4gICAgICAgICAgICB2YWx1ZT17YnRuVGV4dH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5jc3Muc2F2ZURhdGEuc2F2ZUFnYWluQnV0dG9ufVxuICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVUcnlBZ2FpbkNsaWNrfVxuICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB2YXIgY3NzID0gdGhpcy5jc3Muc2F2ZURhdGFbdGhpcy5zdXJ2ZXkuY29tcGxldGVkU3RhdGVdO1xuICAgICAgY29tcGxldGVkU3RhdGUgPSAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy5zYXZlRGF0YS5yb290fT5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y3NzfT5cbiAgICAgICAgICAgIDxzcGFuPnt0aGlzLnN1cnZleS5jb21wbGV0ZWRTdGF0ZVRleHR9PC9zcGFuPlxuICAgICAgICAgICAge3RyeUFnYWluQnV0dG9ufVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuICAgIHZhciBodG1sVmFsdWUgPSB7IF9faHRtbDogdGhpcy5zdXJ2ZXkucHJvY2Vzc2VkQ29tcGxldGVkSHRtbCB9O1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e2h0bWxWYWx1ZX1cbiAgICAgICAgICBjbGFzc05hbWU9e1t0aGlzLmNzcy5ib2R5LCB0aGlzLmNzcy5jb21wbGV0ZWRQYWdlXS5qb2luKFwiIFwiKX1cbiAgICAgICAgLz5cbiAgICAgICAge2NvbXBsZXRlZFN0YXRlfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyQ29tcGxldGVkQmVmb3JlKCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgaHRtbFZhbHVlID0geyBfX2h0bWw6IHRoaXMuc3VydmV5LnByb2Nlc3NlZENvbXBsZXRlZEJlZm9yZUh0bWwgfTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbFZhbHVlfSBjbGFzc05hbWU9e3RoaXMuY3NzLmJvZHl9IC8+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyTG9hZGluZygpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGh0bWxWYWx1ZSA9IHsgX19odG1sOiB0aGlzLnN1cnZleS5wcm9jZXNzZWRMb2FkaW5nSHRtbCB9O1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXtodG1sVmFsdWV9IGNsYXNzTmFtZT17dGhpcy5jc3MuYm9keX0gLz5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJTdGFydFBhZ2UoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBzdGFydGVkUGFnZSA9IHRoaXMuc3VydmV5LnN0YXJ0ZWRQYWdlXG4gICAgICA/IHRoaXMucmVuZGVyUGFnZSh0aGlzLnN1cnZleS5zdGFydGVkUGFnZSlcbiAgICAgIDogbnVsbDtcbiAgICB2YXIgcGFnZUlkID0gdGhpcy5zdXJ2ZXkuc3RhcnRlZFBhZ2UgPyB0aGlzLnN1cnZleS5zdGFydGVkUGFnZS5pZCA6IFwiXCI7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxkaXYgaWQ9e3BhZ2VJZH0gY2xhc3NOYW1lPXt0aGlzLmNzcy5ib2R5fT5cbiAgICAgICAgICB7dGhpcy5yZW5kZXJOYXZpZ2F0aW9uKFwidG9wXCIpfVxuICAgICAgICAgIHtzdGFydGVkUGFnZX1cbiAgICAgICAgICB7dGhpcy5yZW5kZXJOYXZpZ2F0aW9uKFwiYm90dG9tXCIpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlclN1cnZleSgpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGN1cnJlbnRQYWdlID0gdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2VcbiAgICAgID8gdGhpcy5yZW5kZXJQYWdlKHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlKVxuICAgICAgOiBudWxsO1xuICAgIHZhciBwYWdlSWQgPSB0aGlzLnN1cnZleS5jdXJyZW50UGFnZSA/IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlLmlkIDogXCJcIjtcbiAgICB2YXIgdG9wUHJvZ3Jlc3MgPSB0aGlzLnN1cnZleS5pc1Nob3dQcm9ncmVzc0Jhck9uVG9wXG4gICAgICA/IHRoaXMucmVuZGVyUHJvZ3Jlc3ModHJ1ZSlcbiAgICAgIDogbnVsbDtcbiAgICB2YXIgYm90dG9tUHJvZ3Jlc3MgPSB0aGlzLnN1cnZleS5pc1Nob3dQcm9ncmVzc0Jhck9uQm90dG9tXG4gICAgICA/IHRoaXMucmVuZGVyUHJvZ3Jlc3MoZmFsc2UpXG4gICAgICA6IG51bGw7XG4gICAgaWYgKCFjdXJyZW50UGFnZSkge1xuICAgICAgY3VycmVudFBhZ2UgPSB0aGlzLnJlbmRlckVtcHR5U3VydmV5KCk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGlkPXtwYWdlSWR9XG4gICAgICAgIGNsYXNzTmFtZT17IWN1cnJlbnRQYWdlID8gdGhpcy5jc3MuYm9keUVtcHR5IDogdGhpcy5jc3MuYm9keX1cbiAgICAgID5cbiAgICAgICAge3RvcFByb2dyZXNzfVxuICAgICAgICB7dGhpcy5yZW5kZXJUaW1lclBhbmVsKFwidG9wXCIpfVxuICAgICAgICB7dGhpcy5yZW5kZXJOYXZpZ2F0aW9uKFwidG9wXCIpfVxuICAgICAgICB7Y3VycmVudFBhZ2V9XG4gICAgICAgIHt0aGlzLnJlbmRlclRpbWVyUGFuZWwoXCJib3R0b21cIil9XG4gICAgICAgIHtib3R0b21Qcm9ncmVzc31cbiAgICAgICAge3RoaXMucmVuZGVyTmF2aWdhdGlvbihcImJvdHRvbVwiKX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlclRpdGxlKCk6IEpTWC5FbGVtZW50IHtcbiAgICBsZXQgdGl0bGUgPSBudWxsO1xuICAgIGxldCBkZXNjcmlwdGlvbiA9IG51bGw7XG4gICAgaWYgKHRoaXMuc3VydmV5LnRpdGxlICYmIHRoaXMuc3VydmV5LnNob3dUaXRsZSkge1xuICAgICAgdGl0bGUgPSBTdXJ2ZXlFbGVtZW50QmFzZS5yZW5kZXJMb2NTdHJpbmcodGhpcy5zdXJ2ZXkubG9jVGl0bGUpO1xuICAgICAgZGVzY3JpcHRpb24gPSBTdXJ2ZXlFbGVtZW50QmFzZS5yZW5kZXJMb2NTdHJpbmcoXG4gICAgICAgIHRoaXMuc3VydmV5LmxvY0Rlc2NyaXB0aW9uXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGl0bGUgPyAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5jc3MuaGVhZGVyVGV4dH0+XG4gICAgICAgIDxoMyBjbGFzc05hbWU9e3RoaXMuY3NzLnRpdGxlfT57dGl0bGV9PC9oMz5cbiAgICAgICAgPGg1IGNsYXNzTmFtZT17dGhpcy5jc3MuZGVzY3JpcHRpb259PntkZXNjcmlwdGlvbn08L2g1PlxuICAgICAgPC9kaXY+XG4gICAgKSA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckhlYWRlcigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCh0aGlzLnN1cnZleS50aXRsZSAmJiB0aGlzLnN1cnZleS5zaG93VGl0bGUpIHx8IHRoaXMuc3VydmV5Lmhhc0xvZ28pIHtcbiAgICAgIGxldCB0aXRsZSA9IHRoaXMucmVuZGVyVGl0bGUoKTtcbiAgICAgIGxldCBzdHlsZTogYW55ID0geyBvYmplY3RGaXQ6IHRoaXMuc3VydmV5LmxvZ29GaXQgfTtcbiAgICAgIGxldCBpbWFnZUJlZm9yZSA9IG51bGw7XG4gICAgICBsZXQgaW1hZ2VBZnRlciA9IFtdO1xuICAgICAgaWYgKHRoaXMuc3VydmV5LmlzTG9nb0JlZm9yZSkge1xuICAgICAgICBpbWFnZUJlZm9yZSA9IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5zdXJ2ZXkubG9nb0NsYXNzTmFtZXN9PlxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMuc3VydmV5LmNzcy5sb2dvSW1hZ2V9XG4gICAgICAgICAgICAgIHNyYz17dGhpcy5zdXJ2ZXkubG9jTG9nby5yZW5kZXJlZEh0bWx9XG4gICAgICAgICAgICAgIHdpZHRoPXtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cnZleS5sb2dvV2lkdGggPyB0aGlzLnN1cnZleS5sb2dvV2lkdGggKyBcInB4XCIgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBoZWlnaHQ9e1xuICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LmxvZ29IZWlnaHRcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5zdXJ2ZXkubG9nb0hlaWdodCArIFwicHhcIlxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3VydmV5LmlzTG9nb0FmdGVyKSB7XG4gICAgICAgIGltYWdlQWZ0ZXIucHVzaChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5zdXJ2ZXkubG9nb0NsYXNzTmFtZXN9PlxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMuc3VydmV5LmNzcy5sb2dvSW1hZ2V9XG4gICAgICAgICAgICAgIHNyYz17dGhpcy5zdXJ2ZXkubG9jTG9nby5yZW5kZXJlZEh0bWx9XG4gICAgICAgICAgICAgIHdpZHRoPXtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cnZleS5sb2dvV2lkdGggPyB0aGlzLnN1cnZleS5sb2dvV2lkdGggKyBcInB4XCIgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBoZWlnaHQ9e1xuICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LmxvZ29IZWlnaHRcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5zdXJ2ZXkubG9nb0hlaWdodCArIFwicHhcIlxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgICAgICBpbWFnZUFmdGVyLnB1c2goPGRpdiBjbGFzc05hbWU9XCJzdi1sb2dvLS1yaWdodC10YWlsXCI+PC9kaXY+KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy5oZWFkZXJ9PlxuICAgICAgICAgIHtpbWFnZUJlZm9yZX1cbiAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAge2ltYWdlQWZ0ZXJ9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlclRpbWVyUGFuZWwobG9jYXRpb246IHN0cmluZykge1xuICAgIGlmICh0aGlzLnN1cnZleS5zaG93VGltZXJQYW5lbCAhPSBsb2NhdGlvbikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIDxTdXJ2ZXlUaW1lclBhbmVsIHN1cnZleT17dGhpcy5zdXJ2ZXl9IC8+O1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJQYWdlKHBhZ2U6IFBhZ2VNb2RlbCk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN1cnZleVBhZ2VcbiAgICAgICAgc3VydmV5PXt0aGlzLnN1cnZleX1cbiAgICAgICAgcGFnZT17cGFnZX1cbiAgICAgICAgY3NzPXt0aGlzLmNzc31cbiAgICAgICAgY3JlYXRvcj17dGhpc31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyUHJvZ3Jlc3MoaXNUb3A6IGJvb2xlYW4pOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIDxTdXJ2ZXlQcm9ncmVzcyBzdXJ2ZXk9e3RoaXMuc3VydmV5fSBjc3M9e3RoaXMuY3NzfSBpc1RvcD17aXNUb3B9IC8+O1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJOYXZpZ2F0aW9uKG5hdlBvc2l0aW9uOiBzdHJpbmcpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zdXJ2ZXkuaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcgIT09IFwiYm90aFwiICYmXG4gICAgICAodGhpcy5zdXJ2ZXkuaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcgPT09IFwibm9uZVwiIHx8XG4gICAgICAgIHRoaXMuc3VydmV5LmlzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nICE9PSBuYXZQb3NpdGlvbilcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gPFN1cnZleU5hdmlnYXRpb24gc3VydmV5PXt0aGlzLnN1cnZleX0gY3NzPXt0aGlzLmNzc30gLz47XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVtcHR5U3VydmV5KCk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gPHNwYW4+e3RoaXMuc3VydmV5LmVtcHR5U3VydmV5VGV4dH08L3NwYW4+O1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXkobmV3UHJvcHM6IGFueSkge1xuICAgIGlmICghbmV3UHJvcHMpIG5ld1Byb3BzID0ge307XG4gICAgdGhpcy5wcmV2aW91c0pTT04gPSB7fTtcbiAgICBpZiAobmV3UHJvcHMpIHtcbiAgICAgIGlmIChuZXdQcm9wcy5tb2RlbCkge1xuICAgICAgICB0aGlzLnN1cnZleSA9IG5ld1Byb3BzLm1vZGVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5ld1Byb3BzLmpzb24pIHtcbiAgICAgICAgICB0aGlzLnByZXZpb3VzSlNPTiA9IG5ld1Byb3BzLmpzb247XG4gICAgICAgICAgdGhpcy5zdXJ2ZXkgPSBuZXcgUmVhY3RTdXJ2ZXlNb2RlbChuZXdQcm9wcy5qc29uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1cnZleSA9IG5ldyBSZWFjdFN1cnZleU1vZGVsKCk7XG4gICAgfVxuICAgIGlmICghIW5ld1Byb3BzLmNzcykge1xuICAgICAgdGhpcy5zdXJ2ZXkubWVyZ2VDc3MobmV3UHJvcHMuY3NzLCB0aGlzLmNzcyk7XG4gICAgfVxuICAgIHRoaXMuc2V0U3VydmV5RXZlbnRzKCk7XG4gIH1cbiAgcHJpdmF0ZSBpc01vZGVsSlNPTkNoYW5nZWQobmV3UHJvcHM6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghIW5ld1Byb3BzW1wibW9kZWxcIl0pIHtcbiAgICAgIHJldHVybiB0aGlzLnN1cnZleSAhPT0gbmV3UHJvcHNbXCJtb2RlbFwiXTtcbiAgICB9XG4gICAgaWYgKCEhbmV3UHJvcHNbXCJqc29uXCJdKSB7XG4gICAgICByZXR1cm4gIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhuZXdQcm9wc1tcImpzb25cIl0sIHRoaXMucHJldmlvdXNKU09OKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVTdXJ2ZXkobmV3UHJvcHM6IGFueSwgb2xkUHJvcHM/OiBhbnkpIHtcbiAgICBpZiAoIW5ld1Byb3BzKSByZXR1cm47XG4gICAgb2xkUHJvcHMgPSBvbGRQcm9wcyB8fCB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbmV3UHJvcHMpIHtcbiAgICAgIGlmIChrZXkgPT0gXCJtb2RlbFwiIHx8IGtleSA9PSBcImNoaWxkcmVuXCIgfHwga2V5ID09IFwianNvblwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PSBcImNzc1wiKSB7XG4gICAgICAgIHRoaXMuc3VydmV5Lm1lcmdlVmFsdWVzKG5ld1Byb3BzLmNzcywgdGhpcy5zdXJ2ZXkuZ2V0Q3NzKCkpO1xuICAgICAgICB0aGlzLnN1cnZleVtcInVwZGF0ZUVsZW1lbnRDc3NcIl0oKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAobmV3UHJvcHNba2V5XSA9PT0gb2xkUHJvcHNba2V5XSkgY29udGludWU7XG4gICAgICBpZiAoa2V5LmluZGV4T2YoXCJvblwiKSA9PSAwICYmIHRoaXMuc3VydmV5W2tleV0gJiYgdGhpcy5zdXJ2ZXlba2V5XS5hZGQpIHtcbiAgICAgICAgaWYgKCEhb2xkUHJvcHNba2V5XSkge1xuICAgICAgICAgIHRoaXMuc3VydmV5W2tleV0ucmVtb3ZlKG9sZFByb3BzW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VydmV5W2tleV0uYWRkKG5ld1Byb3BzW2tleV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXlba2V5XSA9IG5ld1Byb3BzW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBzZXRTdXJ2ZXlFdmVudHMoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdGhpcy5zdXJ2ZXkucmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY291bnRlciA9XG4gICAgICAgICEhc2VsZi5zdGF0ZSAmJiAhIXNlbGYuc3RhdGUubW9kZWxDaGFuZ2VkID8gc2VsZi5zdGF0ZS5tb2RlbENoYW5nZWQgOiAwO1xuICAgICAgc2VsZi5zZXRTdGF0ZSh7IG1vZGVsQ2hhbmdlZDogY291bnRlciArIDEgfSk7XG4gICAgfTtcbiAgICB0aGlzLnN1cnZleS5vblBhcnRpYWxTZW5kLmFkZCgoc2VuZGVyKSA9PiB7XG4gICAgICBpZiAoISFzZWxmLnN0YXRlKSB7XG4gICAgICAgIHNlbGYuc2V0U3RhdGUoc2VsZi5zdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5zdXJ2ZXkub25DdXJyZW50UGFnZUNoYW5nZWQuYWRkKHRoaXMub25DdXJyZW50UGFnZUNoYW5nZWRIYW5kbGVyKTtcbiAgfVxuXG4gIC8vSVN1cnZleUNyZWF0b3JcbiAgcHVibGljIGNyZWF0ZVF1ZXN0aW9uRWxlbWVudChxdWVzdGlvbjogUXVlc3Rpb24pOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIFJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLmNyZWF0ZVF1ZXN0aW9uKFxuICAgICAgcXVlc3Rpb24uZ2V0VGVtcGxhdGUoKSxcbiAgICAgIHtcbiAgICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgICBpc0Rpc3BsYXlNb2RlOiBxdWVzdGlvbi5pc1JlYWRPbmx5LFxuICAgICAgICBjcmVhdG9yOiB0aGlzLFxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHVibGljIHJlbmRlckVycm9yKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGVycm9yOiBTdXJ2ZXlFcnJvcixcbiAgICBjc3NDbGFzc2VzOiBhbnlcbiAgKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGtleT17a2V5fT5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmVycm9yLmljb259IGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5lcnJvci5pdGVtfT5cbiAgICAgICAgICA8U3VydmV5TG9jU3RyaW5nIGxvY1N0cj17ZXJyb3IubG9jVGV4dH0gLz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwdWJsaWMgcXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LnF1ZXN0aW9uVGl0bGVMb2NhdGlvbjtcbiAgfVxuICBwdWJsaWMgcXVlc3Rpb25FcnJvckxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LnF1ZXN0aW9uRXJyb3JMb2NhdGlvbjtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0U3VydmV5LnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vc3VydmV5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlOYXZpZ2F0aW9uQmFzZSB9IGZyb20gXCIuL3JlYWN0U3VydmV5TmF2aWdhdGlvbkJhc2VcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleU5hdmlnYXRpb24gZXh0ZW5kcyBTdXJ2ZXlOYXZpZ2F0aW9uQmFzZSB7XG4gIHByaXZhdGUgbW91c2VEb3duUGFnZTogYW55ID0gbnVsbDtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZVByZXZDbGljayA9IHRoaXMuaGFuZGxlUHJldkNsaWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVOZXh0Q2xpY2sgPSB0aGlzLmhhbmRsZU5leHRDbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlTmV4dE1vdXNlRG93biA9IHRoaXMuaGFuZGxlTmV4dE1vdXNlRG93bi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlTW91c2VEb3duID0gdGhpcy5oYW5kbGVNb3VzZURvd24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZUNvbXBsZXRlQ2xpY2sgPSB0aGlzLmhhbmRsZUNvbXBsZXRlQ2xpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZVByZXZpZXdDbGljayA9IHRoaXMuaGFuZGxlUHJldmlld0NsaWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVTdGFydENsaWNrID0gdGhpcy5oYW5kbGVTdGFydENsaWNrLmJpbmQodGhpcyk7XG4gIH1cbiAgaGFuZGxlUHJldkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnN1cnZleS5wcmV2UGFnZSgpO1xuICB9XG4gIGhhbmRsZU5leHRDbGljayhldmVudDogYW55KSB7XG4gICAgaWYgKCEhdGhpcy5tb3VzZURvd25QYWdlICYmIHRoaXMubW91c2VEb3duUGFnZSAhPT0gdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2UpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5tb3VzZURvd25QYWdlID0gbnVsbDtcbiAgICB0aGlzLnN1cnZleS5uZXh0UGFnZSgpO1xuICB9XG4gIGhhbmRsZU5leHRNb3VzZURvd24oZXZlbnQ6IGFueSkge1xuICAgIHRoaXMubW91c2VEb3duUGFnZSA9IHRoaXMuc3VydmV5LmN1cnJlbnRQYWdlO1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5uYXZpZ2F0aW9uTW91c2VEb3duKCk7XG4gIH1cbiAgaGFuZGxlTW91c2VEb3duKGV2ZW50OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubmF2aWdhdGlvbk1vdXNlRG93bigpO1xuICB9XG4gIGhhbmRsZUNvbXBsZXRlQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuc3VydmV5LmNvbXBsZXRlTGFzdFBhZ2UoKTtcbiAgfVxuICBoYW5kbGVQcmV2aWV3Q2xpY2soZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuc3VydmV5LnNob3dQcmV2aWV3KCk7XG4gIH1cbiAgaGFuZGxlU3RhcnRDbGljayhldmVudDogYW55KSB7XG4gICAgdGhpcy5zdXJ2ZXkuc3RhcnQoKTtcbiAgfVxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkgfHwgdGhpcy5zdXJ2ZXkuaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcgPT09IFwibm9uZVwiKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgdmFyIGlzU3RhcnRlZFBhZ2UgPSB0aGlzLnN1cnZleS5zdGF0ZSA9PT0gXCJzdGFydGluZ1wiO1xuICAgIHZhciBwcmV2QnV0dG9uID1cbiAgICAgICFpc1N0YXJ0ZWRQYWdlICYmICF0aGlzLnN1cnZleS5pc0ZpcnN0UGFnZSAmJiB0aGlzLnN1cnZleS5pc1Nob3dQcmV2QnV0dG9uXG4gICAgICAgID8gdGhpcy5yZW5kZXJCdXR0b24oXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVByZXZDbGljayxcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTW91c2VEb3duLFxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkucGFnZVByZXZUZXh0LFxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkuY3NzTmF2aWdhdGlvblByZXZcbiAgICAgICAgICApXG4gICAgICAgIDogbnVsbDtcbiAgICB2YXIgbmV4dEJ1dHRvbiA9XG4gICAgICAhaXNTdGFydGVkUGFnZSAmJiAhdGhpcy5zdXJ2ZXkuaXNMYXN0UGFnZVxuICAgICAgICA/IHRoaXMucmVuZGVyQnV0dG9uKFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVOZXh0Q2xpY2ssXG4gICAgICAgICAgICB0aGlzLmhhbmRsZU5leHRNb3VzZURvd24sXG4gICAgICAgICAgICB0aGlzLnN1cnZleS5wYWdlTmV4dFRleHQsXG4gICAgICAgICAgICB0aGlzLnN1cnZleS5jc3NOYXZpZ2F0aW9uTmV4dFxuICAgICAgICAgIClcbiAgICAgICAgOiBudWxsO1xuICAgIHZhciBjb21wbGV0ZUJ1dHRvbiA9XG4gICAgICAhaXNTdGFydGVkUGFnZSAmJlxuICAgICAgdGhpcy5zdXJ2ZXkuaXNMYXN0UGFnZSAmJlxuICAgICAgdGhpcy5zdXJ2ZXkuaXNDb21wbGV0ZUJ1dHRvblZpc2libGVcbiAgICAgICAgPyB0aGlzLnJlbmRlckJ1dHRvbihcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29tcGxldGVDbGljayxcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTW91c2VEb3duLFxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkuY29tcGxldGVUZXh0LFxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXkuY3NzTmF2aWdhdGlvbkNvbXBsZXRlXG4gICAgICAgICAgKVxuICAgICAgICA6IG51bGw7XG4gICAgdmFyIHByZXZpZXdCdXR0b24gPVxuICAgICAgIWlzU3RhcnRlZFBhZ2UgJiZcbiAgICAgIHRoaXMuc3VydmV5LmlzTGFzdFBhZ2UgJiZcbiAgICAgIHRoaXMuc3VydmV5LmlzUHJldmlld0J1dHRvblZpc2libGVcbiAgICAgICAgPyB0aGlzLnJlbmRlckJ1dHRvbihcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUHJldmlld0NsaWNrLFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVNb3VzZURvd24sXG4gICAgICAgICAgICB0aGlzLnN1cnZleS5wcmV2aWV3VGV4dCxcbiAgICAgICAgICAgIHRoaXMuc3VydmV5LmNzc05hdmlnYXRpb25QcmV2aWV3XG4gICAgICAgICAgKVxuICAgICAgICA6IG51bGw7XG4gICAgdmFyIHN0YXJ0QnV0dG9uID0gaXNTdGFydGVkUGFnZVxuICAgICAgPyB0aGlzLnJlbmRlckJ1dHRvbihcbiAgICAgICAgICB0aGlzLmhhbmRsZVN0YXJ0Q2xpY2ssXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICB0aGlzLnN1cnZleS5zdGFydFN1cnZleVRleHQsXG4gICAgICAgICAgdGhpcy5zdXJ2ZXkuY3NzTmF2aWdhdGlvblN0YXJ0XG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMuY3NzLmZvb3Rlcn0+XG4gICAgICAgIHtzdGFydEJ1dHRvbn1cbiAgICAgICAge3ByZXZCdXR0b259XG4gICAgICAgIHtuZXh0QnV0dG9ufVxuICAgICAgICB7cHJldmlld0J1dHRvbn1cbiAgICAgICAge2NvbXBsZXRlQnV0dG9ufVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyQnV0dG9uKFxuICAgIGNsaWNrOiBhbnksXG4gICAgbW91c2VEb3duOiBhbnksXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGJ0bkNsYXNzTmFtZTogc3RyaW5nXG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgc3R5bGUgPSB7IG1hcmdpblJpZ2h0OiBcIjVweFwiIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxpbnB1dFxuICAgICAgICBjbGFzc05hbWU9e2J0bkNsYXNzTmFtZX1cbiAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgb25Nb3VzZURvd249e21vdXNlRG93bn1cbiAgICAgICAgb25DbGljaz17Y2xpY2t9XG4gICAgICAgIHZhbHVlPXt0ZXh0fVxuICAgICAgLz5cbiAgICApO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RTdXJ2ZXlOYXZpZ2F0aW9uLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vc3VydmV5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlOYXZpZ2F0aW9uQmFzZSB9IGZyb20gXCIuL3JlYWN0U3VydmV5TmF2aWdhdGlvbkJhc2VcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVByb2dyZXNzIGV4dGVuZHMgU3VydmV5TmF2aWdhdGlvbkJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaXNUb3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaXNUb3A7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBwcm9ncmVzcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5wcm9ncmVzc1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcHJvZ3Jlc3NUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LnByb2dyZXNzVGV4dDtcbiAgfVxuICByZW5kZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBzdHlsZSA9IHRoaXMuaXNUb3AgPyB7fSA6IHsgbWFyZ2luVG9wOiBcIjFlbVwiIH07XG4gICAgdmFyIHByb2dyZXNzU3R5bGUgPSB7XG4gICAgICB3aWR0aDogdGhpcy5wcm9ncmVzcyArIFwiJVwiLFxuICAgIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy5wcm9ncmVzc30gc3R5bGU9e3N0eWxlfT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXtwcm9ncmVzc1N0eWxlfVxuICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5jc3MucHJvZ3Jlc3NCYXJ9XG4gICAgICAgICAgcm9sZT1cInByb2dyZXNzYmFyXCJcbiAgICAgICAgICBhcmlhLXZhbHVlbWluPXswfVxuICAgICAgICAgIGFyaWEtdmFsdWVtYXg9ezEwMH1cbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMuY3NzLnByb2dyZXNzVGV4dCArIFwiIFwiICsgdGhpcy5jc3MucHJvZ3Jlc3NUZXh0SW5CYXJ9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3RoaXMucHJvZ3Jlc3NUZXh0fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgIHRoaXMuY3NzLnByb2dyZXNzVGV4dCArIFwiIFwiICsgdGhpcy5jc3MucHJvZ3Jlc3NUZXh0VW5kZXJCYXJcbiAgICAgICAgICB9XG4gICAgICAgID5cbiAgICAgICAgICB7dGhpcy5wcm9ncmVzc1RleHR9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdFN1cnZleVByb2dyZXNzLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgUmVhY3RTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlLFxufSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25Db21tZW50SXRlbSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25jb21tZW50XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fY2hlY2tib3hcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFJlYWN0UXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25DaGVja2JveCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25DaGVja2JveE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25DaGVja2JveE1vZGVsO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICByZXR1cm4gKFxuICAgICAgPGZpZWxkc2V0XG4gICAgICAgIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb290fVxuICAgICAgICByZWY9eyhmaWVsZHNldCkgPT4gKHRoaXMuY29udHJvbCA9IGZpZWxkc2V0KX1cbiAgICAgID5cbiAgICAgICAgPGxlZ2VuZCBhcmlhLWxhYmVsPXt0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0gLz5cbiAgICAgICAge3RoaXMucXVlc3Rpb24uaGFzQ29sdW1uc1xuICAgICAgICAgID8gdGhpcy5nZXRDb2x1bW5zKGNzc0NsYXNzZXMpXG4gICAgICAgICAgOiB0aGlzLmdldEl0ZW1zKGNzc0NsYXNzZXMpfVxuICAgICAgPC9maWVsZHNldD5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb2x1bW5zKGNzc0NsYXNzZXM6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLmNvbHVtbnMubWFwKChjb2x1bW46IGFueSwgY2k6IG51bWJlcikgPT4ge1xuICAgICAgdmFyIGl0ZW1zID0gY29sdW1uLm1hcCgoaXRlbTogYW55LCBpaTogbnVtYmVyKSA9PlxuICAgICAgICB0aGlzLnJlbmRlckl0ZW0oXG4gICAgICAgICAgXCJpdGVtXCIgKyBpaSxcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIGNpID09PSAwICYmIGlpID09PSAwLFxuICAgICAgICAgIGNzc0NsYXNzZXMsXG4gICAgICAgICAgXCJcIiArIGNpICsgaWlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYga2V5PXtcImNvbHVtblwiICsgY2l9IGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5nZXRDb2x1bW5DbGFzcygpfT5cbiAgICAgICAgICB7aXRlbXN9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXRlbXMoY3NzQ2xhc3NlczogYW55KTogQXJyYXk8YW55PiB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXNbaV07XG4gICAgICB2YXIga2V5ID0gXCJpdGVtXCIgKyBpO1xuICAgICAgaXRlbXMucHVzaCh0aGlzLnJlbmRlckl0ZW0oa2V5LCBpdGVtLCBpID09IDAsIGNzc0NsYXNzZXMsIFwiXCIgKyBpKSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHRleHRTdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJJdGVtKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGl0ZW06IGFueSxcbiAgICBpc0ZpcnN0OiBib29sZWFuLFxuICAgIGNzc0NsYXNzZXM6IGFueSxcbiAgICBpbmRleDogc3RyaW5nXG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN1cnZleVF1ZXN0aW9uQ2hlY2tib3hJdGVtXG4gICAgICAgIGtleT17a2V5fVxuICAgICAgICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn1cbiAgICAgICAgY3NzQ2xhc3Nlcz17Y3NzQ2xhc3Nlc31cbiAgICAgICAgaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfVxuICAgICAgICBpdGVtPXtpdGVtfVxuICAgICAgICB0ZXh0U3R5bGU9e3RoaXMudGV4dFN0eWxlfVxuICAgICAgICBpc0ZpcnN0PXtpc0ZpcnN0fVxuICAgICAgICBpbmRleD17aW5kZXh9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkNoZWNrYm94SXRlbSBleHRlbmRzIFJlYWN0U3VydmV5RWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLnNlbGVjdEFsbENoYW5nZWQgPSB0aGlzLnNlbGVjdEFsbENoYW5nZWQuYmluZCh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhdGVFbGVtZW50KCk6IEJhc2Uge1xuICAgIHJldHVybiB0aGlzLml0ZW07XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkNoZWNrYm94TW9kZWwge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnF1ZXN0aW9uO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIHJldHVybiB0aGlzLnByb3BzLml0ZW07XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZXh0U3R5bGUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy50ZXh0U3R5bGU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBpc0ZpcnN0KCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaXNGaXJzdDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaW5kZXg7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaGlkZUNhcHRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaGlkZUNhcHRpb24gPT09IHRydWU7XG4gIH1cbiAgcHVibGljIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0IHx8XG4gICAgICAhIXRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0RGF0YS5pc05lZWRSZW5kZXIgfHxcbiAgICAgICEhdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQud2lkZ2V0SnNvbi5pc0RlZmF1bHRSZW5kZXIgfHxcbiAgICAgICEhdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQud2lkZ2V0SnNvbi5yZW5kZXJcbiAgICApO1xuICB9XG4gIGhhbmRsZU9uQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICB2YXIgbmV3VmFsdWUgPSBbXS5jb25jYXQodGhpcy5xdWVzdGlvbi5yZW5kZXJlZFZhbHVlIHx8IFtdKTtcbiAgICB2YXIgaW5kZXggPSBuZXdWYWx1ZS5pbmRleE9mKHRoaXMuaXRlbS52YWx1ZSk7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIG5ld1ZhbHVlLnB1c2godGhpcy5pdGVtLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgbmV3VmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbiAgc2VsZWN0QWxsQ2hhbmdlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5xdWVzdGlvbi50b2dnbGVTZWxlY3RBbGwoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVuZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuaXRlbSAmJiAhIXRoaXMucXVlc3Rpb247XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBpc0NoZWNrZWQgPSB0aGlzLnF1ZXN0aW9uLmlzSXRlbVNlbGVjdGVkKHRoaXMuaXRlbSk7XG4gICAgdmFyIG90aGVySXRlbSA9XG4gICAgICB0aGlzLml0ZW0udmFsdWUgPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtLnZhbHVlICYmIGlzQ2hlY2tlZFxuICAgICAgICA/IHRoaXMucmVuZGVyT3RoZXIoKVxuICAgICAgICA6IG51bGw7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyQ2hlY2tib3goaXNDaGVja2VkLCBvdGhlckl0ZW0pO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgaW5wdXRTdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiB7IG1hcmdpblJpZ2h0OiBcIjNweFwiIH07XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckNoZWNrYm94KFxuICAgIGlzQ2hlY2tlZDogYm9vbGVhbixcbiAgICBvdGhlckl0ZW06IEpTWC5FbGVtZW50XG4gICk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgaWQgPSB0aGlzLnF1ZXN0aW9uLmlucHV0SWQgKyBcIl9cIiArIHRoaXMuaW5kZXg7XG4gICAgdmFyIHRleHQgPSAhdGhpcy5oaWRlQ2FwdGlvbiA/IHRoaXMucmVuZGVyTG9jU3RyaW5nKHRoaXMuaXRlbS5sb2NUZXh0KSA6IFwiXCI7XG4gICAgbGV0IGl0ZW1DbGFzcyA9IHRoaXMucXVlc3Rpb24uZ2V0SXRlbUNsYXNzKHRoaXMuaXRlbSk7XG4gICAgbGV0IGxhYmVsQ2xhc3MgPSB0aGlzLnF1ZXN0aW9uLmdldExhYmVsQ2xhc3ModGhpcy5pdGVtKTtcbiAgICB2YXIgb25JdGVtQ2hhbmdlZCA9XG4gICAgICB0aGlzLml0ZW0gPT0gdGhpcy5xdWVzdGlvbi5zZWxlY3RBbGxJdGVtXG4gICAgICAgID8gdGhpcy5zZWxlY3RBbGxDaGFuZ2VkXG4gICAgICAgIDogdGhpcy5oYW5kbGVPbkNoYW5nZTtcblxuICAgIHZhciBsb2NUZXh0OiBhbnkgPSB0aGlzLml0ZW0ubG9jVGV4dDtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17aXRlbUNsYXNzfT5cbiAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT17bGFiZWxDbGFzc30+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMuY3NzQ2xhc3Nlcy5pdGVtQ29udHJvbH1cbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICB2YWx1ZT17dGhpcy5pdGVtLnZhbHVlfVxuICAgICAgICAgICAgaWQ9e2lkfVxuICAgICAgICAgICAgc3R5bGU9e3RoaXMuaW5wdXRTdHlsZX1cbiAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLmlzRGlzcGxheU1vZGUgfHwgIXRoaXMuaXRlbS5pc0VuYWJsZWR9XG4gICAgICAgICAgICBjaGVja2VkPXtpc0NoZWNrZWR9XG4gICAgICAgICAgICBvbkNoYW5nZT17b25JdGVtQ2hhbmdlZH1cbiAgICAgICAgICAgIGFyaWEtcmVxdWlyZWQ9e3RoaXMucXVlc3Rpb24uaXNSZXF1aXJlZH1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9e2xvY1RleHQucmVuZGVyZWRIdG1sfVxuICAgICAgICAgICAgYXJpYS1pbnZhbGlkPXt0aGlzLnF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwfVxuICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT17XG4gICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMucXVlc3Rpb24uaWQgKyBcIl9lcnJvcnNcIlxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXt0aGlzLmNzc0NsYXNzZXMubWF0ZXJpYWxEZWNvcmF0b3J9PlxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgY2xhc3NOYW1lPXt0aGlzLmNzc0NsYXNzZXMuaXRlbURlY29yYXRvcn0+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSwxM2wyLTJsMywzbDctN2wyLDJsLTksOUw1LDEzelwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNoZWNrXCIgLz5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLmNvbnRyb2xMYWJlbH1cbiAgICAgICAgICAgIHRpdGxlPXtsb2NUZXh0W1wia29SZW5kZXJlZEh0bWxcIl19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3RleHR9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICB7b3RoZXJJdGVtfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyT3RoZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgPFN1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW1cbiAgICAgICAgICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn1cbiAgICAgICAgICBvdGhlckNzcz17dGhpcy5jc3NDbGFzc2VzLm90aGVyfVxuICAgICAgICAgIGNzc0NsYXNzZXM9e3RoaXMuY3NzQ2xhc3Nlc31cbiAgICAgICAgICBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJjaGVja2JveFwiLCAocHJvcHMpID0+IHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25DaGVja2JveCwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmNoZWNrYm94LnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSxcbiAgUmVhY3RTdXJ2ZXlFbGVtZW50LFxufSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fcmFkaW9ncm91cFwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4uL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25Db21tZW50SXRlbSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25jb21tZW50XCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uUmFkaW9ncm91cCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRWxlbWVudCgpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgdmFyIGNsZWFyQnV0dG9uID0gbnVsbDtcbiAgICBpZiAodGhpcy5xdWVzdGlvbi5jYW5TaG93Q2xlYXJCdXR0b24pIHtcbiAgICAgIGNsZWFyQnV0dG9uID0gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5jbGVhckJ1dHRvbn1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMucXVlc3Rpb24uY2xlYXJWYWx1ZSgpfVxuICAgICAgICAgICAgdmFsdWU9e3RoaXMucXVlc3Rpb24uY2xlYXJCdXR0b25DYXB0aW9ufVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxmaWVsZHNldFxuICAgICAgICBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH1cbiAgICAgICAgcmVmPXsoZmllbGRzZXQpID0+ICh0aGlzLmNvbnRyb2wgPSBmaWVsZHNldCl9XG4gICAgICAgIHJvbGU9XCJyYWRpb2dyb3VwXCJcbiAgICAgID5cbiAgICAgICAgPGxlZ2VuZCBhcmlhLWxhYmVsPXt0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0gLz5cbiAgICAgICAge3RoaXMucXVlc3Rpb24uaGFzQ29sdW1uc1xuICAgICAgICAgID8gdGhpcy5nZXRDb2x1bW5zKGNzc0NsYXNzZXMpXG4gICAgICAgICAgOiB0aGlzLmdldEl0ZW1zKGNzc0NsYXNzZXMpfVxuICAgICAgICB7Y2xlYXJCdXR0b259XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbHVtbnMoY3NzQ2xhc3NlczogYW55KSB7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5nZXRTdGF0ZVZhbHVlKCk7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb24uY29sdW1ucy5tYXAoKGNvbHVtbjogYW55LCBjaTogbnVtYmVyKSA9PiB7XG4gICAgICB2YXIgaXRlbXMgPSBjb2x1bW4ubWFwKChpdGVtOiBhbnksIGlpOiBudW1iZXIpID0+XG4gICAgICAgIHRoaXMucmVuZGVySXRlbShpdGVtLCB2YWx1ZSwgY3NzQ2xhc3NlcywgXCJcIiArIGNpICsgaWkpXG4gICAgICApO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBrZXk9e1wiY29sdW1uXCIgKyBjaX0gY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmdldENvbHVtbkNsYXNzKCl9PlxuICAgICAgICAgIHtpdGVtc31cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJdGVtcyhjc3NDbGFzc2VzOiBhbnkpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFN0YXRlVmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlc1tpXTtcbiAgICAgIGl0ZW1zLnB1c2godGhpcy5yZW5kZXJJdGVtKGl0ZW0sIHZhbHVlLCBjc3NDbGFzc2VzLCBcIlwiICsgaSkpO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZXh0U3R5bGUoKTogYW55IHtcbiAgICByZXR1cm4geyBtYXJnaW5MZWZ0OiBcIjNweFwiLCBkaXNwbGF5OiBcImlubGluZVwiLCBwb3NpdGlvbjogXCJzdGF0aWNcIiB9O1xuICB9XG4gIHByaXZhdGUgcmVuZGVySXRlbShcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgdmFsdWU6IGFueSxcbiAgICBjc3NDbGFzc2VzOiBhbnksXG4gICAgaW5kZXg6IHN0cmluZ1xuICApOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGtleSA9IFwiaXRlbVwiICsgaW5kZXg7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdXJ2ZXlRdWVzdGlvblJhZGlvSXRlbVxuICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgcXVlc3Rpb249e3RoaXMucXVlc3Rpb259XG4gICAgICAgIGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9XG4gICAgICAgIGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgaXRlbT17aXRlbX1cbiAgICAgICAgdGV4dFN0eWxlPXt0aGlzLnRleHRTdHlsZX1cbiAgICAgICAgaW5kZXg9e2luZGV4fVxuICAgICAgICBpc0NoZWNrZWQ9e3ZhbHVlID09PSBpdGVtLnZhbHVlfVxuICAgICAgLz5cbiAgICApO1xuICB9XG4gIHByaXZhdGUgZ2V0U3RhdGVWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiAhdGhpcy5xdWVzdGlvbi5pc0VtcHR5KCkgPyB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVmFsdWUgOiBcIlwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvblJhZGlvSXRlbSBleHRlbmRzIFJlYWN0U3VydmV5RWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhdGVFbGVtZW50KCk6IEJhc2Uge1xuICAgIHJldHVybiB0aGlzLml0ZW07XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucXVlc3Rpb247XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBpdGVtKCk6IEl0ZW1WYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaXRlbTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHRleHRTdHlsZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnRleHRTdHlsZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaW5kZXg7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBpc0NoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuaXNDaGVja2VkO1xuICB9XG4gIHByaXZhdGUgZ2V0IGhpZGVDYXB0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmhpZGVDYXB0aW9uID09PSB0cnVlO1xuICB9XG4gIHB1YmxpYyBzaG91bGRDb21wb25lbnRVcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldCB8fFxuICAgICAgISF0aGlzLnF1ZXN0aW9uLmN1c3RvbVdpZGdldERhdGEuaXNOZWVkUmVuZGVyIHx8XG4gICAgICAhIXRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LndpZGdldEpzb24uaXNEZWZhdWx0UmVuZGVyIHx8XG4gICAgICAhIXRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LndpZGdldEpzb24ucmVuZGVyXG4gICAgKTtcbiAgfVxuICBoYW5kbGVPbkNoYW5nZShldmVudDogYW55KSB7XG4gICAgdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFZhbHVlID0gdGhpcy5pdGVtLnZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBjYW5SZW5kZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5xdWVzdGlvbiAmJiAhIXRoaXMuaXRlbTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRWxlbWVudCgpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIG90aGVySXRlbSA9XG4gICAgICB0aGlzLmlzQ2hlY2tlZCAmJiB0aGlzLml0ZW0udmFsdWUgPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtLnZhbHVlXG4gICAgICAgID8gdGhpcy5yZW5kZXJPdGhlcih0aGlzLmNzc0NsYXNzZXMpXG4gICAgICAgIDogbnVsbDtcblxuICAgIHZhciBpZCA9IHRoaXMucXVlc3Rpb24uaW5wdXRJZCArIFwiX1wiICsgdGhpcy5pbmRleDtcbiAgICB2YXIgaXRlbVRleHQgPSAhdGhpcy5oaWRlQ2FwdGlvblxuICAgICAgPyB0aGlzLnJlbmRlckxvY1N0cmluZyh0aGlzLml0ZW0ubG9jVGV4dCwgdGhpcy50ZXh0U3R5bGUpXG4gICAgICA6IFwiXCI7XG4gICAgdmFyIGl0ZW1DbGFzcyA9IHRoaXMucXVlc3Rpb24uZ2V0SXRlbUNsYXNzKHRoaXMuaXRlbSk7XG4gICAgdmFyIGxhYmVsQ2xhc3MgPSB0aGlzLnF1ZXN0aW9uLmdldExhYmVsQ2xhc3ModGhpcy5pdGVtKTtcbiAgICB2YXIgbG9jVGV4dDogYW55ID0gdGhpcy5pdGVtLmxvY1RleHQ7XG4gICAgdmFyIGNvbnRyb2xMYWJlbENsYXNzID0gdGhpcy5xdWVzdGlvbi5nZXRDb250cm9sTGFiZWxDbGFzcyh0aGlzLml0ZW0pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtpdGVtQ2xhc3N9PlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPXtsYWJlbENsYXNzfT5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLml0ZW1Db250cm9sfVxuICAgICAgICAgICAgaWQ9e2lkfVxuICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgIG5hbWU9e3RoaXMucXVlc3Rpb24ubmFtZSArIFwiX1wiICsgdGhpcy5xdWVzdGlvbi5pZH1cbiAgICAgICAgICAgIGNoZWNrZWQ9e3RoaXMuaXNDaGVja2VkfVxuICAgICAgICAgICAgdmFsdWU9e3RoaXMuaXRlbS52YWx1ZX1cbiAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLmlzRGlzcGxheU1vZGUgfHwgIXRoaXMuaXRlbS5pc0VuYWJsZWR9XG4gICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX1cbiAgICAgICAgICAgIGFyaWEtcmVxdWlyZWQ9e3RoaXMucXVlc3Rpb24uaXNSZXF1aXJlZH1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9e2xvY1RleHQucmVuZGVyZWRIdG1sfVxuICAgICAgICAgICAgYXJpYS1pbnZhbGlkPXt0aGlzLnF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwfVxuICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT17XG4gICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMucXVlc3Rpb24uaWQgKyBcIl9lcnJvcnNcIlxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm9sZT1cInJhZGlvXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLm1hdGVyaWFsRGVjb3JhdG9yfT5cbiAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLmNzc0NsYXNzZXMuaXRlbURlY29yYXRvcn1cbiAgICAgICAgICAgICAgdmlld0JveD1cIi0xMiAtMTIgMjQgMjRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8Y2lyY2xlIHI9XCI2XCIgY3g9XCIwXCIgY3k9XCIwXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJjaGVja1wiIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjb250cm9sTGFiZWxDbGFzc30gdGl0bGU9e2xvY1RleHRbXCJrb1JlbmRlcmVkSHRtbFwiXX0+XG4gICAgICAgICAgICB7aXRlbVRleHR9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICB7b3RoZXJJdGVtfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyT3RoZXIoY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgPFN1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW1cbiAgICAgICAgICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn1cbiAgICAgICAgICBvdGhlckNzcz17Y3NzQ2xhc3Nlcy5vdGhlcn1cbiAgICAgICAgICBjc3NDbGFzc2VzPXtjc3NDbGFzc2VzfVxuICAgICAgICAgIGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhZGlvZ3JvdXBcIiwgKHByb3BzKSA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uUmFkaW9ncm91cCwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbnJhZGlvZ3JvdXAudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVRpbWVyUGFuZWwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8YW55LCBhbnk+IHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHN1cnZleSgpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuc3VydmV5O1xuICB9XG4gIHVwZGF0ZSA9ICgpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgdGltZVNwZW50OiB0aGlzLnN1cnZleS50aW1lU3BlbnQgfSk7XG4gIH07XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMuc3VydmV5Lm9uVGltZXIuYWRkKHRoaXMudXBkYXRlKTtcbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLnN1cnZleS5vblRpbWVyLnJlbW92ZSh0aGlzLnVwZGF0ZSk7XG4gIH1cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gPGRpdj57dGhpcy5zdXJ2ZXkudGltZXJJbmZvVGV4dH08L2Rpdj47XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHRpbWVycGFuZWwudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvbiwgSVN1cnZleUNyZWF0b3IgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uUm93TW9kZWwsIFBhbmVsTW9kZWwgfSBmcm9tIFwiLi4vcGFuZWxcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50QmFzZSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBJRWxlbWVudCwgQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBSZWFjdEVsZW1lbnRGYWN0b3J5IH0gZnJvbSBcIi4vZWxlbWVudC1mYWN0b3J5XCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuLi9zZXR0aW5nc1wiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5Um93IGV4dGVuZHMgU3VydmV5RWxlbWVudEJhc2Uge1xuICBwcml2YXRlIHJvb3RSZWY6IFJlYWN0LlJlZk9iamVjdDxIVE1MRGl2RWxlbWVudD47XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5yb290UmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0YXRlRWxlbWVudCgpOiBCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5yb3c7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcm93KCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnJvdztcbiAgfVxuICBwcml2YXRlIGdldCBzdXJ2ZXkoKTogU3VydmV5TW9kZWwge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnN1cnZleTtcbiAgfVxuICBwcml2YXRlIGdldCBjcmVhdG9yKCk6IElTdXJ2ZXlDcmVhdG9yIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5jcmVhdG9yO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgY3NzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY3NzO1xuICB9XG4gIHByb3RlY3RlZCBjYW5SZW5kZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yb3cgJiYgISF0aGlzLnN1cnZleSAmJiAhIXRoaXMuY3JlYXRvciAmJiB0aGlzLnJvdy52aXNpYmxlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgZWxlbWVudHMgPSBudWxsO1xuICAgIGlmICh0aGlzLnJvdy5pc05lZWRSZW5kZXIpIHtcbiAgICAgIGVsZW1lbnRzID0gdGhpcy5yb3cuZWxlbWVudHMubWFwKChlbGVtZW50KSA9PlxuICAgICAgICB0aGlzLmNyZWF0ZUVsZW1lbnQoZWxlbWVudClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJlZj17dGhpcy5yb290UmVmfSBjbGFzc05hbWU9e3RoaXMuY3NzLnJvd30+XG4gICAgICAgIHtlbGVtZW50c31cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICB2YXIgZWwgPSB0aGlzLnJvb3RSZWYuY3VycmVudDtcbiAgICBpZiAoISFlbCkge1xuICAgICAgaWYgKCF0aGlzLnJvdy5pc05lZWRSZW5kZXIpIHtcbiAgICAgICAgdmFyIHJvd0NvbnRhaW5lckRpdiA9IGVsO1xuICAgICAgICB0aGlzLnJvdy5zdGFydExhenlSZW5kZXJpbmcocm93Q29udGFpbmVyRGl2KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHM6IGFueSwgbmV4dFN0YXRlOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAobmV4dFByb3BzLnJvdyAhPT0gdGhpcy5yb3cpIHtcbiAgICAgIG5leHRQcm9wcy5yb3cuaXNOZWVkUmVuZGVyID0gdGhpcy5yb3cuaXNOZWVkUmVuZGVyO1xuICAgICAgdGhpcy5zdG9wTGF6eVJlbmRlcmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHN0b3BMYXp5UmVuZGVyaW5nKCkge1xuICAgIHRoaXMucm93LnN0b3BMYXp5UmVuZGVyaW5nKCk7XG4gICAgdGhpcy5yb3cuaXNOZWVkUmVuZGVyID0gIXNldHRpbmdzLmxhenlSb3dzUmVuZGVyaW5nO1xuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgdGhpcy5zdG9wTGF6eVJlbmRlcmluZygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGVsZW1lbnRUeXBlID0gZWxlbWVudC5nZXRUeXBlKCk7XG4gICAgaWYgKCFSZWFjdEVsZW1lbnRGYWN0b3J5Lkluc3RhbmNlLmlzRWxlbWVudFJlZ2lzZ2VyZWQoZWxlbWVudFR5cGUpKSB7XG4gICAgICBlbGVtZW50VHlwZSA9IFwicXVlc3Rpb25cIjtcbiAgICB9XG4gICAgcmV0dXJuIFJlYWN0RWxlbWVudEZhY3RvcnkuSW5zdGFuY2UuY3JlYXRlRWxlbWVudChlbGVtZW50VHlwZSwge1xuICAgICAga2V5OiBlbGVtZW50Lm5hbWUsXG4gICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgY3JlYXRvcjogdGhpcy5jcmVhdG9yLFxuICAgICAgc3VydmV5OiB0aGlzLnN1cnZleSxcbiAgICAgIGNzczogdGhpcy5jc3MsXG4gICAgfSk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yb3cudHN4IiwiaW1wb3J0IHsgQmFzZSwgU3VydmV5RXJyb3IsIElUZXh0UHJvY2Vzc29yLCBJUXVlc3Rpb24gfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIsIEpzb25PYmplY3RQcm9wZXJ0eSB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFdlYlJlcXVlc3RFcnJvciwgV2ViUmVxdWVzdEVtcHR5RXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG5jbGFzcyBYbWxQYXJzZXIge1xuICBwcml2YXRlIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgcHVibGljIGFzc2lnblZhbHVlKHRhcmdldDogYW55LCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0ucHVzaCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0YXJnZXRbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gW3RhcmdldFtuYW1lXV0uY29uY2F0KHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAxICYmXG4gICAgICBPYmplY3Qua2V5cyh2YWx1ZSlbMF0gPT09IG5hbWVcbiAgICApIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHhtbDJKc29uKHhtbE5vZGU6IGFueSwgcmVzdWx0OiBhbnkpIHtcbiAgICBpZiAoeG1sTm9kZS5jaGlsZHJlbiAmJiB4bWxOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeG1sTm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgY2hpbGROb2RlID0geG1sTm9kZS5jaGlsZHJlbltpXTtcbiAgICAgICAgbGV0IGNoaWxkT2JqZWN0ID0ge307XG4gICAgICAgIHRoaXMueG1sMkpzb24oY2hpbGROb2RlLCBjaGlsZE9iamVjdCk7XG4gICAgICAgIHRoaXMuYXNzaWduVmFsdWUocmVzdWx0LCBjaGlsZE5vZGUubm9kZU5hbWUsIGNoaWxkT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NpZ25WYWx1ZShyZXN1bHQsIHhtbE5vZGUubm9kZU5hbWUsIHhtbE5vZGUudGV4dENvbnRlbnQpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcGFyc2VYbWxTdHJpbmcoeG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgICBsZXQgeG1sUm9vdCA9IHRoaXMucGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG4gICAgbGV0IGpzb24gPSB7fTtcbiAgICB0aGlzLnhtbDJKc29uKHhtbFJvb3QsIGpzb24pO1xuICAgIHJldHVybiBqc29uO1xuICB9XG59XG5cbi8qKlxuICogQSBkZWZpbml0aW9uIGZvciBmaWxsaW5nIGNob2ljZXMgZm9yIGNoZWNrYm94LCBkcm9wZG93biBhbmQgcmFkaW9ncm91cCBxdWVzdGlvbnMgZnJvbSByZXNmdWxsIHNlcnZpY2VzLlxuICogVGhlIHJ1biBtZXRob2QgY2FsbCBhIHJlc3RmdWxsIHNlcnZpY2UgYW5kIHJlc3VsdHMgY2FuIGJlIGdldCBvbiBnZXRSZXN1bHRDYWxsYmFjay5cbiAqL1xuZXhwb3J0IGNsYXNzIENob2ljZXNSZXN0ZnVsbCBleHRlbmRzIEJhc2Uge1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZVRleHQgPSBcIntDQUNIRX1cIjtcbiAgcHJpdmF0ZSBzdGF0aWMgbm9DYWNoZVRleHQgPSBcIntOT0NBQ0hFfVwiO1xuICBwdWJsaWMgc3RhdGljIGdldCBFbmNvZGVQYXJhbWV0ZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzZXR0aW5ncy53ZWJzZXJ2aWNlRW5jb2RlUGFyYW1ldGVycztcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBFbmNvZGVQYXJhbWV0ZXJzKHZhbDogYm9vbGVhbikge1xuICAgIHNldHRpbmdzLndlYnNlcnZpY2VFbmNvZGVQYXJhbWV0ZXJzID0gdmFsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZSgpIHtcbiAgICBDaG9pY2VzUmVzdGZ1bGwuaXRlbXNSZXN1bHQgPSB7fTtcbiAgICBDaG9pY2VzUmVzdGZ1bGwuc2VuZGluZ1NhbWVSZXF1ZXN0cyA9IHt9O1xuICB9XG4gIHByaXZhdGUgc3RhdGljIGl0ZW1zUmVzdWx0OiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBzdGF0aWMgc2VuZGluZ1NhbWVSZXF1ZXN0czoge1xuICAgIFtpbmRleDogc3RyaW5nXTogQXJyYXk8Q2hvaWNlc1Jlc3RmdWxsPjtcbiAgfSA9IHt9O1xuICBwcml2YXRlIHN0YXRpYyBhZGRTYW1lUmVxdWVzdChvYmo6IENob2ljZXNSZXN0ZnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmICghb2JqLmlzVXNpbmdDYWNoZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBoYXNoID0gb2JqLm9iakhhc2g7XG4gICAgdmFyIHJlcyA9IENob2ljZXNSZXN0ZnVsbC5zZW5kaW5nU2FtZVJlcXVlc3RzW2hhc2hdO1xuICAgIGlmICghcmVzKSB7XG4gICAgICBDaG9pY2VzUmVzdGZ1bGwuc2VuZGluZ1NhbWVSZXF1ZXN0c1tvYmoub2JqSGFzaF0gPSBbXTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmVzLnB1c2gob2JqKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHN0YXRpYyB1bnJlZ2lzdGVyU2FtZVJlcXVlc3RzKG9iajogQ2hvaWNlc1Jlc3RmdWxsLCBpdGVtczogYW55KSB7XG4gICAgaWYgKCFvYmouaXNVc2luZ0NhY2hlKSByZXR1cm47XG4gICAgdmFyIHJlcyA9IENob2ljZXNSZXN0ZnVsbC5zZW5kaW5nU2FtZVJlcXVlc3RzW29iai5vYmpIYXNoXTtcbiAgICBkZWxldGUgQ2hvaWNlc1Jlc3RmdWxsLnNlbmRpbmdTYW1lUmVxdWVzdHNbb2JqLm9iakhhc2hdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoISFyZXNbaV0uZ2V0UmVzdWx0Q2FsbGJhY2spIHtcbiAgICAgICAgcmVzW2ldLmdldFJlc3VsdENhbGxiYWNrKGl0ZW1zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIHN0YXRpYyBvbkJlZm9yZVNlbmRSZXF1ZXN0OiAoXG4gICAgc2VuZGVyOiBDaG9pY2VzUmVzdGZ1bGwsXG4gICAgb3B0aW9uczogeyByZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCB9XG4gICkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0Q2FjaGVkSXRlbXNSZXN1bHQob2JqOiBDaG9pY2VzUmVzdGZ1bGwpOiBib29sZWFuIHtcbiAgICB2YXIgaGFzaCA9IG9iai5vYmpIYXNoO1xuICAgIHZhciByZXMgPSBDaG9pY2VzUmVzdGZ1bGwuaXRlbXNSZXN1bHRbaGFzaF07XG4gICAgaWYgKCFyZXMpIHJldHVybiBmYWxzZTtcbiAgICBpZiAob2JqLmdldFJlc3VsdENhbGxiYWNrKSB7XG4gICAgICBvYmouZ2V0UmVzdWx0Q2FsbGJhY2socmVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBsYXN0T2JqSGFzaDogc3RyaW5nID0gXCJcIjtcbiAgcHJpdmF0ZSBpc1J1bm5pbmdWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgcHJvY2Vzc2VkVXJsOiBzdHJpbmcgPSBcIlwiO1xuICBwcm90ZWN0ZWQgcHJvY2Vzc2VkUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgcHJpdmF0ZSBpc1VzaW5nQ2FjaGVGcm9tVXJsOiBib29sZWFuID0gdW5kZWZpbmVkO1xuICBwdWJsaWMgZ2V0UmVzdWx0Q2FsbGJhY2s6IChpdGVtczogQXJyYXk8SXRlbVZhbHVlPikgPT4gdm9pZDtcbiAgcHVibGljIGJlZm9yZVNlbmRSZXF1ZXN0Q2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHB1YmxpYyB1cGRhdGVSZXN1bHRDYWxsYmFjazogKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHNlcnZlclJlc3VsdDogYW55XG4gICkgPT4gQXJyYXk8SXRlbVZhbHVlPjtcbiAgcHVibGljIGdldEl0ZW1WYWx1ZUNhbGxiYWNrOiAoaXRlbTogYW55KSA9PiBhbnk7XG4gIHB1YmxpYyBlcnJvcjogU3VydmV5RXJyb3IgPSBudWxsO1xuICBwdWJsaWMgb3duZXI6IElRdWVzdGlvbjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgcnVuKHRleHRQcm9jZXNzb3I6IElUZXh0UHJvY2Vzc29yID0gbnVsbCkge1xuICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuZ2V0UmVzdWx0Q2FsbGJhY2spIHJldHVybjtcbiAgICB0aGlzLnByb2Nlc3NlZFRleHQodGV4dFByb2Nlc3Nvcik7XG4gICAgaWYgKCF0aGlzLnByb2Nlc3NlZFVybCkge1xuICAgICAgdGhpcy5kb0VtcHR5UmVzdWx0Q2FsbGJhY2soe30pO1xuICAgICAgdGhpcy5sYXN0T2JqSGFzaCA9IHRoaXMub2JqSGFzaDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFzdE9iakhhc2ggPT09IHRoaXMub2JqSGFzaCkgcmV0dXJuO1xuICAgIHRoaXMubGFzdE9iakhhc2ggPSB0aGlzLm9iakhhc2g7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgaWYgKHRoaXMudXNlQ2hhbmdlZEl0ZW1zUmVzdWx0cygpKSByZXR1cm47XG4gICAgaWYgKENob2ljZXNSZXN0ZnVsbC5hZGRTYW1lUmVxdWVzdCh0aGlzKSkgcmV0dXJuO1xuICAgIHRoaXMuc2VuZFJlcXVlc3QoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVXNpbmdDYWNoZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1VzaW5nQ2FjaGVGcm9tVXJsID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5pc1VzaW5nQ2FjaGVGcm9tVXJsID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBzZXR0aW5ncy51c2VDYWNoaW5nRm9yQ2hvaWNlc1Jlc3RmdWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNSdW5uaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmlzUnVubmluZ1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNXYWl0aW5nRm9yUGFyYW1ldGVycygpIHtcbiAgICByZXR1cm4gdGhpcy51cmwgJiYgIXRoaXMucHJvY2Vzc2VkVXJsO1xuICB9XG4gIHByb3RlY3RlZCB1c2VDaGFuZ2VkSXRlbXNSZXN1bHRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBDaG9pY2VzUmVzdGZ1bGwuZ2V0Q2FjaGVkSXRlbXNSZXN1bHQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBkb0VtcHR5UmVzdWx0Q2FsbGJhY2soc2VydmVyUmVzdWx0OiBhbnkpIHtcbiAgICB2YXIgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcbiAgICBpZiAodGhpcy51cGRhdGVSZXN1bHRDYWxsYmFjaykge1xuICAgICAgaXRlbXMgPSB0aGlzLnVwZGF0ZVJlc3VsdENhbGxiYWNrKGl0ZW1zLCBzZXJ2ZXJSZXN1bHQpO1xuICAgIH1cbiAgICB0aGlzLmdldFJlc3VsdENhbGxiYWNrKGl0ZW1zKTtcbiAgfVxuICBwcml2YXRlIHByb2Nlc3NlZFRleHQodGV4dFByb2Nlc3NvcjogSVRleHRQcm9jZXNzb3IpIHtcbiAgICB2YXIgdXJsVGV4dCA9IHRoaXMudXJsO1xuICAgIGlmICghIXVybFRleHQpIHtcbiAgICAgIHVybFRleHQgPSB1cmxUZXh0XG4gICAgICAgIC5yZXBsYWNlKENob2ljZXNSZXN0ZnVsbC5jYWNoZVRleHQsIFwiXCIpXG4gICAgICAgIC5yZXBsYWNlKENob2ljZXNSZXN0ZnVsbC5ub0NhY2hlVGV4dCwgXCJcIik7XG4gICAgfVxuICAgIGlmICh0ZXh0UHJvY2Vzc29yKSB7XG4gICAgICB2YXIgcFVybCA9IHRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHRFeChcbiAgICAgICAgdXJsVGV4dCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHNldHRpbmdzLndlYnNlcnZpY2VFbmNvZGVQYXJhbWV0ZXJzXG4gICAgICApO1xuICAgICAgdmFyIHBQYXRoID0gdGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dEV4KFxuICAgICAgICB0aGlzLnBhdGgsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBzZXR0aW5ncy53ZWJzZXJ2aWNlRW5jb2RlUGFyYW1ldGVyc1xuICAgICAgKTtcbiAgICAgIGlmICghcFVybC5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gfHwgIXBQYXRoLmhhc0FsbFZhbHVlc09uTGFzdFJ1bikge1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFVybCA9IFwiXCI7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkUGF0aCA9IFwiXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFVybCA9IHBVcmwudGV4dDtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoID0gcFBhdGgudGV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgPSB1cmxUZXh0O1xuICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoID0gdGhpcy5wYXRoO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgcGFyc2VSZXNwb25zZShyZXNwb25zZTogYW55KSB7XG4gICAgbGV0IHBhcnNlZFJlc3BvbnNlO1xuICAgIGlmIChcbiAgICAgICEhcmVzcG9uc2UgJiZcbiAgICAgIHR5cGVvZiByZXNwb25zZS5pbmRleE9mID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgIHJlc3BvbnNlLmluZGV4T2YoXCI8XCIpID09PSAwXG4gICAgKSB7XG4gICAgICB2YXIgcGFyc2VyID0gbmV3IFhtbFBhcnNlcigpO1xuICAgICAgcGFyc2VkUmVzcG9uc2UgPSBwYXJzZXIucGFyc2VYbWxTdHJpbmcocmVzcG9uc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWRSZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHBhcnNlZFJlc3BvbnNlID0gKHJlc3BvbnNlIHx8IFwiXCIpXG4gICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgLm1hcCgoczogYW55KSA9PiBzLnRyaW0oXCIgXCIpKVxuICAgICAgICAgIC5maWx0ZXIoKHM6IGFueSkgPT4gISFzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZFJlc3BvbnNlO1xuICB9XG4gIHByb3RlY3RlZCBzZW5kUmVxdWVzdCgpIHtcbiAgICB0aGlzLmlzUnVubmluZ1ZhbHVlID0gdHJ1ZTtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgdGhpcy5wcm9jZXNzZWRVcmwpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbG9hZGluZ09iakhhc2ggPSB0aGlzLm9iakhhc2g7XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuaXNSdW5uaW5nVmFsdWUgPSBmYWxzZTtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgc2VsZi5vbkxvYWQoc2VsZi5wYXJzZVJlc3BvbnNlKHhoci5yZXNwb25zZSksIGxvYWRpbmdPYmpIYXNoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYub25FcnJvcih4aHIuc3RhdHVzVGV4dCwgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcmVxdWVzdDogeGhyIH07XG4gICAgaWYgKCEhQ2hvaWNlc1Jlc3RmdWxsLm9uQmVmb3JlU2VuZFJlcXVlc3QpIHtcbiAgICAgIENob2ljZXNSZXN0ZnVsbC5vbkJlZm9yZVNlbmRSZXF1ZXN0KHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICB0aGlzLmJlZm9yZVNlbmRSZXF1ZXN0KCk7XG4gICAgb3B0aW9ucy5yZXF1ZXN0LnNlbmQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImNob2ljZXNCeVVybFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMudXJsICYmXG4gICAgICAhdGhpcy5wYXRoICYmXG4gICAgICAhdGhpcy52YWx1ZU5hbWUgJiZcbiAgICAgICF0aGlzLnRpdGxlTmFtZSAmJlxuICAgICAgIXRoaXMuaW1hZ2VMaW5rTmFtZVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldEN1c3RvbVByb3BlcnRpZXNOYW1lcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllcygpO1xuICAgIHZhciByZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2godGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydGllc1tpXS5uYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9wZXJ0eU5hbWUgKyBcIk5hbWVcIjtcbiAgfVxuICBwcml2YXRlIGdldEN1c3RvbVByb3BlcnRpZXMoKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBTZXJpYWxpemVyLmdldFByb3BlcnRpZXModGhpcy5pdGVtVmFsdWVUeXBlKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJ2YWx1ZVwiIHx8XG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJ0ZXh0XCIgfHxcbiAgICAgICAgcHJvcGVydGllc1tpXS5uYW1lID09PSBcInZpc2libGVJZlwiIHx8XG4gICAgICAgIHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJlbmFibGVJZlwiXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNldERhdGEoanNvbjogYW55KSB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIGlmIChqc29uLnVybCkgdGhpcy51cmwgPSBqc29uLnVybDtcbiAgICBpZiAoanNvbi5wYXRoKSB0aGlzLnBhdGggPSBqc29uLnBhdGg7XG4gICAgaWYgKGpzb24udmFsdWVOYW1lKSB0aGlzLnZhbHVlTmFtZSA9IGpzb24udmFsdWVOYW1lO1xuICAgIGlmIChqc29uLnRpdGxlTmFtZSkgdGhpcy50aXRsZU5hbWUgPSBqc29uLnRpdGxlTmFtZTtcbiAgICBpZiAoanNvbi5pbWFnZUxpbmtOYW1lKSB0aGlzLmltYWdlTGlua05hbWUgPSBqc29uLmltYWdlTGlua05hbWU7XG4gICAgaWYgKGpzb24uYWxsb3dFbXB0eVJlc3BvbnNlICE9PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLmFsbG93RW1wdHlSZXNwb25zZSA9IGpzb24uYWxsb3dFbXB0eVJlc3BvbnNlO1xuICAgIGlmIChqc29uLmF0dGFjaE9yaWdpbmFsSXRlbXMgIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMuYXR0YWNoT3JpZ2luYWxJdGVtcyA9IGpzb24uYXR0YWNoT3JpZ2luYWxJdGVtcztcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoanNvbltwcm9wZXJ0aWVzW2ldXSkgKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV0gPSBqc29uW3Byb3BlcnRpZXNbaV1dO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0RGF0YSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciByZXM6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLnVybCkgcmVzW1widXJsXCJdID0gdGhpcy51cmw7XG4gICAgaWYgKHRoaXMucGF0aCkgcmVzW1wicGF0aFwiXSA9IHRoaXMucGF0aDtcbiAgICBpZiAodGhpcy52YWx1ZU5hbWUpIHJlc1tcInZhbHVlTmFtZVwiXSA9IHRoaXMudmFsdWVOYW1lO1xuICAgIGlmICh0aGlzLnRpdGxlTmFtZSkgcmVzW1widGl0bGVOYW1lXCJdID0gdGhpcy50aXRsZU5hbWU7XG4gICAgaWYgKHRoaXMuaW1hZ2VMaW5rTmFtZSkgcmVzW1wiaW1hZ2VMaW5rTmFtZVwiXSA9IHRoaXMuaW1hZ2VMaW5rTmFtZTtcbiAgICBpZiAodGhpcy5hbGxvd0VtcHR5UmVzcG9uc2UpXG4gICAgICByZXNbXCJhbGxvd0VtcHR5UmVzcG9uc2VcIl0gPSB0aGlzLmFsbG93RW1wdHlSZXNwb25zZTtcbiAgICBpZiAodGhpcy5hdHRhY2hPcmlnaW5hbEl0ZW1zKVxuICAgICAgcmVzW1wiYXR0YWNoT3JpZ2luYWxJdGVtc1wiXSA9IHRoaXMuYXR0YWNoT3JpZ2luYWxJdGVtcztcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoKDxhbnk+dGhpcylbcHJvcGVydGllc1tpXV0pXG4gICAgICAgIHJlc1twcm9wZXJ0aWVzW2ldXSA9ICg8YW55PnRoaXMpW3Byb3BlcnRpZXNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInVybFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHVybCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInVybFwiLCB2YWwpO1xuICAgIHRoaXMuaXNVc2luZ0NhY2hlRnJvbVVybCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIXZhbCkgcmV0dXJuO1xuICAgIGlmICh2YWwuaW5kZXhPZihDaG9pY2VzUmVzdGZ1bGwuY2FjaGVUZXh0KSA+IC0xKSB7XG4gICAgICB0aGlzLmlzVXNpbmdDYWNoZUZyb21VcmwgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsLmluZGV4T2YoQ2hvaWNlc1Jlc3RmdWxsLm5vQ2FjaGVUZXh0KSA+IC0xKSB7XG4gICAgICAgIHRoaXMuaXNVc2luZ0NhY2hlRnJvbVVybCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGF0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYXRoXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWVOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVOYW1lXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCB0aXRsZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGl0bGVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGVOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGl0bGVOYW1lXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpbWFnZUxpbmtOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlTGlua05hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUxpbmtOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VMaW5rTmFtZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgYWxsb3dFbXB0eVJlc3BvbnNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd0VtcHR5UmVzcG9uc2VcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dFbXB0eVJlc3BvbnNlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93RW1wdHlSZXNwb25zZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgYXR0YWNoT3JpZ2luYWxJdGVtcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYXR0YWNoT3JpZ2luYWxJdGVtc1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBhdHRhY2hPcmlnaW5hbEl0ZW1zKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImF0dGFjaE9yaWdpbmFsSXRlbXNcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGl0ZW1WYWx1ZVR5cGUoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMub3duZXIpIHJldHVybiBcIml0ZW12YWx1ZVwiO1xuICAgIHZhciBwcm9wID0gU2VyaWFsaXplci5maW5kUHJvcGVydHkodGhpcy5vd25lci5nZXRUeXBlKCksIFwiY2hvaWNlc1wiKTtcbiAgICBpZiAoIXByb3ApIHJldHVybiBcIml0ZW12YWx1ZVwiO1xuICAgIGlmIChwcm9wLnR5cGUgPT0gXCJpdGVtdmFsdWVbXVwiKSByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgICByZXR1cm4gcHJvcC50eXBlO1xuICB9XG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLnVybCA9IFwiXCI7XG4gICAgdGhpcy5wYXRoID0gXCJcIjtcbiAgICB0aGlzLnZhbHVlTmFtZSA9IFwiXCI7XG4gICAgdGhpcy50aXRsZU5hbWUgPSBcIlwiO1xuICAgIHRoaXMuaW1hZ2VMaW5rTmFtZSA9IFwiXCI7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNOYW1lcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCg8YW55PnRoaXMpW3Byb3BlcnRpZXNbaV1dKSAoPGFueT50aGlzKVtwcm9wZXJ0aWVzW2ldXSA9IFwiXCI7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBiZWZvcmVTZW5kUmVxdWVzdCgpIHtcbiAgICBpZiAoISF0aGlzLmJlZm9yZVNlbmRSZXF1ZXN0Q2FsbGJhY2spIHtcbiAgICAgIHRoaXMuYmVmb3JlU2VuZFJlcXVlc3RDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25Mb2FkKHJlc3VsdDogYW55LCBsb2FkaW5nT2JqSGFzaDogc3RyaW5nID0gbnVsbCkge1xuICAgIGlmICghbG9hZGluZ09iakhhc2gpIHtcbiAgICAgIGxvYWRpbmdPYmpIYXNoID0gdGhpcy5vYmpIYXNoO1xuICAgIH1cbiAgICB2YXIgaXRlbXMgPSBuZXcgQXJyYXk8SXRlbVZhbHVlPigpO1xuICAgIHZhciB1cGRhdGVkUmVzdWx0ID0gdGhpcy5nZXRSZXN1bHRBZnRlclBhdGgocmVzdWx0KTtcbiAgICBpZiAodXBkYXRlZFJlc3VsdCAmJiB1cGRhdGVkUmVzdWx0W1wibGVuZ3RoXCJdKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVwZGF0ZWRSZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW1WYWx1ZSA9IHVwZGF0ZWRSZXN1bHRbaV07XG4gICAgICAgIGlmICghaXRlbVZhbHVlKSBjb250aW51ZTtcbiAgICAgICAgdmFyIHZhbHVlID0gISF0aGlzLmdldEl0ZW1WYWx1ZUNhbGxiYWNrXG4gICAgICAgICAgPyB0aGlzLmdldEl0ZW1WYWx1ZUNhbGxiYWNrKGl0ZW1WYWx1ZSlcbiAgICAgICAgICA6IHRoaXMuZ2V0VmFsdWUoaXRlbVZhbHVlKTtcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5nZXRUaXRsZShpdGVtVmFsdWUpO1xuICAgICAgICB2YXIgaXRlbSA9IG5ldyBJdGVtVmFsdWUodmFsdWUsIHRpdGxlKTtcbiAgICAgICAgdGhpcy5zZXRDdXN0b21Qcm9wZXJ0aWVzKGl0ZW0sIGl0ZW1WYWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaE9yaWdpbmFsSXRlbXMpIHtcbiAgICAgICAgICBpdGVtLm9yaWdpbmFsSXRlbSA9IGl0ZW1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW1hZ2VMaW5rID0gdGhpcy5nZXRJbWFnZUxpbmsoaXRlbVZhbHVlKTtcbiAgICAgICAgaWYgKCEhaW1hZ2VMaW5rKSB7XG4gICAgICAgICAgaXRlbS5pbWFnZUxpbmsgPSBpbWFnZUxpbms7XG4gICAgICAgIH1cbiAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCF0aGlzLmFsbG93RW1wdHlSZXNwb25zZSkge1xuICAgICAgICB0aGlzLmVycm9yID0gbmV3IFdlYlJlcXVlc3RFbXB0eUVycm9yKG51bGwsIHRoaXMub3duZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy51cGRhdGVSZXN1bHRDYWxsYmFjaykge1xuICAgICAgaXRlbXMgPSB0aGlzLnVwZGF0ZVJlc3VsdENhbGxiYWNrKGl0ZW1zLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1VzaW5nQ2FjaGUpIHtcbiAgICAgIENob2ljZXNSZXN0ZnVsbC5pdGVtc1Jlc3VsdFtsb2FkaW5nT2JqSGFzaF0gPSBpdGVtcztcbiAgICB9XG4gICAgdGhpcy5jYWxsUmVzdWx0Q2FsbGJhY2soaXRlbXMsIGxvYWRpbmdPYmpIYXNoKTtcbiAgICBDaG9pY2VzUmVzdGZ1bGwudW5yZWdpc3RlclNhbWVSZXF1ZXN0cyh0aGlzLCBpdGVtcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGNhbGxSZXN1bHRDYWxsYmFjayhcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBsb2FkaW5nT2JqSGFzaDogc3RyaW5nXG4gICkge1xuICAgIGlmIChsb2FkaW5nT2JqSGFzaCAhPSB0aGlzLm9iakhhc2gpIHJldHVybjtcbiAgICB0aGlzLmdldFJlc3VsdENhbGxiYWNrKGl0ZW1zKTtcbiAgfVxuICBwcml2YXRlIHNldEN1c3RvbVByb3BlcnRpZXMoaXRlbTogSXRlbVZhbHVlLCBpdGVtVmFsdWU6IGFueSkge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRDdXN0b21Qcm9wZXJ0aWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcCA9IHByb3BlcnRpZXNbaV07XG4gICAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZUNvcmUoXG4gICAgICAgIGl0ZW1WYWx1ZSxcbiAgICAgICAgdGhpcy5nZXRQcm9wZXJ0eUJpbmRpbmcocHJvcC5uYW1lKVxuICAgICAgKTtcbiAgICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkge1xuICAgICAgICAoPGFueT5pdGVtKVtwcm9wLm5hbWVdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFByb3BlcnR5QmluZGluZyhwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIGlmICgoPGFueT50aGlzKVt0aGlzLmdldEN1c3RvbVByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpXSlcbiAgICAgIHJldHVybiAoPGFueT50aGlzKVt0aGlzLmdldEN1c3RvbVByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpXTtcbiAgICBpZiAoKDxhbnk+dGhpcylbcHJvcGVydHlOYW1lXSkgcmV0dXJuICg8YW55PnRoaXMpW3Byb3BlcnR5TmFtZV07XG4gICAgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgfVxuICBwcml2YXRlIG9uRXJyb3Ioc3RhdHVzOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVycm9yID0gbmV3IFdlYlJlcXVlc3RFcnJvcihzdGF0dXMsIHJlc3BvbnNlLCB0aGlzLm93bmVyKTtcbiAgICB0aGlzLmRvRW1wdHlSZXN1bHRDYWxsYmFjayhyZXNwb25zZSk7XG4gICAgQ2hvaWNlc1Jlc3RmdWxsLnVucmVnaXN0ZXJTYW1lUmVxdWVzdHModGhpcywgW10pO1xuICB9XG4gIHByaXZhdGUgZ2V0UmVzdWx0QWZ0ZXJQYXRoKHJlc3VsdDogYW55KSB7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgaWYgKCF0aGlzLnByb2Nlc3NlZFBhdGgpIHJldHVybiByZXN1bHQ7XG4gICAgdmFyIHBhdGhlcyA9IHRoaXMuZ2V0UGF0aGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdFtwYXRoZXNbaV1dO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgZ2V0UGF0aGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBwYXRoZXMgPSBbXTtcbiAgICBpZiAodGhpcy5wcm9jZXNzZWRQYXRoLmluZGV4T2YoXCI7XCIpID4gLTEpIHtcbiAgICAgIHBhdGhlcyA9IHRoaXMucGF0aC5zcGxpdChcIjtcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhlcyA9IHRoaXMucHJvY2Vzc2VkUGF0aC5zcGxpdChcIixcIik7XG4gICAgfVxuICAgIGlmIChwYXRoZXMubGVuZ3RoID09IDApIHBhdGhlcy5wdXNoKHRoaXMucHJvY2Vzc2VkUGF0aCk7XG4gICAgcmV0dXJuIHBhdGhlcztcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlKGl0ZW06IGFueSk6IGFueSB7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy52YWx1ZU5hbWUpIHJldHVybiB0aGlzLmdldFZhbHVlQ29yZShpdGVtLCB0aGlzLnZhbHVlTmFtZSk7XG4gICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIE9iamVjdCkpIHJldHVybiBpdGVtO1xuICAgIHZhciBsZW4gPSBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGg7XG4gICAgaWYgKGxlbiA8IDEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBpdGVtW09iamVjdC5rZXlzKGl0ZW0pWzBdXTtcbiAgfVxuICBwcml2YXRlIGdldFRpdGxlKGl0ZW06IGFueSk6IGFueSB7XG4gICAgdmFyIHRpdGxlID0gdGhpcy50aXRsZU5hbWUgPyB0aGlzLnRpdGxlTmFtZSA6IFwidGl0bGVcIjtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUNvcmUoaXRlbSwgdGl0bGUpO1xuICB9XG4gIHByaXZhdGUgZ2V0SW1hZ2VMaW5rKGl0ZW06IGFueSk6IGFueSB7XG4gICAgdmFyIGltYWdlTGluayA9IHRoaXMuaW1hZ2VMaW5rTmFtZSA/IHRoaXMuaW1hZ2VMaW5rTmFtZSA6IFwiaW1hZ2VMaW5rXCI7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVDb3JlKGl0ZW0sIGltYWdlTGluayk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZUNvcmUoaXRlbTogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIWl0ZW0pIHJldHVybiBudWxsO1xuICAgIGlmIChwcm9wZXJ0eS5pbmRleE9mKFwiLlwiKSA8IDApIHJldHVybiBpdGVtW3Byb3BlcnR5XTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHByb3BlcnR5LnNwbGl0KFwiLlwiKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBpdGVtW3Byb3BlcnRpZXNbaV1dO1xuICAgICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW07XG4gIH1cbiAgcHJpdmF0ZSBnZXQgb2JqSGFzaCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcm9jZXNzZWRVcmwgK1xuICAgICAgXCI7XCIgK1xuICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoICtcbiAgICAgIFwiO1wiICtcbiAgICAgIHRoaXMudmFsdWVOYW1lICtcbiAgICAgIFwiO1wiICtcbiAgICAgIHRoaXMudGl0bGVOYW1lICtcbiAgICAgIFwiO1wiICtcbiAgICAgIHRoaXMuaW1hZ2VMaW5rTmFtZVxuICAgICk7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJjaG9pY2VzQnlVcmxcIixcbiAgW1xuICAgIFwidXJsXCIsXG4gICAgXCJwYXRoXCIsXG4gICAgXCJ2YWx1ZU5hbWVcIixcbiAgICBcInRpdGxlTmFtZVwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwiaW1hZ2VMaW5rTmFtZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhb2JqICYmICEhb2JqLm93bmVyICYmIG9iai5vd25lci5nZXRUeXBlKCkgPT0gXCJpbWFnZXBpY2tlclwiO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJhbGxvd0VtcHR5UmVzcG9uc2U6Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJhdHRhY2hPcmlnaW5hbEl0ZW1zOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IENob2ljZXNSZXN0ZnVsbCgpO1xuICB9XG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Nob2ljZXNSZXN0ZnVsbC50cyIsImltcG9ydCB7IE9wZXJhbmQsIENvbnN0IH0gZnJvbSBcIi4vZXhwcmVzc2lvbnMvZXhwcmVzc2lvbnNcIjtcbmltcG9ydCB7IFN5bnRheEVycm9yLCBwYXJzZSB9IGZyb20gXCIuL2V4cHJlc3Npb25zL2V4cHJlc3Npb25QYXJzZXJcIjtcblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbnNQYXJzZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBhdDogbnVtYmVyLCBwdWJsaWMgY29kZTogc3RyaW5nKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uc1BhcnNlciB7XG4gIHByaXZhdGUgY29uZGl0aW9uRXJyb3I6IENvbmRpdGlvbnNQYXJzZXJFcnJvcjtcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VyQ2FjaGU6IHsgW2luZGV4OiBzdHJpbmddOiBPcGVyYW5kIH0gPSB7fTtcblxuICBwcml2YXRlIHBhdGNoRXhwcmVzc2lvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGV4dFxuICAgICAgLnJlcGxhY2UoLz0+L2csIFwiPj1cIilcbiAgICAgIC5yZXBsYWNlKC89PC9nLCBcIjw9XCIpXG4gICAgICAucmVwbGFjZSgvPD4vZywgXCIhPVwiKVxuICAgICAgLnJlcGxhY2UoLz09L2csIFwiPSBcIilcbiAgICAgIC5yZXBsYWNlKC9lcXVhbHMvZywgXCJlcXVhbCBcIilcbiAgICAgIC5yZXBsYWNlKC9ub3RlcXVhbHMvZywgXCJub3RlcXVhbCBcIik7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQ29uZGl0aW9uKHRleHQ6IHN0cmluZyk6IE9wZXJhbmQge1xuICAgIHJldHVybiB0aGlzLnBhcnNlRXhwcmVzc2lvbih0ZXh0KTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUV4cHJlc3Npb24odGV4dDogc3RyaW5nKTogT3BlcmFuZCB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXN1bHQgPSBDb25kaXRpb25zUGFyc2VyLnBhcnNlckNhY2hlW3RleHRdO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc3VsdCA9IHBhcnNlKHRoaXMucGF0Y2hFeHByZXNzaW9uKHRleHQpKTtcbiAgICAgICAgaWYgKCFyZXN1bHQuaGFzQXN5bmNGdW5jdGlvbigpKSB7XG4gICAgICAgICAgQ29uZGl0aW9uc1BhcnNlci5wYXJzZXJDYWNoZVt0ZXh0XSA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgIHRoaXMuY29uZGl0aW9uRXJyb3IgPSBuZXcgQ29uZGl0aW9uc1BhcnNlckVycm9yKFxuICAgICAgICAgIGUubG9jYXRpb24uc3RhcnQub2Zmc2V0LFxuICAgICAgICAgIGUubWVzc2FnZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXJyb3IoKTogQ29uZGl0aW9uc1BhcnNlckVycm9yIHtcbiAgICByZXR1cm4gdGhpcy5jb25kaXRpb25FcnJvcjtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NvbmRpdGlvbnNQYXJzZXIudHMiLCJpbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG4vKipcbiAqIFRoZSBjbGFzcyBjb250YWlucyBtZXRob2RzIHRvIHdvcmsgd2l0aCBhcGkuc3VydmV5anMuaW8gc2VydmljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIGR4U3VydmV5U2VydmljZSB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IHNlcnZpY2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc2V0dGluZ3Muc3VydmV5U2VydmljZVVybDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldCBzZXJ2aWNlVXJsKHZhbDogc3RyaW5nKSB7XG4gICAgc2V0dGluZ3Muc3VydmV5U2VydmljZVVybCA9IHZhbDtcbiAgfVxuICBjb25zdHJ1Y3RvcigpIHt9XG4gIHB1YmxpYyBsb2FkU3VydmV5KFxuICAgIHN1cnZleUlkOiBzdHJpbmcsXG4gICAgb25Mb2FkOiAoc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKFxuICAgICAgXCJHRVRcIixcbiAgICAgIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvZ2V0U3VydmV5P3N1cnZleUlkPVwiICsgc3VydmV5SWRcbiAgICApO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgb25Mb2FkKHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBnZXRTdXJ2ZXlKc29uQW5kSXNDb21wbGV0ZWQoXG4gICAgc3VydmV5SWQ6IHN0cmluZyxcbiAgICBjbGllbnRJZDogc3RyaW5nLFxuICAgIG9uTG9hZDogKFxuICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgIHN1cnZleUpzb246IGFueSxcbiAgICAgIHJlc3VsdDogc3RyaW5nLFxuICAgICAgcmVzcG9uc2U6IGFueVxuICAgICkgPT4gdm9pZFxuICApIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oXG4gICAgICBcIkdFVFwiLFxuICAgICAgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgK1xuICAgICAgICBcIi9nZXRTdXJ2ZXlBbmRJc0NvbXBsZXRlZD9zdXJ2ZXlJZD1cIiArXG4gICAgICAgIHN1cnZleUlkICtcbiAgICAgICAgXCImY2xpZW50SWQ9XCIgK1xuICAgICAgICBjbGllbnRJZFxuICAgICk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICB2YXIgc3VydmV5SnNvbiA9IHJlc3VsdCA/IHJlc3VsdC5zdXJ2ZXkgOiBudWxsO1xuICAgICAgdmFyIGlzQ29tcGxldGVkID0gcmVzdWx0ID8gcmVzdWx0LmlzQ29tcGxldGVkIDogbnVsbDtcbiAgICAgIG9uTG9hZCh4aHIuc3RhdHVzID09IDIwMCwgc3VydmV5SnNvbiwgaXNDb21wbGV0ZWQsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBzZW5kUmVzdWx0KFxuICAgIHBvc3RJZDogc3RyaW5nLFxuICAgIHJlc3VsdDogSlNPTixcbiAgICBvblNlbmRSZXN1bHQ6IChzdWNjZXNzOiBib29sZWFuLCByZXNwb25zZTogYW55LCByZXF1ZXN0PzogYW55KSA9PiB2b2lkLFxuICAgIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLFxuICAgIGlzUGFydGlhbENvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbihcIlBPU1RcIiwgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyBcIi9wb3N0L1wiKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgdmFyIGRhdGEgPSB7IHBvc3RJZDogcG9zdElkLCBzdXJ2ZXlSZXN1bHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCkgfTtcbiAgICBpZiAoY2xpZW50SWQpICg8YW55PmRhdGEpW1wiY2xpZW50SWRcIl0gPSBjbGllbnRJZDtcbiAgICBpZiAoaXNQYXJ0aWFsQ29tcGxldGVkKSAoPGFueT5kYXRhKVtcImlzUGFydGlhbENvbXBsZXRlZFwiXSA9IHRydWU7XG4gICAgdmFyIGRhdGFTdHJpbmdpZnk6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB4aHIub25sb2FkID0geGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIW9uU2VuZFJlc3VsdCkgcmV0dXJuO1xuICAgICAgb25TZW5kUmVzdWx0KHhoci5zdGF0dXMgPT09IDIwMCwgeGhyLnJlc3BvbnNlLCB4aHIpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoZGF0YVN0cmluZ2lmeSk7XG4gIH1cbiAgcHVibGljIHNlbmRGaWxlKFxuICAgIHBvc3RJZDogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUsXG4gICAgb25TZW5kRmlsZTogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vbmxvYWQgPSB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghb25TZW5kRmlsZSkgcmV0dXJuO1xuICAgICAgb25TZW5kRmlsZSh4aHIuc3RhdHVzID09IDIwMCwgSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpKTtcbiAgICB9O1xuICAgIHhoci5vcGVuKFwiUE9TVFwiLCBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArIFwiL3VwbG9hZC9cIiwgdHJ1ZSk7XG4gICAgdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCBmaWxlKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJwb3N0SWRcIiwgcG9zdElkKTtcbiAgICB4aHIuc2VuZChmb3JtRGF0YSk7XG4gIH1cbiAgcHVibGljIGdldFJlc3VsdChcbiAgICByZXN1bHRJZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbkdldFJlc3VsdDogKFxuICAgICAgc3VjY2VzczogYm9vbGVhbixcbiAgICAgIGRhdGE6IGFueSxcbiAgICAgIGRhdGFMaXN0OiBBcnJheTxhbnk+LFxuICAgICAgcmVzcG9uc2U6IGFueVxuICAgICkgPT4gdm9pZFxuICApIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgdmFyIGRhdGEgPSBcInJlc3VsdElkPVwiICsgcmVzdWx0SWQgKyBcIiZuYW1lPVwiICsgbmFtZTtcbiAgICB4aHIub3BlbihcIkdFVFwiLCBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArIFwiL2dldFJlc3VsdD9cIiArIGRhdGEpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IG51bGw7XG4gICAgICB2YXIgbGlzdCA9IG51bGw7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2UpO1xuICAgICAgICBsaXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQuUXVlc3Rpb25SZXN1bHQpIHtcbiAgICAgICAgICB2YXIgZWwgPSB7IG5hbWU6IGtleSwgdmFsdWU6IHJlc3VsdC5RdWVzdGlvblJlc3VsdFtrZXldIH07XG4gICAgICAgICAgbGlzdC5wdXNoKGVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb25HZXRSZXN1bHQoeGhyLnN0YXR1cyA9PSAyMDAsIHJlc3VsdCwgbGlzdCwgeGhyLnJlc3BvbnNlKTtcbiAgICB9O1xuICAgIHhoci5zZW5kKCk7XG4gIH1cbiAgcHVibGljIGlzQ29tcGxldGVkKFxuICAgIHJlc3VsdElkOiBzdHJpbmcsXG4gICAgY2xpZW50SWQ6IHN0cmluZyxcbiAgICBvbklzQ29tcGxldGVkOiAoc3VjY2VzczogYm9vbGVhbiwgcmVzdWx0OiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHZhciBkYXRhID0gXCJyZXN1bHRJZD1cIiArIHJlc3VsdElkICsgXCImY2xpZW50SWQ9XCIgKyBjbGllbnRJZDtcbiAgICB4aHIub3BlbihcIkdFVFwiLCBkeFN1cnZleVNlcnZpY2Uuc2VydmljZVVybCArIFwiL2lzQ29tcGxldGVkP1wiICsgZGF0YSk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCkge1xuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBvbklzQ29tcGxldGVkKHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZHhTdXJ2ZXlTZXJ2aWNlLnRzIiwiLy9VbmNvbW1lbnQgdGhpcyBsaW5lIG9uIGNyZWF0aW5nIGEgdHJhbnNsYXRpb24gZmlsZVxuLy9pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGVuZ2xpc2hTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJldmlvdXNcIixcbiAgcGFnZU5leHRUZXh0OiBcIk5leHRcIixcbiAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRlXCIsXG4gIHByZXZpZXdUZXh0OiBcIlByZXZpZXdcIixcbiAgZWRpdFRleHQ6IFwiRWRpdFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJPdGhlciAoZGVzY3JpYmUpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJOb25lXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlNlbGVjdCBBbGxcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2UgezB9IG9mIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiUmVjb3JkIHswfSBvZiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkFuc3dlcmVkIHswfS97MX0gcXVlc3Rpb25zXCIsXG4gIGVtcHR5U3VydmV5OiBcIlRoZXJlIGlzIG5vIHZpc2libGUgcGFnZSBvciBxdWVzdGlvbiBpbiB0aGUgc3VydmV5LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlRoYW5rIHlvdSBmb3IgY29tcGxldGluZyB0aGUgc3VydmV5IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiT3VyIHJlY29yZHMgc2hvdyB0aGF0IHlvdSBoYXZlIGFscmVhZHkgY29tcGxldGVkIHRoaXMgc3VydmV5LlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxvYWRpbmcgU3VydmV5Li4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIkNob29zZS4uLlwiLFxuICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlBsZWFzZSBhbnN3ZXIgdGhlIHF1ZXN0aW9uLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQbGVhc2UgYW5zd2VyIGF0IGxlYXN0IG9uZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJQbGVhc2UgYW5zd2VyIHF1ZXN0aW9ucyBpbiBhbGwgcm93cy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlRoZSB2YWx1ZSBzaG91bGQgYmUgbnVtZXJpYy5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQbGVhc2UgZW50ZXIgYXQgbGVhc3QgezB9IGNoYXJhY3RlcnMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUGxlYXNlIGVudGVyIGxlc3MgdGhhbiB7MH0gY2hhcmFjdGVycy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJQbGVhc2UgZW50ZXIgbW9yZSB0aGFuIHswfSBhbmQgbGVzcyB0aGFuIHsxfSBjaGFyYWN0ZXJzLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlBsZWFzZSBmaWxsIGluIGF0IGxlYXN0IHswfSByb3dzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IHswfSB2YXJpYW50cy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUGxlYXNlIHNlbGVjdCBubyBtb3JlIHRoYW4gezB9IHZhcmlhbnRzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBtb3JlIHRoYW4gezF9IGFuZCBlcXVhbCBvciBsZXNzIHRoYW4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBtb3JlIHRoYW4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlLW1haWwgYWRkcmVzcy5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVGhlIGV4cHJlc3Npb246IHswfSBzaG91bGQgcmV0dXJuICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlRoZSByZXF1ZXN0IHJldHVybmVkIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiVGhlIHJlcXVlc3QgcmV0dXJuZWQgZW1wdHkgZGF0YSBvciB0aGUgJ3BhdGgnIHByb3BlcnR5IGlzIGluY29ycmVjdFwiLFxuICBleGNlZWRNYXhTaXplOiBcIlRoZSBmaWxlIHNpemUgc2hvdWxkIG5vdCBleGNlZWQgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUGxlYXNlIGVudGVyIHRoZSBvdGhlciB2YWx1ZS5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIllvdXIgZmlsZSBpcyB1cGxvYWRpbmcuIFBsZWFzZSB3YWl0IHNldmVyYWwgc2Vjb25kcyBhbmQgdHJ5IGFnYWluLlwiLFxuICBsb2FkaW5nRmlsZTogXCJMb2FkaW5nLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiQ2hvb3NlIGZpbGUocykuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5vIGZpbGUgY2hvc2VuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiRG8geW91IHdhbnQgdG8gZGVsZXRlIHRoZSByZWNvcmQ/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiVGhpcyB2YWx1ZSBzaG91bGQgYmUgdW5pcXVlLlwiLFxuICBhZGRDb2x1bW46IFwiQWRkIGNvbHVtblwiLFxuICBhZGRSb3c6IFwiQWRkIHJvd1wiLFxuICByZW1vdmVSb3c6IFwiUmVtb3ZlXCIsXG4gIGFkZFBhbmVsOiBcIkFkZCBuZXdcIixcbiAgcmVtb3ZlUGFuZWw6IFwiUmVtb3ZlXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sdW1uXCIsXG4gIG1hdHJpeF9yb3c6IFwiUm93XCIsXG4gIHNhdmluZ0RhdGE6IFwiVGhlIHJlc3VsdHMgYXJlIHNhdmluZyBvbiB0aGUgc2VydmVyLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJBbiBlcnJvciBvY2N1cnJlZCBhbmQgd2UgY291bGQgbm90IHNhdmUgdGhlIHJlc3VsdHMuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlRoZSByZXN1bHRzIHdlcmUgc2F2ZWQgc3VjY2Vzc2Z1bGx5IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiVHJ5IGFnYWluXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCJZb3UgaGF2ZSBzcGVudCB7MH0gb24gdGhpcyBwYWdlIGFuZCB7MX0gaW4gdG90YWwuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIllvdSBoYXZlIHNwZW50IHswfSBvbiB0aGlzIHBhZ2UuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiWW91IGhhdmUgc3BlbnQgezB9IGluIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBvbiB0aGlzIHBhZ2UgYW5kIHsyfSBvZiB7M30gaW4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIllvdSBoYXZlIHNwZW50IHswfSBvZiB7MX0gb24gdGhpcyBwYWdlLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIllvdSBoYXZlIHNwZW50IHswfSBvZiB7MX0gaW4gdG90YWwuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJDbGVhblwiLFxuICBjbGVhckNhcHRpb246IFwiQ2xlYXJcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiQ2hvb3NlIGZpbGVcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiUmVtb3ZlIHRoaXMgZmlsZVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIlllc1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTm9cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlIHRoaXMgZmlsZTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiQXJlIHlvdSBzdXJlIHRoYXQgeW91IHdhbnQgdG8gcmVtb3ZlIGFsbCBmaWxlcz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlF1ZXN0aW9uIFRpdGxlXCIsXG59O1xuXG4vL1VuY29tbWVudCB0aGVzZSB0d28gbGluZXMgb24gY3JlYXRpbmcgYSB0cmFuc2xhdGlvbiBmaWxlLiBZb3Ugc2hvdWxkIHJlcGxhY2UgXCJlblwiIGFuZCBlblN0cmluZ3Mgd2l0aCB5b3VyIGxvY2FsZSAoXCJmclwiLCBcImRlXCIgYW5kIHNvIG9uKSBhbmQgeW91ciB2YXJpYWJsZS5cbi8vc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJlblwiXSA9IGVuZ2xpc2hTdHJpbmdzO1xuLy9zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJlblwiXSA9IFwiRW5nbGlzaFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9lbmdsaXNoLnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG1hdHJpeCBiYXNlIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhCYXNlTW9kZWw8VFJvdywgVENvbHVtbj4gZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIHByb3RlY3RlZCBmaWx0ZXJlZENvbHVtbnM6IEFycmF5PFRDb2x1bW4+O1xuICBwcm90ZWN0ZWQgZmlsdGVyZWRSb3dzOiBBcnJheTxJdGVtVmFsdWU+O1xuICBwcm90ZWN0ZWQgZ2VuZXJhdGVkVmlzaWJsZVJvd3M6IEFycmF5PFRSb3c+ID0gbnVsbDtcbiAgcHJvdGVjdGVkIGdlbmVyYXRlZFRvdGFsUm93OiBUUm93ID0gbnVsbDtcbiAgcHVibGljIHZpc2libGVSb3dzQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIHByb3RlY3RlZCBjcmVhdGVDb2x1bW5WYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwiY29sdW1uc1wiKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IG51bGw7XG4gICAgdGhpcy5maWx0ZXJlZENvbHVtbnMgPSBudWxsO1xuICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuY3JlYXRlQ29sdW1uVmFsdWVzKCk7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwicm93c1wiKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1hdHJpeGJhc2VcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ29tcG9zaXRlUXVlc3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBpc0FsbG93VGl0bGVMZWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UsIHRvIGhpZGUgdGFibGUgaGVhZGVyLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93SGVhZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93SGVhZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd0hlYWRlcih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93SGVhZGVyXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGNvbHVtbnMuIEEgY29sdW1uIGhhcyBhIHZhbHVlIGFuZCBhbiBvcHRpb25hbCB0ZXh0XG4gICAqL1xuICBnZXQgY29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uc1wiKTtcbiAgfVxuICBzZXQgY29sdW1ucyhuZXdWYWx1ZTogQXJyYXk8YW55Pikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbnNcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZUNvbHVtbnMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuICEhdGhpcy5maWx0ZXJlZENvbHVtbnMgPyB0aGlzLmZpbHRlcmVkQ29sdW1ucyA6IHRoaXMuY29sdW1ucztcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2Ygcm93cy4gQSByb3cgaGFzIGEgdmFsdWUgYW5kIGFuIG9wdGlvbmFsIHRleHRcbiAgICovXG4gIGdldCByb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIpO1xuICB9XG4gIHNldCByb3dzKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdmFyIG5ld1Jvd3MgPSB0aGlzLnByb2Nlc3NSb3dzT25TZXQobmV3VmFsdWUpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIiwgbmV3Um93cyk7XG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG4gIHByb3RlY3RlZCBwcm9jZXNzUm93c09uU2V0KG5ld1Jvd3M6IEFycmF5PGFueT4pIHtcbiAgICByZXR1cm4gbmV3Um93cztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmlzaWJsZVJvd3MoKTogQXJyYXk8VFJvdz4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB2aXNpYmxlIHJvd3MgYXMgbW9kZWwgb2JqZWN0cy5cbiAgICogQHNlZSByb3dzVmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVSb3dzKCk6IEFycmF5PFRSb3c+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWaXNpYmxlUm93cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIEl0IHJ1bnMgYWdhaW5zdCBlYWNoIHJvdyBpdGVtIGFuZCBpZiBmb3IgdGhpcyBpdGVtIGl0IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgaXRlbSBpcyB2aXNpYmxlIG90aGVyd2lzZSB0aGUgaXRlbSBiZWNvbWVzIGludmlzaWJsZS4gUGxlYXNlIHVzZSB7aXRlbX0gdG8gZ2V0IHRoZSBjdXJyZW50IGl0ZW0gdmFsdWUgaW4gdGhlIGV4cHJlc3Npb24uXG4gICAqIEBzZWUgdmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd3NWaXNpYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c1Zpc2libGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJvd3NWaXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dzVmlzaWJsZUlmXCIsIHZhbCk7XG4gICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJdCBydW5zIGFnYWluc3QgZWFjaCBjb2x1bW4gaXRlbSBhbmQgaWYgZm9yIHRoaXMgaXRlbSBpdCByZXR1cm5zIHRydWUsIHRoZW4gdGhlIGl0ZW0gaXMgdmlzaWJsZSBvdGhlcndpc2UgdGhlIGl0ZW0gYmVjb21lcyBpbnZpc2libGUuIFBsZWFzZSB1c2Uge2l0ZW19IHRvIGdldCB0aGUgY3VycmVudCBpdGVtIHZhbHVlIGluIHRoZSBleHByZXNzaW9uLlxuICAgKiBAc2VlIHJvd3NWaXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgY29sdW1uc1Zpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5zVmlzaWJsZUlmXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sdW1uc1Zpc2libGVJZih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbnNWaXNpYmxlSWZcIiwgdmFsKTtcbiAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMucnVuSXRlbXNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZmlsdGVySXRlbXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nKSB7XG4gICAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHwgIXRoaXMuZGF0YSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnJ1bkl0ZW1zQ29uZGl0aW9uKFxuICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRWYWx1ZXMoKSxcbiAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Db2x1bW5zQ2hhbmdlZCgpIHt9XG4gIHByb3RlY3RlZCBvblJvd3NDaGFuZ2VkKCkge1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudmlzaWJsZVJvd3NDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIHByb3RlY3RlZCBzaG91bGRSdW5Db2x1bW5FeHByZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5zdXJ2ZXkgfHwgIXRoaXMuc3VydmV5LmFyZUludmlzaWJsZUVsZW1lbnRzU2hvd2luZztcbiAgfVxuICBwcm90ZWN0ZWQgaGFzUm93c0FzSXRlbXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIHJ1bkl0ZW1zQ29uZGl0aW9uKFxuICAgIHZhbHVlczogSGFzaFRhYmxlPGFueT4sXG4gICAgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIG9sZFZpc2libGVSb3dzID0gbnVsbDtcbiAgICBpZiAoISF0aGlzLmZpbHRlcmVkUm93cyAmJiAhSGVscGVycy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpKSB7XG4gICAgICBvbGRWaXNpYmxlUm93cyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZpbHRlcmVkUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBvbGRWaXNpYmxlUm93cy5wdXNoKHRoaXMuZmlsdGVyZWRSb3dzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGhhc0NoYW5nZXMgPVxuICAgICAgdGhpcy5oYXNSb3dzQXNJdGVtcygpICYmIHRoaXMucnVuQ29uZGl0aW9uc0ZvclJvd3ModmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB2YXIgaGFzQ29sdW1uc0NoYW5nZWQgPSB0aGlzLnJ1bkNvbmRpdGlvbnNGb3JDb2x1bW5zKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgaGFzQ2hhbmdlcyA9IGhhc0NvbHVtbnNDaGFuZ2VkIHx8IGhhc0NoYW5nZXM7XG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgISF0aGlzLnN1cnZleSAmJlxuICAgICAgICB0aGlzLnN1cnZleS5pc0NsZWFyVmFsdWVPbkhpZGRlbiAmJlxuICAgICAgICAoISF0aGlzLmZpbHRlcmVkQ29sdW1ucyB8fCAhIXRoaXMuZmlsdGVyZWRSb3dzKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICAgIH1cbiAgICAgIGlmICghIW9sZFZpc2libGVSb3dzKSB7XG4gICAgICAgIHRoaXMucmVzdG9yZU5ld1Zpc2libGVSb3dzVmFsdWVzKG9sZFZpc2libGVSb3dzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgICAgaWYgKGhhc0NvbHVtbnNDaGFuZ2VkKSB7XG4gICAgICAgIHRoaXMub25Db2x1bW5zQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VzO1xuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9uc0ZvclJvd3MoXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB2YXIgc2hvd0ludmlzaWJpbGUgPVxuICAgICAgISF0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5hcmVJbnZpc2libGVFbGVtZW50c1Nob3dpbmc7XG4gICAgdmFyIHJ1bm5lciA9XG4gICAgICAhc2hvd0ludmlzaWJpbGUgJiYgISF0aGlzLnJvd3NWaXNpYmxlSWZcbiAgICAgICAgPyBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMucm93c1Zpc2libGVJZilcbiAgICAgICAgOiBudWxsO1xuICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gW107XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBJdGVtVmFsdWUucnVuQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgICAgdGhpcy5yb3dzLFxuICAgICAgdGhpcy5maWx0ZXJlZFJvd3MsXG4gICAgICBydW5uZXIsXG4gICAgICB2YWx1ZXMsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgIXNob3dJbnZpc2liaWxlXG4gICAgKTtcbiAgICBpZiAodGhpcy5maWx0ZXJlZFJvd3MubGVuZ3RoID09PSB0aGlzLnJvd3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkUm93cyA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VkO1xuICB9XG4gIHByaXZhdGUgcnVuQ29uZGl0aW9uc0ZvckNvbHVtbnMoXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB2YXIgdXNlQ29sdW1uc0V4cHJlc3Npb24gPVxuICAgICAgISF0aGlzLnN1cnZleSAmJiAhdGhpcy5zdXJ2ZXkuYXJlSW52aXNpYmxlRWxlbWVudHNTaG93aW5nO1xuICAgIHZhciBydW5uZXIgPVxuICAgICAgdXNlQ29sdW1uc0V4cHJlc3Npb24gJiYgISF0aGlzLmNvbHVtbnNWaXNpYmxlSWZcbiAgICAgICAgPyBuZXcgQ29uZGl0aW9uUnVubmVyKHRoaXMuY29sdW1uc1Zpc2libGVJZilcbiAgICAgICAgOiBudWxsO1xuICAgIHRoaXMuZmlsdGVyZWRDb2x1bW5zID0gW107XG4gICAgdmFyIGhhc0NoYW5nZWQgPSBJdGVtVmFsdWUucnVuQ29uZGl0aW9uc0Zvckl0ZW1zKFxuICAgICAgdGhpcy5jb2x1bW5zLFxuICAgICAgPGFueT50aGlzLmZpbHRlcmVkQ29sdW1ucyxcbiAgICAgIHJ1bm5lcixcbiAgICAgIHZhbHVlcyxcbiAgICAgIHByb3BlcnRpZXMsXG4gICAgICB0aGlzLnNob3VsZFJ1bkNvbHVtbkV4cHJlc3Npb24oKVxuICAgICk7XG4gICAgaWYgKHRoaXMuZmlsdGVyZWRDb2x1bW5zLmxlbmd0aCA9PT0gdGhpcy5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWx0ZXJlZENvbHVtbnMgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlZDtcbiAgfVxuICBwdWJsaWMgY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsID0gbnVsbDtcbiAgICB2YXIgaXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgdmFyIGNvbHVtbnMgPSAhIXRoaXMuZmlsdGVyZWRDb2x1bW5zID8gdGhpcy5maWx0ZXJlZENvbHVtbnMgOiB0aGlzLmNvbHVtbnM7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbCkge1xuICAgICAgaWYgKFxuICAgICAgICBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUocm93cywga2V5KSAmJlxuICAgICAgICBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUoY29sdW1ucywgdmFsW2tleV0pXG4gICAgICApIHtcbiAgICAgICAgaWYgKG5ld1ZhbCA9PSBudWxsKSBuZXdWYWwgPSB7fTtcbiAgICAgICAgKDxhbnk+bmV3VmFsKVtrZXldID0gdmFsW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsO1xuICAgIH1cbiAgICBzdXBlci5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhckludmlzaWJsZVZhbHVlc0luUm93cygpIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KCkpIHJldHVybjtcbiAgICB2YXIgbmV3RGF0YSA9IEhlbHBlcnMuZ2V0VW5iaW5kVmFsdWUodGhpcy52YWx1ZSk7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gcm93c1tpXS52YWx1ZTtcbiAgICAgIGlmICghIW5ld0RhdGFba2V5XSAmJiAhcm93c1tpXS5pc1Zpc2libGUpIHtcbiAgICAgICAgZGVsZXRlIG5ld0RhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhuZXdEYXRhLCB0aGlzLnZhbHVlKSkgcmV0dXJuO1xuICAgIHRoaXMudmFsdWUgPSBuZXdEYXRhO1xuICB9XG4gIHByaXZhdGUgcmVzdG9yZU5ld1Zpc2libGVSb3dzVmFsdWVzKG9sZFZpc2libGVSb3dzOiBhbnkpIHtcbiAgICB2YXIgcm93cyA9ICEhdGhpcy5maWx0ZXJlZFJvd3MgPyB0aGlzLmZpbHRlcmVkUm93cyA6IHRoaXMucm93cztcbiAgICB2YXIgdmFsID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgdmFyIG5ld1ZhbHVlID0gSGVscGVycy5nZXRVbmJpbmRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB2YXIgaXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yICh2YXIga2V5IGluIHZhbCkge1xuICAgICAgaWYgKFxuICAgICAgICBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUocm93cywga2V5KSAmJlxuICAgICAgICAhSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKG9sZFZpc2libGVSb3dzLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgaWYgKG5ld1ZhbHVlID09IG51bGwpIG5ld1ZhbHVlID0ge307XG4gICAgICAgICg8YW55Pm5ld1ZhbHVlKVtrZXldID0gdmFsW2tleV07XG4gICAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhiYXNlXCIsXG4gIFtcbiAgICBcImNvbHVtbnNWaXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJyb3dzVmlzaWJsZUlmOmNvbmRpdGlvblwiLFxuICAgIHsgbmFtZTogXCJzaG93SGVhZGVyOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICBdLFxuICB1bmRlZmluZWQsXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9tYXJ0aXhCYXNlLnRzIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gIElQYWdlLFxuICBJUGFuZWwsXG4gIElFbGVtZW50LFxuICBJU3VydmV5RWxlbWVudCxcbiAgSVF1ZXN0aW9uLFxuICBTdXJ2ZXlFbGVtZW50XG59IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IERyYWdEcm9wSW5mbywgUGFuZWxNb2RlbEJhc2UsIFF1ZXN0aW9uUm93TW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuXG4vKipcbiAqIFRoZSBwYWdlIG9iamVjdC4gSXQgaGFzIGVsZW1lbnRzIGNvbGxlY3Rpb24sIHRoYXQgY29udGFpbnMgcXVlc3Rpb25zIGFuZCBwYW5lbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlTW9kZWwgZXh0ZW5kcyBQYW5lbE1vZGVsQmFzZSBpbXBsZW1lbnRzIElQYWdlIHtcbiAgcHJpdmF0ZSBoYXNTaG93blZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubG9jVGl0bGUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICBpZiAoc2VsZi5udW0gPiAwKSByZXR1cm4gc2VsZi5udW0gKyBcIi4gXCIgKyB0ZXh0O1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhZ2VcIjtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNQYWdlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBkZWxldGUoKSB7XG4gICAgaWYgKCEhdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMucmVtb3ZlU2VsZkZyb21MaXN0KHRoaXMuc3VydmV5LnBhZ2VzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIG9uRmlyc3RSZW5kZXJpbmcoKSB7XG4gICAgaWYgKHRoaXMud2FzU2hvd24pIHJldHVybjtcbiAgICBzdXBlci5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB2aXNpYmxlIGluZGV4IG9mIHRoZSBwYWdlLiBJdCBoYXMgdmFsdWVzIGZyb20gMCB0byB2aXNpYmxlIHBhZ2UgY291bnQgLSAxLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnZpc2libGVQYWdlc1xuICAgKiBAc2VlIFN1cnZleU1vZGVsLnBhZ2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUluZGV4KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUluZGV4XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIHBhZ2UgaXMgc3RhcnRlZCBwYWdlIGluIHRoZSBzdXJ2ZXkuIEl0IGNhbiBiZSBzaG93biBvbiB0aGUgc3RhcnQgb25seSBhbmQgdGhlIGVuZC11c2VyIGNvdWxkIG5vdCBjb21lYmFjayB0byBpdCBhZnRlciBpdCBwYXNzZWQgaXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzU3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNQYWdlU3RhcnRlZCh0aGlzKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc0NsYXNzZXMoKTogYW55IHtcbiAgICB2YXIgY3NzID0gdGhpcy5jc3M7XG4gICAgdmFyIGNsYXNzZXMgPSB7IHBhZ2U6IHt9LCBwYWdlVGl0bGU6IFwiXCIsIHBhZ2VEZXNjcmlwdGlvbjogXCJcIiwgcm93OiBcIlwiIH07XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLnBhZ2UsIGNzcy5wYWdlKTtcbiAgICBpZiAoISFjc3MucGFnZVRpdGxlKSB7XG4gICAgICBjbGFzc2VzLnBhZ2VUaXRsZSA9IGNzcy5wYWdlVGl0bGU7XG4gICAgfVxuICAgIGlmICghIWNzcy5wYWdlRGVzY3JpcHRpb24pIHtcbiAgICAgIGNsYXNzZXMucGFnZURlc2NyaXB0aW9uID0gY3NzLnBhZ2VEZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKCEhY3NzLnJvdykge1xuICAgICAgY2xhc3Nlcy5yb3cgPSBjc3Mucm93O1xuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnVwZGF0ZVBhZ2VDc3NDbGFzc2VzKHRoaXMsIGNsYXNzZXMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxuICBnZXRJc1BhZ2VWaXNpYmxlKGV4Y2VwdGlvblF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N0YXJ0ZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gc3VwZXIuZ2V0SXNQYWdlVmlzaWJsZShleGNlcHRpb25RdWVzdGlvbik7XG4gIH1cbiAgcHVibGljIGdldCBudW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm51bVwiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCBudW0odmFsOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5udW0gPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibnVtXCIsIHZhbCk7XG4gICAgdGhpcy5vbk51bUNoYW5nZWQodmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJoaWRlXCIgdG8gbWFrZSBcIlByZXZcIiwgXCJOZXh0XCIgYW5kIFwiQ29tcGxldGVcIiBidXR0b25zIGFyZSBpbnZpc2libGUgZm9yIHRoaXMgcGFnZS4gU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJzaG93XCIgdG8gbWFrZSB0aGVzZSBidXR0b25zIHZpc2libGUsIGV2ZW4gaWYgc3VydmV5IHNob3dOYXZpZ2F0aW9uQnV0dG9ucyBwcm9wZXJ0eSBpcyBmYWxzZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlLnNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgKi9cbiAgcHVibGljIGdldCBuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIsIHZhbC50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdHJ1ZSwgaWYgdGhlIHBhZ2UgaGFzIGJlZW4gc2hvd24gdG8gdGhlIGVuZC11c2VyLlxuICAgKi9cbiAgcHVibGljIGdldCB3YXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNTaG93blZhbHVlO1xuICB9XG4gIGdldCBoYXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53YXNTaG93bjtcbiAgfVxuICBwdWJsaWMgc2V0V2FzU2hvd24odmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLmhhc1Nob3duVmFsdWUpIHJldHVybjtcbiAgICB0aGlzLmhhc1Nob3duVmFsdWUgPSB2YWw7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgaWYgKHZhbCA9PSB0cnVlICYmIHRoaXMuYXJlUXVlc3Rpb25zUmFuZG9taXplZCkge1xuICAgICAgdGhpcy5yYW5kb21pemVFbGVtZW50cygpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzUmFuZG9taXppbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByYW5kb21pemVFbGVtZW50cygpIHtcbiAgICBpZiAodGhpcy5pc1JhbmRvbWl6aW5nKSByZXR1cm47XG4gICAgdGhpcy5pc1JhbmRvbWl6aW5nID0gdHJ1ZTtcbiAgICB2YXIgb2xkRWxlbWVudHMgPSBbXTtcbiAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9sZEVsZW1lbnRzLnB1c2goZWxlbWVudHNbaV0pO1xuICAgIH1cbiAgICB2YXIgbmV3RWxlbWVudHMgPSBIZWxwZXJzLnJhbmRvbWl6ZUFycmF5PElFbGVtZW50PihvbGRFbGVtZW50cyk7XG4gICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoMCwgdGhpcy5lbGVtZW50cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHMucHVzaChuZXdFbGVtZW50c1tpXSk7XG4gICAgfVxuICAgIHRoaXMuaXNSYW5kb21pemluZyA9IGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgcmV0dXJucyB0cnVlLCBpZiB0aGUgZWxlbWVudHMgYXJlIHJhbmRvbWl6ZWQgb24gdGhlIHBhZ2VcbiAgICogQHNlZSBoYXNTaG93blxuICAgKiBAc2VlIHF1ZXN0aW9uc09yZGVyXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25zT3JkZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgYXJlUXVlc3Rpb25zUmFuZG9taXplZCgpOiBib29sZWFuIHtcbiAgICB2YXIgb3JkZXIgPVxuICAgICAgdGhpcy5xdWVzdGlvbnNPcmRlciA9PSBcImRlZmF1bHRcIiAmJiB0aGlzLnN1cnZleVxuICAgICAgICA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uc09yZGVyXG4gICAgICAgIDogdGhpcy5xdWVzdGlvbnNPcmRlcjtcbiAgICByZXR1cm4gb3JkZXIgPT0gXCJyYW5kb21cIjtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gcmFuZG9taXplIHF1ZXN0aW9ucy4gU2V0IGl0IHRvICdyYW5kb20nIHRvIHJhbmRvbWl6ZSBxdWVzdGlvbnMsICdpbml0aWFsJyB0byBrZWVwIHRoZW0gaW4gdGhlIHNhbWUgb3JkZXIgb3IgJ2RlZmF1bHQnIHRvIHVzZSB0aGUgU3VydmV5IHF1ZXN0aW9uc09yZGVyIHByb3BlcnR5XG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25zT3JkZXJcbiAgICogQHNlZSBhcmVRdWVzdGlvbnNSYW5kb21pemVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uc09yZGVyKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbnNPcmRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uc09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT3JkZXJcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBzY3JvbGwgdG8gdGhlIHBhZ2UgdG9wLlxuICAgKi9cbiAgcHVibGljIHNjcm9sbFRvVG9wKCkge1xuICAgIGlmICghIXRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS5zY3JvbGxFbGVtZW50VG9Ub3AodGhpcywgbnVsbCwgdGhpcywgdGhpcy5pZCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaW1lIGluIHNlY29uZHMgZW5kLXVzZXIgc3BlbnQgb24gdGhpcyBwYWdlXG4gICAqL1xuICBwdWJsaWMgdGltZVNwZW50ID0gMDtcbiAgLy8gcHVibGljIGdldCB0aW1lU3BlbnQoKTogbnVtYmVyIHtcbiAgLy8gICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGltZVNwZW50XCIsIDApO1xuICAvLyB9XG4gIC8vIHB1YmxpYyBzZXQgdGltZVNwZW50KHZhbDogbnVtYmVyKSB7XG4gIC8vICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGltZVNwZW50XCIsIHZhbCk7XG4gIC8vIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHBhbmVscyBpbiB0aGUgcGFnZVxuICAgKi9cbiAgcHVibGljIGdldFBhbmVscyhcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBBcnJheTxJUGFuZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PElQYW5lbD4oKTtcbiAgICB0aGlzLmFkZFBhbmVsc0ludG9MaXN0KHJlc3VsdCwgdmlzaWJsZU9ubHksIGluY2x1ZGluZ0Rlc2lnblRpbWUpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IGVuZC11c2VyIGhhcyB0byBjb21wbGV0ZSB0aGUgcGFnZS4gSWYgdGhlIHZhbHVlIGlzIDAgb3IgbGVzcywgdGhlIGVuZC11c2VyIGhhcyB1bmxpbWl0ZWQgbnVtYmVyIG9mIHRpbWUgdG8gZmluaXNoIHRoZSBwYWdlLlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tYXhUaW1lVG9GaW5pc2hQYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFRpbWVUb0ZpbmlzaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUaW1lVG9GaW5pc2godmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHt9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzUmFuZG9taXppbmcpIHJldHVybjtcbiAgICBzdXBlci5vblZpc2libGVDaGFuZ2VkKCk7XG4gICAgaWYgKHRoaXMuc3VydmV5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuc3VydmV5LnBhZ2VWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BJbmZvOiBEcmFnRHJvcEluZm87XG4gIHB1YmxpYyBkcmFnRHJvcFN0YXJ0KFxuICAgIHNyYzogSUVsZW1lbnQsXG4gICAgdGFyZ2V0OiBJRWxlbWVudCxcbiAgICBuZXN0ZWRQYW5lbERlcHRoOiBudW1iZXIgPSAtMVxuICApIHtcbiAgICB0aGlzLmRyYWdEcm9wSW5mbyA9IG5ldyBEcmFnRHJvcEluZm8oc3JjLCB0YXJnZXQsIG5lc3RlZFBhbmVsRGVwdGgpO1xuICB9XG4gIHB1YmxpYyBkcmFnRHJvcE1vdmVUbyhcbiAgICBkZXN0aW5hdGlvbjogSVN1cnZleUVsZW1lbnQsXG4gICAgaXNCb3R0b206IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpc0VkZ2U6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZHJhZ0Ryb3BJbmZvKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5kcmFnRHJvcEluZm8uZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjtcbiAgICB0aGlzLmRyYWdEcm9wSW5mby5pc0JvdHRvbSA9IGlzQm90dG9tO1xuICAgIHRoaXMuZHJhZ0Ryb3BJbmZvLmlzRWRnZSA9IGlzRWRnZTtcbiAgICB0aGlzLmNvcnJlY3REcmFnRHJvcEluZm8odGhpcy5kcmFnRHJvcEluZm8pO1xuICAgIGlmICghdGhpcy5kcmFnRHJvcENhbkRyb3BUYWdlcnQoKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghdGhpcy5kcmFnRHJvcENhbkRyb3BTb3VyY2UoKSB8fCAhdGhpcy5kcmFnRHJvcEFsbG93RnJvbVN1cnZleSgpKSB7XG4gICAgICBpZiAoISF0aGlzLmRyYWdEcm9wSW5mby5zb3VyY2UpIHtcbiAgICAgICAgdmFyIHJvdyA9IHRoaXMuZHJhZ0Ryb3BGaW5kUm93KHRoaXMuZHJhZ0Ryb3BJbmZvLnRhcmdldCk7XG4gICAgICAgIHRoaXMudXBkYXRlUm93c1JlbW92ZUVsZW1lbnRGcm9tUm93KHRoaXMuZHJhZ0Ryb3BJbmZvLnRhcmdldCwgcm93KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5kcmFnRHJvcEFkZFRhcmdldCh0aGlzLmRyYWdEcm9wSW5mbyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBjb3JyZWN0RHJhZ0Ryb3BJbmZvKGRyYWdEcm9wSW5mbzogRHJhZ0Ryb3BJbmZvKSB7XG4gICAgaWYgKCFkcmFnRHJvcEluZm8uZGVzdGluYXRpb24pIHJldHVybjtcbiAgICB2YXIgcGFuZWwgPSAoPElFbGVtZW50PmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbikuaXNQYW5lbFxuICAgICAgPyA8SVBhbmVsPig8YW55PmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbilcbiAgICAgIDogbnVsbDtcbiAgICBpZiAoIXBhbmVsKSByZXR1cm47XG4gICAgaWYgKFxuICAgICAgIWRyYWdEcm9wSW5mby50YXJnZXQuaXNMYXlvdXRUeXBlU3VwcG9ydGVkKHBhbmVsLmdldENoaWxkcmVuTGF5b3V0VHlwZSgpKVxuICAgICkge1xuICAgICAgZHJhZ0Ryb3BJbmZvLmlzRWRnZSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BBbGxvd0Zyb21TdXJ2ZXkoKTogYm9vbGVhbiB7XG4gICAgdmFyIGRlc3QgPSB0aGlzLmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbjtcbiAgICBpZiAoIWRlc3QgfHwgIXRoaXMuc3VydmV5KSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgaW5zZXJ0QmVmb3JlOiBJRWxlbWVudCA9IG51bGw7XG4gICAgdmFyIGluc2VydEFmdGVyOiBJRWxlbWVudCA9IG51bGw7XG4gICAgdmFyIHBhcmVudCA9XG4gICAgICBkZXN0LmlzUGFnZSB8fCAoIXRoaXMuZHJhZ0Ryb3BJbmZvLmlzRWRnZSAmJiAoPElFbGVtZW50PmRlc3QpLmlzUGFuZWwpXG4gICAgICAgID8gZGVzdFxuICAgICAgICA6ICg8SUVsZW1lbnQ+ZGVzdCkucGFyZW50O1xuICAgIGlmICghZGVzdC5pc1BhZ2UpIHtcbiAgICAgIHZhciBjb250YWluZXIgPSAoPElFbGVtZW50PmRlc3QpLnBhcmVudDtcbiAgICAgIGlmICghIWNvbnRhaW5lcikge1xuICAgICAgICB2YXIgZWxlbWVudHMgPSAoPFBhbmVsTW9kZWxCYXNlPmNvbnRhaW5lcikuZWxlbWVudHM7XG4gICAgICAgIHZhciBpbmRleCA9IGVsZW1lbnRzLmluZGV4T2YoPElFbGVtZW50PmRlc3QpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIGluc2VydEJlZm9yZSA9IDxJRWxlbWVudD5kZXN0O1xuICAgICAgICAgIGluc2VydEFmdGVyID0gPElFbGVtZW50PmRlc3Q7XG4gICAgICAgICAgaWYgKHRoaXMuZHJhZ0Ryb3BJbmZvLmlzQm90dG9tKSB7XG4gICAgICAgICAgICBpbnNlcnRCZWZvcmUgPVxuICAgICAgICAgICAgICBpbmRleCA8IGVsZW1lbnRzLmxlbmd0aCAtIDEgPyBlbGVtZW50c1tpbmRleCArIDFdIDogbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5zZXJ0QWZ0ZXIgPSBpbmRleCA+IDAgPyBlbGVtZW50c1tpbmRleCAtIDFdIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICB0YXJnZXQ6IHRoaXMuZHJhZ0Ryb3BJbmZvLnRhcmdldCxcbiAgICAgIHNvdXJjZTogdGhpcy5kcmFnRHJvcEluZm8uc291cmNlLFxuICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICBpbnNlcnRBZnRlcjogaW5zZXJ0QWZ0ZXIsXG4gICAgICBpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LmRyYWdBbmREcm9wQWxsb3cob3B0aW9ucyk7XG4gIH1cbiAgcHVibGljIGRyYWdEcm9wRmluaXNoKGlzQ2FuY2VsOiBib29sZWFuID0gZmFsc2UpOiBJRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLmRyYWdEcm9wSW5mbykgcmV0dXJuO1xuICAgIHZhciB0YXJnZXQgPSB0aGlzLmRyYWdEcm9wSW5mby50YXJnZXQ7XG4gICAgdmFyIHJvdyA9IHRoaXMuZHJhZ0Ryb3BGaW5kUm93KHRhcmdldCk7XG4gICAgdmFyIHRhcmdldEluZGV4ID0gdGhpcy5kcmFnRHJvcEdldEVsZW1lbnRJbmRleCh0YXJnZXQsIHJvdyk7XG4gICAgdGhpcy51cGRhdGVSb3dzUmVtb3ZlRWxlbWVudEZyb21Sb3codGFyZ2V0LCByb3cpO1xuICAgIGlmICghaXNDYW5jZWwgJiYgISFyb3cpIHtcbiAgICAgIHZhciBzcmMgPSB0aGlzLmRyYWdEcm9wSW5mby5zb3VyY2U7XG4gICAgICB2YXIgaXNTYW1lUGFuZWwgPSBmYWxzZTtcbiAgICAgIGlmICghIXNyYyAmJiAhIXNyYy5wYXJlbnQpIHtcbiAgICAgICAgaXNTYW1lUGFuZWwgPSByb3cucGFuZWwgPT0gc3JjLnBhcmVudDtcbiAgICAgICAgaWYgKGlzU2FtZVBhbmVsKSB7XG4gICAgICAgICAgcm93LnBhbmVsLmRyYWdEcm9wTW92ZUVsZW1lbnQoc3JjLCB0YXJnZXQsIHRhcmdldEluZGV4KTtcbiAgICAgICAgICB0YXJnZXRJbmRleCA9IC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNyYy5wYXJlbnQucmVtb3ZlRWxlbWVudChzcmMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0SW5kZXggPiAtMSkge1xuICAgICAgICByb3cucGFuZWwuYWRkRWxlbWVudCh0YXJnZXQsIHRhcmdldEluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kcmFnRHJvcEluZm8gPSBudWxsO1xuICAgIHJldHVybiAhaXNDYW5jZWwgPyB0YXJnZXQgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BHZXRFbGVtZW50SW5kZXgoXG4gICAgdGFyZ2V0OiBJRWxlbWVudCxcbiAgICByb3c6IFF1ZXN0aW9uUm93TW9kZWxcbiAgKTogbnVtYmVyIHtcbiAgICBpZiAoIXJvdykgcmV0dXJuIC0xO1xuICAgIHZhciBpbmRleCA9IHJvdy5lbGVtZW50cy5pbmRleE9mKHRhcmdldCk7XG4gICAgaWYgKHJvdy5pbmRleCA9PSAwKSByZXR1cm4gaW5kZXg7XG4gICAgdmFyIHByZXZSb3cgPSByb3cucGFuZWwucm93c1tyb3cuaW5kZXggLSAxXTtcbiAgICB2YXIgcHJldkVsZW1lbnQgPSBwcmV2Um93LmVsZW1lbnRzW3ByZXZSb3cuZWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIGluZGV4ICsgcm93LnBhbmVsLmVsZW1lbnRzLmluZGV4T2YocHJldkVsZW1lbnQpICsgMTtcbiAgfVxuICBwcml2YXRlIGRyYWdEcm9wQ2FuRHJvcFRhZ2VydCgpOiBib29sZWFuIHtcbiAgICB2YXIgZGVzdGluYXRpb24gPSB0aGlzLmRyYWdEcm9wSW5mby5kZXN0aW5hdGlvbjtcbiAgICBpZiAoIWRlc3RpbmF0aW9uIHx8IGRlc3RpbmF0aW9uLmlzUGFnZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BDYW5Ecm9wQ29yZShcbiAgICAgIHRoaXMuZHJhZ0Ryb3BJbmZvLnRhcmdldCxcbiAgICAgIDxJRWxlbWVudD5kZXN0aW5hdGlvblxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBkcmFnRHJvcENhbkRyb3BTb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXMuZHJhZ0Ryb3BJbmZvLnNvdXJjZTtcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuIHRydWU7XG4gICAgdmFyIGRlc3RpbmF0aW9uID0gPElFbGVtZW50PnRoaXMuZHJhZ0Ryb3BJbmZvLmRlc3RpbmF0aW9uO1xuICAgIGlmICghdGhpcy5kcmFnRHJvcENhbkRyb3BDb3JlKHNvdXJjZSwgZGVzdGluYXRpb24pKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ0Ryb3BDYW5Ecm9wTm90TmV4dChcbiAgICAgIHNvdXJjZSxcbiAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgdGhpcy5kcmFnRHJvcEluZm8uaXNFZGdlLFxuICAgICAgdGhpcy5kcmFnRHJvcEluZm8uaXNCb3R0b21cbiAgICApO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BDYW5Ecm9wQ29yZShcbiAgICB0YXJnZXQ6IElFbGVtZW50LFxuICAgIGRlc3RpbmF0aW9uOiBJRWxlbWVudFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWRlc3RpbmF0aW9uKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5kcmFnRHJvcElzU2FtZUVsZW1lbnQoZGVzdGluYXRpb24sIHRhcmdldCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGFyZ2V0LmlzUGFuZWwpIHtcbiAgICAgIHZhciBwbmwgPSA8UGFuZWxNb2RlbEJhc2U+KDxhbnk+dGFyZ2V0KTtcbiAgICAgIGlmIChcbiAgICAgICAgcG5sLmNvbnRhaW5zRWxlbWVudChkZXN0aW5hdGlvbikgfHxcbiAgICAgICAgISFwbmwuZ2V0RWxlbWVudEJ5TmFtZShkZXN0aW5hdGlvbi5uYW1lKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgZHJhZ0Ryb3BDYW5Ecm9wTm90TmV4dChcbiAgICBzb3VyY2U6IElFbGVtZW50LFxuICAgIGRlc3RpbmF0aW9uOiBJRWxlbWVudCxcbiAgICBpc0VkZ2U6IGJvb2xlYW4sXG4gICAgaXNCb3R0b206IGJvb2xlYW5cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkZXN0aW5hdGlvbiB8fCAoZGVzdGluYXRpb24uaXNQYW5lbCAmJiAhaXNFZGdlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHNvdXJjZS5wYXJlbnQgIT09IGRlc3RpbmF0aW9uLnBhcmVudCkgcmV0dXJuIHRydWU7XG4gICAgdmFyIHBubCA9IDxQYW5lbE1vZGVsQmFzZT5zb3VyY2UucGFyZW50O1xuICAgIHZhciBzcmNJbmRleCA9IHBubC5lbGVtZW50cy5pbmRleE9mKHNvdXJjZSk7XG4gICAgdmFyIGRlc3RJbmRleCA9IHBubC5lbGVtZW50cy5pbmRleE9mKGRlc3RpbmF0aW9uKTtcbiAgICBpZiAoZGVzdEluZGV4IDwgc3JjSW5kZXggJiYgIWlzQm90dG9tKSBkZXN0SW5kZXgtLTtcbiAgICBpZiAoaXNCb3R0b20pIGRlc3RJbmRleCsrO1xuICAgIHJldHVybiBzcmNJbmRleCA8IGRlc3RJbmRleFxuICAgICAgPyBkZXN0SW5kZXggLSBzcmNJbmRleCA+IDFcbiAgICAgIDogc3JjSW5kZXggLSBkZXN0SW5kZXggPiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmFnRHJvcElzU2FtZUVsZW1lbnQoZWwxOiBJRWxlbWVudCwgZWwyOiBJRWxlbWVudCkge1xuICAgIHJldHVybiBlbDEgPT0gZWwyIHx8IGVsMS5uYW1lID09IGVsMi5uYW1lO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicGFnZVwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHlcIixcbiAgICAgIGRlZmF1bHQ6IFwiaW5oZXJpdFwiLFxuICAgICAgY2hvaWNlczogW1wiaW5oZXJpdFwiLCBcInNob3dcIiwgXCJoaWRlXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInF1ZXN0aW9uc09yZGVyXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJpbml0aWFsXCIsIFwicmFuZG9tXCJdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwibWF4VGltZVRvRmluaXNoOm51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUGFnZU1vZGVsKCk7XG4gIH0sXG4gIFwicGFuZWxiYXNlXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGFnZS50cyIsImltcG9ydCB7IEJhc2UsIElRdWVzdGlvbiwgRXZlbnQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gIHB1YmxpYyBodG1sVGVtcGxhdGU6IHN0cmluZztcbiAgcHVibGljIGlzRmlyc3RSZW5kZXI6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyB3aWRnZXRKc29uOiBhbnkpIHtcbiAgICB0aGlzLmh0bWxUZW1wbGF0ZSA9IHdpZGdldEpzb24uaHRtbFRlbXBsYXRlID8gd2lkZ2V0SnNvbi5odG1sVGVtcGxhdGUgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBhZnRlclJlbmRlcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBlbDogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdFJlbmRlcikge1xuICAgICAgdGhpcy5pc0ZpcnN0UmVuZGVyID0gZmFsc2U7XG4gICAgICBxdWVzdGlvbi5zdXJ2ZXkub25Mb2NhbGVDaGFuZ2VkRXZlbnQuYWRkKCgpID0+IHtcbiAgICAgICAgdGhpcy53aWRnZXRKc29uLndpbGxVbm1vdW50KHF1ZXN0aW9uLCBlbCk7XG4gICAgICAgIHRoaXMud2lkZ2V0SnNvbi5hZnRlclJlbmRlcihxdWVzdGlvbiwgZWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMud2lkZ2V0SnNvbi5hZnRlclJlbmRlcikgdGhpcy53aWRnZXRKc29uLmFmdGVyUmVuZGVyKHF1ZXN0aW9uLCBlbCk7XG4gIH1cbiAgcHVibGljIHdpbGxVbm1vdW50KHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGVsOiBhbnkpIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLndpbGxVbm1vdW50KSB0aGlzLndpZGdldEpzb24ud2lsbFVubW91bnQocXVlc3Rpb24sIGVsKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGlzcGxheVZhbHVlKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHZhbHVlOiBhbnkgPSB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLndpZGdldEpzb24uZ2V0RGlzcGxheVZhbHVlKVxuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi5nZXREaXNwbGF5VmFsdWUocXVlc3Rpb24sIHZhbHVlKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgaXNGaXQocXVlc3Rpb246IElRdWVzdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzTGlicmFyeUxvYWRlZCgpICYmIHRoaXMud2lkZ2V0SnNvbi5pc0ZpdClcbiAgICAgIHJldHVybiB0aGlzLndpZGdldEpzb24uaXNGaXQocXVlc3Rpb24pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgaW5pdCgpIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLmluaXQpIHtcbiAgICAgIHRoaXMud2lkZ2V0SnNvbi5pbml0KCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnk6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzTGlicmFyeUxvYWRlZCgpICYmIHRoaXMud2lkZ2V0SnNvbi5hY3RpdmF0ZWRCeUNoYW5nZWQpIHtcbiAgICAgIHRoaXMud2lkZ2V0SnNvbi5hY3RpdmF0ZWRCeUNoYW5nZWQoYWN0aXZhdGVkQnkpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzTGlicmFyeUxvYWRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy53aWRnZXRKc29uLndpZGdldElzTG9hZGVkKVxuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi53aWRnZXRJc0xvYWRlZCgpID09IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldCBpc0RlZmF1bHRSZW5kZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMud2lkZ2V0SnNvbi5pc0RlZmF1bHRSZW5kZXI7XG4gIH1cbiAgcHVibGljIGdldCBwZGZRdWVzdGlvblR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLnBkZlF1ZXN0aW9uVHlwZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBkZlJlbmRlcigpIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLnBkZlJlbmRlcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbiB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IEN1c3RvbVdpZGdldENvbGxlY3Rpb24gPSBuZXcgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbigpO1xuICBwcml2YXRlIHdpZGdldHNWYWx1ZXM6IEFycmF5PFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0PiA9IFtdO1xuICBwcml2YXRlIHdpZGdldHNBY3RpdmF0ZWRCeSA9IHt9O1xuXG4gIHB1YmxpYyBvbkN1c3RvbVdpZGdldEFkZGVkOiBFdmVudDxcbiAgICAoY3VzdG9tV2lkZ2V0OiBRdWVzdGlvbkN1c3RvbVdpZGdldCkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChjdXN0b21XaWRnZXQ6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0KSA9PiBhbnksIGFueT4oKTtcblxuICBwdWJsaWMgZ2V0IHdpZGdldHMoKTogQXJyYXk8UXVlc3Rpb25DdXN0b21XaWRnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRzVmFsdWVzO1xuICB9XG4gIHB1YmxpYyBhZGQod2lkZ2V0SnNvbjogYW55LCBhY3RpdmF0ZWRCeTogc3RyaW5nID0gXCJwcm9wZXJ0eVwiKSB7XG4gICAgdGhpcy5hZGRDdXN0b21XaWRnZXQod2lkZ2V0SnNvbiwgYWN0aXZhdGVkQnkpO1xuICB9XG4gIHB1YmxpYyBhZGRDdXN0b21XaWRnZXQod2lkZ2V0SnNvbjogYW55LCBhY3RpdmF0ZWRCeTogc3RyaW5nID0gXCJwcm9wZXJ0eVwiKSB7XG4gICAgdmFyIG5hbWUgPSB3aWRnZXRKc29uLm5hbWU7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBuYW1lID0gXCJ3aWRnZXRfXCIgKyB0aGlzLndpZGdldHMubGVuZ3RoICsgMTtcbiAgICB9XG4gICAgdmFyIGN1c3RvbVdpZGdldCA9IG5ldyBRdWVzdGlvbkN1c3RvbVdpZGdldChuYW1lLCB3aWRnZXRKc29uKTtcbiAgICB0aGlzLndpZGdldHNWYWx1ZXMucHVzaChjdXN0b21XaWRnZXQpO1xuICAgIGN1c3RvbVdpZGdldC5pbml0KCk7XG4gICAgKDxhbnk+dGhpcykud2lkZ2V0c0FjdGl2YXRlZEJ5W25hbWVdID0gYWN0aXZhdGVkQnk7XG4gICAgY3VzdG9tV2lkZ2V0LmFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeSk7XG4gICAgdGhpcy5vbkN1c3RvbVdpZGdldEFkZGVkLmZpcmUoY3VzdG9tV2lkZ2V0LCBudWxsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgd2F5IHRoZSBjdXN0b20gd2lnZXQgaXMgYWN0aXZhdGVkLiBJdCBjYW4gYmUgYWN0aXZhdGVkIGJ5IGEgcHJvcGVydHkgKFwicHJvcGVydHlcIiksIHF1ZXN0aW9uIHR5cGUgKFwidHlwZVwiKSBvciBieSBuZXcvY3VzdG9tIHF1ZXN0aW9uIHR5cGUgKFwiY3VzdG9tdHlwZVwiKS5cbiAgICogQHBhcmFtIHdpZGdldE5hbWUgdGhlIGN1c3RvbSB3aWRnZXQgbmFtZVxuICAgKiBAc2VlIHNldEFjdGl2YXRlZEJ5XG4gICAqL1xuICBwdWJsaWMgZ2V0QWN0aXZhdGVkQnkod2lkZ2V0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gKDxhbnk+dGhpcykud2lkZ2V0c0FjdGl2YXRlZEJ5W3dpZGdldE5hbWVdO1xuICAgIHJldHVybiByZXMgPyByZXMgOiBcInByb3BlcnR5XCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHdheSB0aGUgY3VzdG9tIHdpZ2V0IGlzIGFjdGl2YXRlZC4gVGhlIGFjdGl2YXRpb24gdHlwZXMgYXJlOiBwcm9wZXJ0eSAoXCJwcm9wZXJ0eVwiKSwgcXVlc3Rpb24gdHlwZSAoXCJ0eXBlXCIpIG9yIG5ldy9jdXN0b20gcXVlc3Rpb24gdHlwZSAoXCJjdXN0b210eXBlXCIpLiBBIGN1c3RvbSB3aWdldCBtYXkgc3VwcG9ydCBhbGwgb3Igb25seSBzb21lIG9mIHRoaXMgYWN0aXZhdGlvbiB0eXBlcy5cbiAgICogQHBhcmFtIHdpZGdldE5hbWVcbiAgICogQHBhcmFtIGFjdGl2YXRlZEJ5IHRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSB2YXJpYW50czogXCJwcm9wZXJ0eVwiLCBcInR5cGVcIiBhbmQgXCJjdXN0b210eXBlXCJcbiAgICovXG4gIHB1YmxpYyBzZXRBY3RpdmF0ZWRCeSh3aWRnZXROYW1lOiBzdHJpbmcsIGFjdGl2YXRlZEJ5OiBzdHJpbmcpIHtcbiAgICBpZiAoIXdpZGdldE5hbWUgfHwgIWFjdGl2YXRlZEJ5KSByZXR1cm47XG4gICAgdmFyIHdpZGdldCA9IHRoaXMuZ2V0Q3VzdG9tV2lkZ2V0QnlOYW1lKHdpZGdldE5hbWUpO1xuICAgIGlmICghd2lkZ2V0KSByZXR1cm47XG4gICAgKDxhbnk+dGhpcykud2lkZ2V0c0FjdGl2YXRlZEJ5W3dpZGdldE5hbWVdID0gYWN0aXZhdGVkQnk7XG4gICAgd2lkZ2V0LmFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeSk7XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMud2lkZ2V0c1ZhbHVlcyA9IFtdO1xuICB9XG4gIHB1YmxpYyBnZXRDdXN0b21XaWRnZXRCeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy53aWRnZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRzW2ldLm5hbWUgPT0gbmFtZSkgcmV0dXJuIHRoaXMud2lkZ2V0c1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldEN1c3RvbVdpZGdldChxdWVzdGlvbjogSVF1ZXN0aW9uKTogUXVlc3Rpb25DdXN0b21XaWRnZXQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy53aWRnZXRzVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRzVmFsdWVzW2ldLmlzRml0KHF1ZXN0aW9uKSkgcmV0dXJuIHRoaXMud2lkZ2V0c1ZhbHVlc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbkN1c3RvbVdpZGdldHMudHMiLCJpbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvblNlbGVjdEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIGRyb3Bkb3duIHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgZXh0ZW5kcyBRdWVzdGlvblNlbGVjdEJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIsIHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJjaG9pY2VzTWluXCIsIFwiY2hvaWNlc01heFwiLCBcImNob2ljZXNTdGVwXCJdLFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgdG8gc2hvdyBvcHRpb25zIGNhcHRpb24gaXRlbSAoJ0Nob29zZS4uLicpLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93T3B0aW9uc0NhcHRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dPcHRpb25zQ2FwdGlvblwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dPcHRpb25zQ2FwdGlvbih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93T3B0aW9uc0NhcHRpb25cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBvcHRpb25zIGNhcHRpb24gZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgdmFsdWUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRha2VuIGZyb20gbG9jYWxpemF0aW9uIHN0cmluZ3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG9wdGlvbnNDYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3B0aW9uc0NhcHRpb25cIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBvcHRpb25zQ2FwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwib3B0aW9uc0NhcHRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jT3B0aW9uc0NhcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIik7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJkcm9wZG93blwiO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRJdGVtKCk6IEl0ZW1WYWx1ZSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMudmlzaWJsZUNob2ljZXMsIHRoaXMudmFsdWUpO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgbWluTWF4Q2hvaWNlcyA9IDxBcnJheTxJdGVtVmFsdWU+PltdO1xuICBwcm90ZWN0ZWQgZ2V0Q2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICB2YXIgaXRlbXMgPSBzdXBlci5nZXRDaG9pY2VzKCk7XG4gICAgaWYgKHRoaXMuY2hvaWNlc01heCA8PSB0aGlzLmNob2ljZXNNaW4pIHJldHVybiBpdGVtcztcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goaXRlbXNbaV0pO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLm1pbk1heENob2ljZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICB0aGlzLm1pbk1heENob2ljZXMubGVuZ3RoICE9PVxuICAgICAgICAodGhpcy5jaG9pY2VzTWF4IC0gdGhpcy5jaG9pY2VzTWluKSAvIHRoaXMuY2hvaWNlc1N0ZXAgKyAxXG4gICAgKSB7XG4gICAgICB0aGlzLm1pbk1heENob2ljZXMgPSBbXTtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBpID0gdGhpcy5jaG9pY2VzTWluO1xuICAgICAgICBpIDw9IHRoaXMuY2hvaWNlc01heDtcbiAgICAgICAgaSArPSB0aGlzLmNob2ljZXNTdGVwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5taW5NYXhDaG9pY2VzLnB1c2gobmV3IEl0ZW1WYWx1ZShpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcyA9IHJlcy5jb25jYXQodGhpcy5taW5NYXhDaG9pY2VzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBhbmQgY2hvaWNlc01heCBwcm9wZXJ0eSB0byBhdXRvbWF0aWNhbGx5IGFkZCBjaG9pY2VzLiBGb3IgZXhhbXBsZSBjaG9pY2VzTWluID0gMSBhbmQgY2hvaWNlc01heCA9IDEwIHdpbGwgZ2VuZXJhdGUgdGVuIGFkZGl0aW9uYWwgY2hvaWNlcyBmcm9tIDEgdG8gMTAuXG4gICAqIEBzZWUgY2hvaWNlc01heFxuICAgKiBAc2VlIGNob2ljZXNTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXNNaW4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc01pblwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNNaW4odmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzTWluXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIGFuZCBjaG9pY2VzTWF4IHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgYWRkIGNob2ljZXMuIEZvciBleGFtcGxlIGNob2ljZXNNaW4gPSAxIGFuZCBjaG9pY2VzTWF4ID0gMTAgd2lsbCBnZW5lcmF0ZSB0ZW4gYWRkaXRpb25hbCBjaG9pY2VzIGZyb20gMSB0byAxMC5cbiAgICogQHNlZSBjaG9pY2VzTWluXG4gICAqIEBzZWUgY2hvaWNlc1N0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc01heCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzTWF4XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgY2hvaWNlc01heCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNNYXhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS4gSXQgdGVsbHMgdGhlIHZhbHVlIG9mIHRoZSBpdGVyYXRvciBiZXR3ZWVuIGNob2ljZXNNaW4gYW5kIGNob2ljZXNNYXggcHJvcGVydGllcy5cbiAgICogSWYgY2hvaWNlc01pbiA9IDEwLCBjaG9pY2VzTWF4ID0gMzAgYW5kIGNob2ljZXNTdGVwID0gMTAgdGhlbiB5b3Ugd2lsbCBoYXZlIG9ubHkgdGhyZWUgYWRkaXRpb25hbCBjaG9pY2VzOiBbMTAsIDIwLCAzMF0uXG4gICAqIEBzZWUgY2hvaWNlc01pblxuICAgKiBAc2VlIGNob2ljZXNNYXhcbiAgICovXG4gIHB1YmxpYyBnZXQgY2hvaWNlc1N0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1N0ZXBcIiwgMSk7XG4gIH1cbiAgcHVibGljIHNldCBjaG9pY2VzU3RlcCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAxKSB2YWwgPSAxO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNob2ljZXNTdGVwXCIsIHZhbCk7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiZHJvcGRvd25cIixcbiAgW1xuICAgIHsgbmFtZTogXCJvcHRpb25zQ2FwdGlvblwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jT3B0aW9uc0NhcHRpb25cIiB9LFxuICAgIHsgbmFtZTogXCJzaG93T3B0aW9uc0NhcHRpb246Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImNob2ljZXNNaW46bnVtYmVyXCIsIGRlZmF1bHQ6IDAgfSxcbiAgICB7IG5hbWU6IFwiY2hvaWNlc01heDpudW1iZXJcIiwgZGVmYXVsdDogMCB9LFxuICAgIHsgbmFtZTogXCJjaG9pY2VzU3RlcDpudW1iZXJcIiwgZGVmYXVsdDogMSwgbWluVmFsdWU6IDEgfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Ecm9wZG93bk1vZGVsKFwiXCIpO1xuICB9LFxuICBcInNlbGVjdGJhc2VcIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZHJvcGRvd25cIiwgKG5hbWUpID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25Ecm9wZG93bk1vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fZHJvcGRvd24udHMiLCJpbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBFeHByZXNzaW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgZXhwcmVzc2lvbiBxdWVzdGlvbi4gSXQgaXMgYSByZWFkLW9ubHkgcXVlc3Rpb24uIEl0IGNhbGN1bGF0ZXMgdmFsdWUgYmFzZWQgb24gZXB4cmVzc2lvbiBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBwcml2YXRlIGV4cHJlc3Npb25Jc1J1bm5pbmc6IGJvb2xlYW47XG4gIHByaXZhdGUgZXhwcmVzc2lvblJ1bm5lcjogRXhwcmVzc2lvblJ1bm5lcjtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJmb3JtYXRcIiwgdGhpcyk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJleHByZXNzaW9uXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLmV4cHJlc3Npb25SdW5uZXIpIHtcbiAgICAgICAgc2VsZi5leHByZXNzaW9uUnVubmVyID0gbmV3IEV4cHJlc3Npb25SdW5uZXIoc2VsZi5leHByZXNzaW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImV4cHJlc3Npb25cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0lucHV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4geW91ciBvd24gZm9ybWF0LiBNYWtlIHN1cmUgeW91IGhhdmUgXCJ7MH1cIiBzdWJzdHJpbmcgaW4geW91ciBzdHJpbmcsIHRvIGRpc3BsYXkgdGhlIGFjdHVhbCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZm9ybWF0XCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZm9ybWF0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJmb3JtYXRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jRm9ybWF0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImZvcm1hdFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIEV4cHJlc3Npb24gdGhhdCB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcXVlc3Rpb24gdmFsdWUuIFlvdSBtYXkgdXNlIHN0YW5kYXJkIG9wZXJhdG9ycyBsaWtlICssIC0sICogYW5kIC8sIHNxdWFyZXMgKCkuIEhlcmUgaXMgdGhlIGV4YW1wbGUgb2YgYWNjZXNzaW5nIHRoZSBxdWVzdGlvbiB2YWx1ZSB7cXVlc3Rpb25uYW1lfS5cbiAgICogPGJyLz5FeGFtcGxlOiBcIih7cXVhbnRpdHl9ICoge3ByaWNlfSkgKiAoMTAwIC0ge2Rpc2NvdW50fSkgLyAxMDBcIlxuICAgKi9cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBleHByZXNzaW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBsb2NDYWxjdWxhdGlvbigpIHtcbiAgICB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyB1bmxvY0NhbGN1bGF0aW9uKCkge1xuICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyA9IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBzdXBlci5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbiB8fCB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcpIHJldHVybjtcbiAgICB0aGlzLmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmV4cHJlc3Npb25SdW5uZXIpIHtcbiAgICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lciA9IG5ldyBFeHByZXNzaW9uUnVubmVyKHRoaXMuZXhwcmVzc2lvbik7XG4gICAgfVxuICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKG5ld1ZhbHVlKSA9PiB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhuZXdWYWx1ZSwgdGhpcy52YWx1ZSkpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgICAgdGhpcy51bmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgfTtcbiAgICB0aGlzLmV4cHJlc3Npb25SdW5uZXIucnVuKHZhbHVlcywgcHJvcGVydGllcyk7XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLCByZWM6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGZyYWN0aW9uIGRpZ2l0cyB0byB1c2UgaWYgZGlzcGxheVN0eWxlIGlzIG5vdCBcIm5vbmVcIi4gUG9zc2libGUgdmFsdWVzIGFyZSBmcm9tIDAgdG8gMjAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIC0xIGFuZCBpdCBtZWFucyB0aGF0IHRoaXMgcHJvcGVydHkgaXMgbm90IHVzZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heGltdW1GcmFjdGlvbkRpZ2l0cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhpbXVtRnJhY3Rpb25EaWdpdHNcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4aW11bUZyYWN0aW9uRGlnaXRzKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IC0xIHx8IHZhbCA+IDIwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4aW11bUZyYWN0aW9uRGlnaXRzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBmcmFjdGlvbiBkaWdpdHMgdG8gdXNlIGlmIGRpc3BsYXlTdHlsZSBpcyBub3QgXCJub25lXCIuIFBvc3NpYmxlIHZhbHVlcyBhcmUgZnJvbSAwIHRvIDIwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAtMSBhbmQgaXQgbWVhbnMgdGhhdCB0aGlzIHByb3BlcnR5IGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcHVibGljIGdldCBtaW5pbXVtRnJhY3Rpb25EaWdpdHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluaW11bUZyYWN0aW9uRGlnaXRzXCIsIC0xKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbmltdW1GcmFjdGlvbkRpZ2l0cyh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAtMSB8fCB2YWwgPiAyMCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pbmltdW1GcmFjdGlvbkRpZ2l0c1wiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciB2YWwgPSB0aGlzLmlzVmFsdWVFbXB0eSh2YWx1ZSkgPyB0aGlzLmRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgc3RyID0gdGhpcy5nZXRWYWx1ZUFzU3RyKHZhbCk7XG4gICAgaWYgKCF0aGlzLmZvcm1hdCkgcmV0dXJuIHN0cjtcbiAgICByZXR1cm4gKDxhbnk+dGhpcy5mb3JtYXQpW1wiZm9ybWF0XCJdKHN0cik7XG4gIH1cbiAgLyoqXG4gICAqIFlvdSBtYXkgc2V0IHRoaXMgcHJvcGVydHkgdG8gXCJkZWNpbWFsXCIsIFwiY3VycmVuY3lcIiwgXCJwZXJjZW50XCIgb3IgXCJkYXRlXCIuIElmIHlvdSBzZXQgaXQgdG8gXCJjdXJyZW5jeVwiLCB5b3UgbWF5IHVzZSB0aGUgY3VycmVuY3kgcHJvcGVydHkgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4gY3VycmVuY3kgZGlmZmVyZW50IGZyb20gVVNELlxuICAgKiBAc2VlIGN1cnJlbmN5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpc3BsYXlTdHlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5U3R5bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkaXNwbGF5U3R5bGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5U3R5bGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIGl0IHRvIGRpc3BsYXkgdGhlIHZhbHVlIGluIHRoZSBjdXJyZW5jeSBkaWZmZXJlbiBmcm9tIFVTRC4gVGhlIGRpc3BsYXlTdHlwZSBzaG91bGQgYmUgc2V0IHRvIFwiY3VycmVuY3lcIi5cbiAgICogQHNlZSBkaXNwbGF5U3R5bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVuY3koKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY3VycmVuY3lcIik7XG4gIH1cbiAgcHVibGljIHNldCBjdXJyZW5jeSh2YWw6IHN0cmluZykge1xuICAgIGlmIChnZXRDdXJyZWN5Q29kZXMoKS5pbmRleE9mKHZhbCkgPCAwKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY3VycmVuY3lcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogXHREZXRlcm1pbmVzIHdoZXRoZXIgdG8gZGlzcGxheSBncm91cGluZyBzZXBhcmF0b3JzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLlxuICAgKi9cbiAgcHVibGljIGdldCB1c2VHcm91cGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidXNlR3JvdXBpbmdcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCB1c2VHcm91cGluZyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ1c2VHcm91cGluZ1wiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUFzU3RyKHZhbDogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5U3R5bGUgPT0gXCJkYXRlXCIpIHtcbiAgICAgIHZhciBkID0gbmV3IERhdGUodmFsKTtcbiAgICAgIGlmICghIWQgJiYgISFkLnRvTG9jYWxlRGF0ZVN0cmluZykgcmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRpc3BsYXlTdHlsZSAhPSBcIm5vbmVcIiAmJiBIZWxwZXJzLmlzTnVtYmVyKHZhbCkpIHtcbiAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmdldExvY2FsZSgpO1xuICAgICAgaWYgKCFsb2NhbGUpIGxvY2FsZSA9IFwiZW5cIjtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBzdHlsZTogdGhpcy5kaXNwbGF5U3R5bGUsXG4gICAgICAgIGN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5LFxuICAgICAgICB1c2VHcm91cGluZzogdGhpcy51c2VHcm91cGluZyxcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5tYXhpbXVtRnJhY3Rpb25EaWdpdHMgPiAtMSkge1xuICAgICAgICAoPGFueT5vcHRpb25zKVtcIm1heGltdW1GcmFjdGlvbkRpZ2l0c1wiXSA9IHRoaXMubWF4aW11bUZyYWN0aW9uRGlnaXRzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubWluaW11bUZyYWN0aW9uRGlnaXRzID4gLTEpIHtcbiAgICAgICAgKDxhbnk+b3B0aW9ucylbXCJtaW5pbXVtRnJhY3Rpb25EaWdpdHNcIl0gPSB0aGlzLm1pbmltdW1GcmFjdGlvbkRpZ2l0cztcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWwudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbC50b1N0cmluZygpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZWN5Q29kZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gIHJldHVybiBbXG4gICAgXCJBRURcIixcbiAgICBcIkFGTlwiLFxuICAgIFwiQUxMXCIsXG4gICAgXCJBTURcIixcbiAgICBcIkFOR1wiLFxuICAgIFwiQU9BXCIsXG4gICAgXCJBUlNcIixcbiAgICBcIkFVRFwiLFxuICAgIFwiQVdHXCIsXG4gICAgXCJBWk5cIixcbiAgICBcIkJBTVwiLFxuICAgIFwiQkJEXCIsXG4gICAgXCJCRFRcIixcbiAgICBcIkJHTlwiLFxuICAgIFwiQkhEXCIsXG4gICAgXCJCSUZcIixcbiAgICBcIkJNRFwiLFxuICAgIFwiQk5EXCIsXG4gICAgXCJCT0JcIixcbiAgICBcIkJPVlwiLFxuICAgIFwiQlJMXCIsXG4gICAgXCJCU0RcIixcbiAgICBcIkJUTlwiLFxuICAgIFwiQldQXCIsXG4gICAgXCJCWU5cIixcbiAgICBcIkJaRFwiLFxuICAgIFwiQ0FEXCIsXG4gICAgXCJDREZcIixcbiAgICBcIkNIRVwiLFxuICAgIFwiQ0hGXCIsXG4gICAgXCJDSFdcIixcbiAgICBcIkNMRlwiLFxuICAgIFwiQ0xQXCIsXG4gICAgXCJDTllcIixcbiAgICBcIkNPUFwiLFxuICAgIFwiQ09VXCIsXG4gICAgXCJDUkNcIixcbiAgICBcIkNVQ1wiLFxuICAgIFwiQ1VQXCIsXG4gICAgXCJDVkVcIixcbiAgICBcIkNaS1wiLFxuICAgIFwiREpGXCIsXG4gICAgXCJES0tcIixcbiAgICBcIkRPUFwiLFxuICAgIFwiRFpEXCIsXG4gICAgXCJFR1BcIixcbiAgICBcIkVSTlwiLFxuICAgIFwiRVRCXCIsXG4gICAgXCJFVVJcIixcbiAgICBcIkZKRFwiLFxuICAgIFwiRktQXCIsXG4gICAgXCJHQlBcIixcbiAgICBcIkdFTFwiLFxuICAgIFwiR0hTXCIsXG4gICAgXCJHSVBcIixcbiAgICBcIkdNRFwiLFxuICAgIFwiR05GXCIsXG4gICAgXCJHVFFcIixcbiAgICBcIkdZRFwiLFxuICAgIFwiSEtEXCIsXG4gICAgXCJITkxcIixcbiAgICBcIkhSS1wiLFxuICAgIFwiSFRHXCIsXG4gICAgXCJIVUZcIixcbiAgICBcIklEUlwiLFxuICAgIFwiSUxTXCIsXG4gICAgXCJJTlJcIixcbiAgICBcIklRRFwiLFxuICAgIFwiSVJSXCIsXG4gICAgXCJJU0tcIixcbiAgICBcIkpNRFwiLFxuICAgIFwiSk9EXCIsXG4gICAgXCJKUFlcIixcbiAgICBcIktFU1wiLFxuICAgIFwiS0dTXCIsXG4gICAgXCJLSFJcIixcbiAgICBcIktNRlwiLFxuICAgIFwiS1BXXCIsXG4gICAgXCJLUldcIixcbiAgICBcIktXRFwiLFxuICAgIFwiS1lEXCIsXG4gICAgXCJLWlRcIixcbiAgICBcIkxBS1wiLFxuICAgIFwiTEJQXCIsXG4gICAgXCJMS1JcIixcbiAgICBcIkxSRFwiLFxuICAgIFwiTFNMXCIsXG4gICAgXCJMWURcIixcbiAgICBcIk1BRFwiLFxuICAgIFwiTURMXCIsXG4gICAgXCJNR0FcIixcbiAgICBcIk1LRFwiLFxuICAgIFwiTU1LXCIsXG4gICAgXCJNTlRcIixcbiAgICBcIk1PUFwiLFxuICAgIFwiTVJPXCIsXG4gICAgXCJNVVJcIixcbiAgICBcIk1WUlwiLFxuICAgIFwiTVdLXCIsXG4gICAgXCJNWE5cIixcbiAgICBcIk1YVlwiLFxuICAgIFwiTVlSXCIsXG4gICAgXCJNWk5cIixcbiAgICBcIk5BRFwiLFxuICAgIFwiTkdOXCIsXG4gICAgXCJOSU9cIixcbiAgICBcIk5PS1wiLFxuICAgIFwiTlBSXCIsXG4gICAgXCJOWkRcIixcbiAgICBcIk9NUlwiLFxuICAgIFwiUEFCXCIsXG4gICAgXCJQRU5cIixcbiAgICBcIlBHS1wiLFxuICAgIFwiUEhQXCIsXG4gICAgXCJQS1JcIixcbiAgICBcIlBMTlwiLFxuICAgIFwiUFlHXCIsXG4gICAgXCJRQVJcIixcbiAgICBcIlJPTlwiLFxuICAgIFwiUlNEXCIsXG4gICAgXCJSVUJcIixcbiAgICBcIlJXRlwiLFxuICAgIFwiU0FSXCIsXG4gICAgXCJTQkRcIixcbiAgICBcIlNDUlwiLFxuICAgIFwiU0RHXCIsXG4gICAgXCJTRUtcIixcbiAgICBcIlNHRFwiLFxuICAgIFwiU0hQXCIsXG4gICAgXCJTTExcIixcbiAgICBcIlNPU1wiLFxuICAgIFwiU1JEXCIsXG4gICAgXCJTU1BcIixcbiAgICBcIlNURFwiLFxuICAgIFwiU1ZDXCIsXG4gICAgXCJTWVBcIixcbiAgICBcIlNaTFwiLFxuICAgIFwiVEhCXCIsXG4gICAgXCJUSlNcIixcbiAgICBcIlRNVFwiLFxuICAgIFwiVE5EXCIsXG4gICAgXCJUT1BcIixcbiAgICBcIlRSWVwiLFxuICAgIFwiVFREXCIsXG4gICAgXCJUV0RcIixcbiAgICBcIlRaU1wiLFxuICAgIFwiVUFIXCIsXG4gICAgXCJVR1hcIixcbiAgICBcIlVTRFwiLFxuICAgIFwiVVNOXCIsXG4gICAgXCJVWUlcIixcbiAgICBcIlVZVVwiLFxuICAgIFwiVVpTXCIsXG4gICAgXCJWRUZcIixcbiAgICBcIlZORFwiLFxuICAgIFwiVlVWXCIsXG4gICAgXCJXU1RcIixcbiAgICBcIlhBRlwiLFxuICAgIFwiWEFHXCIsXG4gICAgXCJYQVVcIixcbiAgICBcIlhCQVwiLFxuICAgIFwiWEJCXCIsXG4gICAgXCJYQkNcIixcbiAgICBcIlhCRFwiLFxuICAgIFwiWENEXCIsXG4gICAgXCJYRFJcIixcbiAgICBcIlhPRlwiLFxuICAgIFwiWFBEXCIsXG4gICAgXCJYUEZcIixcbiAgICBcIlhQVFwiLFxuICAgIFwiWFNVXCIsXG4gICAgXCJYVFNcIixcbiAgICBcIlhVQVwiLFxuICAgIFwiWFhYXCIsXG4gICAgXCJZRVJcIixcbiAgICBcIlpBUlwiLFxuICAgIFwiWk1XXCIsXG4gICAgXCJaV0xcIixcbiAgXTtcbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJleHByZXNzaW9uXCIsXG4gIFtcbiAgICBcImV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgIHsgbmFtZTogXCJmb3JtYXRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0Zvcm1hdFwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJkaXNwbGF5U3R5bGVcIixcbiAgICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcImRlY2ltYWxcIiwgXCJjdXJyZW5jeVwiLCBcInBlcmNlbnRcIiwgXCJkYXRlXCJdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjdXJyZW5jeVwiLFxuICAgICAgY2hvaWNlczogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0Q3VycmVjeUNvZGVzKCk7XG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogXCJVU0RcIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJtYXhpbXVtRnJhY3Rpb25EaWdpdHM6bnVtYmVyXCIsIGRlZmF1bHQ6IC0xIH0sXG4gICAgeyBuYW1lOiBcIm1pbmltdW1GcmFjdGlvbkRpZ2l0czpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwidXNlR3JvdXBpbmc6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImVuYWJsZUlmXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImlzUmVxdWlyZWRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicmVhZE9ubHlcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwidmFsaWRhdG9yc1wiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJkZWZhdWx0VmFsdWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiY29ycmVjdEFuc3dlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJyZXF1aXJlZElmXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImV4cHJlc3Npb25cIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2V4cHJlc3Npb24udHMiLCJpbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgRW1haWxWYWxpZGF0b3IsIFN1cnZleVZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvclwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGFuIGlucHV0IHRleHQgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblRleHRNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwbGFjZUhvbGRlclwiLCB0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJtaW5cIiwgXCJtYXhcIiwgXCJpbnB1dFR5cGVcIiwgXCJtaW5WYWx1ZUV4cHJlc3Npb25cIiwgXCJtYXhWYWx1ZUV4cHJlc3Npb25cIl0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0UmVuZGVyZWRNaW5NYXgoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBpc1RleHRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gW1widGV4dFwiLCBcIm51bWJlclwiLCBcInBhc3N3b3JkXCJdLmluZGV4T2YodGhpcy5pbnB1dFR5cGUpID4gLTE7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICB0aGlzLnNldFJlbmRlcmVkTWluTWF4KCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBpbnB1dCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBpbnB1dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5wdXRUeXBlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW5wdXRUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbCA9PSBcImRhdGV0aW1lX2xvY2FsXCIpIHZhbCA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbnB1dFR5cGVcIiwgdmFsLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5taW4gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm1heCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc3RlcCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIHRoYXQgc3BlY2lmaWVzIGhvdyB0aGUgcXVlc3Rpb24gdXBkYXRlcyBpdCdzIHZhbHVlLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTpcbiAgICogLSBgZGVmYXVsdGAgLSBnZXQgdGhlIHZhbHVlIGZyb20gc3VydmV5LnRleHRVcGRhdGVNb2RlXG4gICAqIC0gYG9uQmx1cmAgLSB0aGUgdmFsdWUgaXMgdXBkYXRlZCBhZnRlciBhbiBpbnB1dCBsb3NlcyB0aGUgZm9jdXMuXG4gICAqIC0gYG9uVHlwaW5nYCAtIHVwZGF0ZSB0aGUgdmFsdWUgb2YgdGV4dCBxdWVzdGlvbnMsIFwidGV4dFwiIGFuZCBcImNvbW1lbnRcIiwgb24gZXZlcnkga2V5IHByZXNzLlxuICAgKlxuICAgKiBOb3RlLCB0aGF0IHNldHRpbmcgdG8gXCJvblR5cGluZ1wiIG1heSBsZWFkIHRvIGEgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24sIGluIGNhc2UgeW91IGhhdmUgbWFueSBleHByZXNzaW9ucyBpbiB0aGUgc3VydmV5LlxuICAgKiBAc2VlIHN1cnZleS50ZXh0VXBkYXRlTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCB0ZXh0VXBkYXRlTW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0ZXh0VXBkYXRlTW9kZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRleHRVcGRhdGVNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGV4dFVwZGF0ZU1vZGVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzU3VydmV5SW5wdXRUZXh0VXBkYXRlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnRleHRVcGRhdGVNb2RlID09IFwiZGVmYXVsdFwiKVxuICAgICAgcmV0dXJuICEhdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5pc1VwZGF0ZVZhbHVlVGV4dE9uVHlwaW5nIDogZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMudGV4dFVwZGF0ZU1vZGUgPT0gXCJvblR5cGluZ1wiO1xuICB9XG4gIHB1YmxpYyBnZXRWYWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4ge1xuICAgIHZhciB2YWxpZGF0b3JzID0gc3VwZXIuZ2V0VmFsaWRhdG9ycygpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaW5wdXRUeXBlID09PSBcImVtYWlsXCIgJiZcbiAgICAgICF0aGlzLnZhbGlkYXRvcnMuc29tZSgodikgPT4gdi5nZXRUeXBlKCkgPT09IFwiZW1haWx2YWxpZGF0b3JcIilcbiAgICApIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChuZXcgRW1haWxWYWxpZGF0b3IoKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xuICB9XG4gIGlzTGF5b3V0VHlwZVN1cHBvcnRlZChsYXlvdXRUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gdGV4dCBsZW5ndGguIElmIGl0IGlzIC0xLCBkZWZhdWwgdmFsdWUsIHRoZW4gdGhlIHN1cnZleSBtYXhUZXh0TGVuZ3RoIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAgICogSWYgaXQgaXMgMCwgdGhlbiB0aGUgdmFsdWUgaXMgdW5saW1pdGVkXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubWF4VGV4dExlbmd0aFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4TGVuZ3RoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4TGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4TGVuZ3RoXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldE1heExlbmd0aCgpOiBhbnkge1xuICAgIHJldHVybiBIZWxwZXJzLmdldE1heExlbmd0aChcbiAgICAgIHRoaXMubWF4TGVuZ3RoLFxuICAgICAgdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5tYXhUZXh0TGVuZ3RoIDogLTFcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBpbnB1dCBzaXplXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2l6ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpemUodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaXplXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBhdXRvQ29tcGxldGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYXV0b0NvbXBsZXRlXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXV0b0NvbXBsZXRlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYXV0b0NvbXBsZXRlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5cIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW4odmFsOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRXhwcmVzc2lvbih2YWwpKSB7XG4gICAgICB0aGlzLm1pblZhbHVlRXhwcmVzc2lvbiA9IHZhbC5zdWJzdHIoMSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pblwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIGdldCBtYXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4KHZhbDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUV4cHJlc3Npb24odmFsKSkge1xuICAgICAgdGhpcy5tYXhWYWx1ZUV4cHJlc3Npb24gPSB2YWwuc3Vic3RyKDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG1pblZhbHVlRXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5WYWx1ZUV4cHJlc3Npb25cIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBtaW5WYWx1ZUV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5WYWx1ZUV4cHJlc3Npb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG1heFZhbHVlRXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhWYWx1ZUV4cHJlc3Npb25cIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXhWYWx1ZUV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhWYWx1ZUV4cHJlc3Npb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlbmRlcmVkTWluKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlbmRlcmVkTWluXCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRNYXgoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRNYXhcIik7XG4gIH1cbiAgcHJpdmF0ZSBzZXRSZW5kZXJlZE1pbk1heCgpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXG4gICAgICBcInJlbmRlcmVkTWluXCIsXG4gICAgICB0aGlzLmdldFZhbHVlQW5kUnVuRXhwcmVzc2lvbih0aGlzLm1pbiwgdGhpcy5taW5WYWx1ZUV4cHJlc3Npb24pXG4gICAgKTtcbiAgICB2YXIgdmFsID0gdGhpcy5nZXRWYWx1ZUFuZFJ1bkV4cHJlc3Npb24odGhpcy5tYXgsIHRoaXMubWF4VmFsdWVFeHByZXNzaW9uKTtcbiAgICBpZiAoXG4gICAgICAhdmFsICYmXG4gICAgICAodGhpcy5pbnB1dFR5cGUgPT09IFwiZGF0ZVwiIHx8IHRoaXMuaW5wdXRUeXBlID09PSBcImRhdGV0aW1lLWxvY2FsXCIpXG4gICAgKSB7XG4gICAgICB2YWwgPSBcIjI5OTktMTItMzFcIjtcbiAgICB9XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyZWRNYXhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHN0ZXAgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RlcCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdGVwXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RlcCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0ZXBcIiwgdmFsKTtcbiAgfVxuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5pc0VtcHR5KCkgfHwgdGhpcy52YWx1ZSA9PT0gXCJcIjtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydEdvTmV4dFBhZ2VFcnJvcigpIHtcbiAgICByZXR1cm4gW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIl0uaW5kZXhPZih0aGlzLmlucHV0VHlwZSkgPCAwO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgcGxhY2UgaG9sZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBwbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBsYWNlSG9sZGVyXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1BsYWNlSG9sZGVyKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIHByb3RlY3RlZCBjYW5SdW5WYWxpZGF0b3JzKGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5lcnJvcnMubGVuZ3RoID4gMCB8fFxuICAgICAgIWlzT25WYWx1ZUNoYW5nZWQgfHxcbiAgICAgIHRoaXMuc3VwcG9ydEdvTmV4dFBhZ2VFcnJvcigpXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIG5ld1ZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWVUeXBlKG5ld1ZhbHVlKTtcbiAgICBzdXBlci5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNvcnJlY3RWYWx1ZVR5cGUobmV3VmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIGlmICh0aGlzLmlucHV0VHlwZSA9PSBcIm51bWJlclwiIHx8IHRoaXMuaW5wdXRUeXBlID09IFwicmFuZ2VcIikge1xuICAgICAgcmV0dXJuIEhlbHBlcnMuaXNOdW1iZXIobmV3VmFsdWUpID8gcGFyc2VGbG9hdChuZXdWYWx1ZSkgOiBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gbmV3VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGFkZFN1cHBvcnRlZFZhbGlkYXRvcnMoc3VwcG9ydGVkVmFsaWRhdG9yczogQXJyYXk8c3RyaW5nPikge1xuICAgIHN1cGVyLmFkZFN1cHBvcnRlZFZhbGlkYXRvcnMoc3VwcG9ydGVkVmFsaWRhdG9ycyk7XG4gICAgc3VwcG9ydGVkVmFsaWRhdG9ycy5wdXNoKFwibnVtZXJpY1wiLCBcInRleHRcIiwgXCJyZWdleFwiLCBcImVtYWlsXCIpO1xuICB9XG59XG5cbmNvbnN0IG1pbk1heFR5cGVzID0gW1xuICBcIm51bWJlclwiLFxuICBcInJhbmdlXCIsXG4gIFwiZGF0ZVwiLFxuICBcImRhdGV0aW1lLWxvY2FsXCIsXG4gIFwibW9udGhcIixcbiAgXCJ0aW1lXCIsXG4gIFwid2Vla1wiLFxuXTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJ0ZXh0XCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImlucHV0VHlwZVwiLFxuICAgICAgZGVmYXVsdDogXCJ0ZXh0XCIsXG4gICAgICBjaG9pY2VzOiBbXG4gICAgICAgIFwiY29sb3JcIixcbiAgICAgICAgXCJkYXRlXCIsXG4gICAgICAgIFwiZGF0ZXRpbWVcIixcbiAgICAgICAgXCJkYXRldGltZS1sb2NhbFwiLFxuICAgICAgICBcImVtYWlsXCIsXG4gICAgICAgIFwibW9udGhcIixcbiAgICAgICAgXCJudW1iZXJcIixcbiAgICAgICAgXCJwYXNzd29yZFwiLFxuICAgICAgICBcInJhbmdlXCIsXG4gICAgICAgIFwidGVsXCIsXG4gICAgICAgIFwidGV4dFwiLFxuICAgICAgICBcInRpbWVcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJ3ZWVrXCIsXG4gICAgICBdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcInNpemU6bnVtYmVyXCIsIGRlZmF1bHQ6IDI1IH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ0ZXh0VXBkYXRlTW9kZVwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwib25CbHVyXCIsIFwib25UeXBpbmdcIl0sXG4gICAgICBkZXBlbmRzT246IFwiaW5wdXRUeXBlXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uIChvYmo6IGFueSkge1xuICAgICAgICBpZiAoIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gb2JqLmlucHV0VHlwZSA9PSBcInRleHRcIjtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImF1dG9Db21wbGV0ZVwiLFxuICAgICAgZGF0YUxpc3Q6IFtcbiAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgIFwiaG9ub3JpZmljLXByZWZpeFwiLFxuICAgICAgICBcImdpdmVuLW5hbWVcIixcbiAgICAgICAgXCJhZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgXCJmYW1pbHktbmFtZVwiLFxuICAgICAgICBcImhvbm9yaWZpYy1zdWZmaXhcIixcbiAgICAgICAgXCJuaWNrbmFtZVwiLFxuICAgICAgICBcIm9yZ2FuaXphdGlvbi10aXRsZVwiLFxuICAgICAgICBcInVzZXJuYW1lXCIsXG4gICAgICAgIFwibmV3LXBhc3N3b3JkXCIsXG4gICAgICAgIFwiY3VycmVudC1wYXNzd29yZFwiLFxuICAgICAgICBcIm9yZ2FuaXphdGlvblwiLFxuICAgICAgICBcInN0cmVldC1hZGRyZXNzXCIsXG4gICAgICAgIFwiYWRkcmVzcy1saW5lMVwiLFxuICAgICAgICBcImFkZHJlc3MtbGluZTJcIixcbiAgICAgICAgXCJhZGRyZXNzLWxpbmUzXCIsXG4gICAgICAgIFwiYWRkcmVzcy1sZXZlbDRcIixcbiAgICAgICAgXCJhZGRyZXNzLWxldmVsM1wiLFxuICAgICAgICBcImFkZHJlc3MtbGV2ZWwyXCIsXG4gICAgICAgIFwiYWRkcmVzcy1sZXZlbDFcIixcbiAgICAgICAgXCJjb3VudHJ5XCIsXG4gICAgICAgIFwiY291bnRyeS1uYW1lXCIsXG4gICAgICAgIFwicG9zdGFsLWNvZGVcIixcbiAgICAgICAgXCJjYy1uYW1lXCIsXG4gICAgICAgIFwiY2MtZ2l2ZW4tbmFtZVwiLFxuICAgICAgICBcImNjLWFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICBcImNjLWZhbWlseS1uYW1lXCIsXG4gICAgICAgIFwiY2MtbnVtYmVyXCIsXG4gICAgICAgIFwiY2MtZXhwXCIsXG4gICAgICAgIFwiY2MtZXhwLW1vbnRoXCIsXG4gICAgICAgIFwiY2MtZXhwLXllYXJcIixcbiAgICAgICAgXCJjYy1jc2NcIixcbiAgICAgICAgXCJjYy10eXBlXCIsXG4gICAgICAgIFwidHJhbnNhY3Rpb24tY3VycmVuY3lcIixcbiAgICAgICAgXCJ0cmFuc2FjdGlvbi1hbW91bnRcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiLFxuICAgICAgICBcImJkYXlcIixcbiAgICAgICAgXCJiZGF5LWRheVwiLFxuICAgICAgICBcImJkYXktbW9udGhcIixcbiAgICAgICAgXCJiZGF5LXllYXJcIixcbiAgICAgICAgXCJzZXhcIixcbiAgICAgICAgXCJ1cmxcIixcbiAgICAgICAgXCJwaG90b1wiLFxuICAgICAgICBcInRlbFwiLFxuICAgICAgICBcInRlbC1jb3VudHJ5LWNvZGVcIixcbiAgICAgICAgXCJ0ZWwtbmF0aW9uYWxcIixcbiAgICAgICAgXCJ0ZWwtYXJlYS1jb2RlXCIsXG4gICAgICAgIFwidGVsLWxvY2FsXCIsXG4gICAgICAgIFwidGVsLWxvY2FsLXByZWZpeFwiLFxuICAgICAgICBcInRlbC1sb2NhbC1zdWZmaXhcIixcbiAgICAgICAgXCJ0ZWwtZXh0ZW5zaW9uXCIsXG4gICAgICAgIFwiZW1haWxcIixcbiAgICAgICAgXCJpbXBwXCIsXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtaW5cIixcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24gKG9iajogYW55KSB7XG4gICAgICAgIGlmICghb2JqKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBtaW5NYXhUeXBlcy5pbmRleE9mKG9iai5pbnB1dFR5cGUpICE9PSAtMTtcbiAgICAgIH0sXG4gICAgICBvblByb3BlcnR5RWRpdG9yVXBkYXRlOiBmdW5jdGlvbiAob2JqOiBhbnksIHByb3BlcnR5RWRpdG9yOiBhbnkpIHtcbiAgICAgICAgcHJvcGVydHlFZGl0b3IuaW5wdXRUeXBlID0gb2JqLmlucHV0VHlwZTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1heFwiLFxuICAgICAgZGVwZW5kc09uOiBcImlucHV0VHlwZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgICAgaWYgKCFvYmopIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIG1pbk1heFR5cGVzLmluZGV4T2Yob2JqLmlucHV0VHlwZSkgIT09IC0xO1xuICAgICAgfSxcbiAgICAgIG9uUHJvcGVydHlFZGl0b3JVcGRhdGU6IGZ1bmN0aW9uIChvYmo6IGFueSwgcHJvcGVydHlFZGl0b3I6IGFueSkge1xuICAgICAgICBwcm9wZXJ0eUVkaXRvci5pbnB1dFR5cGUgPSBvYmouaW5wdXRUeXBlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWluVmFsdWVFeHByZXNzaW9uOmV4cHJlc3Npb25cIixcbiAgICAgIGNhdGVnb3J5OiBcImxvZ2ljXCIsXG4gICAgICBkZXBlbmRzT246IFwiaW5wdXRUeXBlXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uIChvYmo6IGFueSkge1xuICAgICAgICBpZiAoIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbWluTWF4VHlwZXMuaW5kZXhPZihvYmouaW5wdXRUeXBlKSAhPT0gLTE7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXhWYWx1ZUV4cHJlc3Npb246ZXhwcmVzc2lvblwiLFxuICAgICAgY2F0ZWdvcnk6IFwibG9naWNcIixcbiAgICAgIGRlcGVuZHNPbjogXCJpbnB1dFR5cGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24gKG9iajogYW55KSB7XG4gICAgICAgIGlmICghb2JqKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBtaW5NYXhUeXBlcy5pbmRleE9mKG9iai5pbnB1dFR5cGUpICE9PSAtMTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInN0ZXA6bnVtYmVyXCIsXG4gICAgICBkZXBlbmRzT246IFwiaW5wdXRUeXBlXCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uIChvYmo6IGFueSkge1xuICAgICAgICBpZiAoIW9iaikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gb2JqLmlucHV0VHlwZSA9PT0gXCJudW1iZXJcIjtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IG5hbWU6IFwibWF4TGVuZ3RoOm51bWJlclwiLCBkZWZhdWx0OiAtMSB9LFxuICAgIHsgbmFtZTogXCJwbGFjZUhvbGRlclwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGxhY2VIb2xkZXJcIiB9LFxuICBdLFxuICBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblRleHRNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInRleHRcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblRleHRNb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX3RleHQudHMiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IElTdXJ2ZXlDcmVhdG9yIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvblwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vc3VydmV5XCI7XG5pbXBvcnQgeyBRdWVzdGlvblJvd01vZGVsLCBQYW5lbE1vZGVsLCBQYW5lbE1vZGVsQmFzZSB9IGZyb20gXCIuLi9wYW5lbFwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudEJhc2UgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlSb3cgfSBmcm9tIFwiLi9yb3dcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVBhbmVsQmFzZSBleHRlbmRzIFN1cnZleUVsZW1lbnRCYXNlIHtcbiAgcHJvdGVjdGVkIHJvb3RSZWY6IFJlYWN0LlJlZk9iamVjdDxIVE1MRGl2RWxlbWVudD47XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5yb290UmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0YXRlRWxlbWVudCgpOiBCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbEJhc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXkoKTogU3VydmV5TW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldFN1cnZleSgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgY3JlYXRvcigpOiBJU3VydmV5Q3JlYXRvciB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY3JlYXRvcjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IGNzcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldENzcygpO1xuICB9XG4gIHB1YmxpYyBnZXQgcGFuZWxCYXNlKCk6IFBhbmVsTW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYW5lbEJhc2UoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UGFuZWxCYXNlKCk6IFBhbmVsTW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5lbGVtZW50O1xuICB9XG4gIHByb3RlY3RlZCBnZXRTdXJ2ZXkoKTogU3VydmV5TW9kZWwge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnN1cnZleTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q3NzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY3NzO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgdGhpcy5kb0FmdGVyUmVuZGVyKCk7XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICB2YXIgZWwgPSB0aGlzLnJvb3RSZWYuY3VycmVudDtcbiAgICBpZiAoISFlbCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1yZW5kZXJlZFwiKTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogYW55LCBwcmV2U3RhdGU6IGFueSkge1xuICAgIHN1cGVyLmNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSk7XG4gICAgaWYgKFxuICAgICAgISFwcmV2UHJvcHMucGFnZSAmJlxuICAgICAgISF0aGlzLnN1cnZleSAmJlxuICAgICAgISF0aGlzLnN1cnZleS5jdXJyZW50UGFnZSAmJlxuICAgICAgcHJldlByb3BzLnBhZ2UubmFtZSA9PT0gdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2UubmFtZVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmRvQWZ0ZXJSZW5kZXIoKTtcbiAgfVxuICBwcml2YXRlIGRvQWZ0ZXJSZW5kZXIoKSB7XG4gICAgdmFyIGVsID0gdGhpcy5yb290UmVmLmN1cnJlbnQ7XG4gICAgaWYgKGVsICYmIHRoaXMuc3VydmV5KSB7XG4gICAgICBpZiAodGhpcy5wYW5lbEJhc2UuaXNQYW5lbCkge1xuICAgICAgICB0aGlzLnN1cnZleS5hZnRlclJlbmRlclBhbmVsKHRoaXMucGFuZWxCYXNlIGFzIFBhbmVsTW9kZWwsIGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3VydmV5LmFmdGVyUmVuZGVyUGFnZShlbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCByZW5kZXJSb3dzKGNzczogYW55KTogQXJyYXk8SlNYLkVsZW1lbnQ+IHtcbiAgICB2YXIgcm93cyA9IFtdO1xuICAgIHZhciBxdWVzdGlvblJvd3MgPSB0aGlzLnBhbmVsQmFzZS5yb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25Sb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzLnB1c2godGhpcy5jcmVhdGVSb3cocXVlc3Rpb25Sb3dzW2ldLCBpLCBjc3MpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJvdyhcbiAgICByb3c6IFF1ZXN0aW9uUm93TW9kZWwsXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBjc3M6IGFueVxuICApOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIHJvd05hbWUgPSBcInJvd1wiICsgKGluZGV4ICsgMSk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdXJ2ZXlSb3dcbiAgICAgICAga2V5PXtyb3dOYW1lfVxuICAgICAgICByb3c9e3Jvd31cbiAgICAgICAgc3VydmV5PXt0aGlzLnN1cnZleX1cbiAgICAgICAgY3JlYXRvcj17dGhpcy5jcmVhdG9yfVxuICAgICAgICBjc3M9e2Nzc31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3BhbmVsLWJhc2UudHN4IiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4vc3VydmV5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBzdXJ2ZXkgcnVubmluZyBpbiB0aGUgV2luZG93LlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5V2luZG93TW9kZWwgZXh0ZW5kcyBCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBzdXJ2ZXlFbGVtZW50TmFtZSA9IFwid2luZG93U3VydmV5SlNcIjtcbiAgc3VydmV5VmFsdWU6IFN1cnZleU1vZGVsO1xuICB3aW5kb3dFbGVtZW50OiBIVE1MRGl2RWxlbWVudDtcblxuICB0ZW1wbGF0ZVZhbHVlOiBzdHJpbmc7XG4gIGV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBzaG93aW5nQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjbG9zZVdpbmRvd09uQ29tcGxldGVDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3Rvcihqc29uT2JqOiBhbnksIGluaXRpYWxNb2RlbDogU3VydmV5TW9kZWwgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoaW5pdGlhbE1vZGVsKSB7XG4gICAgICB0aGlzLnN1cnZleVZhbHVlID0gaW5pdGlhbE1vZGVsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1cnZleVZhbHVlID0gdGhpcy5jcmVhdGVTdXJ2ZXkoanNvbk9iaik7XG4gICAgfVxuICAgIHRoaXMuc3VydmV5VmFsdWUuc2hvd1RpdGxlID0gZmFsc2U7XG4gICAgaWYgKFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBkb2N1bWVudCkge1xuICAgICAgdGhpcy53aW5kb3dFbGVtZW50ID0gPEhUTUxEaXZFbGVtZW50PmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnN1cnZleS5vbkNvbXBsZXRlLmFkZChmdW5jdGlvbiAoc3VydmV5LCBvcHRpb25zKSB7XG4gICAgICBzZWxmLm9uU3VydmV5Q29tcGxldGUoKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIndpbmRvd1wiO1xuICB9XG4gIC8qKlxuICAgKiBBIHN1cnZleSBvYmplY3QuXG4gICAqIEBzZWUgU3VydmV5TW9kZWxcbiAgICovXG4gIHB1YmxpYyBnZXQgc3VydmV5KCk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgdmFsdWUgdG8gbmVnYXRpdmUgdmFsdWUsIGZvciBleGFtcGxlIC0xLCB0byBhdm9pZCBjbG9zaW5nIHRoZSB3aW5kb3cgb24gY29tcGxldGluZyB0aGUgc3VydmV5LiBMZWF2ZSBpdCBlcXVhbHMgdG8gMCAoZGVmYXVsdCB2YWx1ZSkgdG8gY2xvc2UgdGhlIHdpbmRvdyBpbW1lZGlhdGVseSwgb3Igc2V0IGl0IHRvIDMsIDUsIDEwLCAuLi4gdG8gY2xvc2UgdGhlIHdpbmRvdyBpbiAzLCA1LCAxMCBzZWNvbmRzLlxuICAgKi9cbiAgcHVibGljIGNsb3NlT25Db21wbGV0ZVRpbWVvdXQ6IG51bWJlciA9IDA7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgc2hvd2luZy4gU2V0IGl0IHRvIHRydWUgdG8gc2hvdyB0aGUgd2luZG93IGFuZCBmYWxzZSB0byBoaWRlIGl0LlxuICAgKiBAc2VlIHNob3dcbiAgICogQHNlZSBoaWRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNTaG93aW5nXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzU2hvd2luZyh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5pc1Nob3dpbmcgPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNTaG93aW5nXCIsIHZhbCk7XG4gICAgaWYgKHRoaXMuc2hvd2luZ0NoYW5nZWRDYWxsYmFjaykgdGhpcy5zaG93aW5nQ2hhbmdlZENhbGxiYWNrKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNob3cgdGhlIHdpbmRvd1xuICAgKiBAc2VlIGhpZGVcbiAgICogQHNlZSBpc1Nob3dpbmdcbiAgICovXG4gIHB1YmxpYyBzaG93KCkge1xuICAgIHRoaXMuaXNTaG93aW5nID0gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogSGlkZSB0aGUgd2luZG93XG4gICAqIEBzZWUgc2hvd1xuICAgKiBAc2VlIGlzU2hvd2luZ1xuICAgKi9cbiAgcHVibGljIGhpZGUoKSB7XG4gICAgdGhpcy5pc1Nob3dpbmcgPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZXhwYW5kZWQuIFNldCBpdCB0byB0cnVlIHRvIGV4cGFuZCB0aGUgd2luZG93IG9yIGZhbHNlIHRvIGNvbGxhcHNlIGl0LlxuICAgKiBAc2VlIGV4cGFuZFxuICAgKiBAc2VlIGNvbGxhcHNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRXhwYW5kZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzRXhwYW5kZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNFeHBhbmRlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0V4cGFuZGVkXCIsIHZhbCk7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHRoaXMuZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2spXG4gICAgICB0aGlzLmV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrKCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB3aW5kb3cgYW5kIHN1cnZleSB0aXRsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkudGl0bGU7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zdXJ2ZXkudGl0bGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbG9jVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5sb2NUaXRsZTtcbiAgfVxuICAvKipcbiAgICogRXhwYW5kIHRoZSB3aW5kb3cgdG8gc2hvdyB0aGUgc3VydmV5LlxuICAgKi9cbiAgcHVibGljIGV4cGFuZCgpIHtcbiAgICB0aGlzLmV4cGFuZGNvbGxhcHNlKHRydWUpO1xuICB9XG4gIC8qKlxuICAgKiBDb2xsYXBzZSB0aGUgd2luZG93IGFuZCBzaG93IHN1cnZleSB0aXRsZSBvbmx5LlxuICAgKi9cbiAgcHVibGljIGNvbGxhcHNlKCkge1xuICAgIHRoaXMuZXhwYW5kY29sbGFwc2UoZmFsc2UpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXkoanNvbk9iajogYW55KTogU3VydmV5TW9kZWwge1xuICAgIHJldHVybiBuZXcgU3VydmV5TW9kZWwoanNvbk9iaik7XG4gIH1cbiAgcHJvdGVjdGVkIGV4cGFuZGNvbGxhcHNlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0V4cGFuZGVkID0gdmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VydmV5Q29tcGxldGUoKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VPbkNvbXBsZXRlVGltZW91dCA8IDApIHJldHVybjtcbiAgICBpZiAodGhpcy5jbG9zZU9uQ29tcGxldGVUaW1lb3V0ID09IDApIHtcbiAgICAgIHRoaXMuY2xvc2VXaW5kb3dPbkNvbXBsZXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciB0aW1lcklkOiBhbnkgPSBudWxsO1xuICAgICAgdmFyIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuY2xvc2VXaW5kb3dPbkNvbXBsZXRlKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGltZXJJZCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aW1lcklkID1cbiAgICAgICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgID8gd2luZG93LnNldEludGVydmFsKGZ1bmMsIHRoaXMuY2xvc2VPbkNvbXBsZXRlVGltZW91dCAqIDEwMDApXG4gICAgICAgICAgOiAwO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2xvc2VXaW5kb3dPbkNvbXBsZXRlKCkge1xuICAgIGlmICghIXRoaXMuY2xvc2VXaW5kb3dPbkNvbXBsZXRlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuY2xvc2VXaW5kb3dPbkNvbXBsZXRlQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXlXaW5kb3cudHMiLCJpbXBvcnQgeyBFdmVudCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuZXhwb3J0IHZhciBzdXJ2ZXlUaW1lckZ1bmN0aW9ucyA9IHtcbiAgc2V0VGltZW91dDogZnVuY3Rpb24gKGZ1bmM6ICgpID0+IGFueSk6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiAwO1xuICAgIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jLCAxMDAwKTtcbiAgfSxcbiAgY2xlYXJUaW1lb3V0OiBmdW5jdGlvbiAodGltZXJJZDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICB9LFxufTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVRpbWVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VWYWx1ZTogU3VydmV5VGltZXIgPSBudWxsO1xuICBwdWJsaWMgc3RhdGljIGdldCBpbnN0YW5jZSgpIHtcbiAgICBpZiAoIVN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUpIHtcbiAgICAgIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUgPSBuZXcgU3VydmV5VGltZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBsaXN0ZW5lckNvdW50ZXIgPSAwO1xuICBwcml2YXRlIHRpbWVySWQgPSAtMTtcbiAgcHVibGljIG9uVGltZXI6IEV2ZW50PCgpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoKSA9PiBhbnksIGFueT4oKTtcbiAgcHVibGljIHN0YXJ0KGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLmFkZChmdW5jKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGltZXJJZCA8IDApIHtcbiAgICAgIHRoaXMudGltZXJJZCA9IHN1cnZleVRpbWVyRnVuY3Rpb25zLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRvVGltZXIoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmxpc3RlbmVyQ291bnRlcisrO1xuICB9XG4gIHB1YmxpYyBzdG9wKGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLnJlbW92ZShmdW5jKTtcbiAgICB9XG4gICAgdGhpcy5saXN0ZW5lckNvdW50ZXItLTtcbiAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50ZXIgPT0gMCAmJiB0aGlzLnRpbWVySWQgPiAtMSkge1xuICAgICAgc3VydmV5VGltZXJGdW5jdGlvbnMuY2xlYXJUaW1lb3V0KHRoaXMudGltZXJJZCk7XG4gICAgICB0aGlzLnRpbWVySWQgPSAtMTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGRvVGltZXIoKSB7XG4gICAgaWYgKHRoaXMudGltZXJJZCA8IDApIHJldHVybjtcbiAgICB0aGlzLm9uVGltZXIuZmlyZSh0aGlzLCB7fSk7XG4gICAgdGhpcy50aW1lcklkID0gc3VydmV5VGltZXJGdW5jdGlvbnMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRvVGltZXIoKTtcbiAgICB9KTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleXRpbWVyLnRzIiwiaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4vY3Nzc3RhbmRhcmRcIjtcblxuZXhwb3J0IHZhciBkZWZhdWx0Qm9vdHN0cmFwQ3NzID0ge1xuICByb290OiBcInN2X21haW4gc3ZfYm9vdHN0cmFwX2Nzc1wiLFxuICBjb250YWluZXI6IFwic3ZfY29udGFpbmVyXCIsXG4gIGhlYWRlcjogXCJwYW5lbC1oZWFkaW5nIGNhcmQtaGVhZGVyXCIsXG4gIGJvZHk6IFwicGFuZWwtYm9keSBjYXJkLWJsb2NrIG10LTRcIixcbiAgYm9keUVtcHR5OiBcInBhbmVsLWJvZHkgY2FyZC1ibG9jayBtdC00IHN2X2JvZHlfZW1wdHlcIixcbiAgZm9vdGVyOiBcInBhbmVsLWZvb3RlciBjYXJkLWZvb3RlclwiLFxuICB0aXRsZTogXCJcIixcbiAgZGVzY3JpcHRpb246IFwiXCIsXG4gIGxvZ286IFwic3ZfbG9nb1wiLFxuICBsb2dvSW1hZ2U6IFwic3ZfbG9nb19faW1hZ2VcIixcbiAgaGVhZGVyVGV4dDogXCJzdl9oZWFkZXJfX3RleHRcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJcIixcbiAgbmF2aWdhdGlvbjoge1xuICAgIGNvbXBsZXRlOiBcImJ0biBzdl9jb21wbGV0ZV9idG5cIixcbiAgICBwcmV2OiBcImJ0biBzdl9wcmV2X2J0blwiLFxuICAgIG5leHQ6IFwiYnRuIHN2X25leHRfYnRuXCIsXG4gICAgc3RhcnQ6IFwiYnRuIHN2X3N0YXJ0X2J0blwiLFxuICAgIHByZXZpZXc6IFwiYnRuIHN2X3ByZXZpZXdfYnRuXCIsXG4gICAgZWRpdDogXCJidG4gc3ZfZWRpdF9idG5cIixcbiAgfSxcbiAgcHJvZ3Jlc3M6IFwicHJvZ3Jlc3MgY2VudGVyLWJsb2NrIG14LWF1dG8gbWItNFwiLFxuICBwcm9ncmVzc0JhcjogXCJwcm9ncmVzcy1iYXJcIixcbiAgcHJvZ3Jlc3NUZXh0VW5kZXJCYXI6IFwic3YtaGlkZGVuXCIsXG4gIHBhZ2U6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gIH0sXG4gIHBhZ2VUaXRsZTogXCJcIixcbiAgcGFnZURlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gIHJvdzogXCJzdl9yb3dcIixcbiAgcXVlc3Rpb246IHtcbiAgICBtYWluUm9vdDogXCJzdl9xc3RuXCIsXG4gICAgZmxvd1Jvb3Q6IFwic3ZfcV9mbG93IHN2X3FzdG5cIixcbiAgICBoZWFkZXI6IFwiXCIsXG4gICAgaGVhZGVyTGVmdDogXCJ0aXRsZS1sZWZ0XCIsXG4gICAgY29udGVudDogXCJcIixcbiAgICBjb250ZW50TGVmdDogXCJjb250ZW50LWxlZnRcIixcbiAgICB0aXRsZUxlZnRSb290OiBcInN2X3FzdG5fbGVmdFwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIG51bWJlcjogXCJzdl9xX251bVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gICAgZGVzY3JpcHRpb25VbmRlcklucHV0OiBcInNtYWxsXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2X3FfcmVxdWlyZWRfdGV4dFwiLFxuICAgIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgcmVxdWlyZWQ6IFwiXCIsXG4gICAgdGl0bGVSZXF1aXJlZDogXCJcIixcbiAgICBoYXNFcnJvcjogXCJoYXMtZXJyb3JcIixcbiAgICBpbmRlbnQ6IDIwLFxuICAgIGZvcm1Hcm91cDogXCJmb3JtLWdyb3VwXCIsXG4gIH0sXG4gIHBhbmVsOiB7XG4gICAgdGl0bGU6IFwic3ZfcF90aXRsZVwiLFxuICAgIHRpdGxlRXhwYW5kYWJsZTogXCJzdl9wX3RpdGxlX2V4cGFuZGFibGVcIixcbiAgICB0aXRsZU9uRXJyb3I6IFwiXCIsXG4gICAgaWNvbjogXCJzdl9wYW5lbF9pY29uXCIsXG4gICAgaWNvbkV4cGFuZGVkOiBcInN2X2V4cGFuZGVkXCIsXG4gICAgZGVzY3JpcHRpb246IFwic21hbGwgc3ZfcF9kZXNjcmlwdGlvblwiLFxuICAgIGNvbnRhaW5lcjogXCJzdl9wX2NvbnRhaW5lclwiLFxuICAgIGZvb3RlcjogXCJzdl9wX2Zvb3RlclwiLFxuICAgIG51bWJlcjogXCJzdl9xX251bVwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJzdl9xX3JlcXVpcmVkX3RleHRcIixcbiAgfSxcbiAgZXJyb3I6IHtcbiAgICByb290OiBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiLFxuICAgIGljb246IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1leGNsYW1hdGlvbi1zaWduXCIsXG4gICAgaXRlbTogXCJcIixcbiAgICBsb2NhdGlvblRvcDogXCJzdl9xc3RuX2Vycm9yX3RvcFwiLFxuICAgIGxvY2F0aW9uQm90dG9tOiBcInN2X3FzdG5fZXJyb3JfYm90dG9tXCIsXG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICByb290OiBcInN2X3FibG4gZm9ybS1pbmxpbmUgY2hlY2tib3hcIixcbiAgICBpdGVtOiBcInN2LWJvb2xlYW5cIixcbiAgICBjb250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwic3YtYm9vbGVhbi0tY2hlY2tlZCBjaGVja2VkXCIsXG4gICAgaXRlbUluZGV0ZXJtaW5hdGU6IFwic3YtYm9vbGVhbi0taW5kZXRlcm1pbmF0ZVwiLFxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1ib29sZWFuLS1kaXNhYmxlZFwiLFxuICAgIHN3aXRjaDogXCJzdi1ib29sZWFuX19zd2l0Y2hcIixcbiAgICBzbGlkZXI6IFwic3YtYm9vbGVhbl9fc2xpZGVyXCIsXG4gICAgbGFiZWw6IFwic3YtYm9vbGVhbl9fbGFiZWwgXCIsXG4gICAgZGlzYWJsZWRMYWJlbDogXCJzdi1ib29sZWFuX19sYWJlbC0tZGlzYWJsZWRcIixcbiAgfSxcbiAgY2hlY2tib3g6IHtcbiAgICByb290OiBcInN2X3FjYmMgc3ZfcWNieCBmb3JtLWlubGluZVwiLFxuICAgIGl0ZW06IFwiY2hlY2tib3hcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbVNlbGVjdEFsbDogXCJzdl9xX2NoZWNrYm94X3NlbGVjdGFsbFwiLFxuICAgIGl0ZW1Ob25lOiBcInN2X3FfY2hlY2tib3hfbm9uZVwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9jaGVja2JveF9pbmxpbmVcIixcbiAgICBpdGVtQ29udHJvbDogXCJcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGxhYmVsOiBcIlwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBjb250cm9sTGFiZWw6IFwiXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiY2hlY2tib3gtbWF0ZXJpYWxcIixcbiAgICBvdGhlcjogXCJzdl9xX2NoZWNrYm94X290aGVyIGZvcm0tY29udHJvbFwiLFxuICAgIGNvbHVtbjogXCJzdl9xX3NlbGVjdF9jb2x1bW5cIixcbiAgfSxcbiAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZHJvcGRvd246IHtcbiAgICByb290OiBcIlwiLFxuICAgIGNvbnRyb2w6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9kZF9vdGhlciBmb3JtLWNvbnRyb2xcIixcbiAgfSxcbiAgaHRtbDogeyByb290OiBcIlwiIH0sXG4gIGltYWdlOiB7IHJvb3Q6IFwic3ZfcV9pbWFnZVwiLCBpbWFnZTogXCJzdl9pbWFnZV9pbWFnZVwiIH0sXG4gIG1hdHJpeDoge1xuICAgIHJvb3Q6IFwidGFibGUgc3ZfcV9tYXRyaXhcIixcbiAgICBsYWJlbDogXCJzdl9xX21fbGFiZWxcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBjZWxsVGV4dDogXCJzdl9xX21fY2VsbF90ZXh0XCIsXG4gICAgY2VsbFRleHRTZWxlY3RlZDogXCJzdl9xX21fY2VsbF9zZWxlY3RlZCBiZy1wcmltYXJ5XCIsXG4gICAgY2VsbExhYmVsOiBcInN2X3FfbV9jZWxsX2xhYmVsXCIsXG4gIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7IHJvb3Q6IFwidGFibGVcIiB9LFxuICBtYXRyaXhkeW5hbWljOiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGJ1dHRvbjogXCJidXR0b25cIixcbiAgICBidXR0b25BZGQ6IFwiXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcIlwiLFxuICAgIGljb25BZGQ6IFwiXCIsXG4gICAgaWNvblJlbW92ZTogXCJcIixcbiAgfSxcbiAgcGFuZWxkeW5hbWljOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBuYXZpZ2F0aW9uOiBcInN2LXBhbmVsZHluYW1pY19fbmF2aWdhdGlvblwiLFxuICAgIHByb2dyZXNzVG9wOiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3Mgc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy0tdG9wXCIsXG4gICAgcHJvZ3Jlc3NCb3R0b206XG4gICAgICBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3Mgc3YtcGFuZWxkeW5hbWljX19wcm9ncmVzcy0tYm90dG9tXCIsXG4gICAgdGl0bGU6IFwic3YtdGl0bGUgc3YtcXVlc3Rpb25fX3RpdGxlXCIsXG4gICAgYnV0dG9uOiBcImJ1dHRvblwiLFxuICAgIGJ1dHRvbkFkZDogXCJidXR0b24gc3YtcGFuZWxkeW5hbWljX19hZGQtYnRuXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcImJ1dHRvbiBzdi1wYW5lbGR5bmFtaWNfX3JlbW92ZS1idG5cIixcbiAgICBidXR0b25QcmV2OiBcInN2LXBhbmVsZHluYW1pY19fcHJldi1idG5cIixcbiAgICBidXR0b25OZXh0OiBcInN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIixcbiAgICBwcm9ncmVzc0NvbnRhaW5lcjogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLWNvbnRhaW5lclwiLFxuICAgIHByb2dyZXNzOiBcInN2LXByb2dyZXNzXCIsXG4gICAgcHJvZ3Jlc3NCYXI6IFwic3YtcHJvZ3Jlc3NfX2JhclwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIixcbiAgfSxcbiAgbXVsdGlwbGV0ZXh0OiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGl0ZW1UaXRsZTogXCJcIixcbiAgICBpdGVtVmFsdWU6IFwic3ZfcV9tdF9pdGVtX3ZhbHVlIGZvcm0tY29udHJvbFwiLFxuICB9LFxuICByYWRpb2dyb3VwOiB7XG4gICAgcm9vdDogXCJzdl9xY2JjIGZvcm0taW5saW5lXCIsXG4gICAgaXRlbTogXCJyYWRpb1wiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtSW5saW5lOiBcInN2X3FfcmFkaW9ncm91cF9pbmxpbmVcIixcbiAgICBsYWJlbDogXCJcIixcbiAgICBsYWJlbENoZWNrZWQ6IFwiXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwiXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBjb250cm9sTGFiZWw6IFwiXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiY2lyY2xlXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9yYWRpb2dyb3VwX290aGVyIGZvcm0tY29udHJvbFwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhciBidXR0b25cIixcbiAgICBjb2x1bW46IFwic3ZfcV9zZWxlY3RfY29sdW1uXCIsXG4gIH0sXG4gIGltYWdlcGlja2VyOiB7XG4gICAgcm9vdDogXCJzdl9pbWdzZWxcIixcbiAgICBpdGVtOiBcInN2X3FfaW1nc2VsXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwiY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmxpbmU6IFwic3ZfcV9pbWFnZXBpY2tlcl9pbmxpbmVcIixcbiAgICBsYWJlbDogXCJzdl9xX2ltZ3NlbF9sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfaW1nc2VsX2NvbnRyb2xfaXRlbVwiLFxuICAgIGltYWdlOiBcInN2X3FfaW1nc2VsX2ltYWdlXCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9pbWdzZWxfdGV4dFwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhclwiLFxuICB9LFxuICByYXRpbmc6IHtcbiAgICByb290OiBcImJ0bi1ncm91cFwiLFxuICAgIGl0ZW06IFwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zZWNvbmRhcnlcIixcbiAgICBzZWxlY3RlZDogXCJhY3RpdmVcIixcbiAgICBtaW5UZXh0OiBcInN2X3FfcmF0aW5nX21pbl90ZXh0XCIsXG4gICAgaXRlbVRleHQ6IFwic3ZfcV9yYXRpbmdfaXRlbV90ZXh0XCIsXG4gICAgbWF4VGV4dDogXCJzdl9xX3JhdGluZ19tYXhfdGV4dFwiLFxuICAgIGRpc2FibGVkOiBcIlwiLFxuICB9LFxuICB0ZXh0OiBcImZvcm0tY29udHJvbFwiLFxuICBleHByZXNzaW9uOiBcImZvcm0tY29udHJvbFwiLFxuICBmaWxlOiB7XG4gICAgcm9vdDogXCJzdl9xX2ZpbGVcIixcbiAgICBwbGFjZWhvbGRlcklucHV0OiBcInN2X3FfZmlsZV9wbGFjZWhvbGRlclwiLFxuICAgIHByZXZpZXc6IFwic3ZfcV9maWxlX3ByZXZpZXdcIixcbiAgICByZW1vdmVCdXR0b246IFwic3ZfcV9maWxlX3JlbW92ZV9idXR0b25cIixcbiAgICBmaWxlSW5wdXQ6IFwic3ZfcV9maWxlX2lucHV0XCIsXG4gICAgcmVtb3ZlRmlsZTogXCJzdl9xX2ZpbGVfcmVtb3ZlXCIsXG4gICAgcmVtb3ZlRmlsZVN2ZzogXCJzdi1oaWRkZW5cIixcbiAgICBmaWxlRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIGZpbGVTaWduQm90dG9tOiBcInN2LWhpZGRlblwiLFxuICAgIHJlbW92ZUJ1dHRvbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcbiAgfSxcbiAgc2lnbmF0dXJlcGFkOiB7XG4gICAgcm9vdDogXCJzdl9xX3NpZ25hdHVyZXBhZCBzanNfc3BfY29udGFpbmVyXCIsXG4gICAgY29udHJvbHM6IFwic2pzX3NwX2NvbnRyb2xzXCIsXG4gICAgY2xlYXJCdXR0b246IFwic2pzX3NwX2NsZWFyXCIsXG4gIH0sXG4gIHNhdmVEYXRhOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBzYXZpbmc6IFwiYWxlcnQgYWxlcnQtaW5mb1wiLFxuICAgIGVycm9yOiBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiLFxuICAgIHN1Y2Nlc3M6IFwiYWxlcnQgYWxlcnQtc3VjY2Vzc1wiLFxuICAgIHNhdmVBZ2FpbkJ1dHRvbjogXCJcIixcbiAgfSxcbiAgd2luZG93OiB7XG4gICAgcm9vdDogXCJtb2RhbC1jb250ZW50XCIsXG4gICAgYm9keTogXCJtb2RhbC1ib2R5XCIsXG4gICAgaGVhZGVyOiB7XG4gICAgICByb290OiBcIm1vZGFsLWhlYWRlciBwYW5lbC10aXRsZVwiLFxuICAgICAgdGl0bGU6IFwicHVsbC1sZWZ0XCIsXG4gICAgICBidXR0b246IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHRcIixcbiAgICAgIGJ1dHRvbkV4cGFuZGVkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLXVwXCIsXG4gICAgICBidXR0b25Db2xsYXBzZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tZG93blwiLFxuICAgIH0sXG4gIH0sXG59O1xuKDxhbnk+c3VydmV5Q3NzKVtcImJvb3RzdHJhcFwiXSA9IGRlZmF1bHRCb290c3RyYXBDc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3Nib290c3RyYXAudHMiLCJpbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9jc3NzdGFuZGFyZFwiO1xuXG5leHBvcnQgdmFyIGRlZmF1bHRCb290c3RyYXBNYXRlcmlhbENzcyA9IHtcbiAgcm9vdDogXCJzdl9tYWluIHN2X2Jvb3RzdHJhcG1hdGVyaWFsX2Nzc1wiLFxuICBjb250YWluZXI6IFwic3ZfY29udGFpbmVyXCIsXG4gIGhlYWRlcjogXCJjYXJkLWhlYWRpbmdcIixcbiAgYm9keTogXCJjYXJkLWJvZHlcIixcbiAgYm9keUVtcHR5OiBcImNhcmQtYm9keSBzdl9ib2R5X2VtcHR5XCIsXG4gIGZvb3RlcjogXCJjYXJkLWZvb3RlclwiLFxuICB0aXRsZTogXCJcIixcbiAgZGVzY3JpcHRpb246IFwiXCIsXG4gIGxvZ286IFwic3ZfbG9nb1wiLFxuICBsb2dvSW1hZ2U6IFwic3ZfbG9nb19faW1hZ2VcIixcbiAgaGVhZGVyVGV4dDogXCJzdl9oZWFkZXJfX3RleHRcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJcIixcbiAgbmF2aWdhdGlvbjoge1xuICAgIGNvbXBsZXRlOiBcImJ0biBzdl9jb21wbGV0ZV9idG4gYnRuLXByaW1hcnlcIixcbiAgICBwcmV2OiBcImJ0biBzdl9wcmV2X2J0biBidG4tcHJpbWFyeVwiLFxuICAgIG5leHQ6IFwiYnRuIHN2X25leHRfYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgc3RhcnQ6IFwiYnRuIHN2X3N0YXJ0X2J0biBidG4tcHJpbWFyeVwiLFxuICAgIHByZXZpZXc6IFwiYnRuIHN2X3ByZXZpZXdfYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgZWRpdDogXCJidG4gc3ZfZWRpdF9idG4gYnRuLXByaW1hcnlcIixcbiAgfSxcbiAgcHJvZ3Jlc3M6IFwicHJvZ3Jlc3MgY2VudGVyLWJsb2NrIG14LWF1dG8gbWItNFwiLFxuICBwcm9ncmVzc0JhcjogXCJwcm9ncmVzcy1iYXJcIixcbiAgcHJvZ3Jlc3NUZXh0VW5kZXJCYXI6IFwic3YtaGlkZGVuXCIsXG4gIHBhZ2U6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gIH0sXG4gIHBhZ2VUaXRsZTogXCJcIixcbiAgcGFnZURlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gIHJvdzogXCJzdl9yb3dcIixcbiAgcXVlc3Rpb246IHtcbiAgICBtYWluUm9vdDogXCJzdl9xc3RuIGZvcm0tZ3JvdXAgYm1kLWZvcm0tZ3JvdXBcIixcbiAgICBmbG93Um9vdDogXCJzdl9xX2Zsb3cgZm9ybS1ncm91cCBibWQtZm9ybS1ncm91cFwiLFxuICAgIGhlYWRlcjogXCJcIixcbiAgICBoZWFkZXJMZWZ0OiBcInRpdGxlLWxlZnRcIixcbiAgICBjb250ZW50OiBcIlwiLFxuICAgIGNvbnRlbnRMZWZ0OiBcImNvbnRlbnQtbGVmdFwiLFxuICAgIHRpdGxlTGVmdFJvb3Q6IFwic3ZfcXN0bl9sZWZ0XCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2X3FfcmVxdWlyZWRfdGV4dFwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIG51bWJlcjogXCJzdl9xX251bVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gICAgZGVzY3JpcHRpb25VbmRlcklucHV0OiBcInNtYWxsXCIsXG4gICAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICByZXF1aXJlZDogXCJcIixcbiAgICB0aXRsZVJlcXVpcmVkOiBcIlwiLFxuICAgIGhhc0Vycm9yOiBcImhhcy1lcnJvclwiLFxuICAgIGluZGVudDogMjAsXG4gICAgZm9ybUdyb3VwOiBcImZvcm0tZ3JvdXAgYm1kLWZvcm0tZ3JvdXBcIixcbiAgfSxcbiAgcGFuZWw6IHtcbiAgICB0aXRsZTogXCJzdl9wX3RpdGxlXCIsXG4gICAgdGl0bGVFeHBhbmRhYmxlOiBcInN2X3BfdGl0bGVfZXhwYW5kYWJsZVwiLFxuICAgIHRpdGxlT25FcnJvcjogXCJcIixcbiAgICBpY29uOiBcInN2X3BhbmVsX2ljb25cIixcbiAgICBpY29uRXhwYW5kZWQ6IFwic3ZfZXhwYW5kZWRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzbWFsbCBzdl9wX2Rlc2NyaXB0aW9uXCIsXG4gICAgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCIsXG4gICAgZm9vdGVyOiBcInN2X3BfZm9vdGVyXCIsXG4gICAgbnVtYmVyOiBcInN2X3FfbnVtXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2X3FfcmVxdWlyZWRfdGV4dFwiLFxuICB9LFxuICBlcnJvcjoge1xuICAgIHJvb3Q6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgaWNvbjogXCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIixcbiAgICBpdGVtOiBcIlwiLFxuICAgIGxvY2F0aW9uVG9wOiBcInN2X3FzdG5fZXJyb3JfdG9wXCIsXG4gICAgbG9jYXRpb25Cb3R0b206IFwic3ZfcXN0bl9lcnJvcl9ib3R0b21cIixcbiAgfSxcblxuICBib29sZWFuOiB7XG4gICAgcm9vdDogXCJzdl9xYmxuIGNoZWNrYm94XCIsXG4gICAgaXRlbTogXCJzdi1ib29sZWFuXCIsXG4gICAgY29udHJvbDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxuICAgIGl0ZW1DaGVja2VkOiBcInN2LWJvb2xlYW4tLWNoZWNrZWQgY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmRldGVybWluYXRlOiBcInN2LWJvb2xlYW4tLWluZGV0ZXJtaW5hdGVcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtYm9vbGVhbi0tZGlzYWJsZWRcIixcbiAgICBzd2l0Y2g6IFwic3YtYm9vbGVhbl9fc3dpdGNoXCIsXG4gICAgc2xpZGVyOiBcInN2LWJvb2xlYW5fX3NsaWRlclwiLFxuICAgIGxhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsIFwiLFxuICAgIGRpc2FibGVkTGFiZWw6IFwic3YtYm9vbGVhbl9fbGFiZWwtLWRpc2FibGVkXCIsXG4gIH0sXG4gIGNoZWNrYm94OiB7XG4gICAgcm9vdDogXCJzdl9xY2J4XCIsXG4gICAgaXRlbTogXCJjaGVja2JveFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtU2VsZWN0QWxsOiBcInN2X3FfY2hlY2tib3hfc2VsZWN0YWxsXCIsXG4gICAgaXRlbU5vbmU6IFwic3ZfcV9jaGVja2JveF9ub25lXCIsXG4gICAgaXRlbUlubGluZTogXCJzdl9xX2NoZWNrYm94X2lubGluZVwiLFxuICAgIGl0ZW1EZWNvcmF0b3I6IFwic3YtaGlkZGVuXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwiXCIsXG4gICAgbGFiZWw6IFwiXCIsXG4gICAgbGFiZWxDaGVja2VkOiBcIlwiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJcIixcbiAgICBtYXRlcmlhbERlY29yYXRvcjogXCJjaGVja2JveC1kZWNvcmF0b3JcIixcbiAgICBvdGhlcjogXCJzdl9xX2NoZWNrYm94X290aGVyIGZvcm0tY29udHJvbFwiLFxuICAgIGNvbHVtbjogXCJzdl9xX3NlbGVjdF9jb2x1bW5cIixcbiAgfSxcbiAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZHJvcGRvd246IHtcbiAgICByb290OiBcIlwiLFxuICAgIGNvbnRyb2w6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9kZF9vdGhlciBmb3JtLWNvbnRyb2xcIixcbiAgfSxcbiAgaHRtbDogeyByb290OiBcIlwiIH0sXG4gIGltYWdlOiB7IHJvb3Q6IFwic3ZfcV9pbWFnZVwiLCBpbWFnZTogXCJzdl9pbWFnZV9pbWFnZVwiIH0sXG4gIG1hdHJpeDoge1xuICAgIHJvb3Q6IFwidGFibGUgc3ZfcV9tYXRyaXhcIixcbiAgICByb3c6IFwiZm9ybS1ncm91cCBibWQtZm9ybS1ncm91cFwiLFxuICAgIGxhYmVsOiBcInN2X3FfbV9sYWJlbCByYWRpby1pbmxpbmVcIixcbiAgICBjZWxsVGV4dDogXCJzdl9xX21fY2VsbF90ZXh0XCIsXG4gICAgY2VsbFRleHRTZWxlY3RlZDogXCJzdl9xX21fY2VsbF9zZWxlY3RlZCBiZy1wcmltYXJ5XCIsXG4gICAgY2VsbExhYmVsOiBcInN2X3FfbV9jZWxsX2xhYmVsXCIsXG4gICAgaXRlbVZhbHVlOiBcImZvcm0tY29udHJvbFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWhpZGRlblwiLFxuICAgIG1hdGVyaWFsRGVjb3JhdG9yOiBcImJtZC1yYWRpb1wiLFxuICB9LFxuICBtYXRyaXhkcm9wZG93bjogeyByb290OiBcInRhYmxlXCIsIGl0ZW1WYWx1ZTogXCJmb3JtLWdyb3VwIGJtZC1mb3JtLWdyb3VwXCIgfSxcbiAgbWF0cml4ZHluYW1pYzoge1xuICAgIG1haW5Sb290OiBcInN2X3FzdG5cIixcbiAgICBmbG93Um9vdDogXCJzdl9xX2Zsb3dcIixcbiAgICByb290OiBcInRhYmxlXCIsXG4gICAgYnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxuICAgIGl0ZW1WYWx1ZTogXCJmb3JtLWdyb3VwIGJtZC1mb3JtLWdyb3VwXCIsXG4gICAgYnV0dG9uQWRkOiBcIlwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJcIixcbiAgICBpY29uQWRkOiBcIlwiLFxuICAgIGljb25SZW1vdmU6IFwiXCIsXG4gIH0sXG4gIHBhbmVsZHluYW1pYzoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgbmF2aWdhdGlvbjogXCJzdi1wYW5lbGR5bmFtaWNfX25hdmlnYXRpb25cIixcbiAgICBwcm9ncmVzc1RvcDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzIHN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtLXRvcFwiLFxuICAgIHByb2dyZXNzQm90dG9tOlxuICAgICAgXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzIHN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtLWJvdHRvbVwiLFxuICAgIHRpdGxlOiBcInN2LXRpdGxlIHN2LXF1ZXN0aW9uX190aXRsZVwiLFxuICAgIGJ1dHRvbjogXCJidXR0b25cIixcbiAgICBidXR0b25BZGQ6IFwiYnV0dG9uIHN2LXBhbmVsZHluYW1pY19fYWRkLWJ0biBidG4gYnRuLXByaW1hcnlcIixcbiAgICBidXR0b25SZW1vdmU6IFwiYnV0dG9uIHN2LXBhbmVsZHluYW1pY19fcmVtb3ZlLWJ0biBidG4gYnRuLXByaW1hcnlcIixcbiAgICBidXR0b25QcmV2OiBcInN2LXBhbmVsZHluYW1pY19fcHJldi1idG5cIixcbiAgICBidXR0b25OZXh0OiBcInN2LXBhbmVsZHluYW1pY19fbmV4dC1idG5cIixcbiAgICBwcm9ncmVzc0NvbnRhaW5lcjogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLWNvbnRhaW5lclwiLFxuICAgIHByb2dyZXNzOiBcInN2LXByb2dyZXNzXCIsXG4gICAgcHJvZ3Jlc3NCYXI6IFwic3YtcHJvZ3Jlc3NfX2JhclwiLFxuICAgIHByb2dyZXNzVGV4dDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzLXRleHRcIixcbiAgfSxcbiAgbXVsdGlwbGV0ZXh0OiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGl0ZW1UaXRsZTogXCJcIixcbiAgICByb3c6IFwiZm9ybS1ncm91cCBibWQtZm9ybS1ncm91cFwiLFxuICAgIGl0ZW1WYWx1ZTogXCJzdl9xX210X2l0ZW1fdmFsdWUgZm9ybS1jb250cm9sXCIsXG4gIH0sXG4gIHJhZGlvZ3JvdXA6IHtcbiAgICByb290OiBcIlwiLFxuICAgIGl0ZW06IFwicmFkaW9cIixcbiAgICBpdGVtQ2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgaXRlbUlubGluZTogXCJzdl9xX3JhZGlvZ3JvdXBfaW5saW5lXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBsYWJlbDogXCJcIixcbiAgICBsYWJlbENoZWNrZWQ6IFwiXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwiXCIsXG4gICAgY29udHJvbExhYmVsOiBcInN2X3FfcmFkaW9ncm91cF9jb250cm9sX2xhYmVsXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwiYm1kLXJhZGlvXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9yYWRpb2dyb3VwX290aGVyIGZvcm0tY29udHJvbFwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2X3FfcmFkaW9ncm91cF9jbGVhciBidXR0b24gYnRuIGJ0bi1wcmltYXJ5XCIsXG4gICAgY29sdW1uOiBcInN2X3Ffc2VsZWN0X2NvbHVtblwiLFxuICB9LFxuICBpbWFnZXBpY2tlcjoge1xuICAgIHJvb3Q6IFwic3ZfaW1nc2VsXCIsXG4gICAgaXRlbTogXCJzdl9xX2ltZ3NlbFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcImNoZWNrZWRcIixcbiAgICBpdGVtSW5saW5lOiBcInN2X3FfaW1hZ2VwaWNrZXJfaW5saW5lXCIsXG4gICAgbGFiZWw6IFwic3ZfcV9pbWdzZWxfbGFiZWxcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdl9xX2ltZ3NlbF9jb250cm9sX2l0ZW1cIixcbiAgICBpbWFnZTogXCJzdl9xX2ltZ3NlbF9pbWFnZVwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfaW1nc2VsX3RleHRcIixcbiAgICBjbGVhckJ1dHRvbjogXCJzdl9xX3JhZGlvZ3JvdXBfY2xlYXJcIixcbiAgfSxcbiAgcmF0aW5nOiB7XG4gICAgcm9vdDogXCJidG4tZ3JvdXBcIixcbiAgICBpdGVtOiBcImJ0biBidG4tZGVmYXVsdCBidG4tc2Vjb25kYXJ5XCIsXG4gICAgc2VsZWN0ZWQ6IFwiYWN0aXZlXCIsXG4gICAgbWluVGV4dDogXCJzdl9xX3JhdGluZ19taW5fdGV4dFwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiLFxuICAgIG1heFRleHQ6IFwic3ZfcV9yYXRpbmdfbWF4X3RleHRcIixcbiAgICBkaXNhYmxlZDogXCJcIixcbiAgfSxcbiAgdGV4dDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZXhwcmVzc2lvbjogXCJmb3JtLWNvbnRyb2xcIixcbiAgZmlsZToge1xuICAgIHJvb3Q6IFwiZm9ybS1ncm91cCBibWQtZm9ybS1ncm91cCBpcy1maWxlaW5wdXQgc3ZfcV9maWxlXCIsXG4gICAgcGxhY2Vob2xkZXJJbnB1dDogXCJcIixcbiAgICBwcmV2aWV3OiBcInN2X3FfZmlsZV9wcmV2aWV3XCIsXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCIsXG4gICAgZmlsZUlucHV0OiBcInN2X3FfZmlsZV9pbnB1dFwiLFxuICAgIHJlbW92ZUZpbGU6IFwic3ZfcV9maWxlX3JlbW92ZVwiLFxuICAgIHJlbW92ZUZpbGVTdmc6IFwic3YtaGlkZGVuXCIsXG4gICAgZmlsZURlY29yYXRvcjogXCJzdi1oaWRkZW5cIixcbiAgICBmaWxlU2lnbkJvdHRvbTogXCJzdi1oaWRkZW5cIixcbiAgICByZW1vdmVCdXR0b25Cb3R0b206IFwic3YtaGlkZGVuXCIsXG4gIH0sXG4gIHNpZ25hdHVyZXBhZDoge1xuICAgIHJvb3Q6IFwic3ZfcV9zaWduYXR1cmVwYWQgc2pzX3NwX2NvbnRhaW5lclwiLFxuICAgIGNvbnRyb2xzOiBcInNqc19zcF9jb250cm9sc1wiLFxuICAgIGNsZWFyQnV0dG9uOiBcInNqc19zcF9jbGVhclwiLFxuICB9LFxuICBzYXZlRGF0YToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgc2F2aW5nOiBcImFsZXJ0IGFsZXJ0LWluZm9cIixcbiAgICBlcnJvcjogXCJhbGVydCBhbGVydC1kYW5nZXJcIixcbiAgICBzdWNjZXNzOiBcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIixcbiAgICBzYXZlQWdhaW5CdXR0b246IFwiXCIsXG4gIH0sXG4gIHdpbmRvdzoge1xuICAgIHJvb3Q6IFwibW9kYWwtY29udGVudFwiLFxuICAgIGJvZHk6IFwibW9kYWwtYm9keVwiLFxuICAgIGhlYWRlcjoge1xuICAgICAgcm9vdDogXCJtb2RhbC1oZWFkZXIgY2FyZC10aXRsZVwiLFxuICAgICAgdGl0bGU6IFwicHVsbC1sZWZ0XCIsXG4gICAgICBidXR0b246IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHRcIixcbiAgICAgIGJ1dHRvbkV4cGFuZGVkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLXVwXCIsXG4gICAgICBidXR0b25Db2xsYXBzZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tZG93blwiLFxuICAgIH0sXG4gIH0sXG59O1xuKDxhbnk+c3VydmV5Q3NzKVtcImJvb3RzdHJhcG1hdGVyaWFsXCJdID0gZGVmYXVsdEJvb3RzdHJhcE1hdGVyaWFsQ3NzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwbWF0ZXJpYWwudHMiLCJpbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9jc3NzdGFuZGFyZFwiO1xuZXhwb3J0IHZhciBtb2Rlcm5Dc3MgPSB7XG4gIHJvb3Q6IFwic3Ytcm9vdC1tb2Rlcm5cIixcbiAgY29udGFpbmVyOiBcInN2LWNvbnRhaW5lci1tb2Rlcm5cIixcbiAgaGVhZGVyOiBcInN2LXRpdGxlIHN2LWNvbnRhaW5lci1tb2Rlcm5fX3RpdGxlXCIsXG4gIGJvZHk6IFwic3YtYm9keVwiLFxuICBib2R5RW1wdHk6IFwic3YtYm9keSBzdi1ib2R5LS1lbXB0eVwiLFxuICBmb290ZXI6IFwic3YtZm9vdGVyIHN2LWJvZHlfX2Zvb3RlciBzdi1jbGVhcmZpeFwiLFxuICB0aXRsZTogXCJcIixcbiAgZGVzY3JpcHRpb246IFwiXCIsXG4gIGxvZ286IFwic3YtbG9nb1wiLFxuICBsb2dvSW1hZ2U6IFwic3YtbG9nb19faW1hZ2VcIixcbiAgaGVhZGVyVGV4dDogXCJzdi1oZWFkZXJfX3RleHRcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJzdi1jb21wbGV0ZWRwYWdlXCIsXG4gIG5hdmlnYXRpb246IHtcbiAgICBjb21wbGV0ZTogXCJzdi1idG4gc3YtZm9vdGVyX19jb21wbGV0ZS1idG5cIixcbiAgICBwcmV2OiBcInN2LWJ0biBzdi1mb290ZXJfX3ByZXYtYnRuXCIsXG4gICAgbmV4dDogXCJzdi1idG4gc3YtZm9vdGVyX19uZXh0LWJ0blwiLFxuICAgIHN0YXJ0OiBcInN2LWJ0biBzdi1mb290ZXJfX3N0YXJ0LWJ0blwiLFxuICAgIHByZXZpZXc6IFwic3YtYnRuIHN2LWZvb3Rlcl9fcHJldmlldy1idG5cIixcbiAgICBlZGl0OiBcInN2LWJ0biBzdi1mb290ZXJfX2VkaXQtYnRuXCIsXG4gIH0sXG4gIHBhbmVsOiB7XG4gICAgdGl0bGU6IFwic3YtdGl0bGUgc3YtcGFuZWxfX3RpdGxlXCIsXG4gICAgdGl0bGVFeHBhbmRhYmxlOiBcInN2LXBhbmVsX190aXRsZS0tZXhwYW5kYWJsZVwiLFxuICAgIHRpdGxlT25FcnJvcjogXCJzdi1wYW5lbF9fdGl0bGUtLWVycm9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwic3YtZGVzY3JpcHRpb24gc3YtcGFuZWxfX2Rlc2NyaXB0aW9uXCIsXG4gICAgY29udGFpbmVyOiBcInN2LXBhbmVsIHN2LXJvd19fcGFuZWxcIixcbiAgICBjb250ZW50OiBcInN2LXBhbmVsX19jb250ZW50XCIsXG4gICAgaWNvbjogXCJzdi1wYW5lbF9faWNvblwiLFxuICAgIGljb25FeHBhbmRlZDogXCJzdi1wYW5lbF9faWNvbi0tZXhwYW5kZWRcIixcbiAgICBmb290ZXI6IFwic3YtcGFuZWxfX2Zvb3RlclwiLFxuICAgIHJlcXVpcmVkVGV4dDogXCJzdi1wYW5lbF9fcmVxdWlyZWQtdGV4dFwiLFxuICAgIG51bWJlcjogXCJzdi1xdWVzdGlvbl9fbnVtXCIsXG4gIH0sXG4gIHBhbmVsZHluYW1pYzoge1xuICAgIHJvb3Q6IFwic3YtcGFuZWxkeW5hbWljXCIsXG4gICAgbmF2aWdhdGlvbjogXCJzdi1wYW5lbGR5bmFtaWNfX25hdmlnYXRpb25cIixcbiAgICB0aXRsZTogXCJzdi10aXRsZSBzdi1xdWVzdGlvbl9fdGl0bGVcIixcbiAgICBidXR0b246IFwic3YtYnRuXCIsXG4gICAgYnV0dG9uUmVtb3ZlOiBcInN2LXBhbmVsZHluYW1pY19fcmVtb3ZlLWJ0blwiLFxuICAgIGJ1dHRvbkFkZDogXCJzdi1wYW5lbGR5bmFtaWNfX2FkZC1idG5cIixcbiAgICBwcm9ncmVzc1RvcDogXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzIHN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtLXRvcFwiLFxuICAgIHByb2dyZXNzQm90dG9tOlxuICAgICAgXCJzdi1wYW5lbGR5bmFtaWNfX3Byb2dyZXNzIHN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtLWJvdHRvbVwiLFxuICAgIGJ1dHRvblByZXY6IFwic3YtcGFuZWxkeW5hbWljX19wcmV2LWJ0blwiLFxuICAgIGJ1dHRvbk5leHQ6IFwic3YtcGFuZWxkeW5hbWljX19uZXh0LWJ0blwiLFxuICAgIHByb2dyZXNzQ29udGFpbmVyOiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtY29udGFpbmVyXCIsXG4gICAgcHJvZ3Jlc3M6IFwic3YtcHJvZ3Jlc3NcIixcbiAgICBwcm9ncmVzc0JhcjogXCJzdi1wcm9ncmVzc19fYmFyXCIsXG4gICAgcHJvZ3Jlc3NUZXh0OiBcInN2LXBhbmVsZHluYW1pY19fcHJvZ3Jlc3MtdGV4dFwiLFxuICAgIHNlcGFyYXRvcjogXCJzdi1wYW5lbGR5bmFtaWNfX3NlcGFyYXRvclwiLFxuICB9LFxuICBwcm9ncmVzczogXCJzdi1wcm9ncmVzcyBzdi1ib2R5X19wcm9ncmVzc1wiLFxuICBwcm9ncmVzc0JhcjogXCJzdi1wcm9ncmVzc19fYmFyXCIsXG4gIHByb2dyZXNzVGV4dDogXCJzdi1wcm9ncmVzc19fdGV4dFwiLFxuICBwcm9ncmVzc1RleHRJbkJhcjogXCJzdi1oaWRkZW5cIixcbiAgcGFnZToge1xuICAgIHJvb3Q6IFwic3YtcGFnZSBzdi1ib2R5X19wYWdlXCIsXG4gICAgdGl0bGU6IFwic3YtdGl0bGUgc3YtcGFnZV9fdGl0bGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzdi1kZXNjcmlwdGlvbiBzdi1wYWdlX19kZXNjcmlwdGlvblwiLFxuICB9LFxuICBwYWdlVGl0bGU6IFwic3YtdGl0bGUgc3YtcGFnZV9fdGl0bGVcIixcbiAgcGFnZURlc2NyaXB0aW9uOiBcInN2LWRlc2NyaXB0aW9uIHN2LXBhZ2VfX2Rlc2NyaXB0aW9uXCIsXG4gIHJvdzogXCJzdi1yb3cgc3YtY2xlYXJmaXhcIixcbiAgcXVlc3Rpb246IHtcbiAgICBtYWluUm9vdDogXCJzdi1xdWVzdGlvbiBzdi1yb3dfX3F1ZXN0aW9uXCIsXG4gICAgZmxvd1Jvb3Q6IFwic3YtcXVlc3Rpb24gc3Ytcm93X19xdWVzdGlvbiBzdi1yb3dfX3F1ZXN0aW9uLS1mbG93XCIsXG4gICAgYXNDZWxsOiBcInN2LXRhYmxlX19jZWxsXCIsXG4gICAgaGVhZGVyOiBcInN2LXF1ZXN0aW9uX19oZWFkZXJcIixcbiAgICBoZWFkZXJMZWZ0OiBcInN2LXF1ZXN0aW9uX19oZWFkZXItLWxvY2F0aW9uLS1sZWZ0XCIsXG4gICAgaGVhZGVyVG9wOiBcInN2LXF1ZXN0aW9uX19oZWFkZXItLWxvY2F0aW9uLS10b3BcIixcbiAgICBoZWFkZXJCb3R0b206IFwic3YtcXVlc3Rpb25fX2hlYWRlci0tbG9jYXRpb24tLWJvdHRvbVwiLFxuICAgIGNvbnRlbnQ6IFwic3YtcXVlc3Rpb25fX2NvbnRlbnRcIixcbiAgICBjb250ZW50TGVmdDogXCJzdi1xdWVzdGlvbl9fY29udGVudC0tbGVmdFwiLFxuICAgIHRpdGxlTGVmdFJvb3Q6IFwiXCIsXG4gICAgdGl0bGVPbkFuc3dlcjogXCJzdi1xdWVzdGlvbl9fdGl0bGUtLWFuc3dlclwiLFxuICAgIHRpdGxlT25FcnJvcjogXCJzdi1xdWVzdGlvbl9fdGl0bGUtLWVycm9yXCIsXG4gICAgdGl0bGU6IFwic3YtdGl0bGUgc3YtcXVlc3Rpb25fX3RpdGxlXCIsXG4gICAgcmVxdWlyZWRUZXh0OiBcInN2LXF1ZXN0aW9uX19yZXF1aXJlZC10ZXh0XCIsXG4gICAgbnVtYmVyOiBcInN2LXF1ZXN0aW9uX19udW1cIixcbiAgICBkZXNjcmlwdGlvbjogXCJzdi1kZXNjcmlwdGlvbiBzdi1xdWVzdGlvbl9fZGVzY3JpcHRpb25cIixcbiAgICBkZXNjcmlwdGlvblVuZGVySW5wdXQ6IFwic3YtZGVzY3JpcHRpb24gc3YtcXVlc3Rpb25fX2Rlc2NyaXB0aW9uXCIsXG4gICAgY29tbWVudDogXCJzdi1jb21tZW50XCIsXG4gICAgcmVxdWlyZWQ6IFwic3YtcXVlc3Rpb24tLXJlcXVpcmVkXCIsXG4gICAgdGl0bGVSZXF1aXJlZDogXCJzdi1xdWVzdGlvbl9fdGl0bGUtLXJlcXVpcmVkXCIsXG4gICAgaW5kZW50OiAyMCxcbiAgICBmb290ZXI6IFwic3YtcXVlc3Rpb25fX2Zvb3RlclwiLFxuICAgIGZvcm1Hcm91cDogXCJzdi1xdWVzdGlvbl9fZm9ybS1ncm91cFwiLFxuICAgIGhhc0Vycm9yOiBcIlwiLFxuICAgIGRpc2FibGVkOiBcInN2LXF1ZXN0aW9uLS1kaXNhYmxlZFwiLFxuICB9LFxuICBpbWFnZTogeyByb290OiBcInN2LWltYWdlXCIsIGltYWdlOiBcInN2X2ltYWdlX2ltYWdlXCIgfSxcbiAgZXJyb3I6IHtcbiAgICByb290OiBcInN2LXF1ZXN0aW9uX19lcmJveFwiLFxuICAgIGljb246IFwiXCIsXG4gICAgaXRlbTogXCJcIixcbiAgICBsb2NhdGlvblRvcDogXCJzdi1xdWVzdGlvbl9fZXJib3gtLWxvY2F0aW9uLS10b3BcIixcbiAgICBsb2NhdGlvbkJvdHRvbTogXCJzdi1xdWVzdGlvbl9fZXJib3gtLWxvY2F0aW9uLS1ib3R0b21cIixcbiAgfSxcbiAgY2hlY2tib3g6IHtcbiAgICByb290OiBcInN2LXNlbGVjdGJhc2VcIixcbiAgICBpdGVtOiBcInN2LWl0ZW0gc3YtY2hlY2tib3ggc3Ytc2VsZWN0YmFzZV9faXRlbVwiLFxuICAgIGl0ZW1TZWxlY3RBbGw6IFwic3YtY2hlY2tib3gtLXNlbGVjdGFsbFwiLFxuICAgIGl0ZW1Ob25lOiBcInN2LWNoZWNrYm94LS1ub25lXCIsXG4gICAgaXRlbURpc2FibGVkOiBcInN2LWl0ZW0tLWRpc2FibGVkIHN2LWNoZWNrYm94LS1kaXNhYmxlZFwiLFxuICAgIGl0ZW1DaGVja2VkOiBcInN2LWNoZWNrYm94LS1jaGVja2VkXCIsXG4gICAgaXRlbUhvdmVyOiBcInN2LWNoZWNrYm94LS1hbGxvd2hvdmVyXCIsXG4gICAgaXRlbUlubGluZTogXCJzdi1zZWxlY3RiYXNlX19pdGVtLS1pbmxpbmVcIixcbiAgICBsYWJlbDogXCJzdi1zZWxlY3RiYXNlX19sYWJlbFwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdi12aXN1YWxseWhpZGRlbiBzdi1pdGVtX19jb250cm9sXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1pdGVtX19zdmcgc3YtY2hlY2tib3hfX3N2Z1wiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJzdi1pdGVtX19jb250cm9sLWxhYmVsXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwic3YtaXRlbV9fZGVjb3JhdG9yIHN2LWNoZWNrYm94X19kZWNvcmF0b3JcIixcbiAgICBvdGhlcjogXCJzdi1jb21tZW50IHN2LXF1ZXN0aW9uX19vdGhlclwiLFxuICAgIGNvbHVtbjogXCJzdi1zZWxlY3RiYXNlX19jb2x1bW5cIixcbiAgfSxcbiAgcmFkaW9ncm91cDoge1xuICAgIHJvb3Q6IFwic3Ytc2VsZWN0YmFzZVwiLFxuICAgIGl0ZW06IFwic3YtaXRlbSBzdi1yYWRpbyBzdi1zZWxlY3RiYXNlX19pdGVtXCIsXG4gICAgaXRlbUlubGluZTogXCJzdi1zZWxlY3RiYXNlX19pdGVtLS1pbmxpbmVcIixcbiAgICBsYWJlbDogXCJzdi1zZWxlY3RiYXNlX19sYWJlbFwiLFxuICAgIGxhYmVsQ2hlY2tlZDogXCJcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtaXRlbS0tZGlzYWJsZWQgc3YtcmFkaW8tLWRpc2FibGVkXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwic3YtcmFkaW8tLWNoZWNrZWRcIixcbiAgICBpdGVtSG92ZXI6IFwic3YtcmFkaW8tLWFsbG93aG92ZXJcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdi12aXN1YWxseWhpZGRlbiBzdi1pdGVtX19jb250cm9sXCIsXG4gICAgaXRlbURlY29yYXRvcjogXCJzdi1pdGVtX19zdmcgc3YtcmFkaW9fX3N2Z1wiLFxuICAgIGNvbnRyb2xMYWJlbDogXCJzdi1pdGVtX19jb250cm9sLWxhYmVsXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwic3YtaXRlbV9fZGVjb3JhdG9yIHN2LXJhZGlvX19kZWNvcmF0b3JcIixcbiAgICBvdGhlcjogXCJzdi1jb21tZW50IHN2LXF1ZXN0aW9uX19vdGhlclwiLFxuICAgIGNsZWFyQnV0dG9uOiBcInN2LWJ0biBzdi1zZWxlY3RiYXNlX19jbGVhci1idG5cIixcbiAgICBjb2x1bW46IFwic3Ytc2VsZWN0YmFzZV9fY29sdW1uXCIsXG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICByb290OiBcIlwiLFxuICAgIHNtYWxsOiBcInN2LXJvd19fcXVlc3Rpb24tLXNtYWxsXCIsXG4gICAgaXRlbTogXCJzdi1ib29sZWFuIHN2LWl0ZW1cIixcbiAgICBjb250cm9sOiBcInN2LXZpc3VhbGx5aGlkZGVuXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwic3YtYm9vbGVhbi0tY2hlY2tlZFwiLFxuICAgIGl0ZW1JbmRldGVybWluYXRlOiBcInN2LWJvb2xlYW4tLWluZGV0ZXJtaW5hdGVcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtaXRlbS0tZGlzYWJsZWQgc3YtYm9vbGVhbi0tZGlzYWJsZWRcIixcbiAgICBzd2l0Y2g6IFwic3YtYm9vbGVhbl9fc3dpdGNoXCIsXG4gICAgc2xpZGVyOiBcInN2LWJvb2xlYW5fX3NsaWRlclwiLFxuICAgIGxhYmVsOiBcInN2LWJvb2xlYW5fX2xhYmVsIFwiLFxuICAgIGRpc2FibGVkTGFiZWw6IFwic3YtYm9vbGVhbl9fbGFiZWwtLWRpc2FibGVkXCIsXG4gIH0sXG4gIHRleHQ6IHtcbiAgICByb290OiBcInN2LXRleHRcIixcbiAgICBzbWFsbDogXCJzdi1yb3dfX3F1ZXN0aW9uLS1zbWFsbFwiLFxuICAgIG9uRXJyb3I6IFwic3YtdGV4dC0tZXJyb3JcIixcbiAgfSxcbiAgbXVsdGlwbGV0ZXh0OiB7XG4gICAgcm9vdDogXCJzdi1tdWx0aXBsZXRleHRcIixcbiAgICBpdGVtOiBcInN2LW11bHRpcGxldGV4dF9faXRlbVwiLFxuICAgIGl0ZW1UaXRsZTogXCJzdi1tdWx0aXBsZXRleHRfX2l0ZW0tdGl0bGVcIixcbiAgICByb3c6IFwic3YtbXVsdGlwbGV0ZXh0X19yb3dcIixcbiAgICBjZWxsOiBcInN2LW11bHRpcGxldGV4dF9fY2VsbFwiLFxuICB9LFxuICBkcm9wZG93bjoge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgc21hbGw6IFwic3Ytcm93X19xdWVzdGlvbi0tc21hbGxcIixcbiAgICBjb250cm9sOiBcInN2LWRyb3Bkb3duXCIsXG4gICAgc2VsZWN0V3JhcHBlcjogXCJcIixcbiAgICBvdGhlcjogXCJzdi1jb21tZW50IHN2LXF1ZXN0aW9uX19vdGhlclwiLFxuICAgIG9uRXJyb3I6IFwic3YtZHJvcGRvd24tLWVycm9yXCIsXG4gIH0sXG4gIGltYWdlcGlja2VyOiB7XG4gICAgcm9vdDogXCJzdi1pbWFnZXBpY2tlclwiLFxuICAgIGl0ZW06IFwic3YtaW1hZ2VwaWNrZXJfX2l0ZW1cIixcbiAgICBpdGVtSW5saW5lOiBcInN2LWltYWdlcGlja2VyX19pdGVtLS1pbmxpbmVcIixcbiAgICBpdGVtQ2hlY2tlZDogXCJzdi1pbWFnZXBpY2tlcl9faXRlbS0tY2hlY2tlZFwiLFxuICAgIGl0ZW1EaXNhYmxlZDogXCJzdi1pbWFnZXBpY2tlcl9faXRlbS0tZGlzYWJsZWRcIixcbiAgICBpdGVtSG92ZXI6IFwic3YtaW1hZ2VwaWNrZXJfX2l0ZW0tLWFsbG93aG92ZXJcIixcbiAgICBsYWJlbDogXCJzdi1pbWFnZXBpY2tlcl9fbGFiZWxcIixcbiAgICBpdGVtQ29udHJvbDogXCJzdi1pbWFnZXBpY2tlcl9fY29udHJvbFwiLFxuICAgIGltYWdlOiBcInN2LWltYWdlcGlja2VyX19pbWFnZVwiLFxuICAgIGl0ZW1UZXh0OiBcInN2LWltYWdlcGlja2VyX190ZXh0XCIsXG4gICAgY2xlYXJCdXR0b246IFwic3YtYnRuXCIsXG4gICAgb3RoZXI6IFwic3YtY29tbWVudCBzdi1xdWVzdGlvbl9fb3RoZXJcIixcbiAgfSxcbiAgbWF0cml4OiB7XG4gICAgdGFibGVXcmFwcGVyOiBcInN2LW1hdHJpeFwiLFxuICAgIHJvb3Q6IFwic3YtdGFibGVcIixcbiAgICByb3dFcnJvcjogXCJzdi1tYXRyaXhfX3Jvdy0tZXJyb3JcIixcbiAgICBjZWxsOiBcInN2LXRhYmxlX19jZWxsIHN2LW1hdHJpeF9fY2VsbFwiLFxuICAgIGhlYWRlckNlbGw6IFwic3YtdGFibGVfX2NlbGwgc3YtdGFibGVfX2NlbGwtLWhlYWRlclwiLFxuICAgIGxhYmVsOiBcInN2LWl0ZW0gc3YtcmFkaW8gc3YtbWF0cml4X19sYWJlbFwiLFxuICAgIGl0ZW1WYWx1ZTogXCJzdi12aXN1YWxseWhpZGRlbiBzdi1pdGVtX19jb250cm9sIHN2LXJhZGlvX19jb250cm9sXCIsXG4gICAgaXRlbUNoZWNrZWQ6IFwic3YtcmFkaW8tLWNoZWNrZWRcIixcbiAgICBpdGVtRGlzYWJsZWQ6IFwic3YtaXRlbS0tZGlzYWJsZWQgc3YtcmFkaW8tLWRpc2FibGVkXCIsXG4gICAgaXRlbUhvdmVyOiBcInN2LXJhZGlvLS1hbGxvd2hvdmVyXCIsXG4gICAgbWF0ZXJpYWxEZWNvcmF0b3I6IFwic3YtaXRlbV9fZGVjb3JhdG9yIHN2LXJhZGlvX19kZWNvcmF0b3JcIixcbiAgICBpdGVtRGVjb3JhdG9yOiBcInN2LWl0ZW1fX3N2ZyBzdi1yYWRpb19fc3ZnXCIsXG4gICAgY2VsbFRleHQ6IFwic3YtbWF0cml4X190ZXh0XCIsXG4gICAgY2VsbFRleHRTZWxlY3RlZDogXCJzdi1tYXRyaXhfX3RleHQtLWNoZWNrZWRcIixcbiAgICBjZWxsVGV4dERpc2FibGVkOiBcInN2LW1hdHJpeF9fdGV4dC0tZGlzYWJsZWRcIixcbiAgfSxcbiAgbWF0cml4ZHJvcGRvd246IHtcbiAgICByb290OiBcInN2LXRhYmxlXCIsXG4gICAgY2VsbDogXCJzdi10YWJsZV9fY2VsbFwiLFxuICAgIGhlYWRlckNlbGw6IFwic3YtdGFibGVfX2NlbGwgc3YtdGFibGVfX2NlbGwtLWhlYWRlclwiLFxuICB9LFxuICBtYXRyaXhkeW5hbWljOiB7XG4gICAgcm9vdDogXCJzdi10YWJsZSBzdi1tYXRyaXhkeW5hbWljXCIsXG4gICAgY2VsbDogXCJzdi10YWJsZV9fY2VsbFwiLFxuICAgIGhlYWRlckNlbGw6IFwic3YtdGFibGVfX2NlbGwgc3YtdGFibGVfX2NlbGwtLWhlYWRlclwiLFxuICAgIGJ1dHRvbjogXCJzdi1idG5cIixcbiAgICBidXR0b25BZGQ6IFwic3YtbWF0cml4ZHluYW1pY19fYWRkLWJ0blwiLFxuICAgIGJ1dHRvblJlbW92ZTogXCJzdi1tYXRyaXhkeW5hbWljX19yZW1vdmUtYnRuXCIsXG4gICAgaWNvbkFkZDogXCJcIixcbiAgICBpY29uUmVtb3ZlOiBcIlwiLFxuICB9LFxuICByYXRpbmc6IHtcbiAgICByb290OiBcInN2LXJhdGluZ1wiLFxuICAgIGl0ZW06IFwic3YtcmF0aW5nX19pdGVtXCIsXG4gICAgc2VsZWN0ZWQ6IFwic3YtcmF0aW5nX19pdGVtLS1zZWxlY3RlZFwiLFxuICAgIG1pblRleHQ6IFwic3YtcmF0aW5nX19taW4tdGV4dFwiLFxuICAgIGl0ZW1UZXh0OiBcInN2LXJhdGluZ19faXRlbS10ZXh0XCIsXG4gICAgbWF4VGV4dDogXCJzdi1yYXRpbmdfX21heC10ZXh0XCIsXG4gICAgZGlzYWJsZWQ6IFwic3YtcmF0aW5nLS1kaXNhYmxlZFwiLFxuICB9LFxuICBjb21tZW50OiB7XG4gICAgcm9vdDogXCJzdi1jb21tZW50XCIsXG4gICAgc21hbGw6IFwic3Ytcm93X19xdWVzdGlvbi0tc21hbGxcIixcbiAgfSxcbiAgZXhwcmVzc2lvbjogXCJcIixcbiAgZmlsZToge1xuICAgIHJvb3Q6IFwic3YtZmlsZVwiLFxuICAgIG90aGVyOiBcInN2LWNvbW1lbnQgc3YtcXVlc3Rpb25fX290aGVyXCIsXG4gICAgcGxhY2Vob2xkZXJJbnB1dDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxuICAgIHByZXZpZXc6IFwic3YtZmlsZV9fcHJldmlld1wiLFxuICAgIGZpbGVTaWduOiBcInN2LWhpZGRlblwiLFxuICAgIGZpbGVTaWduQm90dG9tOiBcInN2LWZpbGVfX3NpZ25cIixcbiAgICBmaWxlRGVjb3JhdG9yOiBcInN2LWZpbGVfX2RlY29yYXRvclwiLFxuICAgIGZpbGVJbnB1dDogXCJzdi12aXN1YWxseWhpZGRlblwiLFxuICAgIG5vRmlsZUNob3NlbjogXCJzdi1kZXNjcmlwdGlvbiBzdi1maWxlX19uby1maWxlLWNob3NlblwiLFxuICAgIGNob29zZUZpbGU6IFwic3YtYnRuIHN2LWZpbGVfX2Nob29zZS1idG5cIixcbiAgICBkaXNhYmxlZDogXCJzdi1maWxlX19jaG9vc2UtYnRuLS1kaXNhYmxlZFwiLFxuICAgIHJlbW92ZUJ1dHRvbjogXCJzdi1oaWRkZW5cIixcbiAgICByZW1vdmVCdXR0b25Cb3R0b206IFwic3YtYnRuIHN2LWZpbGVfX2NsZWFuLWJ0blwiLFxuICAgIHJlbW92ZUZpbGU6IFwic3YtaGlkZGVuXCIsXG4gICAgcmVtb3ZlRmlsZVN2ZzogXCJzdi1maWxlX19yZW1vdmUtc3ZnXCIsXG4gICAgd3JhcHBlcjogXCJzdi1maWxlX193cmFwcGVyXCIsXG4gIH0sXG4gIHNpZ25hdHVyZXBhZDoge1xuICAgIHJvb3Q6IFwic3Ytc2lnbmF0dXJlcGFkIHNqc19zcF9jb250YWluZXJcIixcbiAgICBzbWFsbDogXCJzdi1yb3dfX3F1ZXN0aW9uLS1zbWFsbFwiLFxuICAgIGNvbnRyb2xzOiBcInNqc19zcF9jb250cm9sc1wiLFxuICAgIGNsZWFyQnV0dG9uOiBcInNqc19zcF9jbGVhclwiLFxuICB9LFxuICBzYXZlRGF0YToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgc2F2aW5nOiBcIlwiLFxuICAgIGVycm9yOiBcIlwiLFxuICAgIHN1Y2Nlc3M6IFwiXCIsXG4gICAgc2F2ZUFnYWluQnV0dG9uOiBcIlwiLFxuICB9LFxuICB3aW5kb3c6IHtcbiAgICByb290OiBcInN2X3dpbmRvd1wiLFxuICAgIGJvZHk6IFwic3Zfd2luZG93X2NvbnRlbnRcIixcbiAgICBoZWFkZXI6IHtcbiAgICAgIHJvb3Q6IFwic3Zfd2luZG93X3RpdGxlXCIsXG4gICAgICB0aXRsZTogXCJcIixcbiAgICAgIGJ1dHRvbjogXCJcIixcbiAgICAgIGJ1dHRvbkV4cGFuZGVkOiBcIlwiLFxuICAgICAgYnV0dG9uQ29sbGFwc2VkOiBcIlwiLFxuICAgIH0sXG4gIH0sXG59O1xuXG5zdXJ2ZXlDc3NbXCJtb2Rlcm5cIl0gPSBtb2Rlcm5Dc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3Ntb2Rlcm4udHMiLCJpbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vYXJhYmljXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vYnVsZ2FyaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vY2F0YWxhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2N6ZWNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZGFuaXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vZHV0Y2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9lc3RvbmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2Zpbm5pc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9mcmVuY2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9nZW9yZ2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2dlcm1hblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2dyZWVrXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaGVicmV3XCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaHVuZ2FyaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaWNlbGFuZGljXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaW5kb25lc2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2l0YWxpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9qYXBhbmVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2tvcmVhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2xhdHZpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9saXRodWFuaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vbm9yd2VnaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcGVyc2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3BvbGlzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2VcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9yb21hbmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3J1c3NpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9zaW1wbGlmaWVkLWNoaW5lc2VcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9zcGFuaXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vc3dlZGlzaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3RoYWlcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi90dXJraXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vdHJhZGl0aW9uYWwtY2hpbmVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3VrcmFpbmlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3RhamlrXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vc3dhaGlsaVwiO1xuXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9jaHVua3MvbG9jYWxpemF0aW9uLnRzIiwiLy8gc3R5bGVzXG5pbXBvcnQgXCIuLi8uLi9tYWluLnNjc3NcIjtcbmltcG9ydCBcIi4uLy4uL21vZGVybi5zY3NzXCI7XG5cbmV4cG9ydCBsZXQgVmVyc2lvbjogc3RyaW5nO1xuVmVyc2lvbiA9IGAke3Byb2Nlc3MuZW52LlZFUlNJT059YDtcblxuZXhwb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi4vLi4vc2V0dGluZ3NcIjtcbmV4cG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi4vLi4vaGVscGVyc1wiO1xuZXhwb3J0IHtcbiAgQW5zd2VyQ291bnRWYWxpZGF0b3IsXG4gIEVtYWlsVmFsaWRhdG9yLFxuICBOdW1lcmljVmFsaWRhdG9yLFxuICBSZWdleFZhbGlkYXRvcixcbiAgU3VydmV5VmFsaWRhdG9yLFxuICBUZXh0VmFsaWRhdG9yLFxuICBWYWxpZGF0b3JSZXN1bHQsXG4gIEV4cHJlc3Npb25WYWxpZGF0b3IsXG4gIFZhbGlkYXRvclJ1bm5lcixcbn0gZnJvbSBcIi4uLy4uL3ZhbGlkYXRvclwiO1xuZXhwb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4uLy4uL2l0ZW12YWx1ZVwiO1xuZXhwb3J0IHsgQmFzZSwgRXZlbnQsIFN1cnZleUVycm9yLCBJU3VydmV5LCBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmV4cG9ydCB7IENhbGN1bGF0ZWRWYWx1ZSB9IGZyb20gXCIuLi8uLi9jYWxjdWxhdGVkVmFsdWVcIjtcbmV4cG9ydCB7XG4gIEN1c3RvbUVycm9yLFxuICBBbnN3ZXJSZXF1aXJlZEVycm9yLFxuICBPbmVBbnN3ZXJSZXF1aXJlZEVycm9yLFxuICBSZXF1cmVOdW1lcmljRXJyb3IsXG4gIEV4Y2VlZFNpemVFcnJvcixcbn0gZnJvbSBcIi4uLy4uL2Vycm9yXCI7XG5leHBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi4vLi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmV4cG9ydCB7IEh0bWxDb25kaXRpb25JdGVtLCBVcmxDb25kaXRpb25JdGVtIH0gZnJvbSBcIi4uLy4uL2V4cHJlc3Npb25JdGVtc1wiO1xuZXhwb3J0IHsgQ2hvaWNlc1Jlc3RmdWxsIH0gZnJvbSBcIi4uLy4uL2Nob2ljZXNSZXN0ZnVsbFwiO1xuZXhwb3J0IHsgRnVuY3Rpb25GYWN0b3J5LCByZWdpc3RlckZ1bmN0aW9uIH0gZnJvbSBcIi4uLy4uL2Z1bmN0aW9uc2ZhY3RvcnlcIjtcbmV4cG9ydCB7IENvbmRpdGlvblJ1bm5lciwgRXhwcmVzc2lvblJ1bm5lciB9IGZyb20gXCIuLi8uLi9jb25kaXRpb25zXCI7XG5leHBvcnQge1xuICBPcGVyYW5kLFxuICBDb25zdCxcbiAgQmluYXJ5T3BlcmFuZCxcbiAgVmFyaWFibGUsXG4gIEZ1bmN0aW9uT3BlcmFuZCxcbiAgQXJyYXlPcGVyYW5kLFxufSBmcm9tIFwiLi4vLi4vZXhwcmVzc2lvbnMvZXhwcmVzc2lvbnNcIjtcbmV4cG9ydCB7IENvbmRpdGlvbnNQYXJzZXIgfSBmcm9tIFwiLi4vLi4vY29uZGl0aW9uc1BhcnNlclwiO1xuZXhwb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvbmRpdGlvblByb2Nlc3NWYWx1ZVwiO1xuZXhwb3J0IHtcbiAgSnNvbkVycm9yLFxuICBKc29uSW5jb3JyZWN0VHlwZUVycm9yLFxuICBKc29uTWV0YWRhdGEsXG4gIEpzb25NZXRhZGF0YUNsYXNzLFxuICBKc29uTWlzc2luZ1R5cGVFcnJvcixcbiAgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlLFxuICBKc29uT2JqZWN0LFxuICBKc29uT2JqZWN0UHJvcGVydHksXG4gIEpzb25SZXF1aXJlZFByb3BlcnR5RXJyb3IsXG4gIEpzb25Vbmtub3duUHJvcGVydHlFcnJvcixcbiAgU2VyaWFsaXplcixcbn0gZnJvbSBcIi4uLy4uL2pzb25vYmplY3RcIjtcbmV4cG9ydCB7XG4gIE1hdHJpeERyb3Bkb3duQ2VsbCxcbiAgTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gIG1hdHJpeERyb3Bkb3duQ29sdW1uVHlwZXMsXG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XG5leHBvcnQge1xuICBNYXRyaXhEcm9wZG93blJvd01vZGVsLFxuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwsXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuZXhwb3J0IHtcbiAgTWF0cml4RHluYW1pY1Jvd01vZGVsLFxuICBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbCxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWNcIjtcbmV4cG9ydCB7XG4gIE1hdHJpeFJvd01vZGVsLFxuICBNYXJ0cml4Q2VsbHMsXG4gIFF1ZXN0aW9uTWF0cml4TW9kZWwsXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tYXRyaXhcIjtcbmV4cG9ydCB7XG4gIE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCxcbiAgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xuZXhwb3J0IHsgUGFuZWxNb2RlbCwgUGFuZWxNb2RlbEJhc2UsIFF1ZXN0aW9uUm93TW9kZWwgfSBmcm9tIFwiLi4vLi4vcGFuZWxcIjtcbmV4cG9ydCB7IEZsb3dQYW5lbE1vZGVsIH0gZnJvbSBcIi4uLy4uL2Zsb3dwYW5lbFwiO1xuZXhwb3J0IHsgUGFnZU1vZGVsIH0gZnJvbSBcIi4uLy4uL3BhZ2VcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uXCI7XG5leHBvcnQgeyBRdWVzdGlvbk5vblZhbHVlIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9ubm9udmFsdWVcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRW1wdHlNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9lbXB0eVwiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25DaGVja2JveEJhc2UsXG4gIFF1ZXN0aW9uU2VsZWN0QmFzZSxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9jaGVja2JveFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Db21tZW50TW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fY29tbWVudFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Ryb3Bkb3duXCI7XG5leHBvcnQgeyBRdWVzdGlvbkZhY3RvcnksIEVsZW1lbnRGYWN0b3J5IH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25GaWxlTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fZmlsZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25IdG1sTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25faHRtbFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fcmFkaW9ncm91cFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25SYXRpbmdNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9yYXRpbmdcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2V4cHJlc3Npb25cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3RleHRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQm9vbGVhbk1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2Jvb2xlYW5cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9pbWFnZXBpY2tlclwiO1xuZXhwb3J0IHsgUXVlc3Rpb25JbWFnZU1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2ltYWdlXCI7XG5leHBvcnQgeyBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3NpZ25hdHVyZXBhZFwiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCxcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fcGFuZWxkeW5hbWljXCI7XG5leHBvcnQgeyBTdXJ2ZXlUaW1lciB9IGZyb20gXCIuLi8uLi9zdXJ2ZXl0aW1lclwiO1xuZXhwb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vLi4vc3VydmV5XCI7XG5leHBvcnQge1xuICBTdXJ2ZXlUcmlnZ2VyLFxuICBTdXJ2ZXlUcmlnZ2VyQ29tcGxldGUsXG4gIFN1cnZleVRyaWdnZXJTZXRWYWx1ZSxcbiAgU3VydmV5VHJpZ2dlclZpc2libGUsXG4gIFN1cnZleVRyaWdnZXJDb3B5VmFsdWUsXG4gIFN1cnZleVRyaWdnZXJSdW5FeHByZXNzaW9uLFxuICBUcmlnZ2VyLFxufSBmcm9tIFwiLi4vLi4vdHJpZ2dlclwiO1xuZXhwb3J0IHsgU3VydmV5V2luZG93TW9kZWwgfSBmcm9tIFwiLi4vLi4vc3VydmV5V2luZG93XCI7XG5leHBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yIH0gZnJvbSBcIi4uLy4uL3RleHRQcmVQcm9jZXNzb3JcIjtcblxuZXhwb3J0IHsgZHhTdXJ2ZXlTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2R4U3VydmV5U2VydmljZVwiO1xuZXhwb3J0IHsgZW5nbGlzaFN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vbG9jYWxpemF0aW9uL2VuZ2xpc2hcIjtcbmV4cG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiwgc3VydmV5U3RyaW5ncyB9IGZyb20gXCIuLi8uLi9zdXJ2ZXlTdHJpbmdzXCI7XG4vLyBleHBvcnQgeyBjdWx0dXJlSW5mbyB9IGZyb20gXCIuLi8uLi9jdWx0dXJlSW5mb1wiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25DdXN0b21XaWRnZXQsXG4gIEN1c3RvbVdpZGdldENvbGxlY3Rpb24sXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbkN1c3RvbVdpZGdldHNcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uQ3VzdG9tTW9kZWwsXG4gIFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwsXG4gIENvbXBvbmVudFF1ZXN0aW9uSlNPTixcbiAgQ29tcG9uZW50Q29sbGVjdGlvbixcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2N1c3RvbVwiO1xuXG5leHBvcnQgeyBTdHlsZXNNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL3N0eWxlc21hbmFnZXJcIjtcblxuLy9VbmNvbW1lbnQgdG8gaW5jbHVkZSB0aGUgXCJkYXRlXCIgcXVlc3Rpb24gdHlwZS5cbi8vZXhwb3J0IHtkZWZhdWx0IGFzIFF1ZXN0aW9uRGF0ZU1vZGVsfSBmcm9tIFwiLi4vLi4vcGx1Z2lucy9xdWVzdGlvbl9kYXRlXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9jaHVua3MvbW9kZWwudHMiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IEZsb3dQYW5lbE1vZGVsIH0gZnJvbSBcIi4uL2Zsb3dwYW5lbFwiO1xuaW1wb3J0IHsgUmVhY3RFbGVtZW50RmFjdG9yeSB9IGZyb20gXCIuL2VsZW1lbnQtZmFjdG9yeVwiO1xuXG5pbXBvcnQgeyBTdXJ2ZXlQYW5lbCB9IGZyb20gXCIuL3BhbmVsXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlGbG93UGFuZWwgZXh0ZW5kcyBTdXJ2ZXlQYW5lbCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcHVibGljIGdldCBmbG93UGFuZWwoKTogRmxvd1BhbmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnBhbmVsIGFzIEZsb3dQYW5lbE1vZGVsO1xuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgaWYgKCEhdGhpcy5mbG93UGFuZWwpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHRoaXMuZmxvd1BhbmVsLm9uQ3VzdG9tSHRtbFByb2R1Y2luZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH07XG4gICAgICB0aGlzLmZsb3dQYW5lbC5vbkdldEh0bWxGb3JRdWVzdGlvbiA9IHNlbGYucmVuZGVyUXVlc3Rpb247XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgaWYgKCEhdGhpcy5mbG93UGFuZWwpIHtcbiAgICAgIHRoaXMuZmxvd1BhbmVsLm9uQ3VzdG9tSHRtbFByb2R1Y2luZyA9IG51bGw7XG4gICAgICB0aGlzLmZsb3dQYW5lbC5vbkdldEh0bWxGb3JRdWVzdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRRdWVzdGlvbihuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuZmxvd1BhbmVsLmdldFF1ZXN0aW9uQnlOYW1lKG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBcIjxxdWVzdGlvbj5cIiArIHF1ZXN0aW9uLm5hbWUgKyBcIjwvcXVlc3Rpb24+XCI7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlclJvd3MoKTogQXJyYXk8SlNYLkVsZW1lbnQ+IHtcbiAgICByZXR1cm4gW3RoaXMucmVuZGVySHRtbCgpXTtcbiAgfVxuICBwcml2YXRlIHJlbmRlcmVkSW5kZXg6IG51bWJlcjtcbiAgcHJpdmF0ZSBnZXROb2RlSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlZEluZGV4Kys7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckh0bWwoKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5mbG93UGFuZWwpIHJldHVybiBudWxsO1xuICAgIGxldCBodG1sID0gXCI8c3Bhbj5cIiArIHRoaXMuZmxvd1BhbmVsLnByb2R1Y2VIdG1sKCkgKyBcIjwvc3Bhbj5cIjtcbiAgICBpZiAoIURPTVBhcnNlcikge1xuICAgICAgdmFyIGh0bWxWYWx1ZSA9IHsgX19odG1sOiBodG1sIH07XG4gICAgICByZXR1cm4gPGRpdiBkYW5nZXJvdXNseVNldElubmVySFRNTD17aHRtbFZhbHVlfSAvPjtcbiAgICB9XG4gICAgbGV0IGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgXCJ0ZXh0L3htbFwiKTtcbiAgICB0aGlzLnJlbmRlcmVkSW5kZXggPSAwO1xuICAgIHJldHVybiB0aGlzLnJlbmRlclBhcmVudE5vZGUoZG9jKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyTm9kZXMoZG9tTm9kZXM6IEFycmF5PE5vZGU+KTogQXJyYXk8SlNYLkVsZW1lbnQ+IHtcbiAgICB2YXIgbm9kZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvbU5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBub2Rlcy5wdXNoKHRoaXMucmVuZGVyTm9kZShkb21Ob2Rlc1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRTdHlsZShub2RlVHlwZTogc3RyaW5nKSB7XG4gICAgdmFyIHN0eWxlOiBhbnkgPSB7fTtcbiAgICBpZiAobm9kZVR5cGUudG9Mb3dlckNhc2UoKSA9PT0gXCJiXCIpIHtcbiAgICAgIHN0eWxlLmZvbnRXZWlnaHQgPSBcImJvbGRcIjtcbiAgICB9XG4gICAgaWYgKG5vZGVUeXBlLnRvTG93ZXJDYXNlKCkgPT09IFwiaVwiKSB7XG4gICAgICBzdHlsZS5mb250U3R5bGUgPSBcIml0YWxpY1wiO1xuICAgIH1cbiAgICBpZiAobm9kZVR5cGUudG9Mb3dlckNhc2UoKSA9PT0gXCJ1XCIpIHtcbiAgICAgIHN0eWxlLnRleHREZWNvcmF0aW9uID0gXCJ1bmRlcmxpbmVcIjtcbiAgICB9XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJQYXJlbnROb2RlKG5vZGU6IE5vZGUpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIG5vZGVUeXBlID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucmVuZGVyTm9kZXModGhpcy5nZXRDaGlsZERvbU5vZGVzKG5vZGUpKTtcbiAgICBpZiAobm9kZVR5cGUgPT0gXCJkaXZcIilcbiAgICAgIHJldHVybiA8ZGl2IGtleT17dGhpcy5nZXROb2RlSW5kZXgoKX0+e2NoaWxkcmVufTwvZGl2PjtcbiAgICByZXR1cm4gKFxuICAgICAgPHNwYW4ga2V5PXt0aGlzLmdldE5vZGVJbmRleCgpfSBzdHlsZT17dGhpcy5nZXRTdHlsZShub2RlVHlwZSl9PlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICA8L3NwYW4+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyTm9kZShub2RlOiBOb2RlKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5oYXNUZXh0Q2hpbGROb2Rlc09ubHkobm9kZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclBhcmVudE5vZGUobm9kZSk7XG4gICAgfVxuICAgIHZhciBub2RlVHlwZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9kZVR5cGUgPT09IFwicXVlc3Rpb25cIikge1xuICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5mbG93UGFuZWwuZ2V0UXVlc3Rpb25CeU5hbWUobm9kZS50ZXh0Q29udGVudCk7XG4gICAgICBpZiAoIXF1ZXN0aW9uKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBxdWVzdGlvbkJvZHkgPSAoXG4gICAgICAgIDxTdXJ2ZXlRdWVzdGlvblxuICAgICAgICAgIGtleT17cXVlc3Rpb24ubmFtZX1cbiAgICAgICAgICBlbGVtZW50PXtxdWVzdGlvbn1cbiAgICAgICAgICBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9XG4gICAgICAgICAgY3NzPXt0aGlzLmNzc31cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgICByZXR1cm4gPHNwYW4ga2V5PXt0aGlzLmdldE5vZGVJbmRleCgpfT57cXVlc3Rpb25Cb2R5fTwvc3Bhbj47XG4gICAgfVxuICAgIGlmIChub2RlVHlwZSA9PT0gXCJkaXZcIikge1xuICAgICAgcmV0dXJuIDxkaXYga2V5PXt0aGlzLmdldE5vZGVJbmRleCgpfT57bm9kZS50ZXh0Q29udGVudH08L2Rpdj47XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8c3BhbiBrZXk9e3RoaXMuZ2V0Tm9kZUluZGV4KCl9IHN0eWxlPXt0aGlzLmdldFN0eWxlKG5vZGVUeXBlKX0+XG4gICAgICAgIHtub2RlLnRleHRDb250ZW50fVxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDaGlsZERvbU5vZGVzKG5vZGU6IE5vZGUpOiBBcnJheTxOb2RlPiB7XG4gICAgdmFyIGRvbU5vZGVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRvbU5vZGVzLnB1c2gobm9kZS5jaGlsZE5vZGVzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGRvbU5vZGVzO1xuICB9XG4gIHByaXZhdGUgaGFzVGV4dENoaWxkTm9kZXNPbmx5KG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICB2YXIgbm9kZXMgPSBub2RlLmNoaWxkTm9kZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiI3RleHRcIikgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyQ29udGVudChzdHlsZTogYW55LCByb3dzOiBKU1guRWxlbWVudFtdKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZi1wYW5lbFwiLCB7IHN0eWxlOiBzdHlsZSB9LCByb3dzKTtcbiAgfVxufVxuXG5SZWFjdEVsZW1lbnRGYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyRWxlbWVudChcImZsb3dwYW5lbFwiLCBwcm9wcyA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleUZsb3dQYW5lbCwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvZmxvdy1wYW5lbC50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2UgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbWFnZU1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2ltYWdlXCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkltYWdlIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkltYWdlTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkltYWdlTW9kZWw7XG4gIH1cbiAgcHJvdGVjdGVkIGNhblJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIuY2FuUmVuZGVyKCkgJiYgISF0aGlzLnF1ZXN0aW9uLmltYWdlTGluaztcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRWxlbWVudCgpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgdmFyIHN0eWxlOiBhbnkgPSB7IG9iamVjdEZpdDogdGhpcy5xdWVzdGlvbi5pbWFnZUZpdCB9O1xuICAgIHZhciBjb250cm9sID0gbnVsbDtcbiAgICBpZiAodGhpcy5xdWVzdGlvbi5jb250ZW50TW9kZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICBjb250cm9sID0gKFxuICAgICAgICA8aW1nXG4gICAgICAgICAgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmltYWdlfVxuICAgICAgICAgIHNyYz17dGhpcy5xdWVzdGlvbi5pbWFnZUxpbmt9XG4gICAgICAgICAgd2lkdGg9e1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoXG4gICAgICAgICAgICAgID8gdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoICsgXCJweFwiXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGhlaWdodD17XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0XG4gICAgICAgICAgICAgID8gdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCArIFwicHhcIlxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICAvL2FsdD17aXRlbS50ZXh0IHx8IGl0ZW0udmFsdWV9XG4gICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uY29udGVudE1vZGUgPT09IFwidmlkZW9cIikge1xuICAgICAgY29udHJvbCA9IChcbiAgICAgICAgPGVtYmVkXG4gICAgICAgICAgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmltYWdlfVxuICAgICAgICAgIHNyYz17dGhpcy5xdWVzdGlvbi5pbWFnZUxpbmt9XG4gICAgICAgICAgd2lkdGg9e1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoXG4gICAgICAgICAgICAgID8gdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoICsgXCJweFwiXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIGhlaWdodD17XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0XG4gICAgICAgICAgICAgID8gdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCArIFwicHhcIlxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5yb290fT57Y29udHJvbH08L2Rpdj47XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImltYWdlXCIsIChwcm9wcykgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkltYWdlLCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9pbWFnZS50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2UgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2ltYWdlcGlja2VyXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkltYWdlUGlja2VyIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbDtcbiAgfVxuICBoYW5kbGVPbkNoYW5nZShldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMucXVlc3Rpb24ubXVsdGlTZWxlY3QpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbHVlID0gdGhpcy5xdWVzdGlvbi52YWx1ZS5jb25jYXQoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBjdXJyVmFsdWUgPSB0aGlzLnF1ZXN0aW9uLnZhbHVlO1xuICAgICAgICBjdXJyVmFsdWUuc3BsaWNlKHRoaXMucXVlc3Rpb24udmFsdWUuaW5kZXhPZihldmVudC50YXJnZXQudmFsdWUpLCAxKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IGN1cnJWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVzdGlvbi52YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB0aGlzLnF1ZXN0aW9uLnZhbHVlIH0pO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICByZXR1cm4gKFxuICAgICAgPGZpZWxkc2V0IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb290fT5cbiAgICAgICAgPGxlZ2VuZCBhcmlhLWxhYmVsPXt0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0gLz5cbiAgICAgICAge3RoaXMuZ2V0SXRlbXMoY3NzQ2xhc3Nlcyl9XG4gICAgICA8L2ZpZWxkc2V0PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEl0ZW1zKGNzc0NsYXNzZXM6IGFueSk6IEFycmF5PGFueT4ge1xuICAgIHZhciBpdGVtcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzW2ldO1xuICAgICAgdmFyIGtleSA9IFwiaXRlbVwiICsgaTtcbiAgICAgIGl0ZW1zLnB1c2godGhpcy5yZW5kZXJJdGVtKGtleSwgaXRlbSwgY3NzQ2xhc3NlcykpO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZXh0U3R5bGUoKTogYW55IHtcbiAgICByZXR1cm4geyBtYXJnaW5MZWZ0OiBcIjNweFwiLCBkaXNwbGF5OiBcImlubGluZVwiLCBwb3NpdGlvbjogXCJzdGF0aWNcIiB9O1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJJdGVtKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBjc3NDbGFzc2VzOiBhbnlcbiAgKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBpc0NoZWNrZWQgPSB0aGlzLnF1ZXN0aW9uLmlzSXRlbVNlbGVjdGVkKGl0ZW0pO1xuICAgIHZhciBpZCA9IHRoaXMucXVlc3Rpb24uaW5wdXRJZCArIFwiX1wiICsgaXRlbS52YWx1ZTtcbiAgICB2YXIgaXRlbUNsYXNzID0gdGhpcy5xdWVzdGlvbi5nZXRJdGVtQ2xhc3MoaXRlbSk7XG4gICAgdmFyIHRleHQgPSBudWxsO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLnNob3dMYWJlbCkge1xuICAgICAgdGV4dCA9IChcbiAgICAgICAgPHNwYW5cbiAgICAgICAgICB0aXRsZT17aXRlbS50ZXh0IHx8IGl0ZW0udmFsdWV9XG4gICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaXRlbVRleHR9XG4gICAgICAgID5cbiAgICAgICAgICB7aXRlbS50ZXh0IHx8IGl0ZW0udmFsdWV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlOiBhbnkgPSB7IG9iamVjdEZpdDogdGhpcy5xdWVzdGlvbi5pbWFnZUZpdCB9O1xuXG4gICAgdmFyIGNvbnRyb2wgPSBudWxsO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmNvbnRlbnRNb2RlID09PSBcImltYWdlXCIpIHtcbiAgICAgIGNvbnRyb2wgPSAoXG4gICAgICAgIDxpbWdcbiAgICAgICAgICBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuaW1hZ2V9XG4gICAgICAgICAgc3JjPXtpdGVtW1wiaW1hZ2VMaW5rXCJdfVxuICAgICAgICAgIHdpZHRoPXtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uaW1hZ2VXaWR0aFxuICAgICAgICAgICAgICA/IHRoaXMucXVlc3Rpb24uaW1hZ2VXaWR0aCArIFwicHhcIlxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBoZWlnaHQ9e1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodFxuICAgICAgICAgICAgICA/IHRoaXMucXVlc3Rpb24uaW1hZ2VIZWlnaHQgKyBcInB4XCJcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgYWx0PXtpdGVtLnRleHQgfHwgaXRlbS52YWx1ZX1cbiAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVzdGlvbi5jb250ZW50TW9kZSA9PT0gXCJ2aWRlb1wiKSB7XG4gICAgICBjb250cm9sID0gKFxuICAgICAgICA8ZW1iZWRcbiAgICAgICAgICBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuaW1hZ2V9XG4gICAgICAgICAgc3JjPXtpdGVtW1wiaW1hZ2VMaW5rXCJdfVxuICAgICAgICAgIHdpZHRoPXtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uaW1hZ2VXaWR0aFxuICAgICAgICAgICAgICA/IHRoaXMucXVlc3Rpb24uaW1hZ2VXaWR0aCArIFwicHhcIlxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICBoZWlnaHQ9e1xuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodFxuICAgICAgICAgICAgICA/IHRoaXMucXVlc3Rpb24uaW1hZ2VIZWlnaHQgKyBcInB4XCJcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICAvPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBrZXk9e2tleX0gY2xhc3NOYW1lPXtpdGVtQ2xhc3N9PlxuICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmxhYmVsfT5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHN0eWxlPXt7IGRpc3BsYXk6IFwibm9uZVwiIH19XG4gICAgICAgICAgICBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuaXRlbUNvbnRyb2x9XG4gICAgICAgICAgICBpZD17aWR9XG4gICAgICAgICAgICB0eXBlPXt0aGlzLnF1ZXN0aW9uLm11bHRpU2VsZWN0ID8gXCJjaGVja2JveFwiIDogXCJyYWRpb1wifVxuICAgICAgICAgICAgbmFtZT17dGhpcy5xdWVzdGlvbi5uYW1lICsgXCJfXCIgKyB0aGlzLnF1ZXN0aW9uQmFzZS5pZH1cbiAgICAgICAgICAgIGNoZWNrZWQ9e2lzQ2hlY2tlZH1cbiAgICAgICAgICAgIHZhbHVlPXtpdGVtLnZhbHVlfVxuICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZSB8fCAhaXRlbS5pc0VuYWJsZWR9XG4gICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9e3RoaXMucXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfVxuICAgICAgICAgICAgYXJpYS1pbnZhbGlkPXt0aGlzLnF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwfVxuICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT17XG4gICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMucXVlc3Rpb24uaWQgKyBcIl9lcnJvcnNcIlxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIHtjb250cm9sfVxuICAgICAgICAgICAge3RleHR9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJpbWFnZXBpY2tlclwiLCAocHJvcHMpID0+IHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25JbWFnZVBpY2tlciwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvaW1hZ2VwaWNrZXIudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXkgfSBmcm9tIFwiLi9yZWFjdFN1cnZleVwiO1xuaW1wb3J0IHsgUmVhY3RXaW5kb3dNb2RlbCB9IGZyb20gXCIuL3JlYWN0c3VydmV5bW9kZWxcIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnRCYXNlIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5V2luZG93IGV4dGVuZHMgU3VydmV5IHtcbiAgcHJvdGVjdGVkIHdpbmRvdzogUmVhY3RXaW5kb3dNb2RlbDtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZU9uRXhwYW5kZWQgPSB0aGlzLmhhbmRsZU9uRXhwYW5kZWQuYmluZCh0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3RhdGVFbGVtZW50cygpOiBBcnJheTxCYXNlPiB7XG4gICAgcmV0dXJuIFt0aGlzLndpbmRvdywgdGhpcy53aW5kb3cuc3VydmV5XTtcbiAgfVxuICBoYW5kbGVPbkV4cGFuZGVkKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLndpbmRvdy5pc0V4cGFuZGVkID0gIXRoaXMud2luZG93LmlzRXhwYW5kZWQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNhblJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIuY2FuUmVuZGVyKCkgJiYgdGhpcy53aW5kb3cuaXNTaG93aW5nO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgaGVhZGVyID0gdGhpcy5yZW5kZXJXaW5kb3dIZWFkZXIoKTtcbiAgICB2YXIgYm9keSA9IHRoaXMud2luZG93LmlzRXhwYW5kZWQgPyB0aGlzLnJlbmRlckJvZHkoKSA6IG51bGw7XG4gICAgbGV0IHN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgIGJvdHRvbTogMyxcbiAgICAgIHJpZ2h0OiAxMCxcbiAgICAgIG1heFdpZHRoOiBcIjYwJVwiLFxuICAgIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy53aW5kb3cucm9vdH0gc3R5bGU9e3N0eWxlfT5cbiAgICAgICAge2hlYWRlcn1cbiAgICAgICAge2JvZHl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJXaW5kb3dIZWFkZXIoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBzdHlsZUEgPSB7IHdpZHRoOiBcIjEwMCVcIiwgY3Vyc29yOiBcInBvaW50ZXJcIiB9O1xuICAgIHZhciBzdHlsZVRpdGxlID0geyBwYWRkaW5nUmlnaHQ6IFwiMTBweFwiIH07XG4gICAgdmFyIGdseXBoQ2xhc3NOYW1lID0gdGhpcy53aW5kb3cuaXNFeHBhbmRlZFxuICAgICAgPyB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkNvbGxhcHNlZFxuICAgICAgOiB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkV4cGFuZGVkO1xuICAgIGdseXBoQ2xhc3NOYW1lID0gXCJnbHlwaGljb24gcHVsbC1yaWdodCBcIiArIGdseXBoQ2xhc3NOYW1lO1xuICAgIHZhciB0aXRsZSA9IFN1cnZleUVsZW1lbnRCYXNlLnJlbmRlckxvY1N0cmluZyh0aGlzLnN1cnZleS5sb2NUaXRsZSk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy53aW5kb3cuaGVhZGVyLnJvb3R9PlxuICAgICAgICA8c3BhbiBvbkNsaWNrPXt0aGlzLmhhbmRsZU9uRXhwYW5kZWR9IHN0eWxlPXtzdHlsZUF9PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5jc3Mud2luZG93LmhlYWRlci50aXRsZX0gc3R5bGU9e3N0eWxlVGl0bGV9PlxuICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2dseXBoQ2xhc3NOYW1lfSBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIHt0aGlzLndpbmRvdy5pc0V4cGFuZGVkID8gKFxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZU9uRXhwYW5kZWR9XG4gICAgICAgICAgICBzdHlsZT17eyBmbG9hdDogXCJyaWdodFwiLCBjdXJzb3I6IFwicG9pbnRlclwiIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXt0aGlzLmNzcy53aW5kb3cuaGVhZGVyLnRpdGxlfSBzdHlsZT17c3R5bGVUaXRsZX0+XG4gICAgICAgICAgICAgIFhcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyQm9keSgpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPXt0aGlzLmNzcy53aW5kb3cuYm9keX0+e3RoaXMuZG9SZW5kZXIoKX08L2Rpdj47XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleShuZXdQcm9wczogYW55KSB7XG4gICAgaWYgKCFuZXdQcm9wcykgbmV3UHJvcHMgPSB7fTtcbiAgICBzdXBlci5jcmVhdGVTdXJ2ZXkobmV3UHJvcHMpO1xuICAgIHRoaXMud2luZG93ID0gbmV3IFJlYWN0V2luZG93TW9kZWwobnVsbCwgdGhpcy5zdXJ2ZXkpO1xuICAgIGlmIChuZXdQcm9wcy5jbG9zZU9uQ29tcGxldGVUaW1lb3V0KSB7XG4gICAgICB0aGlzLndpbmRvdy5jbG9zZU9uQ29tcGxldGVUaW1lb3V0ID0gbmV3UHJvcHMuY2xvc2VPbkNvbXBsZXRlVGltZW91dDtcbiAgICB9XG4gICAgdGhpcy53aW5kb3cuaXNTaG93aW5nID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMud2luZG93LmlzRXhwYW5kZWQgJiYgKG5ld1Byb3BzLmV4cGFuZGVkIHx8IG5ld1Byb3BzLmlzRXhwYW5kZWQpKVxuICAgICAgdGhpcy53aW5kb3cuZXhwYW5kKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMud2luZG93LmNsb3NlV2luZG93T25Db21wbGV0ZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi53aW5kb3cuaGlkZSgpO1xuICAgIH07XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdFN1cnZleVdpbmRvdy50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIFJlYWN0U3VydmV5RWxlbWVudCxcbiAgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSxcbn0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQm9vbGVhbk1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2Jvb2xlYW5cIjtcbmltcG9ydCB7IFJlYWN0UXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IE90aGVyRW1wdHlFcnJvciB9IGZyb20gXCIuLi9lcnJvclwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25Cb29sZWFuIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gIHByaXZhdGUgY2hlY2tSZWY6IFJlYWN0LlJlZk9iamVjdDxIVE1MSW5wdXRFbGVtZW50PjtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlT25DbGljayA9IHRoaXMuaGFuZGxlT25DbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlT25MYWJlbENsaWNrID0gdGhpcy5oYW5kbGVPbkxhYmVsQ2xpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZU9uU3dpdGNoQ2xpY2sgPSB0aGlzLmhhbmRsZU9uU3dpdGNoQ2xpY2suYmluZCh0aGlzKTtcbiAgICB0aGlzLmNoZWNrUmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uQm9vbGVhbk1vZGVsO1xuICB9XG4gIHByaXZhdGUgcHJldmVudERlZmF1bHRzKGV2ZW50OiBhbnkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG4gIHByaXZhdGUgZG9DaGVjayh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMucXVlc3Rpb24uY2hlY2tlZFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB0aGlzLnF1ZXN0aW9uLmNoZWNrZWRWYWx1ZSB9KTtcbiAgfVxuICBoYW5kbGVPbkNoYW5nZShldmVudDogYW55KSB7XG4gICAgdGhpcy5kb0NoZWNrKGV2ZW50LnRhcmdldC5jaGVja2VkKTtcbiAgfVxuICBoYW5kbGVPbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAodGhpcy5xdWVzdGlvbi5pc0luZGV0ZXJtaW5hdGUpIHtcbiAgICAgIHRoaXMucHJldmVudERlZmF1bHRzKGV2ZW50KTtcbiAgICAgIHRoaXMucXVlc3Rpb24uY2hlY2tlZFZhbHVlID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5xdWVzdGlvbi5jaGVja2VkVmFsdWUgfSk7XG4gICAgfVxuICB9XG4gIGhhbmRsZU9uU3dpdGNoQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzSW5kZXRlcm1pbmF0ZSkge1xuICAgICAgdGhpcy5wcmV2ZW50RGVmYXVsdHMoZXZlbnQpO1xuICAgICAgdmFyIGlzUmlnaHRDbGljayA9XG4gICAgICAgIGV2ZW50Lm5hdGl2ZUV2ZW50Lm9mZnNldFggLyBldmVudC50YXJnZXQub2Zmc2V0V2lkdGggPiAwLjU7XG4gICAgICB2YXIgaXNSdGwgPVxuICAgICAgICBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGV2ZW50LnRhcmdldCkuZGlyZWN0aW9uID09IFwicnRsXCI7XG4gICAgICB2YXIgdmFsdWUgPSBpc1J0bCA/ICFpc1JpZ2h0Q2xpY2sgOiBpc1JpZ2h0Q2xpY2s7XG4gICAgICByZXR1cm4gdGhpcy5kb0NoZWNrKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgaGFuZGxlT25MYWJlbENsaWNrKGV2ZW50OiBhbnksIHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uaXNJbmRldGVybWluYXRlKSB7XG4gICAgICB0aGlzLnByZXZlbnREZWZhdWx0cyhldmVudCk7XG4gICAgICB0aGlzLmRvQ2hlY2sodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVEb21FbGVtZW50KCkge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuO1xuICAgIHZhciBlbCA9IHRoaXMuY2hlY2tSZWYuY3VycmVudDtcbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLmluZGV0ZXJtaW5hdGUgPSB0aGlzLnF1ZXN0aW9uLmlzSW5kZXRlcm1pbmF0ZTtcbiAgICB9XG4gICAgdGhpcy5jb250cm9sID0gZWw7XG4gICAgc3VwZXIudXBkYXRlRG9tRWxlbWVudCgpO1xuICB9XG4gIHByaXZhdGUgZ2V0SXRlbUNsYXNzKCk6IHN0cmluZyB7XG4gICAgdmFyIGNzc0NsYXNzZXMgPSB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgdmFyIGlzQ2hlY2tlZCA9IHRoaXMucXVlc3Rpb24uY2hlY2tlZFZhbHVlO1xuICAgIHZhciBpc0Rpc2FibGVkID0gdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5O1xuICAgIHZhciBpdGVtQ2xhc3MgPSBjc3NDbGFzc2VzLml0ZW07XG4gICAgaWYgKGlzRGlzYWJsZWQpIGl0ZW1DbGFzcyArPSBcIiBcIiArIGNzc0NsYXNzZXMuaXRlbURpc2FibGVkO1xuICAgIGlmIChpc0NoZWNrZWQpIGl0ZW1DbGFzcyArPSBcIiBcIiArIGNzc0NsYXNzZXMuaXRlbUNoZWNrZWQ7XG4gICAgZWxzZSBpZiAoaXNDaGVja2VkID09PSBudWxsKVxuICAgICAgaXRlbUNsYXNzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5pdGVtSW5kZXRlcm1pbmF0ZTtcbiAgICByZXR1cm4gaXRlbUNsYXNzO1xuICB9XG4gIHByaXZhdGUgZ2V0TGFiZWxDbGFzcyhjaGVja2VkOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLnF1ZXN0aW9uO1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHJldHVybiAoXG4gICAgICBjc3NDbGFzc2VzLmxhYmVsICtcbiAgICAgIFwiIFwiICtcbiAgICAgIChxdWVzdGlvbi5jaGVja2VkVmFsdWUgPT09ICFjaGVja2VkIHx8IHF1ZXN0aW9uLmlzUmVhZE9ubHlcbiAgICAgICAgPyBxdWVzdGlvbi5jc3NDbGFzc2VzLmRpc2FibGVkTGFiZWxcbiAgICAgICAgOiBcIlwiKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBpdGVtQ2xhc3MgPSB0aGlzLmdldEl0ZW1DbGFzcygpO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb290fT5cbiAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT17aXRlbUNsYXNzfSBvbkNsaWNrPXt0aGlzLmhhbmRsZU9uQ2xpY2t9PlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgcmVmPXt0aGlzLmNoZWNrUmVmfVxuICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgIHZhbHVlPXtcbiAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5jaGVja2VkVmFsdWUgPT09IG51bGxcbiAgICAgICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgICAgICA6IHRoaXMucXVlc3Rpb24uY2hlY2tlZFZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZD17dGhpcy5xdWVzdGlvbi5pbnB1dElkfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmNvbnRyb2x9XG4gICAgICAgICAgICBkaXNhYmxlZD17dGhpcy5pc0Rpc3BsYXlNb2RlfVxuICAgICAgICAgICAgY2hlY2tlZD17dGhpcy5xdWVzdGlvbi5jaGVja2VkVmFsdWUgfHwgZmFsc2V9XG4gICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVPbkNoYW5nZX1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9e3RoaXMucXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfVxuICAgICAgICAgICAgYXJpYS1pbnZhbGlkPXt0aGlzLnF1ZXN0aW9uLmVycm9ycy5sZW5ndGggPiAwfVxuICAgICAgICAgICAgYXJpYS1kZXNjcmliZWRieT17XG4gICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMucXVlc3Rpb24uaWQgKyBcIl9lcnJvcnNcIlxuICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5nZXRMYWJlbENsYXNzKGZhbHNlKX1cbiAgICAgICAgICAgIG9uQ2xpY2s9eyhldmVudCkgPT4gdGhpcy5oYW5kbGVPbkxhYmVsQ2xpY2soZXZlbnQsIGZhbHNlKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dGhpcy5xdWVzdGlvbi5sb2NMYWJlbEZhbHNlLnJlbmRlcmVkSHRtbH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuc3dpdGNofSBvbkNsaWNrPXt0aGlzLmhhbmRsZU9uU3dpdGNoQ2xpY2t9PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnNsaWRlcn0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLmdldExhYmVsQ2xhc3ModHJ1ZSl9XG4gICAgICAgICAgICBvbkNsaWNrPXsoZXZlbnQpID0+IHRoaXMuaGFuZGxlT25MYWJlbENsaWNrKGV2ZW50LCB0cnVlKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dGhpcy5xdWVzdGlvbi5sb2NMYWJlbFRydWUucmVuZGVyZWRIdG1sfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImJvb2xlYW5cIiwgKHByb3BzKSA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uQm9vbGVhbiwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmJvb2xlYW4udHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICBSZWFjdFN1cnZleUVsZW1lbnQsXG4gIFN1cnZleVF1ZXN0aW9uVW5jb250cm9sbGVkRWxlbWVudCxcbn0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvblwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25DdXN0b21Nb2RlbCxcbiAgUXVlc3Rpb25Db21wb3NpdGVNb2RlbCxcbn0gZnJvbSBcIi4uL3F1ZXN0aW9uX2N1c3RvbVwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgU3VydmV5UGFuZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25DdXN0b20gZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvblVuY29udHJvbGxlZEVsZW1lbnQ8XG4gIFF1ZXN0aW9uQ3VzdG9tTW9kZWxcbj4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gU3VydmV5UXVlc3Rpb24ucmVuZGVyUXVlc3Rpb25Cb2R5KFxuICAgICAgdGhpcy5jcmVhdG9yLFxuICAgICAgdGhpcy5xdWVzdGlvbi5jb250ZW50UXVlc3Rpb25cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFN1cnZleVF1ZXN0aW9uVW5jb250cm9sbGVkRWxlbWVudDxcbiAgUXVlc3Rpb25Db21wb3NpdGVNb2RlbFxuPiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGNhblJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXN0aW9uLmNvbnRlbnRQYW5lbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRWxlbWVudCgpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdXJ2ZXlQYW5lbFxuICAgICAgICBlbGVtZW50PXt0aGlzLnF1ZXN0aW9uLmNvbnRlbnRQYW5lbH1cbiAgICAgICAgY3JlYXRvcj17dGhpcy5jcmVhdG9yfVxuICAgICAgICBzdXJ2ZXk9e3RoaXMucXVlc3Rpb24uc3VydmV5fVxuICAgICAgPjwvU3VydmV5UGFuZWw+XG4gICAgKTtcbiAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY3VzdG9tXCIsIChwcm9wcykgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkN1c3RvbSwgcHJvcHMpO1xufSk7XG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY29tcG9zaXRlXCIsIChwcm9wcykgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkNvbXBvc2l0ZSwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmN1c3RvbS50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gIFN1cnZleVF1ZXN0aW9uVW5jb250cm9sbGVkRWxlbWVudCxcbiAgUmVhY3RTdXJ2ZXlFbGVtZW50LFxufSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fZHJvcGRvd25cIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW0gfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uY29tbWVudFwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4uL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuLi9iYXNlXCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkRyb3Bkb3duIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25VbmNvbnRyb2xsZWRFbGVtZW50PFxuICBRdWVzdGlvbkRyb3Bkb3duTW9kZWxcbj4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB2YXIgY29tbWVudCA9IHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkXG4gICAgICA/IHRoaXMucmVuZGVyT3RoZXIoY3NzQ2xhc3NlcylcbiAgICAgIDogbnVsbDtcbiAgICB2YXIgc2VsZWN0ID0gdGhpcy5yZW5kZXJTZWxlY3QoY3NzQ2xhc3Nlcyk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9PlxuICAgICAgICB7c2VsZWN0fVxuICAgICAgICB7Y29tbWVudH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlclNlbGVjdChjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKHRoaXMuaXNEaXNwbGF5TW9kZSkge1xuICAgICAgdmFyIGlzT3RoZXJTZWxlY3RlZCA9IHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICA8ZGl2IGlkPXt0aGlzLnF1ZXN0aW9uLmlucHV0SWR9IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5jb250cm9sfSBkaXNhYmxlZD5cbiAgICAgICAgICB7aXNPdGhlclNlbGVjdGVkXG4gICAgICAgICAgICA/IHRoaXMucXVlc3Rpb24ub3RoZXJUZXh0XG4gICAgICAgICAgICA6IHRoaXMucXVlc3Rpb24uZGlzcGxheVZhbHVlfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuICAgIHZhciBvcHRpb25zID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXNbaV07XG4gICAgICB2YXIga2V5ID0gXCJpdGVtXCIgKyBpO1xuICAgICAgdmFyIG9wdGlvbiA9IDxTdXJ2ZXlRdWVzdGlvbk9wdGlvbkl0ZW0ga2V5PXtrZXl9IGl0ZW09e2l0ZW19IC8+O1xuICAgICAgb3B0aW9ucy5wdXNoKG9wdGlvbik7XG4gICAgfVxuICAgIHZhciBjYXB0aW9uT3B0aW9uID0gdGhpcy5xdWVzdGlvbi5zaG93T3B0aW9uc0NhcHRpb24gPyAoXG4gICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+e3RoaXMucXVlc3Rpb24ub3B0aW9uc0NhcHRpb259PC9vcHRpb24+XG4gICAgKSA6IG51bGw7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuc2VsZWN0V3JhcHBlcn0+XG4gICAgICAgIDxzZWxlY3RcbiAgICAgICAgICBpZD17dGhpcy5xdWVzdGlvbi5pbnB1dElkfVxuICAgICAgICAgIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5jb250cm9sfVxuICAgICAgICAgIHJlZj17KHNlbGVjdCkgPT4gKHRoaXMuY29udHJvbCA9IHNlbGVjdCl9XG4gICAgICAgICAgb25DaGFuZ2U9e3RoaXMudXBkYXRlVmFsdWVPbkV2ZW50fVxuICAgICAgICAgIG9uSW5wdXQ9e3RoaXMudXBkYXRlVmFsdWVPbkV2ZW50fVxuICAgICAgICAgIGFyaWEtbGFiZWw9e3RoaXMucXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfVxuICAgICAgICAgIGFyaWEtaW52YWxpZD17dGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMH1cbiAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PXtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyB0aGlzLnF1ZXN0aW9uLmlkICsgXCJfZXJyb3JzXCJcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICA+XG4gICAgICAgICAge2NhcHRpb25PcHRpb259XG4gICAgICAgICAge29wdGlvbnN9XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyT3RoZXIoY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgPFN1cnZleVF1ZXN0aW9uQ29tbWVudEl0ZW1cbiAgICAgICAgICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn1cbiAgICAgICAgICBvdGhlckNzcz17Y3NzQ2xhc3Nlcy5vdGhlcn1cbiAgICAgICAgICBjc3NDbGFzc2VzPXtjc3NDbGFzc2VzfVxuICAgICAgICAgIGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uT3B0aW9uSXRlbSBleHRlbmRzIFJlYWN0U3VydmV5RWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0YXRlRWxlbWVudCgpOiBCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtO1xuICB9XG4gIHByaXZhdGUgZ2V0IGl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pdGVtO1xuICB9XG4gIHByb3RlY3RlZCBjYW5SZW5kZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5pdGVtO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgPG9wdGlvbiB2YWx1ZT17dGhpcy5pdGVtLnZhbHVlfSBkaXNhYmxlZD17IXRoaXMuaXRlbS5pc0VuYWJsZWR9PlxuICAgICAgICB7dGhpcy5pdGVtLnRleHR9XG4gICAgICA8L29wdGlvbj5cbiAgICApO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJkcm9wZG93blwiLCAocHJvcHMpID0+IHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25Ecm9wZG93biwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmRyb3Bkb3duLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2UgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25FbXB0eU1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2VtcHR5XCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkVtcHR5IGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHsgdmFsdWU6IHRoaXMucXVlc3Rpb24udmFsdWUgfTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uRW1wdHlNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uRW1wdHlNb2RlbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRWxlbWVudCgpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIDxkaXYgLz47XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImVtcHR5XCIsIChwcm9wcykgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkVtcHR5LCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uZW1wdHkudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9leHByZXNzaW9uXCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWw7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGlkPXt0aGlzLnF1ZXN0aW9uLmlucHV0SWR9XG4gICAgICAgIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb290fVxuICAgICAgICByZWY9eyhkaXYpID0+ICh0aGlzLmNvbnRyb2wgPSBkaXYpfVxuICAgICAgPlxuICAgICAgICB7dGhpcy5xdWVzdGlvbi5kaXNwbGF5VmFsdWV9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJleHByZXNzaW9uXCIsIChwcm9wcykgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbkV4cHJlc3Npb24sIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25leHByZXNzaW9uLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZpbGVNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9maWxlXCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQge1xuICBjb25maXJtQWN0aW9uLFxuICBkZXRlY3RJRU9yRWRnZSxcbiAgbG9hZEZpbGVGcm9tQmFzZTY0LFxufSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbkZpbGUgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZmlsZUxvYWRlZDogMCxcbiAgICAgIHN0YXRlOiBcImVtcHR5XCIsXG4gICAgICByb290Q2xhc3M6IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5yb290LFxuICAgIH07XG4gICAgdGhpcy5oYW5kbGVPbkNoYW5nZSA9IHRoaXMuaGFuZGxlT25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLnF1ZXN0aW9uLm9uU3RhdGVDaGFuZ2VkLmFkZCgoc3RhdGU6IGFueSkgPT5cbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBmaWxlTG9hZGVkOiB0aGlzLnN0YXRlLmZpbGVMb2FkZWQgKyAxLCBzdGF0ZTogc3RhdGUgfSlcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25GaWxlTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkZpbGVNb2RlbDtcbiAgfVxuICBoYW5kbGVPbkRyYWdPdmVyID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICBpZiAodGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5KSB7XG4gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IFwiY29weVwiO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG4gIGhhbmRsZU9uRHJvcCA9IChldmVudDogYW55KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBsZXQgc3JjID0gZXZlbnQuZGF0YVRyYW5zZmVyO1xuICAgIHRoaXMub25DaGFuZ2Uoc3JjKTtcbiAgfTtcbiAgaGFuZGxlT25DaGFuZ2UgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIHZhciBzcmMgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDtcbiAgICB0aGlzLm9uQ2hhbmdlKHNyYyk7XG4gIH07XG4gIGhhbmRsZU9uQ2xlYW4gPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMucXVlc3Rpb247XG4gICAgdmFyIHNyYyA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50O1xuICAgIGlmIChxdWVzdGlvbi5uZWVkQ29uZmlybVJlbW92ZUZpbGUpIHtcbiAgICAgIHZhciBpc0NvbmZpcm1lZCA9IGNvbmZpcm1BY3Rpb24ocXVlc3Rpb24uY29uZmlybVJlbW92ZUFsbE1lc3NhZ2UpO1xuICAgICAgaWYgKCFpc0NvbmZpcm1lZCkgcmV0dXJuO1xuICAgIH1cbiAgICBxdWVzdGlvbi5jbGVhcigpO1xuICAgIHNyYy5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFwiKVswXS52YWx1ZSA9IFwiXCI7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGZpbGVMb2FkZWQ6IHRoaXMuc3RhdGUuZmlsZUxvYWRlZCArIDEgfSk7XG4gIH07XG4gIGhhbmRsZU9uUmVtb3ZlRmlsZSA9IChldmVudDogYW55KSA9PiB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbjtcbiAgICBpZiAocXVlc3Rpb24ubmVlZENvbmZpcm1SZW1vdmVGaWxlKSB7XG4gICAgICB2YXIgaXNDb25maXJtZWQgPSBjb25maXJtQWN0aW9uKFxuICAgICAgICBxdWVzdGlvbi5nZXRDb25maXJtUmVtb3ZlTWVzc2FnZShldmVudC5uYW1lKVxuICAgICAgKTtcbiAgICAgIGlmICghaXNDb25maXJtZWQpIHJldHVybjtcbiAgICB9XG4gICAgcXVlc3Rpb24ucmVtb3ZlRmlsZShldmVudCk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGZpbGVMb2FkZWQ6IHRoaXMuc3RhdGUuZmlsZUxvYWRlZCArIDEgfSk7XG4gIH07XG4gIGhhbmRsZU9uRG93bmxvYWRGaWxlID0gKGV2ZW50OiBhbnksIGRhdGE6IGFueSkgPT4ge1xuICAgIGlmIChkZXRlY3RJRU9yRWRnZSgpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgbG9hZEZpbGVGcm9tQmFzZTY0KGRhdGEuY29udGVudCwgZGF0YS5uYW1lKTtcbiAgICB9XG4gIH07XG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoc3JjOiBhbnkpID0+IHtcbiAgICBpZiAoISh3aW5kb3cgYXMgYW55KVtcIkZpbGVSZWFkZXJcIl0pIHJldHVybjtcbiAgICBpZiAoIXNyYyB8fCAhc3JjLmZpbGVzIHx8IHNyYy5maWxlcy5sZW5ndGggPCAxKSByZXR1cm47XG4gICAgbGV0IGZpbGVzID0gW107XG4gICAgbGV0IGFsbG93Q291bnQgPSB0aGlzLnF1ZXN0aW9uLmFsbG93TXVsdGlwbGUgPyBzcmMuZmlsZXMubGVuZ3RoIDogMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbG93Q291bnQ7IGkrKykge1xuICAgICAgZmlsZXMucHVzaChzcmMuZmlsZXNbaV0pO1xuICAgIH1cbiAgICBzcmMudmFsdWUgPSBcIlwiO1xuICAgIHRoaXMucXVlc3Rpb24ubG9hZEZpbGVzKGZpbGVzKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgZmlsZUxvYWRlZDogdGhpcy5zdGF0ZS5maWxlTG9hZGVkICsgMSB9KTtcbiAgfTtcbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBwcmV2aWV3ID0gdGhpcy5yZW5kZXJQcmV2aWV3KCk7XG4gICAgdmFyIGZpbGVJbnB1dCA9IG51bGw7XG4gICAgdmFyIGZpbGVEZWNvcmF0b3IgPSB0aGlzLnJlbmRlckZpbGVEZWNvcmF0b3IoKTtcbiAgICB2YXIgY2xlYXJCdXR0b24gPSB0aGlzLnJlbmRlckNsZWFyQnV0dG9uKFxuICAgICAgdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLnJlbW92ZUJ1dHRvblxuICAgICk7XG4gICAgdmFyIGNsZWFyQnV0dG9uQm90dG9tID0gdGhpcy5yZW5kZXJDbGVhckJ1dHRvbihcbiAgICAgIHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5yZW1vdmVCdXR0b25Cb3R0b21cbiAgICApO1xuICAgIGZpbGVJbnB1dCA9IChcbiAgICAgIDxpbnB1dFxuICAgICAgICBkaXNhYmxlZD17dGhpcy5pc0Rpc3BsYXlNb2RlfVxuICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5maWxlSW5wdXR9XG4gICAgICAgIGlkPXt0aGlzLnF1ZXN0aW9uLmlucHV0SWR9XG4gICAgICAgIHJlZj17KGlucHV0KSA9PiAodGhpcy5jb250cm9sID0gaW5wdXQpfVxuICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgIG9uQ2hhbmdlPXshdGhpcy5pc0Rpc3BsYXlNb2RlID8gdGhpcy5oYW5kbGVPbkNoYW5nZSA6IG51bGx9XG4gICAgICAgIGFyaWEtcmVxdWlyZWQ9e3RoaXMucXVlc3Rpb24uaXNSZXF1aXJlZH1cbiAgICAgICAgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9XG4gICAgICAgIGFyaWEtaW52YWxpZD17dGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMH1cbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT17XG4gICAgICAgICAgdGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMCA/IHRoaXMucXVlc3Rpb24uaWQgKyBcIl9lcnJvcnNcIiA6IG51bGxcbiAgICAgICAgfVxuICAgICAgICBtdWx0aXBsZT17dGhpcy5xdWVzdGlvbi5hbGxvd011bHRpcGxlfVxuICAgICAgICB0aXRsZT17dGhpcy5xdWVzdGlvbi5pbnB1dFRpdGxlfVxuICAgICAgICBhY2NlcHQ9e3RoaXMucXVlc3Rpb24uYWNjZXB0ZWRUeXBlc31cbiAgICAgIC8+XG4gICAgKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMuc3RhdGUucm9vdENsYXNzfT5cbiAgICAgICAge2ZpbGVJbnB1dH1cbiAgICAgICAge2ZpbGVEZWNvcmF0b3J9XG4gICAgICAgIHtjbGVhckJ1dHRvbn1cbiAgICAgICAge3ByZXZpZXd9XG4gICAgICAgIHtjbGVhckJ1dHRvbkJvdHRvbX1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckZpbGVEZWNvcmF0b3IoKTogSlNYLkVsZW1lbnQge1xuICAgIGxldCBub0ZpbGVDaG9zZW4gPSBudWxsO1xuICAgIGxldCBjaG9vc2VGaWxlID0gbnVsbDtcbiAgICBsZXQgY2hvb3NlRmlsZUNzcyA9XG4gICAgICB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuY2hvb3NlRmlsZSArXG4gICAgICAodGhpcy5pc0Rpc3BsYXlNb2RlID8gXCIgXCIgKyB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuZGlzYWJsZWQgOiBcIlwiKTtcbiAgICBjaG9vc2VGaWxlID0gKFxuICAgICAgPGxhYmVsXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzc05hbWU9e2Nob29zZUZpbGVDc3N9XG4gICAgICAgIGh0bWxGb3I9e3RoaXMucXVlc3Rpb24uaW5wdXRJZH1cbiAgICAgICAgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5jaG9vc2VCdXR0b25DYXB0aW9ufVxuICAgICAgPlxuICAgICAgICB7dGhpcy5xdWVzdGlvbi5jaG9vc2VCdXR0b25DYXB0aW9ufVxuICAgICAgPC9sYWJlbD5cbiAgICApO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzRW1wdHkoKSkge1xuICAgICAgbm9GaWxlQ2hvc2VuID0gKFxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5ub0ZpbGVDaG9zZW59PlxuICAgICAgICAgIHt0aGlzLnF1ZXN0aW9uLm5vRmlsZUNob3NlbkNhcHRpb259XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLmZpbGVEZWNvcmF0b3J9XG4gICAgICAgIG9uRHJvcD17dGhpcy5oYW5kbGVPbkRyb3B9XG4gICAgICAgIG9uRHJhZ092ZXI9e3RoaXMuaGFuZGxlT25EcmFnT3Zlcn1cbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy53cmFwcGVyfT5cbiAgICAgICAgICB7Y2hvb3NlRmlsZX1cbiAgICAgICAgICB7bm9GaWxlQ2hvc2VufVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckNsZWFyQnV0dG9uKGNsYXNzTmFtZTogc3RyaW5nKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAhdGhpcy5xdWVzdGlvbi5pc0VtcHR5KCkgJiYgIXRoaXMuaXNEaXNwbGF5TW9kZSA/IChcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e3RoaXMuaGFuZGxlT25DbGVhbn0gY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgICB7dGhpcy5xdWVzdGlvbi5jbGVhbkJ1dHRvbkNhcHRpb259XG4gICAgICA8L2J1dHRvbj5cbiAgICApIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyUHJldmlldygpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHByZXZpZXdzID0gdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubWFwKCh2YWwsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIXZhbCkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgZmlsZVNpZ24gPSAoXG4gICAgICAgIDxhXG4gICAgICAgICAgaHJlZj17dmFsLmNvbnRlbnR9XG4gICAgICAgICAgb25DbGljaz17KGV2ZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU9uRG93bmxvYWRGaWxlKGV2ZW50LCB2YWwpO1xuICAgICAgICAgIH19XG4gICAgICAgICAgdGl0bGU9e3ZhbC5uYW1lfVxuICAgICAgICAgIGRvd25sb2FkPXt2YWwubmFtZX1cbiAgICAgICAgICBzdHlsZT17eyB3aWR0aDogdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoICsgXCJweFwiIH19XG4gICAgICAgID5cbiAgICAgICAgICB7dmFsLm5hbWV9XG4gICAgICAgIDwvYT5cbiAgICAgICk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8c3BhblxuICAgICAgICAgIGtleT17dGhpcy5xdWVzdGlvbi5pbnB1dElkICsgXCJfXCIgKyBpbmRleH1cbiAgICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5wcmV2aWV3fVxuICAgICAgICA+XG4gICAgICAgICAge3ZhbC5uYW1lID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5maWxlU2lnbn0+e2ZpbGVTaWdufTwvZGl2PlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIHt0aGlzLnF1ZXN0aW9uLmNhblByZXZpZXdJbWFnZSh2YWwpID8gKFxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICBzcmM9e3ZhbC5jb250ZW50fVxuICAgICAgICAgICAgICBoZWlnaHQ9e3RoaXMucXVlc3Rpb24uaW1hZ2VIZWlnaHR9XG4gICAgICAgICAgICAgIHdpZHRoPXt0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGh9XG4gICAgICAgICAgICAgIGFsdD1cIkZpbGUgcHJldmlld1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIHt2YWwubmFtZSAmJiAhdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5ID8gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5yZW1vdmVGaWxlfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhldmVudCkgPT4gdGhpcy5oYW5kbGVPblJlbW92ZUZpbGUodmFsKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt0aGlzLnF1ZXN0aW9uLnJlbW92ZUZpbGVDYXB0aW9ufVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5yZW1vdmVGaWxlU3ZnfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhldmVudCkgPT4gdGhpcy5oYW5kbGVPblJlbW92ZUZpbGUodmFsKX1cbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOCwyQzQuNywyLDIsNC43LDIsOHMyLjcsNiw2LDZzNi0yLjcsNi02UzExLjMsMiw4LDJ6IE0xMSwxMGwtMSwxTDgsOWwtMiwybC0xLTFsMi0yTDUsNmwxLTFsMiwybDItMmwxLDFMOSw4IEwxMSwxMHpcIiAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuZmlsZVNpZ25Cb3R0b219PlxuICAgICAgICAgICAge2ZpbGVTaWdufVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NwYW4+XG4gICAgICApO1xuICAgIH0pO1xuICAgIHJldHVybiA8ZGl2PntwcmV2aWV3c308L2Rpdj47XG4gIH1cbn1cblxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImZpbGVcIiwgKHByb3BzKSA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uRmlsZSwgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbmZpbGUudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSHRtbE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2h0bWxcIjtcbmltcG9ydCB7IFJlYWN0UXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uSHRtbCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25IdG1sTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbkh0bWxNb2RlbDtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVuZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5jYW5SZW5kZXIoKSAmJiAhIXRoaXMucXVlc3Rpb24uaHRtbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRWxlbWVudCgpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGh0bWxWYWx1ZSA9IHsgX19odG1sOiB0aGlzLnF1ZXN0aW9uLmxvY0h0bWwucmVuZGVyZWRIdG1sIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMucm9vdH1cbiAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e2h0bWxWYWx1ZX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaHRtbFwiLCAocHJvcHMpID0+IHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25IdG1sLCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9uaHRtbC50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFJlYWN0U3VydmV5RWxlbWVudCwgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBRdWVzdGlvbk1hdHJpeE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeFwiO1xuaW1wb3J0IHsgTWF0cml4Um93TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fbWF0cml4XCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbk1hdHJpeCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7IHJvd3NDaGFuZ2VkOiAwIH07XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25NYXRyaXhNb2RlbDtcbiAgfVxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRNb3VudCgpO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLnNldFN0YXRlKHsgcm93c0NoYW5nZWQ6IHNlbGYuc3RhdGUucm93c0NoYW5nZWQgKyAxIH0pO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICBpZiAodGhpcy5xdWVzdGlvbikge1xuICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93c0NoYW5nZWRDYWxsYmFjayA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBmaXJzdFRIID0gdGhpcy5xdWVzdGlvbi5oYXNSb3dzID8gPHRkIC8+IDogbnVsbDtcbiAgICB2YXIgaGVhZGVycyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbHVtbiA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnNbaV07XG4gICAgICB2YXIga2V5ID0gXCJjb2x1bW5cIiArIGk7XG4gICAgICB2YXIgY29sdW1UZXh0ID0gdGhpcy5yZW5kZXJMb2NTdHJpbmcoY29sdW1uLmxvY1RleHQpO1xuICAgICAgaGVhZGVycy5wdXNoKFxuICAgICAgICA8dGggY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuaGVhZGVyQ2VsbH0ga2V5PXtrZXl9PlxuICAgICAgICAgIHtjb2x1bVRleHR9XG4gICAgICAgIDwvdGg+XG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgcm93cyA9IFtdO1xuICAgIHZhciB2aXNpYmxlUm93cyA9IHRoaXMucXVlc3Rpb24udmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvdyA9IHZpc2libGVSb3dzW2ldO1xuICAgICAgdmFyIGtleSA9IFwicm93XCIgKyBpO1xuICAgICAgcm93cy5wdXNoKFxuICAgICAgICA8U3VydmV5UXVlc3Rpb25NYXRyaXhSb3dcbiAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn1cbiAgICAgICAgICBjc3NDbGFzc2VzPXtjc3NDbGFzc2VzfVxuICAgICAgICAgIGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgICByb3c9e3Jvd31cbiAgICAgICAgICBpc0ZpcnN0PXtpID09IDB9XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgaGVhZGVyID0gIXRoaXMucXVlc3Rpb24uc2hvd0hlYWRlciA/IG51bGwgOiAoXG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICB7Zmlyc3RUSH1cbiAgICAgICAgICB7aGVhZGVyc31cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGhlYWQ+XG4gICAgKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMudGFibGVXcmFwcGVyfT5cbiAgICAgICAgPGZpZWxkc2V0PlxuICAgICAgICAgIDxsZWdlbmQgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9IC8+XG4gICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb290fT5cbiAgICAgICAgICAgIHtoZWFkZXJ9XG4gICAgICAgICAgICA8dGJvZHk+e3Jvd3N9PC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NYXRyaXhSb3cgZXh0ZW5kcyBSZWFjdFN1cnZleUVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlT25DaGFuZ2UgPSB0aGlzLmhhbmRsZU9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25NYXRyaXhNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucXVlc3Rpb247XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcm93KCk6IE1hdHJpeFJvd01vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5yb3c7XG4gIH1cbiAgaGFuZGxlT25DaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucm93LnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5yb3cudmFsdWUgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNhblJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnJvdztcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyRWxlbWVudCgpOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGZpcnN0VEQgPSBudWxsO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc1Jvd3MpIHtcbiAgICAgIHZhciByb3dUZXh0ID0gdGhpcy5yZW5kZXJMb2NTdHJpbmcodGhpcy5yb3cubG9jVGV4dCk7XG4gICAgICBmaXJzdFREID0gPHRkIGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLmNlbGx9Pntyb3dUZXh0fTwvdGQ+O1xuICAgIH1cbiAgICB2YXIgdGRzID0gdGhpcy5nZW5lcmF0ZVRkcygpO1xuICAgIHJldHVybiAoXG4gICAgICA8dHIgY2xhc3NOYW1lPXt0aGlzLnJvdy5yb3dDbGFzc2VzfT5cbiAgICAgICAge2ZpcnN0VER9XG4gICAgICAgIHt0ZHN9XG4gICAgICA8L3RyPlxuICAgICk7XG4gIH1cbiAgZ2VuZXJhdGVUZHMoKSB7XG4gICAgdmFyIHRkcyA9IFtdO1xuICAgIHZhciByb3cgPSB0aGlzLnJvdztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRkID0gbnVsbDtcbiAgICAgIHZhciBjb2x1bW4gPSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zW2ldO1xuICAgICAgdmFyIGtleSA9IFwidmFsdWVcIiArIGk7XG5cbiAgICAgIHZhciBpc0NoZWNrZWQgPSByb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgbGV0IGl0ZW1DbGFzcyA9IHRoaXMucXVlc3Rpb24uZ2V0SXRlbUNsYXNzKHJvdywgY29sdW1uKTtcbiAgICAgIHZhciBpbnB1dElkID0gdGhpcy5xdWVzdGlvbi5pbnB1dElkICsgXCJfXCIgKyByb3cubmFtZSArIFwiX1wiICsgaTtcbiAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc0NlbGxUZXh0KSB7XG4gICAgICAgIHZhciBnZXRIYW5kbGVyID0gIXRoaXMucXVlc3Rpb24uaXNSZWFkT25seVxuICAgICAgICAgID8gKGNvbHVtbjogYW55KSA9PiAoKSA9PiB0aGlzLmNlbGxDbGljayhyb3csIGNvbHVtbilcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIHRkID0gKFxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICBjbGFzc05hbWU9e2l0ZW1DbGFzc31cbiAgICAgICAgICAgIG9uQ2xpY2s9e2dldEhhbmRsZXIgPyBnZXRIYW5kbGVyKGNvbHVtbikgOiBudWxsfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0aGlzLnJlbmRlckxvY1N0cmluZyhcbiAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5nZXRDZWxsRGlzcGxheUxvY1RleHQocm93Lm5hbWUsIGNvbHVtbilcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC90ZD5cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRkID0gKFxuICAgICAgICAgIDx0ZFxuICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICBoZWFkZXJzPXtjb2x1bW4ubG9jVGV4dC5yZW5kZXJlZEh0bWx9XG4gICAgICAgICAgICBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5jZWxsfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9e2l0ZW1DbGFzc30+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGlkPXtpbnB1dElkfVxuICAgICAgICAgICAgICAgIHR5cGU9XCJyYWRpb1wiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXt0aGlzLmNzc0NsYXNzZXMuaXRlbVZhbHVlfVxuICAgICAgICAgICAgICAgIG5hbWU9e3Jvdy5mdWxsTmFtZX1cbiAgICAgICAgICAgICAgICB2YWx1ZT17Y29sdW1uLnZhbHVlfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLmlzRGlzcGxheU1vZGV9XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17aXNDaGVja2VkfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZU9uQ2hhbmdlfVxuICAgICAgICAgICAgICAgIGFyaWEtcmVxdWlyZWQ9e3RoaXMucXVlc3Rpb24uaXNSZXF1aXJlZH1cbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt0aGlzLnF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXt0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMubWF0ZXJpYWxEZWNvcmF0b3J9PlxuICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLml0ZW1EZWNvcmF0b3J9XG4gICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiLTEyIC0xMiAyNCAyNFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGNpcmNsZSByPVwiNlwiIGN4PVwiMFwiIGN5PVwiMFwiIC8+c1xuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNpcmNsZVwiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImNoZWNrXCIgLz5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgZGlzcGxheTogXCJub25lXCIgfX0+XG4gICAgICAgICAgICAgICAge3RoaXMucXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0ZHMucHVzaCh0ZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRkcztcbiAgfVxuICBjZWxsQ2xpY2socm93OiBhbnksIGNvbHVtbjogYW55KSB7XG4gICAgcm93LnZhbHVlID0gY29sdW1uLnZhbHVlO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhcIiwgKHByb3BzKSA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uTWF0cml4LCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4LnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93bkJhc2UgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9ubWF0cml4ZHJvcGRvd25iYXNlXCI7XG5pbXBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlRdWVzdGlvbk1hdHJpeERyb3Bkb3duIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93bkJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkcm9wZG93blwiLCBwcm9wcyA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd24sIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkcm9wZG93bi50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFJlYWN0U3VydmV5RWxlbWVudCB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5pbXBvcnQgeyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWNcIjtcbmltcG9ydCB7IFJlYWN0UXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd25CYXNlIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbm1hdHJpeGRyb3Bkb3duYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NYXRyaXhEeW5hbWljIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25NYXRyaXhEcm9wZG93bkJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuaGFuZGxlT25Sb3dBZGRDbGljayA9IHRoaXMuaGFuZGxlT25Sb3dBZGRDbGljay5iaW5kKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgbWF0cml4KCk6IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbkJhc2UgYXMgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWw7XG4gIH1cbiAgaGFuZGxlT25Sb3dBZGRDbGljayhldmVudDogYW55KSB7XG4gICAgdGhpcy5tYXRyaXguYWRkUm93KCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBtYWluRGl2ID0gdGhpcy5yZW5kZXJUYWJsZURpdigpO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2PlxuICAgICAgICB7dGhpcy5yZW5kZXJBZGRSb3dCdXR0b25PblRvcChjc3NDbGFzc2VzKX1cbiAgICAgICAge21haW5EaXZ9XG4gICAgICAgIHt0aGlzLnJlbmRlckFkZFJvd0J1dHRvbk9uQm90dG9tKGNzc0NsYXNzZXMpfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyQWRkUm93QnV0dG9uT25Ub3AoY3NzQ2xhc3NlczogYW55KTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5tYXRyaXguaXNBZGRSb3dPblRvcCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyQWRkUm93QnV0dG9uKGNzc0NsYXNzZXMpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJBZGRSb3dCdXR0b25PbkJvdHRvbShjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLm1hdHJpeC5pc0FkZFJvd09uQm90dG9tKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJBZGRSb3dCdXR0b24oY3NzQ2xhc3Nlcyk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckFkZFJvd0J1dHRvbihjc3NDbGFzc2VzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmZvb3Rlcn0+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuYnV0dG9uICsgXCIgXCIgKyBjc3NDbGFzc2VzLmJ1dHRvbkFkZH1cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZU9uUm93QWRkQ2xpY2t9XG4gICAgICAgID5cbiAgICAgICAgICA8c3Bhbj57dGhpcy5tYXRyaXguYWRkUm93VGV4dH08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmljb25BZGR9IC8+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICByZW5kZXJSZW1vdmVCdXR0b24ocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN1cnZleVF1ZXN0aW9uTWF0cml4RHluYW1pY1JlbW92ZUJ1dHRvblxuICAgICAgICBxdWVzdGlvbj17dGhpcy5xdWVzdGlvbn1cbiAgICAgICAgcm93PXtyb3d9XG4gICAgICAgIGNzc0NsYXNzZXM9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlc31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NYXRyaXhEeW5hbWljUmVtb3ZlQnV0dG9uIGV4dGVuZHMgUmVhY3RTdXJ2ZXlFbGVtZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZU9uUm93UmVtb3ZlQ2xpY2sgPSB0aGlzLmhhbmRsZU9uUm93UmVtb3ZlQ2xpY2suYmluZCh0aGlzKTtcbiAgfVxuICBwcml2YXRlIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucXVlc3Rpb247XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcm93KCk6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5yb3c7XG4gIH1cbiAgaGFuZGxlT25Sb3dSZW1vdmVDbGljayhldmVudDogYW55KSB7XG4gICAgdGhpcy5xdWVzdGlvbi5yZW1vdmVSb3dVSSh0aGlzLnJvdyk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHJldHVybiAoXG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLmJ1dHRvbiArIFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLmJ1dHRvblJlbW92ZX1cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlT25Sb3dSZW1vdmVDbGlja31cbiAgICAgID5cbiAgICAgICAgPHNwYW4+e3RoaXMucXVlc3Rpb24ucmVtb3ZlUm93VGV4dH08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5jc3NDbGFzc2VzLmljb25SZW1vdmV9IC8+XG4gICAgICA8L2J1dHRvbj5cbiAgICApO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkeW5hbWljXCIsIChwcm9wcykgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWMsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkeW5hbWljLnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgUmVhY3RTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlLFxufSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25BbmRFcnJvcnNDZWxsIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvblwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xuaW1wb3J0IHsgTXVsdGlwbGVUZXh0SXRlbU1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25NdWx0aXBsZVRleHQgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB2YXIgdGFibGVSb3dzID0gdGhpcy5xdWVzdGlvbi5nZXRSb3dzKCk7XG4gICAgdmFyIHJvd3MgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93cy5wdXNoKHRoaXMucmVuZGVyUm93KGksIHRhYmxlUm93c1tpXSwgY3NzQ2xhc3NlcykpO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPHRhYmxlIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb290fT5cbiAgICAgICAgPHRib2R5Pntyb3dzfTwvdGJvZHk+XG4gICAgICA8L3RhYmxlPlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlclJvdyhcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIGl0ZW1zOiBBcnJheTxNdWx0aXBsZVRleHRJdGVtTW9kZWw+LFxuICAgIGNzc0NsYXNzZXM6IGFueVxuICApIHtcbiAgICB2YXIga2V5OiBzdHJpbmcgPSBcIml0ZW1cIiArIHJvd0luZGV4O1xuICAgIHZhciB0ZHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgdmFyIGl0ZW1UaXRsZSA9IHRoaXMucmVuZGVyTG9jU3RyaW5nKGl0ZW0ubG9jVGl0bGUpO1xuICAgICAgdmFyIHNwYWNlU3BhbiA9IDxzcGFuPiZuYnNwOzwvc3Bhbj47XG4gICAgICB2YXIgc3BhbnMgPSBbXTtcbiAgICAgIHZhciBlZCA9IGl0ZW0uZWRpdG9yO1xuICAgICAgaWYgKCEhZWQuaXNSZXF1aXJlVGV4dE9uU3RhcnQgfHwgZWQuaXNSZXF1aXJlVGV4dEJlZm9yZVRpdGxlKSB7XG4gICAgICAgIHNwYW5zLnB1c2goXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJlcXVpcmVkVGV4dH0+e2VkLnJlcXVpcmVkVGV4dH08L3NwYW4+XG4gICAgICAgICk7XG4gICAgICAgIHNwYW5zLnB1c2goc3BhY2VTcGFuKTtcbiAgICAgIH1cbiAgICAgIHNwYW5zLnB1c2goPHNwYW4gY2xhc3NOYW1lPXtjc3NDbGFzc2VzLml0ZW1UaXRsZX0+e2l0ZW1UaXRsZX08L3NwYW4+KTtcbiAgICAgIGlmICghIWVkLmlzUmVxdWlyZVRleHRBZnRlclRpdGxlKSB7XG4gICAgICAgIHNwYW5zLnB1c2goc3BhY2VTcGFuKTtcbiAgICAgICAgc3BhbnMucHVzaChcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucmVxdWlyZWRUZXh0fT57ZWQucmVxdWlyZWRUZXh0fTwvc3Bhbj5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRkcy5wdXNoKFxuICAgICAgICA8dGQga2V5PXtcImxhYmVsXCIgKyBpfSBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuY2VsbH0+XG4gICAgICAgICAge3NwYW5zfVxuICAgICAgICA8L3RkPlxuICAgICAgKTtcbiAgICAgIHRkcy5wdXNoKFxuICAgICAgICA8U3VydmV5UXVlc3Rpb25BbmRFcnJvcnNDZWxsXG4gICAgICAgICAga2V5PXtcInZhbHVlXCIgKyBpfVxuICAgICAgICAgIGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9XG4gICAgICAgICAgcXVlc3Rpb249e2l0ZW0uZWRpdG9yfVxuICAgICAgICAgIGNyZWF0b3I9e3RoaXMuY3JlYXRvcn1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8dHIga2V5PXtrZXl9IGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5yb3d9PlxuICAgICAgICB7dGRzfVxuICAgICAgPC90cj5cbiAgICApO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtdWx0aXBsZXRleHRcIiwgKHByb3BzKSA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uTXVsdGlwbGVUZXh0LCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9yZWFjdHF1ZXN0aW9ubXVsdGlwbGV0ZXh0LnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcbiAgUmVhY3RTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlLFxufSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCxcbiAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLFxufSBmcm9tIFwiLi4vcXVlc3Rpb25fcGFuZWxkeW5hbWljXCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsIH0gZnJvbSBcIi4uL3BhbmVsXCI7XG5pbXBvcnQgeyBTdXJ2ZXlQYW5lbCB9IGZyb20gXCIuL3BhbmVsXCI7XG5pbXBvcnQgeyBJU3VydmV5Q3JlYXRvciB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25cIjtcbmltcG9ydCB7IFJlYWN0UXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4uL3N1cnZleVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uUGFuZWxEeW5hbWljIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5oYW5kbGVPblBhbmVsQWRkQ2xpY2sgPSB0aGlzLmhhbmRsZU9uUGFuZWxBZGRDbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlT25QYW5lbFByZXZDbGljayA9IHRoaXMuaGFuZGxlT25QYW5lbFByZXZDbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlT25QYW5lbE5leHRDbGljayA9IHRoaXMuaGFuZGxlT25QYW5lbE5leHRDbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlT25SYW5nZUNoYW5nZSA9IHRoaXMuaGFuZGxlT25SYW5nZUNoYW5nZS5iaW5kKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWw7XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgcGFuZWxDb3VudGVyOiAwIH0pO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnF1ZXN0aW9uLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLnVwZGF0ZVF1ZXN0aW9uUmVuZGVyaW5nKCk7XG4gICAgfTtcbiAgICB0aGlzLnF1ZXN0aW9uLmN1cnJlbnRJbmRleENoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYudXBkYXRlUXVlc3Rpb25SZW5kZXJpbmcoKTtcbiAgICB9O1xuICAgIHRoaXMucXVlc3Rpb24ucmVuZGVyTW9kZUNoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYudXBkYXRlUXVlc3Rpb25SZW5kZXJpbmcoKTtcbiAgICB9O1xuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgdGhpcy5xdWVzdGlvbi5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLnF1ZXN0aW9uLmN1cnJlbnRJbmRleENoYW5nZWRDYWxsYmFjayA9IG51bGw7XG4gICAgdGhpcy5xdWVzdGlvbi5yZW5kZXJNb2RlQ2hhbmdlZENhbGxiYWNrID0gbnVsbDtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVF1ZXN0aW9uUmVuZGVyaW5nKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgcGFuZWxDb3VudGVyOiB0aGlzLnN0YXRlID8gdGhpcy5zdGF0ZS5wYW5lbENvdW50ZXIgKyAxIDogMSxcbiAgICB9KTtcbiAgfVxuICBoYW5kbGVPblBhbmVsQWRkQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24uYWRkUGFuZWxVSSgpO1xuICB9XG4gIGhhbmRsZU9uUGFuZWxQcmV2Q2xpY2soZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24uZ29Ub1ByZXZQYW5lbCgpO1xuICB9XG4gIGhhbmRsZU9uUGFuZWxOZXh0Q2xpY2soZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24uZ29Ub05leHRQYW5lbCgpO1xuICB9XG4gIGhhbmRsZU9uUmFuZ2VDaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24uY3VycmVudEluZGV4ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB2YXIgcGFuZWxzID0gW107XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uaXNSZW5kZXJNb2RlTGlzdCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcGFuZWwgPSB0aGlzLnF1ZXN0aW9uLnBhbmVsc1tpXTtcbiAgICAgICAgcGFuZWxzLnB1c2goXG4gICAgICAgICAgPFN1cnZleVF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbVxuICAgICAgICAgICAga2V5PXtwYW5lbC5pZH1cbiAgICAgICAgICAgIGVsZW1lbnQ9e3BhbmVsfVxuICAgICAgICAgICAgcXVlc3Rpb249e3RoaXMucXVlc3Rpb259XG4gICAgICAgICAgICBpbmRleD17aX1cbiAgICAgICAgICAgIGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9XG4gICAgICAgICAgICBpc0Rpc3BsYXlNb2RlPXt0aGlzLmlzRGlzcGxheU1vZGV9XG4gICAgICAgICAgICBjcmVhdG9yPXt0aGlzLmNyZWF0b3J9XG4gICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMucXVlc3Rpb24uY3VycmVudFBhbmVsICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHBhbmVsID0gdGhpcy5xdWVzdGlvbi5jdXJyZW50UGFuZWw7XG4gICAgICAgIHBhbmVscy5wdXNoKFxuICAgICAgICAgIDxTdXJ2ZXlRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW1cbiAgICAgICAgICAgIGtleT17dGhpcy5xdWVzdGlvbi5jdXJyZW50SW5kZXh9XG4gICAgICAgICAgICBlbGVtZW50PXtwYW5lbH1cbiAgICAgICAgICAgIHF1ZXN0aW9uPXt0aGlzLnF1ZXN0aW9ufVxuICAgICAgICAgICAgaW5kZXg9e3RoaXMucXVlc3Rpb24uY3VycmVudEluZGV4fVxuICAgICAgICAgICAgY3NzQ2xhc3Nlcz17Y3NzQ2xhc3Nlc31cbiAgICAgICAgICAgIGlzRGlzcGxheU1vZGU9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgICAgIGNyZWF0b3I9e3RoaXMuY3JlYXRvcn1cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgYnRuRGVsZXRlVEQgPSAhdGhpcy5pc0Rpc3BsYXlNb2RlID8gPHRkIC8+IDogbnVsbDtcbiAgICB2YXIgYnRuQWRkID0gdGhpcy5xdWVzdGlvbi5pc1JlbmRlck1vZGVMaXN0XG4gICAgICA/IHRoaXMucmVuZGVyQWRkUm93QnV0dG9uKClcbiAgICAgIDogbnVsbDtcbiAgICB2YXIgbmF2VG9wID0gdGhpcy5xdWVzdGlvbi5pc1Byb2dyZXNzVG9wU2hvd2luZ1xuICAgICAgPyB0aGlzLnJlbmRlck5hdmlnYXRvcihjc3NDbGFzc2VzKVxuICAgICAgOiBudWxsO1xuICAgIHZhciBuYXZCb3R0b20gPSB0aGlzLnF1ZXN0aW9uLmlzUHJvZ3Jlc3NCb3R0b21TaG93aW5nXG4gICAgICA/IHRoaXMucmVuZGVyTmF2aWdhdG9yKGNzc0NsYXNzZXMpXG4gICAgICA6IG51bGw7XG5cbiAgICB2YXIgc3R5bGU6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhvcml6b250YWxTY3JvbGwpIHtcbiAgICAgIHN0eWxlW1wib3ZlcmZsb3dYXCJdID0gXCJzY3JvbGxcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH0+XG4gICAgICAgIHtuYXZUb3B9XG4gICAgICAgIDxkaXYgc3R5bGU9e3N0eWxlfT57cGFuZWxzfTwvZGl2PlxuICAgICAgICB7bmF2Qm90dG9tfVxuICAgICAgICB7YnRuQWRkfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyTmF2aWdhdG9yKGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgcmFuZ2UgPSB0aGlzLnF1ZXN0aW9uLmlzUmFuZ2VTaG93aW5nID8gdGhpcy5yZW5kZXJSYW5nZSgpIDogbnVsbDtcbiAgICB2YXIgYnRuUHJldiA9IHRoaXMucmVuZHJlclByZXZCdXR0b24oKTtcbiAgICB2YXIgYnRuTmV4dCA9IHRoaXMucmVuZHJlck5leHRCdXR0b24oKTtcbiAgICB2YXIgYnRuQWRkID0gdGhpcy5yZW5kZXJBZGRSb3dCdXR0b24oKTtcbiAgICB2YXIgcHJvZ3Jlc3NDbGFzcyA9IHRoaXMucXVlc3Rpb24uaXNQcm9ncmVzc1RvcFNob3dpbmdcbiAgICAgID8gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLnByb2dyZXNzVG9wXG4gICAgICA6IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5wcm9ncmVzc0JvdHRvbTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBzdHlsZT17eyBjbGVhcjogXCJib3RoXCIgfX0gY2xhc3NOYW1lPXtwcm9ncmVzc0NsYXNzfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5wcm9ncmVzc0NvbnRhaW5lcn0+XG4gICAgICAgICAge2J0blByZXZ9XG4gICAgICAgICAge3JhbmdlfVxuICAgICAgICAgIHtidG5OZXh0fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge2J0bkFkZH1cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5wcm9ncmVzc1RleHR9PlxuICAgICAgICAgIHt0aGlzLnF1ZXN0aW9uLnByb2dyZXNzVGV4dH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRyZXJQcmV2QnV0dG9uKCkge1xuICAgIHZhciBnZXRCdXR0b25QcmV2Q3NzID0gKHF1ZXN0aW9uOiBRdWVzdGlvbikgPT4ge1xuICAgICAgdmFyIGJ0bkNsYXNzZXMgPSBxdWVzdGlvbi5jc3NDbGFzc2VzLmJ1dHRvblByZXY7XG4gICAgICBpZiAoIXF1ZXN0aW9uLmlzUHJldkJ1dHRvblNob3dpbmcpIHtcbiAgICAgICAgYnRuQ2xhc3NlcyArPSBcIiBcIiArIHF1ZXN0aW9uLmNzc0NsYXNzZXMuYnV0dG9uUHJldiArIFwiLS1kaXNhYmxlZFwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ0bkNsYXNzZXM7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHRpdGxlPXt0aGlzLnF1ZXN0aW9uLnBhbmVsUHJldlRleHR9PlxuICAgICAgICA8c3ZnXG4gICAgICAgICAgdmlld0JveD1cIjAgMCAxMCAxMFwiXG4gICAgICAgICAgY2xhc3NOYW1lPXtnZXRCdXR0b25QcmV2Q3NzKHRoaXMucXVlc3Rpb24pfVxuICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlT25QYW5lbFByZXZDbGlja31cbiAgICAgICAgPlxuICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjIsMiAwLDQgNSw5IDEwLDQgOCwyIDUsNSBcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRyZXJOZXh0QnV0dG9uKCkge1xuICAgIHZhciBnZXRCdXR0b25OZXh0Q3NzID0gZnVuY3Rpb24gKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgICAgdmFyIGJ0bkNsYXNzZXMgPSBxdWVzdGlvbi5jc3NDbGFzc2VzLmJ1dHRvbk5leHQ7XG4gICAgICBpZiAoIXF1ZXN0aW9uLmlzTmV4dEJ1dHRvblNob3dpbmcpIHtcbiAgICAgICAgYnRuQ2xhc3NlcyArPSBcIiBcIiArIHF1ZXN0aW9uLmNzc0NsYXNzZXMuYnV0dG9uTmV4dCArIFwiLS1kaXNhYmxlZFwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJ0bkNsYXNzZXM7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHRpdGxlPXt0aGlzLnF1ZXN0aW9uLnBhbmVsTmV4dFRleHR9PlxuICAgICAgICA8c3ZnXG4gICAgICAgICAgdmlld0JveD1cIjAgMCAxMCAxMFwiXG4gICAgICAgICAgY2xhc3NOYW1lPXtnZXRCdXR0b25OZXh0Q3NzKHRoaXMucXVlc3Rpb24pfVxuICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlT25QYW5lbE5leHRDbGlja31cbiAgICAgICAgPlxuICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjIsMiAwLDQgNSw5IDEwLDQgOCwyIDUsNSBcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyUmFuZ2UoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBnZXRQcm9ncmVzcyA9ICgpID0+IHtcbiAgICAgIHZhciByYW5nZU1heCA9IHRoaXMucXVlc3Rpb24ucGFuZWxDb3VudCAtIDE7XG4gICAgICByZXR1cm4gKHRoaXMucXVlc3Rpb24uY3VycmVudEluZGV4IC8gcmFuZ2VNYXgpICogMTAwICsgXCIlXCI7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLnByb2dyZXNzfT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17dGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLnByb2dyZXNzQmFyfVxuICAgICAgICAgIHN0eWxlPXt7IHdpZHRoOiBnZXRQcm9ncmVzcygpIH19XG4gICAgICAgICAgcm9sZT1cInByb2dyZXNzYmFyXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckFkZFJvd0J1dHRvbigpOiBKU1guRWxlbWVudCB7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uLmNhbkFkZFBhbmVsKSByZXR1cm4gbnVsbDtcblxuICAgIHZhciBjbGFzc2VzID1cbiAgICAgIHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5idXR0b24gK1xuICAgICAgXCIgXCIgK1xuICAgICAgdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLmJ1dHRvbkFkZDtcblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uLnJlbmRlck1vZGUgPT09IFwibGlzdFwiKSB7XG4gICAgICBjbGFzc2VzICs9IFwiIFwiICsgdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLmJ1dHRvbkFkZCArIFwiLS1saXN0LW1vZGVcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGlucHV0XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlc31cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlT25QYW5lbEFkZENsaWNrfVxuICAgICAgICB2YWx1ZT17dGhpcy5xdWVzdGlvbi5wYW5lbEFkZFRleHR9XG4gICAgICAvPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSBleHRlbmRzIFN1cnZleVBhbmVsIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZU9uUGFuZWxSZW1vdmVDbGljayA9IHRoaXMuaGFuZGxlT25QYW5lbFJlbW92ZUNsaWNrLmJpbmQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucXVlc3Rpb247XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pbmRleDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0U3VydmV5KCk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gISF0aGlzLnF1ZXN0aW9uID8gKHRoaXMucXVlc3Rpb24uc3VydmV5IGFzIFN1cnZleU1vZGVsKSA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENzcygpOiBhbnkge1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xuICAgIHJldHVybiAhIXN1cnZleSA/IHN1cnZleS5nZXRDc3MoKSA6IHt9O1xuICB9XG4gIGhhbmRsZU9uUGFuZWxSZW1vdmVDbGljayhldmVudDogYW55KSB7XG4gICAgdGhpcy5xdWVzdGlvbi5yZW1vdmVQYW5lbFVJKHRoaXMuaW5kZXgpO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJCb3R0b20oKTogSlNYLkVsZW1lbnQge1xuICAgIGlmICghdGhpcy5xdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgdmFyIGhyID1cbiAgICAgIHRoaXMucXVlc3Rpb24uaXNSZW5kZXJNb2RlTGlzdCAmJlxuICAgICAgdGhpcy5pbmRleCA8IHRoaXMucXVlc3Rpb24ucGFuZWxDb3VudCAtIDEgPyAoXG4gICAgICAgIDxociBjbGFzc05hbWU9e3RoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5zZXBhcmF0b3J9IC8+XG4gICAgICApIDogbnVsbDtcbiAgICB2YXIgcmVtb3ZlQnV0dG9uID0gdGhpcy5yZW5kZXJCdXR0b24oKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAge3JlbW92ZUJ1dHRvbn1cbiAgICAgICAge2hyfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyQnV0dG9uKCk6IEpTWC5FbGVtZW50IHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5xdWVzdGlvbi5jYW5SZW1vdmVQYW5lbCB8fFxuICAgICAgKHRoaXMucXVlc3Rpb24uaXNSZW5kZXJNb2RlTGlzdCAmJiB0aGlzLnBhbmVsLmlzQ29sbGFwc2VkKVxuICAgIClcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHZhciBzdHlsZSA9IHsgbWFyZ2luVG9wOiBcIjVweFwiIH07XG4gICAgcmV0dXJuIChcbiAgICAgIDxpbnB1dFxuICAgICAgICBjbGFzc05hbWU9e1xuICAgICAgICAgIHRoaXMucXVlc3Rpb24uY3NzQ2xhc3Nlcy5idXR0b24gK1xuICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmNzc0NsYXNzZXMuYnV0dG9uUmVtb3ZlXG4gICAgICAgIH1cbiAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVPblBhbmVsUmVtb3ZlQ2xpY2t9XG4gICAgICAgIHZhbHVlPXt0aGlzLnF1ZXN0aW9uLnBhbmVsUmVtb3ZlVGV4dH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxufVxuXG5SZWFjdFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicGFuZWxkeW5hbWljXCIsIChwcm9wcykgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvblBhbmVsRHluYW1pYywgcHJvcHMpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcmVhY3QvcmVhY3RxdWVzdGlvbnBhbmVsZHluYW1pYy50c3giLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2UgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgU3VydmV5UXVlc3Rpb25Db21tZW50SXRlbSB9IGZyb20gXCIuL3JlYWN0cXVlc3Rpb25jb21tZW50XCI7XG5pbXBvcnQgeyBRdWVzdGlvblJhdGluZ01vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX3JhdGluZ1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4uL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25SYXRpbmcgZXh0ZW5kcyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLmhhbmRsZU9uQ2hhbmdlID0gdGhpcy5oYW5kbGVPbkNoYW5nZS5iaW5kKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb25SYXRpbmdNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25CYXNlIGFzIFF1ZXN0aW9uUmF0aW5nTW9kZWw7XG4gIH1cbiAgaGFuZGxlT25DaGFuZ2UoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiB0aGlzLnF1ZXN0aW9uLnZhbHVlIH0pO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB2YXIgdmFsdWVzID0gW107XG4gICAgdmFyIG1pblRleHQgPSB0aGlzLnF1ZXN0aW9uLm1pblJhdGVEZXNjcmlwdGlvblxuICAgICAgPyB0aGlzLnJlbmRlckxvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY01pblJhdGVEZXNjcmlwdGlvbilcbiAgICAgIDogbnVsbDtcbiAgICB2YXIgbWF4VGV4dCA9IHRoaXMucXVlc3Rpb24ubWF4UmF0ZURlc2NyaXB0aW9uXG4gICAgICA/IHRoaXMucmVuZGVyTG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jTWF4UmF0ZURlc2NyaXB0aW9uKVxuICAgICAgOiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG1pblRleHRWYWx1ZSA9IGkgPT0gMCA/IG1pblRleHQgOiBudWxsO1xuICAgICAgdmFyIG1heFRleHRWYWx1ZSA9XG4gICAgICAgIGkgPT0gdGhpcy5xdWVzdGlvbi52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGggLSAxID8gbWF4VGV4dCA6IG51bGw7XG4gICAgICB2YWx1ZXMucHVzaChcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtKFxuICAgICAgICAgIFwidmFsdWVcIiArIGksXG4gICAgICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlUmF0ZVZhbHVlc1tpXSxcbiAgICAgICAgICBtaW5UZXh0VmFsdWUsXG4gICAgICAgICAgbWF4VGV4dFZhbHVlLFxuICAgICAgICAgIGNzc0NsYXNzZXNcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgdmFyIGNvbW1lbnQgPSB0aGlzLnF1ZXN0aW9uLmhhc090aGVyID8gdGhpcy5yZW5kZXJPdGhlcihjc3NDbGFzc2VzKSA6IG51bGw7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9IHJlZj17KGRpdikgPT4gKHRoaXMuY29udHJvbCA9IGRpdil9PlxuICAgICAgICB7dmFsdWVzfVxuICAgICAgICB7Y29tbWVudH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckl0ZW0oXG4gICAga2V5OiBzdHJpbmcsXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIG1pblRleHQ6IEpTWC5FbGVtZW50LFxuICAgIG1heFRleHQ6IEpTWC5FbGVtZW50LFxuICAgIGNzc0NsYXNzZXM6IGFueVxuICApOiBKU1guRWxlbWVudCB7XG4gICAgdmFyIGlzQ2hlY2tlZCA9IHRoaXMucXVlc3Rpb24udmFsdWUgPT0gaXRlbS52YWx1ZTtcbiAgICB2YXIgY2xhc3NOYW1lID0gY3NzQ2xhc3Nlcy5pdGVtO1xuICAgIGlmIChpc0NoZWNrZWQpIGNsYXNzTmFtZSArPSBcIiBcIiArIGNzc0NsYXNzZXMuc2VsZWN0ZWQ7XG4gICAgaWYgKHRoaXMuaXNEaXNwbGF5TW9kZSkgY2xhc3NOYW1lICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5kaXNhYmxlZDtcblxuICAgIHZhciBpdGVtVGV4dCA9IHRoaXMucmVuZGVyTG9jU3RyaW5nKGl0ZW0ubG9jVGV4dCk7XG4gICAgdmFyIG1pblRleHRCbG9jayA9ICEhbWluVGV4dCA/IChcbiAgICAgIDxzcGFuIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5taW5UZXh0fT57bWluVGV4dH08L3NwYW4+XG4gICAgKSA6IG51bGw7XG4gICAgdmFyIG1heFRleHRCbG9jayA9ICEhbWF4VGV4dCA/IChcbiAgICAgIDxzcGFuIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5tYXhUZXh0fT57bWF4VGV4dH08L3NwYW4+XG4gICAgKSA6IG51bGw7XG4gICAgcmV0dXJuIChcbiAgICAgIDxsYWJlbCBrZXk9e2tleX0gY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgIGNsYXNzTmFtZT1cInN2LXZpc3VhbGx5aGlkZGVuXCJcbiAgICAgICAgICBuYW1lPXt0aGlzLnF1ZXN0aW9uLm5hbWV9XG4gICAgICAgICAgdmFsdWU9e2l0ZW0udmFsdWV9XG4gICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgICBjaGVja2VkPXt0aGlzLnF1ZXN0aW9uLnZhbHVlID09IGl0ZW0udmFsdWV9XG4gICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlT25DaGFuZ2V9XG4gICAgICAgICAgYXJpYS1yZXF1aXJlZD17dGhpcy5xdWVzdGlvbi5pc1JlcXVpcmVkfVxuICAgICAgICAgIGFyaWEtbGFiZWw9e2l0ZW0ubG9jVGV4dC50ZXh0fVxuICAgICAgICAgIGFyaWEtaW52YWxpZD17dGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMH1cbiAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PXtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZXJyb3JzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyB0aGlzLnF1ZXN0aW9uLmlkICsgXCJfZXJyb3JzXCJcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgICB7bWluVGV4dEJsb2NrfVxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMuaXRlbVRleHR9PntpdGVtVGV4dH08L3NwYW4+XG4gICAgICAgIHttYXhUZXh0QmxvY2t9XG4gICAgICA8L2xhYmVsPlxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlck90aGVyKGNzc0NsYXNzZXM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMub3RoZXJ9PlxuICAgICAgICA8U3VydmV5UXVlc3Rpb25Db21tZW50SXRlbVxuICAgICAgICAgIHF1ZXN0aW9uPXt0aGlzLnF1ZXN0aW9ufVxuICAgICAgICAgIGNzc0NsYXNzZXM9e2Nzc0NsYXNzZXN9XG4gICAgICAgICAgaXNEaXNwbGF5TW9kZT17dGhpcy5pc0Rpc3BsYXlNb2RlfVxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuUmVhY3RRdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhdGluZ1wiLCAocHJvcHMpID0+IHtcbiAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3VydmV5UXVlc3Rpb25SYXRpbmcsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb25yYXRpbmcudHN4IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvblVuY29udHJvbGxlZEVsZW1lbnQgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgUmVhY3RRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5UXVlc3Rpb25UZXh0IGV4dGVuZHMgU3VydmV5UXVlc3Rpb25VbmNvbnRyb2xsZWRFbGVtZW50PFxuICBRdWVzdGlvblRleHRNb2RlbFxuPiB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRlckVsZW1lbnQoKTogSlNYLkVsZW1lbnQge1xuICAgIHZhciBjc3NDbGFzc2VzID0gdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzO1xuICAgIHZhciBvbkJsdXIgPSAhdGhpcy5xdWVzdGlvbi5pc0lucHV0VGV4dFVwZGF0ZVxuICAgICAgPyB0aGlzLnVwZGF0ZVZhbHVlT25FdmVudFxuICAgICAgOiBudWxsO1xuICAgIHZhciBvbklucHV0ID0gdGhpcy5xdWVzdGlvbi5pc0lucHV0VGV4dFVwZGF0ZVxuICAgICAgPyB0aGlzLnVwZGF0ZVZhbHVlT25FdmVudFxuICAgICAgOiBudWxsO1xuICAgIHZhciBwbGFjZUhvbGRlciA9XG4gICAgICB0aGlzLnF1ZXN0aW9uLmlucHV0VHlwZSA9PT0gXCJyYW5nZVwiIHx8IHRoaXMucXVlc3Rpb24uaXNSZWFkT25seVxuICAgICAgICA/IFwiXCJcbiAgICAgICAgOiB0aGlzLnF1ZXN0aW9uLnBsYWNlSG9sZGVyO1xuICAgIHJldHVybiAoXG4gICAgICA8aW5wdXRcbiAgICAgICAgaWQ9e3RoaXMucXVlc3Rpb24uaW5wdXRJZH1cbiAgICAgICAgZGlzYWJsZWQ9e3RoaXMuaXNEaXNwbGF5TW9kZX1cbiAgICAgICAgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLnJvb3R9XG4gICAgICAgIHR5cGU9e3RoaXMucXVlc3Rpb24uaW5wdXRUeXBlfVxuICAgICAgICByZWY9eyhpbnB1dCkgPT4gKHRoaXMuY29udHJvbCA9IGlucHV0KX1cbiAgICAgICAgbWF4TGVuZ3RoPXt0aGlzLnF1ZXN0aW9uLmdldE1heExlbmd0aCgpfVxuICAgICAgICBtaW49e3RoaXMucXVlc3Rpb24ucmVuZGVyZWRNaW59XG4gICAgICAgIG1heD17dGhpcy5xdWVzdGlvbi5yZW5kZXJlZE1heH1cbiAgICAgICAgc3RlcD17dGhpcy5xdWVzdGlvbi5zdGVwfVxuICAgICAgICBzaXplPXt0aGlzLnF1ZXN0aW9uLnNpemV9XG4gICAgICAgIHBsYWNlaG9sZGVyPXtwbGFjZUhvbGRlcn1cbiAgICAgICAgYXV0b0NvbXBsZXRlPXt0aGlzLnF1ZXN0aW9uLmF1dG9Db21wbGV0ZX1cbiAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgIG9uSW5wdXQ9e29uSW5wdXR9XG4gICAgICAgIGFyaWEtcmVxdWlyZWQ9e3RoaXMucXVlc3Rpb24uaXNSZXF1aXJlZH1cbiAgICAgICAgYXJpYS1sYWJlbD17dGhpcy5xdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9XG4gICAgICAgIGFyaWEtaW52YWxpZD17dGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMH1cbiAgICAgICAgYXJpYS1kZXNjcmliZWRieT17XG4gICAgICAgICAgdGhpcy5xdWVzdGlvbi5lcnJvcnMubGVuZ3RoID4gMCA/IHRoaXMucXVlc3Rpb24uaWQgKyBcIl9lcnJvcnNcIiA6IG51bGxcbiAgICAgICAgfVxuICAgICAgLz5cbiAgICApO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJ0ZXh0XCIsIChwcm9wcykgPT4ge1xuICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChTdXJ2ZXlRdWVzdGlvblRleHQsIHByb3BzKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L3JlYWN0cXVlc3Rpb250ZXh0LnRzeCIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2UgfSBmcm9tIFwiLi9yZWFjdHF1ZXN0aW9uZWxlbWVudFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9zaWduYXR1cmVwYWRcIjtcbmltcG9ydCB7IFJlYWN0UXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmZhY3RvcnlcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVF1ZXN0aW9uU2lnbmF0dXJlUGFkIGV4dGVuZHMgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHsgdmFsdWU6IHRoaXMucXVlc3Rpb24udmFsdWUgfTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uQmFzZSBhcyBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICB2YXIgY3NzQ2xhc3NlcyA9IHRoaXMucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nzc0NsYXNzZXMucm9vdH0gcmVmPXsocm9vdCkgPT4gKHRoaXMuY29udHJvbCA9IHJvb3QpfT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8Y2FudmFzIHRhYkluZGV4PXswfT48L2NhbnZhcz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3NDbGFzc2VzLmNvbnRyb2xzfT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y3NzQ2xhc3Nlcy5jbGVhckJ1dHRvbn1cbiAgICAgICAgICAgIHRpdGxlPXt0aGlzLnF1ZXN0aW9uLmNsZWFyQnV0dG9uQ2FwdGlvbn1cbiAgICAgICAgICA+XG4gICAgICAgICAgICDinJZcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cblJlYWN0UXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJzaWduYXR1cmVwYWRcIiwgKHByb3BzKSA9PiB7XG4gIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFN1cnZleVF1ZXN0aW9uU2lnbmF0dXJlUGFkLCBwcm9wcyk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9yZWFjdC9zaWduYXR1cmVwYWQudHN4IiwiLy8gcmVtb3ZlZCBieSBleHRyYWN0LXRleHQtd2VicGFjay1wbHVnaW5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9tYWluLnNjc3Ncbi8vIG1vZHVsZSBpZCA9IDgwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8vIHJlbW92ZWQgYnkgZXh0cmFjdC10ZXh0LXdlYnBhY2stcGx1Z2luXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvbW9kZXJuLnNjc3Ncbi8vIG1vZHVsZSBpZCA9IDgxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIVxuICogU2lnbmF0dXJlIFBhZCB2Mi4zLjJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvc2lnbmF0dXJlX3BhZFxuICpcbiAqIENvcHlyaWdodCAyMDE3IFN6eW1vbiBOb3dha1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKlxuICogVGhlIG1haW4gaWRlYSBhbmQgc29tZSBwYXJ0cyBvZiB0aGUgY29kZSAoZS5nLiBkcmF3aW5nIHZhcmlhYmxlIHdpZHRoIELDqXppZXIgY3VydmUpIGFyZSB0YWtlbiBmcm9tOlxuICogaHR0cDovL2Nvcm5lci5zcXVhcmV1cC5jb20vMjAxMi8wNy9zbW9vdGhlci1zaWduYXR1cmVzLmh0bWxcbiAqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBpbnRlcnBvbGF0aW9uIHVzaW5nIGN1YmljIELDqXppZXIgY3VydmVzIGlzIHRha2VuIGZyb206XG4gKiBodHRwOi8vYmVua25vd3Njb2RlLndvcmRwcmVzcy5jb20vMjAxMi8wOS8xNC9wYXRoLWludGVycG9sYXRpb24tdXNpbmctY3ViaWMtYmV6aWVyLWFuZC1jb250cm9sLXBvaW50LWVzdGltYXRpb24taW4tamF2YXNjcmlwdFxuICpcbiAqIEFsZ29yaXRobSBmb3IgYXBwcm94aW1hdGVkIGxlbmd0aCBvZiBhIELDqXppZXIgY3VydmUgaXMgdGFrZW4gZnJvbTpcbiAqIGh0dHA6Ly93d3cubGVtb2RhLm5ldC9tYXRocy9iZXppZXItbGVuZ3RoL2luZGV4Lmh0bWxcbiAqXG4gKi9cblxuZnVuY3Rpb24gUG9pbnQoeCwgeSwgdGltZSkge1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xuICB0aGlzLnRpbWUgPSB0aW1lIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xufVxuXG5Qb2ludC5wcm90b3R5cGUudmVsb2NpdHlGcm9tID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gIHJldHVybiB0aGlzLnRpbWUgIT09IHN0YXJ0LnRpbWUgPyB0aGlzLmRpc3RhbmNlVG8oc3RhcnQpIC8gKHRoaXMudGltZSAtIHN0YXJ0LnRpbWUpIDogMTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5kaXN0YW5jZVRvID0gZnVuY3Rpb24gKHN0YXJ0KSB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codGhpcy54IC0gc3RhcnQueCwgMikgKyBNYXRoLnBvdyh0aGlzLnkgLSBzdGFydC55LCAyKSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gIHJldHVybiB0aGlzLnggPT09IG90aGVyLnggJiYgdGhpcy55ID09PSBvdGhlci55ICYmIHRoaXMudGltZSA9PT0gb3RoZXIudGltZTtcbn07XG5cbmZ1bmN0aW9uIEJlemllcihzdGFydFBvaW50LCBjb250cm9sMSwgY29udHJvbDIsIGVuZFBvaW50KSB7XG4gIHRoaXMuc3RhcnRQb2ludCA9IHN0YXJ0UG9pbnQ7XG4gIHRoaXMuY29udHJvbDEgPSBjb250cm9sMTtcbiAgdGhpcy5jb250cm9sMiA9IGNvbnRyb2wyO1xuICB0aGlzLmVuZFBvaW50ID0gZW5kUG9pbnQ7XG59XG5cbi8vIFJldHVybnMgYXBwcm94aW1hdGVkIGxlbmd0aC5cbkJlemllci5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RlcHMgPSAxMDtcbiAgdmFyIGxlbmd0aCA9IDA7XG4gIHZhciBweCA9IHZvaWQgMDtcbiAgdmFyIHB5ID0gdm9pZCAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDw9IHN0ZXBzOyBpICs9IDEpIHtcbiAgICB2YXIgdCA9IGkgLyBzdGVwcztcbiAgICB2YXIgY3ggPSB0aGlzLl9wb2ludCh0LCB0aGlzLnN0YXJ0UG9pbnQueCwgdGhpcy5jb250cm9sMS54LCB0aGlzLmNvbnRyb2wyLngsIHRoaXMuZW5kUG9pbnQueCk7XG4gICAgdmFyIGN5ID0gdGhpcy5fcG9pbnQodCwgdGhpcy5zdGFydFBvaW50LnksIHRoaXMuY29udHJvbDEueSwgdGhpcy5jb250cm9sMi55LCB0aGlzLmVuZFBvaW50LnkpO1xuICAgIGlmIChpID4gMCkge1xuICAgICAgdmFyIHhkaWZmID0gY3ggLSBweDtcbiAgICAgIHZhciB5ZGlmZiA9IGN5IC0gcHk7XG4gICAgICBsZW5ndGggKz0gTWF0aC5zcXJ0KHhkaWZmICogeGRpZmYgKyB5ZGlmZiAqIHlkaWZmKTtcbiAgICB9XG4gICAgcHggPSBjeDtcbiAgICBweSA9IGN5O1xuICB9XG5cbiAgcmV0dXJuIGxlbmd0aDtcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLW11bHRpLXNwYWNlcywgc3BhY2UtaW4tcGFyZW5zICovXG5CZXppZXIucHJvdG90eXBlLl9wb2ludCA9IGZ1bmN0aW9uICh0LCBzdGFydCwgYzEsIGMyLCBlbmQpIHtcbiAgcmV0dXJuIHN0YXJ0ICogKDEuMCAtIHQpICogKDEuMCAtIHQpICogKDEuMCAtIHQpICsgMy4wICogYzEgKiAoMS4wIC0gdCkgKiAoMS4wIC0gdCkgKiB0ICsgMy4wICogYzIgKiAoMS4wIC0gdCkgKiB0ICogdCArIGVuZCAqIHQgKiB0ICogdDtcbn07XG5cbi8qIGVzbGludC1kaXNhYmxlICovXG5cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI3MDc4NDAxLzgxNTUwN1xuZnVuY3Rpb24gdGhyb3R0bGUoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgY29udGV4dCwgYXJncywgcmVzdWx0O1xuICB2YXIgdGltZW91dCA9IG51bGw7XG4gIHZhciBwcmV2aW91cyA9IDA7XG4gIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICB2YXIgbGF0ZXIgPSBmdW5jdGlvbiBsYXRlcigpIHtcbiAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogRGF0ZS5ub3coKTtcbiAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIGlmICghdGltZW91dCkgY29udGV4dCA9IGFyZ3MgPSBudWxsO1xuICB9O1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBub3c7XG4gICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAobm93IC0gcHJldmlvdXMpO1xuICAgIGNvbnRleHQgPSB0aGlzO1xuICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgaWYgKHJlbWFpbmluZyA8PSAwIHx8IHJlbWFpbmluZyA+IHdhaXQpIHtcbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICB9XG4gICAgICBwcmV2aW91cyA9IG5vdztcbiAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICBpZiAoIXRpbWVvdXQpIGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKCF0aW1lb3V0ICYmIG9wdGlvbnMudHJhaWxpbmcgIT09IGZhbHNlKSB7XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gU2lnbmF0dXJlUGFkKGNhbnZhcywgb3B0aW9ucykge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBvcHRzID0gb3B0aW9ucyB8fCB7fTtcblxuICB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0ID0gb3B0cy52ZWxvY2l0eUZpbHRlcldlaWdodCB8fCAwLjc7XG4gIHRoaXMubWluV2lkdGggPSBvcHRzLm1pbldpZHRoIHx8IDAuNTtcbiAgdGhpcy5tYXhXaWR0aCA9IG9wdHMubWF4V2lkdGggfHwgMi41O1xuICB0aGlzLnRocm90dGxlID0gJ3Rocm90dGxlJyBpbiBvcHRzID8gb3B0cy50aHJvdHRsZSA6IDE2OyAvLyBpbiBtaWxpc2Vjb25kc1xuICB0aGlzLm1pbkRpc3RhbmNlID0gJ21pbkRpc3RhbmNlJyBpbiBvcHRzID8gb3B0cy5taW5EaXN0YW5jZSA6IDU7XG5cbiAgaWYgKHRoaXMudGhyb3R0bGUpIHtcbiAgICB0aGlzLl9zdHJva2VNb3ZlVXBkYXRlID0gdGhyb3R0bGUoU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlLCB0aGlzLnRocm90dGxlKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9zdHJva2VNb3ZlVXBkYXRlID0gU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlO1xuICB9XG5cbiAgdGhpcy5kb3RTaXplID0gb3B0cy5kb3RTaXplIHx8IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gKHRoaXMubWluV2lkdGggKyB0aGlzLm1heFdpZHRoKSAvIDI7XG4gIH07XG4gIHRoaXMucGVuQ29sb3IgPSBvcHRzLnBlbkNvbG9yIHx8ICdibGFjayc7XG4gIHRoaXMuYmFja2dyb3VuZENvbG9yID0gb3B0cy5iYWNrZ3JvdW5kQ29sb3IgfHwgJ3JnYmEoMCwwLDAsMCknO1xuICB0aGlzLm9uQmVnaW4gPSBvcHRzLm9uQmVnaW47XG4gIHRoaXMub25FbmQgPSBvcHRzLm9uRW5kO1xuXG4gIHRoaXMuX2NhbnZhcyA9IGNhbnZhcztcbiAgdGhpcy5fY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIHRoaXMuY2xlYXIoKTtcblxuICAvLyBXZSBuZWVkIGFkZCB0aGVzZSBpbmxpbmUgc28gdGhleSBhcmUgYXZhaWxhYmxlIHRvIHVuYmluZCB3aGlsZSBzdGlsbCBoYXZpbmdcbiAgLy8gYWNjZXNzIHRvICdzZWxmJyB3ZSBjb3VsZCB1c2UgXy5iaW5kIGJ1dCBpdCdzIG5vdCB3b3J0aCBhZGRpbmcgYSBkZXBlbmRlbmN5LlxuICB0aGlzLl9oYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDEpIHtcbiAgICAgIHNlbGYuX21vdXNlQnV0dG9uRG93biA9IHRydWU7XG4gICAgICBzZWxmLl9zdHJva2VCZWdpbihldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuX2hhbmRsZU1vdXNlTW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChzZWxmLl9tb3VzZUJ1dHRvbkRvd24pIHtcbiAgICAgIHNlbGYuX3N0cm9rZU1vdmVVcGRhdGUoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLl9oYW5kbGVNb3VzZVVwID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LndoaWNoID09PSAxICYmIHNlbGYuX21vdXNlQnV0dG9uRG93bikge1xuICAgICAgc2VsZi5fbW91c2VCdXR0b25Eb3duID0gZmFsc2U7XG4gICAgICBzZWxmLl9zdHJva2VFbmQoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICB2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICAgIHNlbGYuX3N0cm9rZUJlZ2luKHRvdWNoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gUHJldmVudCBzY3JvbGxpbmcuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHZhciB0b3VjaCA9IGV2ZW50LnRhcmdldFRvdWNoZXNbMF07XG4gICAgc2VsZi5fc3Ryb2tlTW92ZVVwZGF0ZSh0b3VjaCk7XG4gIH07XG5cbiAgdGhpcy5faGFuZGxlVG91Y2hFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICB2YXIgd2FzQ2FudmFzVG91Y2hlZCA9IGV2ZW50LnRhcmdldCA9PT0gc2VsZi5fY2FudmFzO1xuICAgIGlmICh3YXNDYW52YXNUb3VjaGVkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2VsZi5fc3Ryb2tlRW5kKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gRW5hYmxlIG1vdXNlIGFuZCB0b3VjaCBldmVudCBoYW5kbGVyc1xuICB0aGlzLm9uKCk7XG59XG5cbi8vIFB1YmxpYyBtZXRob2RzXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuICB2YXIgY2FudmFzID0gdGhpcy5fY2FudmFzO1xuXG4gIGN0eC5maWxsU3R5bGUgPSB0aGlzLmJhY2tncm91bmRDb2xvcjtcbiAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xuICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICB0aGlzLl9kYXRhID0gW107XG4gIHRoaXMuX3Jlc2V0KCk7XG4gIHRoaXMuX2lzRW1wdHkgPSB0cnVlO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5mcm9tRGF0YVVSTCA9IGZ1bmN0aW9uIChkYXRhVXJsKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICB2YXIgcmF0aW8gPSBvcHRpb25zLnJhdGlvIHx8IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHZhciB3aWR0aCA9IG9wdGlvbnMud2lkdGggfHwgdGhpcy5fY2FudmFzLndpZHRoIC8gcmF0aW87XG4gIHZhciBoZWlnaHQgPSBvcHRpb25zLmhlaWdodCB8fCB0aGlzLl9jYW52YXMuaGVpZ2h0IC8gcmF0aW87XG5cbiAgdGhpcy5fcmVzZXQoKTtcbiAgaW1hZ2Uuc3JjID0gZGF0YVVybDtcbiAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzLl9jdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgfTtcbiAgdGhpcy5faXNFbXB0eSA9IGZhbHNlO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS50b0RhdGFVUkwgPSBmdW5jdGlvbiAodHlwZSkge1xuICB2YXIgX2NhbnZhcztcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdpbWFnZS9zdmcreG1sJzpcbiAgICAgIHJldHVybiB0aGlzLl90b1NWRygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgb3B0aW9ucyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgb3B0aW9uc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoX2NhbnZhcyA9IHRoaXMuX2NhbnZhcykudG9EYXRhVVJMLmFwcGx5KF9jYW52YXMsIFt0eXBlXS5jb25jYXQob3B0aW9ucykpO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9oYW5kbGVNb3VzZUV2ZW50cygpO1xuICB0aGlzLl9oYW5kbGVUb3VjaEV2ZW50cygpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9oYW5kbGVNb3VzZURvd24pO1xuICB0aGlzLl9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlTW91c2VNb3ZlKTtcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2hhbmRsZU1vdXNlVXApO1xuXG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5faGFuZGxlVG91Y2hTdGFydCk7XG4gIHRoaXMuX2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVUb3VjaE1vdmUpO1xuICB0aGlzLl9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9oYW5kbGVUb3VjaEVuZCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9pc0VtcHR5O1xufTtcblxuLy8gUHJpdmF0ZSBtZXRob2RzXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VCZWdpbiA9IGZ1bmN0aW9uIChldmVudCkge1xuICB0aGlzLl9kYXRhLnB1c2goW10pO1xuICB0aGlzLl9yZXNldCgpO1xuICB0aGlzLl9zdHJva2VVcGRhdGUoZXZlbnQpO1xuXG4gIGlmICh0eXBlb2YgdGhpcy5vbkJlZ2luID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhpcy5vbkJlZ2luKGV2ZW50KTtcbiAgfVxufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fc3Ryb2tlVXBkYXRlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHZhciB4ID0gZXZlbnQuY2xpZW50WDtcbiAgdmFyIHkgPSBldmVudC5jbGllbnRZO1xuXG4gIHZhciBwb2ludCA9IHRoaXMuX2NyZWF0ZVBvaW50KHgsIHkpO1xuICB2YXIgbGFzdFBvaW50R3JvdXAgPSB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV07XG4gIHZhciBsYXN0UG9pbnQgPSBsYXN0UG9pbnRHcm91cCAmJiBsYXN0UG9pbnRHcm91cFtsYXN0UG9pbnRHcm91cC5sZW5ndGggLSAxXTtcbiAgdmFyIGlzTGFzdFBvaW50VG9vQ2xvc2UgPSBsYXN0UG9pbnQgJiYgcG9pbnQuZGlzdGFuY2VUbyhsYXN0UG9pbnQpIDwgdGhpcy5taW5EaXN0YW5jZTtcblxuICAvLyBTa2lwIHRoaXMgcG9pbnQgaWYgaXQncyB0b28gY2xvc2UgdG8gdGhlIHByZXZpb3VzIG9uZVxuICBpZiAoIShsYXN0UG9pbnQgJiYgaXNMYXN0UG9pbnRUb29DbG9zZSkpIHtcbiAgICB2YXIgX2FkZFBvaW50ID0gdGhpcy5fYWRkUG9pbnQocG9pbnQpLFxuICAgICAgICBjdXJ2ZSA9IF9hZGRQb2ludC5jdXJ2ZSxcbiAgICAgICAgd2lkdGhzID0gX2FkZFBvaW50LndpZHRocztcblxuICAgIGlmIChjdXJ2ZSAmJiB3aWR0aHMpIHtcbiAgICAgIHRoaXMuX2RyYXdDdXJ2ZShjdXJ2ZSwgd2lkdGhzLnN0YXJ0LCB3aWR0aHMuZW5kKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV0ucHVzaCh7XG4gICAgICB4OiBwb2ludC54LFxuICAgICAgeTogcG9pbnQueSxcbiAgICAgIHRpbWU6IHBvaW50LnRpbWUsXG4gICAgICBjb2xvcjogdGhpcy5wZW5Db2xvclxuICAgIH0pO1xuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIGNhbkRyYXdDdXJ2ZSA9IHRoaXMucG9pbnRzLmxlbmd0aCA+IDI7XG4gIHZhciBwb2ludCA9IHRoaXMucG9pbnRzWzBdOyAvLyBQb2ludCBpbnN0YW5jZVxuXG4gIGlmICghY2FuRHJhd0N1cnZlICYmIHBvaW50KSB7XG4gICAgdGhpcy5fZHJhd0RvdChwb2ludCk7XG4gIH1cblxuICBpZiAocG9pbnQpIHtcbiAgICB2YXIgbGFzdFBvaW50R3JvdXAgPSB0aGlzLl9kYXRhW3RoaXMuX2RhdGEubGVuZ3RoIC0gMV07XG4gICAgdmFyIGxhc3RQb2ludCA9IGxhc3RQb2ludEdyb3VwW2xhc3RQb2ludEdyb3VwLmxlbmd0aCAtIDFdOyAvLyBwbGFpbiBvYmplY3RcblxuICAgIC8vIFdoZW4gZHJhd2luZyBhIGRvdCwgdGhlcmUncyBvbmx5IG9uZSBwb2ludCBpbiBhIGdyb3VwLCBzbyB3aXRob3V0IHRoaXMgY2hlY2tcbiAgICAvLyBzdWNoIGdyb3VwIHdvdWxkIGVuZCB1cCB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgMiBwb2ludHMuXG4gICAgaWYgKCFwb2ludC5lcXVhbHMobGFzdFBvaW50KSkge1xuICAgICAgbGFzdFBvaW50R3JvdXAucHVzaCh7XG4gICAgICAgIHg6IHBvaW50LngsXG4gICAgICAgIHk6IHBvaW50LnksXG4gICAgICAgIHRpbWU6IHBvaW50LnRpbWUsXG4gICAgICAgIGNvbG9yOiB0aGlzLnBlbkNvbG9yXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHRoaXMub25FbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLm9uRW5kKGV2ZW50KTtcbiAgfVxufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5faGFuZGxlTW91c2VFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX21vdXNlQnV0dG9uRG93biA9IGZhbHNlO1xuXG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9oYW5kbGVNb3VzZURvd24pO1xuICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlTW91c2VNb3ZlKTtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2hhbmRsZU1vdXNlVXApO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5faGFuZGxlVG91Y2hFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFBhc3MgdG91Y2ggZXZlbnRzIHRvIGNhbnZhcyBlbGVtZW50IG9uIG1vYmlsZSBJRTExIGFuZCBFZGdlLlxuICB0aGlzLl9jYW52YXMuc3R5bGUubXNUb3VjaEFjdGlvbiA9ICdub25lJztcbiAgdGhpcy5fY2FudmFzLnN0eWxlLnRvdWNoQWN0aW9uID0gJ25vbmUnO1xuXG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5faGFuZGxlVG91Y2hTdGFydCk7XG4gIHRoaXMuX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVUb3VjaE1vdmUpO1xuICB0aGlzLl9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9oYW5kbGVUb3VjaEVuZCk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5wb2ludHMgPSBbXTtcbiAgdGhpcy5fbGFzdFZlbG9jaXR5ID0gMDtcbiAgdGhpcy5fbGFzdFdpZHRoID0gKHRoaXMubWluV2lkdGggKyB0aGlzLm1heFdpZHRoKSAvIDI7XG4gIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB0aGlzLnBlbkNvbG9yO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fY3JlYXRlUG9pbnQgPSBmdW5jdGlvbiAoeCwgeSwgdGltZSkge1xuICB2YXIgcmVjdCA9IHRoaXMuX2NhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICByZXR1cm4gbmV3IFBvaW50KHggLSByZWN0LmxlZnQsIHkgLSByZWN0LnRvcCwgdGltZSB8fCBuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9hZGRQb2ludCA9IGZ1bmN0aW9uIChwb2ludCkge1xuICB2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG4gIHZhciB0bXAgPSB2b2lkIDA7XG5cbiAgcG9pbnRzLnB1c2gocG9pbnQpO1xuXG4gIGlmIChwb2ludHMubGVuZ3RoID4gMikge1xuICAgIC8vIFRvIHJlZHVjZSB0aGUgaW5pdGlhbCBsYWcgbWFrZSBpdCB3b3JrIHdpdGggMyBwb2ludHNcbiAgICAvLyBieSBjb3B5aW5nIHRoZSBmaXJzdCBwb2ludCB0byB0aGUgYmVnaW5uaW5nLlxuICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAzKSBwb2ludHMudW5zaGlmdChwb2ludHNbMF0pO1xuXG4gICAgdG1wID0gdGhpcy5fY2FsY3VsYXRlQ3VydmVDb250cm9sUG9pbnRzKHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0pO1xuICAgIHZhciBjMiA9IHRtcC5jMjtcbiAgICB0bXAgPSB0aGlzLl9jYWxjdWxhdGVDdXJ2ZUNvbnRyb2xQb2ludHMocG9pbnRzWzFdLCBwb2ludHNbMl0sIHBvaW50c1szXSk7XG4gICAgdmFyIGMzID0gdG1wLmMxO1xuICAgIHZhciBjdXJ2ZSA9IG5ldyBCZXppZXIocG9pbnRzWzFdLCBjMiwgYzMsIHBvaW50c1syXSk7XG4gICAgdmFyIHdpZHRocyA9IHRoaXMuX2NhbGN1bGF0ZUN1cnZlV2lkdGhzKGN1cnZlKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBsaXN0LFxuICAgIC8vIHNvIHRoYXQgd2UgYWx3YXlzIGhhdmUgbm8gbW9yZSB0aGFuIDQgcG9pbnRzIGluIHBvaW50cyBhcnJheS5cbiAgICBwb2ludHMuc2hpZnQoKTtcblxuICAgIHJldHVybiB7IGN1cnZlOiBjdXJ2ZSwgd2lkdGhzOiB3aWR0aHMgfTtcbiAgfVxuXG4gIHJldHVybiB7fTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2NhbGN1bGF0ZUN1cnZlQ29udHJvbFBvaW50cyA9IGZ1bmN0aW9uIChzMSwgczIsIHMzKSB7XG4gIHZhciBkeDEgPSBzMS54IC0gczIueDtcbiAgdmFyIGR5MSA9IHMxLnkgLSBzMi55O1xuICB2YXIgZHgyID0gczIueCAtIHMzLng7XG4gIHZhciBkeTIgPSBzMi55IC0gczMueTtcblxuICB2YXIgbTEgPSB7IHg6IChzMS54ICsgczIueCkgLyAyLjAsIHk6IChzMS55ICsgczIueSkgLyAyLjAgfTtcbiAgdmFyIG0yID0geyB4OiAoczIueCArIHMzLngpIC8gMi4wLCB5OiAoczIueSArIHMzLnkpIC8gMi4wIH07XG5cbiAgdmFyIGwxID0gTWF0aC5zcXJ0KGR4MSAqIGR4MSArIGR5MSAqIGR5MSk7XG4gIHZhciBsMiA9IE1hdGguc3FydChkeDIgKiBkeDIgKyBkeTIgKiBkeTIpO1xuXG4gIHZhciBkeG0gPSBtMS54IC0gbTIueDtcbiAgdmFyIGR5bSA9IG0xLnkgLSBtMi55O1xuXG4gIHZhciBrID0gbDIgLyAobDEgKyBsMik7XG4gIHZhciBjbSA9IHsgeDogbTIueCArIGR4bSAqIGssIHk6IG0yLnkgKyBkeW0gKiBrIH07XG5cbiAgdmFyIHR4ID0gczIueCAtIGNtLng7XG4gIHZhciB0eSA9IHMyLnkgLSBjbS55O1xuXG4gIHJldHVybiB7XG4gICAgYzE6IG5ldyBQb2ludChtMS54ICsgdHgsIG0xLnkgKyB0eSksXG4gICAgYzI6IG5ldyBQb2ludChtMi54ICsgdHgsIG0yLnkgKyB0eSlcbiAgfTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2NhbGN1bGF0ZUN1cnZlV2lkdGhzID0gZnVuY3Rpb24gKGN1cnZlKSB7XG4gIHZhciBzdGFydFBvaW50ID0gY3VydmUuc3RhcnRQb2ludDtcbiAgdmFyIGVuZFBvaW50ID0gY3VydmUuZW5kUG9pbnQ7XG4gIHZhciB3aWR0aHMgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcblxuICB2YXIgdmVsb2NpdHkgPSB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0ICogZW5kUG9pbnQudmVsb2NpdHlGcm9tKHN0YXJ0UG9pbnQpICsgKDEgLSB0aGlzLnZlbG9jaXR5RmlsdGVyV2VpZ2h0KSAqIHRoaXMuX2xhc3RWZWxvY2l0eTtcblxuICB2YXIgbmV3V2lkdGggPSB0aGlzLl9zdHJva2VXaWR0aCh2ZWxvY2l0eSk7XG5cbiAgd2lkdGhzLnN0YXJ0ID0gdGhpcy5fbGFzdFdpZHRoO1xuICB3aWR0aHMuZW5kID0gbmV3V2lkdGg7XG5cbiAgdGhpcy5fbGFzdFZlbG9jaXR5ID0gdmVsb2NpdHk7XG4gIHRoaXMuX2xhc3RXaWR0aCA9IG5ld1dpZHRoO1xuXG4gIHJldHVybiB3aWR0aHM7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9zdHJva2VXaWR0aCA9IGZ1bmN0aW9uICh2ZWxvY2l0eSkge1xuICByZXR1cm4gTWF0aC5tYXgodGhpcy5tYXhXaWR0aCAvICh2ZWxvY2l0eSArIDEpLCB0aGlzLm1pbldpZHRoKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2RyYXdQb2ludCA9IGZ1bmN0aW9uICh4LCB5LCBzaXplKSB7XG4gIHZhciBjdHggPSB0aGlzLl9jdHg7XG5cbiAgY3R4Lm1vdmVUbyh4LCB5KTtcbiAgY3R4LmFyYyh4LCB5LCBzaXplLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICB0aGlzLl9pc0VtcHR5ID0gZmFsc2U7XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl9kcmF3Q3VydmUgPSBmdW5jdGlvbiAoY3VydmUsIHN0YXJ0V2lkdGgsIGVuZFdpZHRoKSB7XG4gIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gIHZhciB3aWR0aERlbHRhID0gZW5kV2lkdGggLSBzdGFydFdpZHRoO1xuICB2YXIgZHJhd1N0ZXBzID0gTWF0aC5mbG9vcihjdXJ2ZS5sZW5ndGgoKSk7XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZHJhd1N0ZXBzOyBpICs9IDEpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIEJlemllciAoeCwgeSkgY29vcmRpbmF0ZSBmb3IgdGhpcyBzdGVwLlxuICAgIHZhciB0ID0gaSAvIGRyYXdTdGVwcztcbiAgICB2YXIgdHQgPSB0ICogdDtcbiAgICB2YXIgdHR0ID0gdHQgKiB0O1xuICAgIHZhciB1ID0gMSAtIHQ7XG4gICAgdmFyIHV1ID0gdSAqIHU7XG4gICAgdmFyIHV1dSA9IHV1ICogdTtcblxuICAgIHZhciB4ID0gdXV1ICogY3VydmUuc3RhcnRQb2ludC54O1xuICAgIHggKz0gMyAqIHV1ICogdCAqIGN1cnZlLmNvbnRyb2wxLng7XG4gICAgeCArPSAzICogdSAqIHR0ICogY3VydmUuY29udHJvbDIueDtcbiAgICB4ICs9IHR0dCAqIGN1cnZlLmVuZFBvaW50Lng7XG5cbiAgICB2YXIgeSA9IHV1dSAqIGN1cnZlLnN0YXJ0UG9pbnQueTtcbiAgICB5ICs9IDMgKiB1dSAqIHQgKiBjdXJ2ZS5jb250cm9sMS55O1xuICAgIHkgKz0gMyAqIHUgKiB0dCAqIGN1cnZlLmNvbnRyb2wyLnk7XG4gICAgeSArPSB0dHQgKiBjdXJ2ZS5lbmRQb2ludC55O1xuXG4gICAgdmFyIHdpZHRoID0gc3RhcnRXaWR0aCArIHR0dCAqIHdpZHRoRGVsdGE7XG4gICAgdGhpcy5fZHJhd1BvaW50KHgsIHksIHdpZHRoKTtcbiAgfVxuXG4gIGN0eC5jbG9zZVBhdGgoKTtcbiAgY3R4LmZpbGwoKTtcbn07XG5cblNpZ25hdHVyZVBhZC5wcm90b3R5cGUuX2RyYXdEb3QgPSBmdW5jdGlvbiAocG9pbnQpIHtcbiAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcbiAgdmFyIHdpZHRoID0gdHlwZW9mIHRoaXMuZG90U2l6ZSA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuZG90U2l6ZSgpIDogdGhpcy5kb3RTaXplO1xuXG4gIGN0eC5iZWdpblBhdGgoKTtcbiAgdGhpcy5fZHJhd1BvaW50KHBvaW50LngsIHBvaW50LnksIHdpZHRoKTtcbiAgY3R4LmNsb3NlUGF0aCgpO1xuICBjdHguZmlsbCgpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5fZnJvbURhdGEgPSBmdW5jdGlvbiAocG9pbnRHcm91cHMsIGRyYXdDdXJ2ZSwgZHJhd0RvdCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50R3JvdXBzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGdyb3VwID0gcG9pbnRHcm91cHNbaV07XG5cbiAgICBpZiAoZ3JvdXAubGVuZ3RoID4gMSkge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBncm91cC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICB2YXIgcmF3UG9pbnQgPSBncm91cFtqXTtcbiAgICAgICAgdmFyIHBvaW50ID0gbmV3IFBvaW50KHJhd1BvaW50LngsIHJhd1BvaW50LnksIHJhd1BvaW50LnRpbWUpO1xuICAgICAgICB2YXIgY29sb3IgPSByYXdQb2ludC5jb2xvcjtcblxuICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgIC8vIEZpcnN0IHBvaW50IGluIGEgZ3JvdXAuIE5vdGhpbmcgdG8gZHJhdyB5ZXQuXG5cbiAgICAgICAgICAvLyBBbGwgcG9pbnRzIGluIHRoZSBncm91cCBoYXZlIHRoZSBzYW1lIGNvbG9yLCBzbyBpdCdzIGVub3VnaCB0byBzZXRcbiAgICAgICAgICAvLyBwZW5Db2xvciBqdXN0IGF0IHRoZSBiZWdpbm5pbmcuXG4gICAgICAgICAgdGhpcy5wZW5Db2xvciA9IGNvbG9yO1xuICAgICAgICAgIHRoaXMuX3Jlc2V0KCk7XG5cbiAgICAgICAgICB0aGlzLl9hZGRQb2ludChwb2ludCk7XG4gICAgICAgIH0gZWxzZSBpZiAoaiAhPT0gZ3JvdXAubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIC8vIE1pZGRsZSBwb2ludCBpbiBhIGdyb3VwLlxuICAgICAgICAgIHZhciBfYWRkUG9pbnQyID0gdGhpcy5fYWRkUG9pbnQocG9pbnQpLFxuICAgICAgICAgICAgICBjdXJ2ZSA9IF9hZGRQb2ludDIuY3VydmUsXG4gICAgICAgICAgICAgIHdpZHRocyA9IF9hZGRQb2ludDIud2lkdGhzO1xuXG4gICAgICAgICAgaWYgKGN1cnZlICYmIHdpZHRocykge1xuICAgICAgICAgICAgZHJhd0N1cnZlKGN1cnZlLCB3aWR0aHMsIGNvbG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTGFzdCBwb2ludCBpbiBhIGdyb3VwLiBEbyBub3RoaW5nLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgICB2YXIgX3Jhd1BvaW50ID0gZ3JvdXBbMF07XG4gICAgICBkcmF3RG90KF9yYXdQb2ludCk7XG4gICAgfVxuICB9XG59O1xuXG5TaWduYXR1cmVQYWQucHJvdG90eXBlLl90b1NWRyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgdmFyIHBvaW50R3JvdXBzID0gdGhpcy5fZGF0YTtcbiAgdmFyIGNhbnZhcyA9IHRoaXMuX2NhbnZhcztcbiAgdmFyIHJhdGlvID0gTWF0aC5tYXgod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSwgMSk7XG4gIHZhciBtaW5YID0gMDtcbiAgdmFyIG1pblkgPSAwO1xuICB2YXIgbWF4WCA9IGNhbnZhcy53aWR0aCAvIHJhdGlvO1xuICB2YXIgbWF4WSA9IGNhbnZhcy5oZWlnaHQgLyByYXRpbztcbiAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG5cbiAgc3ZnLnNldEF0dHJpYnV0ZU5TKG51bGwsICd3aWR0aCcsIGNhbnZhcy53aWR0aCk7XG4gIHN2Zy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaGVpZ2h0JywgY2FudmFzLmhlaWdodCk7XG5cbiAgdGhpcy5fZnJvbURhdGEocG9pbnRHcm91cHMsIGZ1bmN0aW9uIChjdXJ2ZSwgd2lkdGhzLCBjb2xvcikge1xuICAgIHZhciBwYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncGF0aCcpO1xuXG4gICAgLy8gTmVlZCB0byBjaGVjayBjdXJ2ZSBmb3IgTmFOIHZhbHVlcywgdGhlc2UgcG9wIHVwIHdoZW4gZHJhd2luZ1xuICAgIC8vIGxpbmVzIG9uIHRoZSBjYW52YXMgdGhhdCBhcmUgbm90IGNvbnRpbnVvdXMuIEUuZy4gU2hhcnAgY29ybmVyc1xuICAgIC8vIG9yIHN0b3BwaW5nIG1pZC1zdHJva2UgYW5kIHRoYW4gY29udGludWluZyB3aXRob3V0IGxpZnRpbmcgbW91c2UuXG4gICAgaWYgKCFpc05hTihjdXJ2ZS5jb250cm9sMS54KSAmJiAhaXNOYU4oY3VydmUuY29udHJvbDEueSkgJiYgIWlzTmFOKGN1cnZlLmNvbnRyb2wyLngpICYmICFpc05hTihjdXJ2ZS5jb250cm9sMi55KSkge1xuICAgICAgdmFyIGF0dHIgPSAnTSAnICsgY3VydmUuc3RhcnRQb2ludC54LnRvRml4ZWQoMykgKyAnLCcgKyBjdXJ2ZS5zdGFydFBvaW50LnkudG9GaXhlZCgzKSArICcgJyArICgnQyAnICsgY3VydmUuY29udHJvbDEueC50b0ZpeGVkKDMpICsgJywnICsgY3VydmUuY29udHJvbDEueS50b0ZpeGVkKDMpICsgJyAnKSArIChjdXJ2ZS5jb250cm9sMi54LnRvRml4ZWQoMykgKyAnLCcgKyBjdXJ2ZS5jb250cm9sMi55LnRvRml4ZWQoMykgKyAnICcpICsgKGN1cnZlLmVuZFBvaW50LngudG9GaXhlZCgzKSArICcsJyArIGN1cnZlLmVuZFBvaW50LnkudG9GaXhlZCgzKSk7XG5cbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdkJywgYXR0cik7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgKHdpZHRocy5lbmQgKiAyLjI1KS50b0ZpeGVkKDMpKTtcbiAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2UnLCBjb2xvcik7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7XG4gICAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLWxpbmVjYXAnLCAncm91bmQnKTtcblxuICAgICAgc3ZnLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgIH1cbiAgfSwgZnVuY3Rpb24gKHJhd1BvaW50KSB7XG4gICAgdmFyIGNpcmNsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NpcmNsZScpO1xuICAgIHZhciBkb3RTaXplID0gdHlwZW9mIF90aGlzMi5kb3RTaXplID09PSAnZnVuY3Rpb24nID8gX3RoaXMyLmRvdFNpemUoKSA6IF90aGlzMi5kb3RTaXplO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ3InLCBkb3RTaXplKTtcbiAgICBjaXJjbGUuc2V0QXR0cmlidXRlKCdjeCcsIHJhd1BvaW50LngpO1xuICAgIGNpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N5JywgcmF3UG9pbnQueSk7XG4gICAgY2lyY2xlLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHJhd1BvaW50LmNvbG9yKTtcblxuICAgIHN2Zy5hcHBlbmRDaGlsZChjaXJjbGUpO1xuICB9KTtcblxuICB2YXIgcHJlZml4ID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJztcbiAgdmFyIGhlYWRlciA9ICc8c3ZnJyArICcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiJyArICcgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCInICsgKCcgdmlld0JveD1cIicgKyBtaW5YICsgJyAnICsgbWluWSArICcgJyArIG1heFggKyAnICcgKyBtYXhZICsgJ1wiJykgKyAoJyB3aWR0aD1cIicgKyBtYXhYICsgJ1wiJykgKyAoJyBoZWlnaHQ9XCInICsgbWF4WSArICdcIicpICsgJz4nO1xuICB2YXIgYm9keSA9IHN2Zy5pbm5lckhUTUw7XG5cbiAgLy8gSUUgaGFjayBmb3IgbWlzc2luZyBpbm5lckhUTUwgcHJvcGVydHkgb24gU1ZHRWxlbWVudFxuICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGR1bW15ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZHVtbXknKTtcbiAgICB2YXIgbm9kZXMgPSBzdmcuY2hpbGROb2RlcztcbiAgICBkdW1teS5pbm5lckhUTUwgPSAnJztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGR1bW15LmFwcGVuZENoaWxkKG5vZGVzW2ldLmNsb25lTm9kZSh0cnVlKSk7XG4gICAgfVxuXG4gICAgYm9keSA9IGR1bW15LmlubmVySFRNTDtcbiAgfVxuXG4gIHZhciBmb290ZXIgPSAnPC9zdmc+JztcbiAgdmFyIGRhdGEgPSBoZWFkZXIgKyBib2R5ICsgZm9vdGVyO1xuXG4gIHJldHVybiBwcmVmaXggKyBidG9hKGRhdGEpO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS5mcm9tRGF0YSA9IGZ1bmN0aW9uIChwb2ludEdyb3Vwcykge1xuICB2YXIgX3RoaXMzID0gdGhpcztcblxuICB0aGlzLmNsZWFyKCk7XG5cbiAgdGhpcy5fZnJvbURhdGEocG9pbnRHcm91cHMsIGZ1bmN0aW9uIChjdXJ2ZSwgd2lkdGhzKSB7XG4gICAgcmV0dXJuIF90aGlzMy5fZHJhd0N1cnZlKGN1cnZlLCB3aWR0aHMuc3RhcnQsIHdpZHRocy5lbmQpO1xuICB9LCBmdW5jdGlvbiAocmF3UG9pbnQpIHtcbiAgICByZXR1cm4gX3RoaXMzLl9kcmF3RG90KHJhd1BvaW50KTtcbiAgfSk7XG5cbiAgdGhpcy5fZGF0YSA9IHBvaW50R3JvdXBzO1xufTtcblxuU2lnbmF0dXJlUGFkLnByb3RvdHlwZS50b0RhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl9kYXRhO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2lnbmF0dXJlUGFkO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NpZ25hdHVyZV9wYWQvZGlzdC9zaWduYXR1cmVfcGFkLm1qc1xuLy8gbW9kdWxlIGlkID0gODJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgQmFzZSwgSVN1cnZleURhdGEgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBFeHByZXNzaW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcblxuLyoqXG4gKiBUaGUgY2FsY3VsYXRlZCB2YWx1ZSBpcyBhIHdheSB0byBkZWZpbmUgdGhlIHZhcmlhYmxlIGluIFN1cnZleSBDcmVhdG9yLlxuICogSXQgaGFzIHR3byBtYWluIHByb3BlcnRpZXM6IG5hbWUgYW5kIGV4cHJlc3Npb24uIEJhc2VkIG9uIGV4cHJlc3Npb24gdGhlIHZhbHVlIHJlYWQtb25seSBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQuXG4gKiBUaGUgbmFtZSBwcm9wZXJ0eSBzaG91bGQgYmUgdW5pcXVlIHRob3VnaCBhbGwgY2FsY3VsYXRlZCB2YWx1ZXMuXG4gKiBJdCB1c2VzIHN1cnZleS5nZXRWYXJpYWJsZS9zZXJ1dmV5LnNldFZhcmlhYmxlIGZ1bmN0aW9ucyB0byBnZXQvc2V0IGl0cyB2YWx1ZS4gVGhlIGNsYXNzIGRvIG5vdCBzdG9yZSBpdHMgdmFsdWUgaW50ZXJuYWxseS5cbiAqIFlvdSBtYXkgc2V0IGluY2x1ZGVJbnRvUmVzdWx0IHByb3BlcnR5IHRvIHRydWUgdG8gc3RvcmUgdGhpcyBjYWxjdWxhdGVkIHZhbHVlIGludG8gc3VydmV5IHJlc3VsdC5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbGN1bGF0ZWRWYWx1ZSBleHRlbmRzIEJhc2Uge1xuICBwcml2YXRlIGRhdGE6IElTdXJ2ZXlEYXRhO1xuICBwcml2YXRlIGV4cHJlc3Npb25Jc1J1bm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBleHByZXNzaW9uUnVubmVyOiBFeHByZXNzaW9uUnVubmVyO1xuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgPSBudWxsLCBleHByZXNzaW9uOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoISFuYW1lKSB7XG4gICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIH1cbiAgICBpZiAoISFleHByZXNzaW9uKSB7XG4gICAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgc2V0T3duZXIoZGF0YTogSVN1cnZleURhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucmVydW5FeHByZXNzaW9uKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjYWxjdWxhdGVkdmFsdWVcIjtcbiAgfVxuICAvKipcbiAgICogVGhlIGNhbGN1bGF0ZWQgdmFsdWUgbmFtZS4gSXQgc2hvdWxkIGJlIG5vbiBlbXB0eSBhbmQgdW5pcXVlLlxuICAgKi9cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibmFtZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIGluY2x1ZGUgdGhlIG5vbi1lbXB0eSBjYWxjdWxhdGVkIHZhbHVlIGludG8gc3VydmV5IHJlc3VsdCwgc3VydmV5LmRhdGEgcHJvcGVydHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGluY2x1ZGVJbnRvUmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbmNsdWRlSW50b1Jlc3VsdFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpbmNsdWRlSW50b1Jlc3VsdCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbmNsdWRlSW50b1Jlc3VsdFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgRXhwcmVzc2lvbiB0aGF0IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZS4gWW91IG1heSB1c2Ugc3RhbmRhcmQgb3BlcmF0b3JzIGxpa2UgKywgLSwgKiBhbmQgLywgc3F1YXJlcyAoKS4gSGVyZSBpcyB0aGUgZXhhbXBsZSBvZiBhY2Nlc3NpbmcgdGhlIHF1ZXN0aW9uIHZhbHVlIHtxdWVzdGlvbm5hbWV9LlxuICAgKiA8YnIvPkV4YW1wbGU6IFwiKHtxdWFudGl0eX0gKiB7cHJpY2V9KSAqICgxMDAgLSB7ZGlzY291bnR9KSAvIDEwMFwiXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIHZhbCk7XG4gICAgdGhpcy5yZXJ1bkV4cHJlc3Npb24oKTtcbiAgfVxuICBwdWJsaWMgbG9jQ2FsY3VsYXRpb24oKSB7XG4gICAgdGhpcy5leHByZXNzaW9uSXNSdW5uaW5nID0gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgdW5sb2NDYWxjdWxhdGlvbigpIHtcbiAgICB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcgPSBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGlzQ2FsY3VsYXRlZCA9IGZhbHNlO1xuICBwdWJsaWMgcmVzZXRDYWxjdWxhdGlvbigpIHtcbiAgICB0aGlzLmlzQ2FsY3VsYXRlZCA9IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBkb0NhbGN1bGF0aW9uKFxuICAgIGNhbGN1bGF0ZWRWYWx1ZXM6IEFycmF5PENhbGN1bGF0ZWRWYWx1ZT4sXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAodGhpcy5pc0NhbGN1bGF0ZWQpIHJldHVybjtcbiAgICB0aGlzLnJ1bkV4cHJlc3Npb25Db3JlKGNhbGN1bGF0ZWRWYWx1ZXMsIHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5pc0NhbGN1bGF0ZWQgPSB0cnVlO1xuICB9XG4gIHB1YmxpYyBydW5FeHByZXNzaW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgdGhpcy5ydW5FeHByZXNzaW9uQ29yZShudWxsLCB2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmdldFZhcmlhYmxlKHRoaXMubmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFZhbHVlKHZhbDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybjtcbiAgICB0aGlzLmRhdGEuc2V0VmFyaWFibGUodGhpcy5uYW1lLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgZ2V0IGNhblJ1bkV4cHJlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5kYXRhICYmXG4gICAgICAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJlxuICAgICAgISF0aGlzLmV4cHJlc3Npb24gJiZcbiAgICAgICF0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcgJiZcbiAgICAgICEhdGhpcy5uYW1lXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJlcnVuRXhwcmVzc2lvbigpIHtcbiAgICBpZiAoIXRoaXMuY2FuUnVuRXhwcmVzc2lvbikgcmV0dXJuO1xuICAgIHRoaXMucnVuRXhwcmVzc2lvbihcbiAgICAgIHRoaXMuZGF0YS5nZXRGaWx0ZXJlZFZhbHVlcygpLFxuICAgICAgdGhpcy5kYXRhLmdldEZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHJ1bkV4cHJlc3Npb25Db3JlKFxuICAgIGNhbGN1bGF0ZWRWYWx1ZXM6IEFycmF5PENhbGN1bGF0ZWRWYWx1ZT4sXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAoIXRoaXMuY2FuUnVuRXhwcmVzc2lvbikgcmV0dXJuO1xuICAgIHRoaXMuZW5zdXJlRXhwcmVzc2lvbih2YWx1ZXMpO1xuICAgIHRoaXMubG9jQ2FsY3VsYXRpb24oKTtcbiAgICBpZiAoISFjYWxjdWxhdGVkVmFsdWVzKSB7XG4gICAgICB0aGlzLnJ1bkRlcGVuZGVudEV4cHJlc3Npb25zKGNhbGN1bGF0ZWRWYWx1ZXMsIHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lci5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJ1bkRlcGVuZGVudEV4cHJlc3Npb25zKFxuICAgIGNhbGN1bGF0ZWRWYWx1ZXM6IEFycmF5PENhbGN1bGF0ZWRWYWx1ZT4sXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICB2YXIgdmFyaWFibGVzID0gdGhpcy5leHByZXNzaW9uUnVubmVyLmdldFZhcmlhYmxlcygpO1xuICAgIGlmICghdmFyaWFibGVzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxjdWxhdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2FsY0l0ZW0gPSBjYWxjdWxhdGVkVmFsdWVzW2ldO1xuICAgICAgaWYgKGNhbGNJdGVtID09PSB0aGlzIHx8IHZhcmlhYmxlcy5pbmRleE9mKGNhbGNJdGVtLm5hbWUpIDwgMCkgY29udGludWU7XG4gICAgICBjYWxjSXRlbS5kb0NhbGN1bGF0aW9uKGNhbGN1bGF0ZWRWYWx1ZXMsIHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgICB2YWx1ZXNbY2FsY0l0ZW0ubmFtZV0gPSBjYWxjSXRlbS52YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVFeHByZXNzaW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAoISF0aGlzLmV4cHJlc3Npb25SdW5uZXIpIHJldHVybjtcbiAgICB0aGlzLmV4cHJlc3Npb25SdW5uZXIgPSBuZXcgRXhwcmVzc2lvblJ1bm5lcih0aGlzLmV4cHJlc3Npb24pO1xuICAgIHRoaXMuZXhwcmVzc2lvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gbmV3VmFsdWUgPT4ge1xuICAgICAgaWYgKCFIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMobmV3VmFsdWUsIHRoaXMudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWUobmV3VmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy51bmxvY0NhbGN1bGF0aW9uKCk7XG4gICAgfTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImNhbGN1bGF0ZWR2YWx1ZVwiLFxuICBbe25hbWU6IFwiIW5hbWVcIiwgaXNVbmlxdWU6IHRydWV9LCBcImV4cHJlc3Npb246ZXhwcmVzc2lvblwiLCBcImluY2x1ZGVJbnRvUmVzdWx0OmJvb2xlYW5cIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgQ2FsY3VsYXRlZFZhbHVlKCk7XG4gIH0sXG4gIFwiYmFzZVwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2NhbGN1bGF0ZWRWYWx1ZS50cyIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25JdGVtIGV4dGVuZHMgQmFzZSBpbXBsZW1lbnRzIElMb2NhbGl6YWJsZU93bmVyIHtcbiAgcHVibGljIGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lcjtcbiAgY29uc3RydWN0b3IoZXhwcmVzc2lvbjogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImh0bWxcIiwgdGhpcyk7XG4gICAgdGhpcy5leHByZXNzaW9uID0gZXhwcmVzc2lvbjtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImV4cHJlc3Npb25pdGVtXCI7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IGFueSwgcHJvcGVydGllczogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmV4cHJlc3Npb24pIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLmV4cHJlc3Npb24pLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZXhwcmVzc2lvbiBwcm9wZXJ0eS4gSWYgdGhpcyBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlbiBzdXJ2ZXkgd2lsbCB1c2UgaHRtbCBwcm9wZXJ0eSB0byBzaG93IG9uIGNvbXBsZXRlIHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0h0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldE1hcmtkb3duSHRtbCh0ZXh0KSA6IG51bGw7XG4gIH1cbiAgcHVibGljIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NPd25lciA/IHRoaXMubG9jT3duZXIuZ2V0UHJvY2Vzc2VkVGV4dCh0ZXh0KSA6IHRleHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgY29udGFpbnMgZXhwcmVzc2lvbiBhbmQgaHRtbCBwcm9wZXRpZXMuIEl0IHVzZXMgaW4gc3VydmV5LmNvbXBsZXRlZEh0bWxPbkNvbmRpdGlvbiBhcnJheS5cbiAqIElmIHRoZSBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSB0aGVuIGh0bWwgb2YgdGhpcyBpdGVtIHVzZXMgaW5zdGVhZCBvZiBzdXJ2ZXkuY29tcGxldGVkSHRtbCBwcm9wZXJ0eVxuICogQHNlZSBTdXJ2ZXlNb2RlbC5jb21wbGV0ZWRIdG1sT25Db25kaXRpb25cbiAqIEBzZWUgU3VydmV5TW9kZWwuY29tcGxldGVkSHRtbFxuICovXG5leHBvcnQgY2xhc3MgSHRtbENvbmRpdGlvbkl0ZW0gZXh0ZW5kcyBFeHByZXNzaW9uSXRlbSB7XG4gIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IHN0cmluZyA9IG51bGwsIGh0bWw6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcihleHByZXNzaW9uKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmh0bWwgPSBodG1sO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiaHRtbGNvbmRpdGlvbml0ZW1cIjtcbiAgfVxuICAvKipcbiAgICogVGhlIGh0bWwgdGhhdCBzaG93cyBvbiBjb21wbGV0ZWQgKCdUaGFuayB5b3UnKSBwYWdlLiBUaGUgZXhwcmVzc2lvbiBzaG91bGQgcmV0dXJuIHRydWVcbiAgICogQHNlZSBleHByZXNzaW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJodG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJodG1sXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJodG1sXCIpO1xuICB9XG59XG5cbi8qKlxuICogQSBjbGFzcyB0aGF0IGNvbnRhaW5zIGV4cHJlc3Npb24gYW5kIHVybCBwcm9wZXRpZXMuIEl0IHVzZXMgaW4gc3VydmV5Lm5hdmlnYXRlVG9VcmxPbkNvbmRpdGlvbiBhcnJheS5cbiAqIElmIHRoZSBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSB0aGVuIHVybCBvZiB0aGlzIGl0ZW0gdXNlcyBpbnN0ZWFkIG9mIHN1cnZleS5uYXZpZ2F0ZVRvVXJsIHByb3BlcnR5XG4gKiBAc2VlIFN1cnZleU1vZGVsLm5hdmlnYXRlVG9VcmxcbiAqL1xuZXhwb3J0IGNsYXNzIFVybENvbmRpdGlvbkl0ZW0gZXh0ZW5kcyBFeHByZXNzaW9uSXRlbSB7XG4gIGNvbnN0cnVjdG9yKGV4cHJlc3Npb246IHN0cmluZyA9IG51bGwsIHVybDogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKGV4cHJlc3Npb24pO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ1cmxcIiwgdGhpcyk7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ1cmxjb25kaXRpb25pdGVtXCI7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB1cmwgdGhhdCBzdXJ2ZXkgbmF2aWdhdGVzIHRvIG9uIGNvbXBsZXRpbmcgdGhlIHN1cnZleS4gVGhlIGV4cHJlc3Npb24gc2hvdWxkIHJldHVybiB0cnVlXG4gICAqIEBzZWUgZXhwcmVzc2lvblxuICAgKi9cbiAgcHVibGljIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ1cmxcIik7XG4gIH1cbiAgcHVibGljIHNldCB1cmwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidXJsXCIsIHZhbHVlKTtcbiAgfVxuICBnZXQgbG9jVXJsKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInVybFwiKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImV4cHJlc3Npb25pdGVtXCIsXG4gIFtcImV4cHJlc3Npb246Y29uZGl0aW9uXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25JdGVtKCk7XG4gIH0sXG4gIFwiYmFzZVwiXG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImh0bWxjb25kaXRpb25pdGVtXCIsXG4gIFt7IG5hbWU6IFwiaHRtbDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NIdG1sXCIgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgSHRtbENvbmRpdGlvbkl0ZW0oKTtcbiAgfSxcbiAgXCJleHByZXNzaW9uaXRlbVwiXG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInVybGNvbmRpdGlvbml0ZW1cIixcbiAgW3sgbmFtZTogXCJ1cmw6c3RyaW5nXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NVcmxcIiB9XSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBVcmxDb25kaXRpb25JdGVtKCk7XG4gIH0sXG4gIFwiZXhwcmVzc2lvbml0ZW1cIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9leHByZXNzaW9uSXRlbXMudHMiLCIvLyB0c2xpbnQ6ZGlzYWJsZTpvbmx5LWFycm93LWZ1bmN0aW9uc1xuLy8gdHNsaW50OmRpc2FibGU6b2JqZWN0LWxpdGVyYWwtc2hvcnRoYW5kXG4vLyB0c2xpbnQ6ZGlzYWJsZTp0cmFpbGluZy1jb21tYVxuLy8gdHNsaW50OmRpc2FibGU6b2JqZWN0LWxpdGVyYWwtc29ydC1rZXlzXG4vLyB0c2xpbnQ6ZGlzYWJsZTpvbmUtdmFyaWFibGUtcGVyLWRlY2xhcmF0aW9uXG4vLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbi8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNlY3V0aXZlLWJsYW5rLWxpbmVzXG4vLyB0c2xpbnQ6ZGlzYWJsZTphbGlnblxuXG5cbi8vIEdlbmVyYXRlZCBieSBQRUcuanMgdi4gMC4xMC4wICh0cy1wZWdqcyBwbHVnaW4gdi4gMC4yLjYgKVxuLy9cbi8vIGh0dHBzOi8vcGVnanMub3JnLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS9tZXRhZGV2cHJvL3RzLXBlZ2pzXG5cblwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQge1xuQ29uc3QsXG5CaW5hcnlPcGVyYW5kLFxuVmFyaWFibGUsXG5PcGVyYW5kLFxuVW5hcnlPcGVyYW5kLFxuRnVuY3Rpb25PcGVyYW5kLFxuQXJyYXlPcGVyYW5kXG59IGZyb20gXCIuL2V4cHJlc3Npb25zXCI7XG5leHBvcnQgaW50ZXJmYWNlIElGaWxlUG9zaXRpb24ge1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgbGluZTogbnVtYmVyO1xuICBjb2x1bW46IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRmlsZVJhbmdlIHtcbiAgc3RhcnQ6IElGaWxlUG9zaXRpb247XG4gIGVuZDogSUZpbGVQb3NpdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTGl0ZXJhbEV4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJsaXRlcmFsXCI7XG4gIHRleHQ6IHN0cmluZztcbiAgaWdub3JlQ2FzZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2xhc3NQYXJ0cyBleHRlbmRzIEFycmF5PHN0cmluZyB8IElDbGFzc1BhcnRzPiB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIElDbGFzc0V4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJjbGFzc1wiO1xuICBwYXJ0czogSUNsYXNzUGFydHM7XG4gIGludmVydGVkOiBib29sZWFuO1xuICBpZ25vcmVDYXNlOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBbnlFeHBlY3RhdGlvbiB7XG4gIHR5cGU6IFwiYW55XCI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVuZEV4cGVjdGF0aW9uIHtcbiAgdHlwZTogXCJlbmRcIjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJT3RoZXJFeHBlY3RhdGlvbiB7XG4gIHR5cGU6IFwib3RoZXJcIjtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRXhwZWN0YXRpb24gPSBJTGl0ZXJhbEV4cGVjdGF0aW9uIHwgSUNsYXNzRXhwZWN0YXRpb24gfCBJQW55RXhwZWN0YXRpb24gfCBJRW5kRXhwZWN0YXRpb24gfCBJT3RoZXJFeHBlY3RhdGlvbjtcblxuZXhwb3J0IGNsYXNzIFN5bnRheEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgc3RhdGljIGJ1aWxkTWVzc2FnZShleHBlY3RlZDogRXhwZWN0YXRpb25bXSwgZm91bmQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICBmdW5jdGlvbiBoZXgoY2g6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXRlcmFsRXNjYXBlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gc1xuICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cIi9nLCAgXCJcXFxcXFxcIlwiKVxuICAgICAgICAucmVwbGFjZSgvXFwwL2csIFwiXFxcXDBcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcdC9nLCBcIlxcXFx0XCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csIFwiXFxcXHJcIilcbiAgICAgICAgLnJlcGxhY2UoL1tcXHgwMC1cXHgwRl0vZywgICAgICAgICAgICAoY2gpID0+IFwiXFxcXHgwXCIgKyBoZXgoY2gpIClcbiAgICAgICAgLnJlcGxhY2UoL1tcXHgxMC1cXHgxRlxceDdGLVxceDlGXS9nLCAoY2gpID0+IFwiXFxcXHhcIiAgKyBoZXgoY2gpICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xhc3NFc2NhcGUoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBzXG4gICAgICAgIC5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcXS9nLCBcIlxcXFxdXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXF4vZywgXCJcXFxcXlwiKVxuICAgICAgICAucmVwbGFjZSgvLS9nLCAgXCJcXFxcLVwiKVxuICAgICAgICAucmVwbGFjZSgvXFwwL2csIFwiXFxcXDBcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcdC9nLCBcIlxcXFx0XCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKVxuICAgICAgICAucmVwbGFjZSgvXFxyL2csIFwiXFxcXHJcIilcbiAgICAgICAgLnJlcGxhY2UoL1tcXHgwMC1cXHgwRl0vZywgICAgICAgICAgICAoY2gpID0+IFwiXFxcXHgwXCIgKyBoZXgoY2gpIClcbiAgICAgICAgLnJlcGxhY2UoL1tcXHgxMC1cXHgxRlxceDdGLVxceDlGXS9nLCAoY2gpID0+IFwiXFxcXHhcIiAgKyBoZXgoY2gpICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVzY3JpYmVFeHBlY3RhdGlvbihleHBlY3RhdGlvbjogRXhwZWN0YXRpb24pIHtcbiAgICAgIHN3aXRjaCAoZXhwZWN0YXRpb24udHlwZSkge1xuICAgICAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgICAgIHJldHVybiBcIlxcXCJcIiArIGxpdGVyYWxFc2NhcGUoZXhwZWN0YXRpb24udGV4dCkgKyBcIlxcXCJcIjtcbiAgICAgICAgY2FzZSBcImNsYXNzXCI6XG4gICAgICAgICAgY29uc3QgZXNjYXBlZFBhcnRzID0gZXhwZWN0YXRpb24ucGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShwYXJ0KVxuICAgICAgICAgICAgICA/IGNsYXNzRXNjYXBlKHBhcnRbMF0gYXMgc3RyaW5nKSArIFwiLVwiICsgY2xhc3NFc2NhcGUocGFydFsxXSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgIDogY2xhc3NFc2NhcGUocGFydCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gXCJbXCIgKyAoZXhwZWN0YXRpb24uaW52ZXJ0ZWQgPyBcIl5cIiA6IFwiXCIpICsgZXNjYXBlZFBhcnRzICsgXCJdXCI7XG4gICAgICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgICAgICByZXR1cm4gXCJhbnkgY2hhcmFjdGVyXCI7XG4gICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICByZXR1cm4gXCJlbmQgb2YgaW5wdXRcIjtcbiAgICAgICAgY2FzZSBcIm90aGVyXCI6XG4gICAgICAgICAgcmV0dXJuIGV4cGVjdGF0aW9uLmRlc2NyaXB0aW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlRXhwZWN0ZWQoZXhwZWN0ZWQxOiBFeHBlY3RhdGlvbltdKSB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbnMgPSBleHBlY3RlZDEubWFwKGRlc2NyaWJlRXhwZWN0YXRpb24pO1xuICAgICAgbGV0IGk6IG51bWJlcjtcbiAgICAgIGxldCBqOiBudW1iZXI7XG5cbiAgICAgIGRlc2NyaXB0aW9ucy5zb3J0KCk7XG5cbiAgICAgIGlmIChkZXNjcmlwdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGkgPSAxLCBqID0gMTsgaSA8IGRlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChkZXNjcmlwdGlvbnNbaSAtIDFdICE9PSBkZXNjcmlwdGlvbnNbaV0pIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uc1tqXSA9IGRlc2NyaXB0aW9uc1tpXTtcbiAgICAgICAgICAgIGorKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGVzY3JpcHRpb25zLmxlbmd0aCA9IGo7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGVzY3JpcHRpb25zLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uc1swXTtcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uc1swXSArIFwiIG9yIFwiICsgZGVzY3JpcHRpb25zWzFdO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9ucy5zbGljZSgwLCAtMSkuam9pbihcIiwgXCIpXG4gICAgICAgICAgICArIFwiLCBvciBcIlxuICAgICAgICAgICAgKyBkZXNjcmlwdGlvbnNbZGVzY3JpcHRpb25zLmxlbmd0aCAtIDFdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlRm91bmQoZm91bmQxOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICByZXR1cm4gZm91bmQxID8gXCJcXFwiXCIgKyBsaXRlcmFsRXNjYXBlKGZvdW5kMSkgKyBcIlxcXCJcIiA6IFwiZW5kIG9mIGlucHV0XCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiRXhwZWN0ZWQgXCIgKyBkZXNjcmliZUV4cGVjdGVkKGV4cGVjdGVkKSArIFwiIGJ1dCBcIiArIGRlc2NyaWJlRm91bmQoZm91bmQpICsgXCIgZm91bmQuXCI7XG4gIH1cblxuICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nO1xuICBwdWJsaWMgZXhwZWN0ZWQ6IEV4cGVjdGF0aW9uW107XG4gIHB1YmxpYyBmb3VuZDogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIGxvY2F0aW9uOiBJRmlsZVJhbmdlO1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgZXhwZWN0ZWQ6IEV4cGVjdGF0aW9uW10sIGZvdW5kOiBzdHJpbmcgfCBudWxsLCBsb2NhdGlvbjogSUZpbGVSYW5nZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7XG4gICAgdGhpcy5mb3VuZCA9IGZvdW5kO1xuICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICB0aGlzLm5hbWUgPSBcIlN5bnRheEVycm9yXCI7XG5cbiAgICBpZiAodHlwZW9mIChFcnJvciBhcyBhbnkpLmNhcHR1cmVTdGFja1RyYWNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIChFcnJvciBhcyBhbnkpLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIFN5bnRheEVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2FjaGVkIHtcbiAgbmV4dFBvczogbnVtYmVyO1xuICByZXN1bHQ6IGFueTtcbn1cblxuZnVuY3Rpb24gcGVnJHBhcnNlKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM/OiBJUGFyc2VPcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zICE9PSB1bmRlZmluZWQgPyBvcHRpb25zIDoge307XG5cbiAgY29uc3QgcGVnJEZBSUxFRDogUmVhZG9ubHk8e30+ID0ge307XG5cbiAgY29uc3QgcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uczoge1tpZDogc3RyaW5nXTogYW55fSA9IHsgRXhwcmVzc2lvbjogcGVnJHBhcnNlRXhwcmVzc2lvbiB9O1xuICBsZXQgcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uOiAoKSA9PiBhbnkgPSBwZWckcGFyc2VFeHByZXNzaW9uO1xuXG4gIGNvbnN0IHBlZyRjMCA9IGZ1bmN0aW9uKGhlYWQ6IGFueSwgdGFpbDogYW55KTogYW55IHtcbiAgICAgIHJldHVybiBidWlsZEJpbmFyeU9wZXJhbmQoaGVhZCwgdGFpbCwgdHJ1ZSk7XG4gICAgfTtcbiAgY29uc3QgcGVnJGMxID0gXCJ8fFwiO1xuICBjb25zdCBwZWckYzIgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwifHxcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzMgPSBcIm9yXCI7XG4gIGNvbnN0IHBlZyRjNCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJvclwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM1ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwib3JcIjsgfTtcbiAgY29uc3QgcGVnJGM2ID0gXCImJlwiO1xuICBjb25zdCBwZWckYzcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiJiZcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzggPSBcImFuZFwiO1xuICBjb25zdCBwZWckYzkgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiYW5kXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzEwID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiYW5kXCI7IH07XG4gIGNvbnN0IHBlZyRjMTEgPSBmdW5jdGlvbihoZWFkOiBhbnksIHRhaWw6IGFueSk6IGFueSB7XG4gICAgICByZXR1cm4gYnVpbGRCaW5hcnlPcGVyYW5kKGhlYWQsIHRhaWwpO1xuICAgIH07XG4gIGNvbnN0IHBlZyRjMTIgPSBcIjw9XCI7XG4gIGNvbnN0IHBlZyRjMTMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiPD1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE0ID0gXCJsZXNzb3JlcXVhbFwiO1xuICBjb25zdCBwZWckYzE1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImxlc3NvcmVxdWFsXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzE2ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwibGVzc29yZXF1YWxcIjsgfTtcbiAgY29uc3QgcGVnJGMxNyA9IFwiPj1cIjtcbiAgY29uc3QgcGVnJGMxOCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCI+PVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTkgPSBcImdyZWF0ZXJvcmVxdWFsXCI7XG4gIGNvbnN0IHBlZyRjMjAgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiZ3JlYXRlcm9yZXF1YWxcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMjEgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJncmVhdGVyb3JlcXVhbFwiOyB9O1xuICBjb25zdCBwZWckYzIyID0gXCI9XCI7XG4gIGNvbnN0IHBlZyRjMjMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiPVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMjQgPSBcImVxdWFsXCI7XG4gIGNvbnN0IHBlZyRjMjUgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiZXF1YWxcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMjYgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJlcXVhbFwiOyB9O1xuICBjb25zdCBwZWckYzI3ID0gXCIhPVwiO1xuICBjb25zdCBwZWckYzI4ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIiE9XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMyOSA9IFwibm90ZXF1YWxcIjtcbiAgY29uc3QgcGVnJGMzMCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJub3RlcXVhbFwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGMzMSA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm5vdGVxdWFsXCI7IH07XG4gIGNvbnN0IHBlZyRjMzIgPSBcIjxcIjtcbiAgY29uc3QgcGVnJGMzMyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCI8XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMzNCA9IFwibGVzc1wiO1xuICBjb25zdCBwZWckYzM1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImxlc3NcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMzYgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJsZXNzXCI7IH07XG4gIGNvbnN0IHBlZyRjMzcgPSBcIj5cIjtcbiAgY29uc3QgcGVnJGMzOCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCI+XCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMzOSA9IFwiZ3JlYXRlclwiO1xuICBjb25zdCBwZWckYzQwID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImdyZWF0ZXJcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNDEgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJncmVhdGVyXCI7IH07XG4gIGNvbnN0IHBlZyRjNDIgPSBcIitcIjtcbiAgY29uc3QgcGVnJGM0MyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIrXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM0NCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcInBsdXNcIjsgIH07XG4gIGNvbnN0IHBlZyRjNDUgPSBcIi1cIjtcbiAgY29uc3QgcGVnJGM0NiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCItXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM0NyA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm1pbnVzXCI7IH07XG4gIGNvbnN0IHBlZyRjNDggPSBcIipcIjtcbiAgY29uc3QgcGVnJGM0OSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIqXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM1MCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm11bFwiOyB9O1xuICBjb25zdCBwZWckYzUxID0gXCIvXCI7XG4gIGNvbnN0IHBlZyRjNTIgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiL1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjNTMgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCJkaXZcIjsgfTtcbiAgY29uc3QgcGVnJGM1NCA9IFwiJVwiO1xuICBjb25zdCBwZWckYzU1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIiVcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzU2ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwibW9kXCI7IH07XG4gIGNvbnN0IHBlZyRjNTcgPSBcIl5cIjtcbiAgY29uc3QgcGVnJGM1OCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJeXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGM1OSA9IFwicG93ZXJcIjtcbiAgY29uc3QgcGVnJGM2MCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJwb3dlclwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM2MSA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcInBvd2VyXCI7IH07XG4gIGNvbnN0IHBlZyRjNjIgPSBcIio9XCI7XG4gIGNvbnN0IHBlZyRjNjMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiKj1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzY0ID0gXCJjb250YWluc1wiO1xuICBjb25zdCBwZWckYzY1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImNvbnRhaW5zXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzY2ID0gXCJjb250YWluXCI7XG4gIGNvbnN0IHBlZyRjNjcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiY29udGFpblwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM2OCA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcImNvbnRhaW5zXCI7IH07XG4gIGNvbnN0IHBlZyRjNjkgPSBcIm5vdGNvbnRhaW5zXCI7XG4gIGNvbnN0IHBlZyRjNzAgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwibm90Y29udGFpbnNcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjNzEgPSBcIm5vdGNvbnRhaW5cIjtcbiAgY29uc3QgcGVnJGM3MiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJub3Rjb250YWluXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzczID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwibm90Y29udGFpbnNcIjsgfTtcbiAgY29uc3QgcGVnJGM3NCA9IFwiYW55b2ZcIjtcbiAgY29uc3QgcGVnJGM3NSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJhbnlvZlwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM3NiA9IGZ1bmN0aW9uKCk6IGFueSB7cmV0dXJuIFwiYW55b2ZcIjsgfTtcbiAgY29uc3QgcGVnJGM3NyA9IFwiYWxsb2ZcIjtcbiAgY29uc3QgcGVnJGM3OCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJhbGxvZlwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM3OSA9IGZ1bmN0aW9uKCk6IGFueSB7cmV0dXJuIFwiYWxsb2ZcIjsgfTtcbiAgY29uc3QgcGVnJGM4MCA9IFwiKFwiO1xuICBjb25zdCBwZWckYzgxID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIihcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzgyID0gXCIpXCI7XG4gIGNvbnN0IHBlZyRjODMgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiKVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjODQgPSBmdW5jdGlvbihleHByOiBhbnkpOiBhbnkgeyByZXR1cm4gZXhwcjsgfTtcbiAgY29uc3QgcGVnJGM4NSA9IGZ1bmN0aW9uKG5hbWU6IGFueSwgcGFyYW1zOiBhbnkpOiBhbnkgeyByZXR1cm4gbmV3IEZ1bmN0aW9uT3BlcmFuZChuYW1lLCBwYXJhbXMpOyB9O1xuICBjb25zdCBwZWckYzg2ID0gXCIhXCI7XG4gIGNvbnN0IHBlZyRjODcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiIVwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjODggPSBcIm5lZ2F0ZVwiO1xuICBjb25zdCBwZWckYzg5ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIm5lZ2F0ZVwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM5MCA9IGZ1bmN0aW9uKGV4cHI6IGFueSk6IGFueSB7IHJldHVybiBuZXcgVW5hcnlPcGVyYW5kKGV4cHIsIFwibmVnYXRlXCIpOyB9O1xuICBjb25zdCBwZWckYzkxID0gZnVuY3Rpb24oZXhwcjogYW55LCBvcDogYW55KTogYW55IHsgcmV0dXJuIG5ldyBVbmFyeU9wZXJhbmQoZXhwciwgb3ApOyB9O1xuICBjb25zdCBwZWckYzkyID0gXCJlbXB0eVwiO1xuICBjb25zdCBwZWckYzkzID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcImVtcHR5XCIsIHRydWUpO1xuICBjb25zdCBwZWckYzk0ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiZW1wdHlcIjsgfTtcbiAgY29uc3QgcGVnJGM5NSA9IFwibm90ZW1wdHlcIjtcbiAgY29uc3QgcGVnJGM5NiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJub3RlbXB0eVwiLCB0cnVlKTtcbiAgY29uc3QgcGVnJGM5NyA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBcIm5vdGVtcHR5XCI7IH07XG4gIGNvbnN0IHBlZyRjOTggPSBcInVuZGVmaW5lZFwiO1xuICBjb25zdCBwZWckYzk5ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcInVuZGVmaW5lZFwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTAwID0gXCJudWxsXCI7XG4gIGNvbnN0IHBlZyRjMTAxID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIm51bGxcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEwMiA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBudWxsOyB9O1xuICBjb25zdCBwZWckYzEwMyA9IGZ1bmN0aW9uKHZhbHVlOiBhbnkpOiBhbnkgeyByZXR1cm4gbmV3IENvbnN0KHZhbHVlKTsgfTtcbiAgY29uc3QgcGVnJGMxMDQgPSBcIntcIjtcbiAgY29uc3QgcGVnJGMxMDUgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwie1wiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTA2ID0gXCJ9XCI7XG4gIGNvbnN0IHBlZyRjMTA3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIn1cIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEwOCA9IGZ1bmN0aW9uKHZhbHVlOiBhbnkpOiBhbnkgeyByZXR1cm4gbmV3IFZhcmlhYmxlKHZhbHVlKTsgfTtcbiAgY29uc3QgcGVnJGMxMDkgPSBmdW5jdGlvbih2YWx1ZTogYW55KTogYW55IHsgcmV0dXJuIHZhbHVlOyB9O1xuICBjb25zdCBwZWckYzExMCA9IFwiJ1wiO1xuICBjb25zdCBwZWckYzExMSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCInXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMTIgPSBmdW5jdGlvbih2YWx1ZTogYW55KTogYW55IHsgcmV0dXJuIFwiJ1wiICsgdmFsdWUgKyBcIidcIjsgfTtcbiAgY29uc3QgcGVnJGMxMTMgPSBcIlxcXCJcIjtcbiAgY29uc3QgcGVnJGMxMTQgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiXFxcIlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTE1ID0gXCJbXCI7XG4gIGNvbnN0IHBlZyRjMTE2ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIltcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzExNyA9IFwiXVwiO1xuICBjb25zdCBwZWckYzExOCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJdXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMTkgPSBmdW5jdGlvbihzZXF1ZW5jZTogYW55KTogYW55IHsgcmV0dXJuIHNlcXVlbmNlOyB9O1xuICBjb25zdCBwZWckYzEyMCA9IFwiLFwiO1xuICBjb25zdCBwZWckYzEyMSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIsXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxMjIgPSBmdW5jdGlvbihleHByOiBhbnksIHRhaWw6IGFueSk6IGFueSB7XG4gICAgICBpZiAoZXhwciA9PSBudWxsKVxuICAgICAgICByZXR1cm4gbmV3IEFycmF5T3BlcmFuZChbXSk7XG5cbiAgICAgIHZhciBhcnJheSA9IFtleHByXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhaWwpKSB7XG4gICAgICAgIHZhciBmbGF0dGVuID0gZmxhdHRlbkFycmF5KHRhaWwpO1xuICAgICAgICBmb3IgKHZhciBpID0gMzsgaSA8IGZsYXR0ZW4ubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICBhcnJheS5wdXNoKGZsYXR0ZW5baV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQXJyYXlPcGVyYW5kKGFycmF5KTtcbiAgICB9O1xuICBjb25zdCBwZWckYzEyMyA9IFwidHJ1ZVwiO1xuICBjb25zdCBwZWckYzEyNCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJ0cnVlXCIsIHRydWUpO1xuICBjb25zdCBwZWckYzEyNSA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiB0cnVlOyB9O1xuICBjb25zdCBwZWckYzEyNiA9IFwiZmFsc2VcIjtcbiAgY29uc3QgcGVnJGMxMjcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiZmFsc2VcIiwgdHJ1ZSk7XG4gIGNvbnN0IHBlZyRjMTI4ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIGZhbHNlOyB9O1xuICBjb25zdCBwZWckYzEyOSA9IFwiMHhcIjtcbiAgY29uc3QgcGVnJGMxMzAgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiMHhcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEzMSA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiBwYXJzZUludCh0ZXh0KCksIDE2KTsgfTtcbiAgY29uc3QgcGVnJGMxMzIgPSAvXltcXC1dLztcbiAgY29uc3QgcGVnJGMxMzMgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCItXCJdLCBmYWxzZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzEzNCA9IGZ1bmN0aW9uKHNpZ246IGFueSwgbnVtOiBhbnkpOiBhbnkgeyByZXR1cm4gc2lnbiA9PSBudWxsID8gbnVtIDogLW51bTsgfTtcbiAgY29uc3QgcGVnJGMxMzUgPSBcIi5cIjtcbiAgY29uc3QgcGVnJGMxMzYgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiLlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTM3ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIHBhcnNlRmxvYXQodGV4dCgpKTsgfTtcbiAgY29uc3QgcGVnJGMxMzggPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gcGFyc2VJbnQodGV4dCgpLCAxMCk7IH07XG4gIGNvbnN0IHBlZyRjMTM5ID0gXCIwXCI7XG4gIGNvbnN0IHBlZyRjMTQwID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIjBcIiwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE0MSA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiAwOyB9O1xuICBjb25zdCBwZWckYzE0MiA9IGZ1bmN0aW9uKGNoYXJzOiBhbnkpOiBhbnkgeyByZXR1cm4gY2hhcnMuam9pbihcIlwiKTsgfTtcbiAgY29uc3QgcGVnJGMxNDMgPSBcIlxcXFwnXCI7XG4gIGNvbnN0IHBlZyRjMTQ0ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIlxcXFwnXCIsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNDUgPSBmdW5jdGlvbigpOiBhbnkgeyByZXR1cm4gXCInXCI7IH07XG4gIGNvbnN0IHBlZyRjMTQ2ID0gXCJcXFxcXFxcIlwiO1xuICBjb25zdCBwZWckYzE0NyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFxcXFxcIlwiLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTQ4ID0gZnVuY3Rpb24oKTogYW55IHsgcmV0dXJuIFwiXFxcIlwiOyB9O1xuICBjb25zdCBwZWckYzE0OSA9IC9eW15cIiddLztcbiAgY29uc3QgcGVnJGMxNTAgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCJcXFwiXCIsIFwiJ1wiXSwgdHJ1ZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE1MSA9IGZ1bmN0aW9uKCk6IGFueSB7IHJldHVybiB0ZXh0KCk7IH07XG4gIGNvbnN0IHBlZyRjMTUyID0gL15bXnt9XS87XG4gIGNvbnN0IHBlZyRjMTUzID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wie1wiLCBcIn1cIl0sIHRydWUsIGZhbHNlKTtcbiAgY29uc3QgcGVnJGMxNTQgPSAvXlswLTldLztcbiAgY29uc3QgcGVnJGMxNTUgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbW1wiMFwiLCBcIjlcIl1dLCBmYWxzZSwgZmFsc2UpO1xuICBjb25zdCBwZWckYzE1NiA9IC9eWzEtOV0vO1xuICBjb25zdCBwZWckYzE1NyA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtbXCIxXCIsIFwiOVwiXV0sIGZhbHNlLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTU4ID0gL15bYS16QS1aXS87XG4gIGNvbnN0IHBlZyRjMTU5ID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1tcImFcIiwgXCJ6XCJdLCBbXCJBXCIsIFwiWlwiXV0sIGZhbHNlLCBmYWxzZSk7XG4gIGNvbnN0IHBlZyRjMTYwID0gcGVnJG90aGVyRXhwZWN0YXRpb24oXCJ3aGl0ZXNwYWNlXCIpO1xuICBjb25zdCBwZWckYzE2MSA9IC9eWyBcXHRcXG5cXHJdLztcbiAgY29uc3QgcGVnJGMxNjIgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbXCIgXCIsIFwiXFx0XCIsIFwiXFxuXCIsIFwiXFxyXCJdLCBmYWxzZSwgZmFsc2UpO1xuXG4gIGxldCBwZWckY3VyclBvcyA9IDA7XG4gIGxldCBwZWckc2F2ZWRQb3MgPSAwO1xuICBjb25zdCBwZWckcG9zRGV0YWlsc0NhY2hlID0gW3sgbGluZTogMSwgY29sdW1uOiAxIH1dO1xuICBsZXQgcGVnJG1heEZhaWxQb3MgPSAwO1xuICBsZXQgcGVnJG1heEZhaWxFeHBlY3RlZDogRXhwZWN0YXRpb25bXSA9IFtdO1xuICBsZXQgcGVnJHNpbGVudEZhaWxzID0gMDtcblxuICBjb25zdCBwZWckcmVzdWx0c0NhY2hlOiB7W2lkOiBudW1iZXJdOiBJQ2FjaGVkfSA9IHt9O1xuXG4gIGxldCBwZWckcmVzdWx0O1xuXG4gIGlmIChvcHRpb25zLnN0YXJ0UnVsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCEob3B0aW9ucy5zdGFydFJ1bGUgaW4gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHN0YXJ0IHBhcnNpbmcgZnJvbSBydWxlIFxcXCJcIiArIG9wdGlvbnMuc3RhcnRSdWxlICsgXCJcXFwiLlwiKTtcbiAgICB9XG5cbiAgICBwZWckc3RhcnRSdWxlRnVuY3Rpb24gPSBwZWckc3RhcnRSdWxlRnVuY3Rpb25zW29wdGlvbnMuc3RhcnRSdWxlXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaW5wdXQuc3Vic3RyaW5nKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9jYXRpb24oKTogSUZpbGVSYW5nZSB7XG4gICAgcmV0dXJuIHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG4gIH1cblxuICBmdW5jdGlvbiBleHBlY3RlZChkZXNjcmlwdGlvbjogc3RyaW5nLCBsb2NhdGlvbjE/OiBJRmlsZVJhbmdlKSB7XG4gICAgbG9jYXRpb24xID0gbG9jYXRpb24xICE9PSB1bmRlZmluZWRcbiAgICAgID8gbG9jYXRpb24xXG4gICAgICA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyk7XG5cbiAgICB0aHJvdyBwZWckYnVpbGRTdHJ1Y3R1cmVkRXJyb3IoXG4gICAgICBbcGVnJG90aGVyRXhwZWN0YXRpb24oZGVzY3JpcHRpb24pXSxcbiAgICAgIGlucHV0LnN1YnN0cmluZyhwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKSxcbiAgICAgIGxvY2F0aW9uMVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGxvY2F0aW9uMT86IElGaWxlUmFuZ2UpIHtcbiAgICBsb2NhdGlvbjEgPSBsb2NhdGlvbjEgIT09IHVuZGVmaW5lZFxuICAgICAgPyBsb2NhdGlvbjFcbiAgICAgIDogcGVnJGNvbXB1dGVMb2NhdGlvbihwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKTtcblxuICAgIHRocm93IHBlZyRidWlsZFNpbXBsZUVycm9yKG1lc3NhZ2UsIGxvY2F0aW9uMSk7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKHRleHQxOiBzdHJpbmcsIGlnbm9yZUNhc2U6IGJvb2xlYW4pOiBJTGl0ZXJhbEV4cGVjdGF0aW9uIHtcbiAgICByZXR1cm4geyB0eXBlOiBcImxpdGVyYWxcIiwgdGV4dDogdGV4dDEsIGlnbm9yZUNhc2U6IGlnbm9yZUNhc2UgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRjbGFzc0V4cGVjdGF0aW9uKHBhcnRzOiBJQ2xhc3NQYXJ0cywgaW52ZXJ0ZWQ6IGJvb2xlYW4sIGlnbm9yZUNhc2U6IGJvb2xlYW4pOiBJQ2xhc3NFeHBlY3RhdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJjbGFzc1wiLCBwYXJ0czogcGFydHMsIGludmVydGVkOiBpbnZlcnRlZCwgaWdub3JlQ2FzZTogaWdub3JlQ2FzZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGFueUV4cGVjdGF0aW9uKCk6IElBbnlFeHBlY3RhdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJhbnlcIiB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGVuZEV4cGVjdGF0aW9uKCk6IElFbmRFeHBlY3RhdGlvbiB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJlbmRcIiB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJG90aGVyRXhwZWN0YXRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IElPdGhlckV4cGVjdGF0aW9uIHtcbiAgICByZXR1cm4geyB0eXBlOiBcIm90aGVyXCIsIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHBvczogbnVtYmVyKSB7XG4gICAgbGV0IGRldGFpbHMgPSBwZWckcG9zRGV0YWlsc0NhY2hlW3Bvc107XG4gICAgbGV0IHA7XG5cbiAgICBpZiAoZGV0YWlscykge1xuICAgICAgcmV0dXJuIGRldGFpbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAgPSBwb3MgLSAxO1xuICAgICAgd2hpbGUgKCFwZWckcG9zRGV0YWlsc0NhY2hlW3BdKSB7XG4gICAgICAgIHAtLTtcbiAgICAgIH1cblxuICAgICAgZGV0YWlscyA9IHBlZyRwb3NEZXRhaWxzQ2FjaGVbcF07XG4gICAgICBkZXRhaWxzID0ge1xuICAgICAgICBsaW5lOiBkZXRhaWxzLmxpbmUsXG4gICAgICAgIGNvbHVtbjogZGV0YWlscy5jb2x1bW5cbiAgICAgIH07XG5cbiAgICAgIHdoaWxlIChwIDwgcG9zKSB7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHApID09PSAxMCkge1xuICAgICAgICAgIGRldGFpbHMubGluZSsrO1xuICAgICAgICAgIGRldGFpbHMuY29sdW1uID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXRhaWxzLmNvbHVtbisrO1xuICAgICAgICB9XG5cbiAgICAgICAgcCsrO1xuICAgICAgfVxuXG4gICAgICBwZWckcG9zRGV0YWlsc0NhY2hlW3Bvc10gPSBkZXRhaWxzO1xuXG4gICAgICByZXR1cm4gZGV0YWlscztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwZWckY29tcHV0ZUxvY2F0aW9uKHN0YXJ0UG9zOiBudW1iZXIsIGVuZFBvczogbnVtYmVyKTogSUZpbGVSYW5nZSB7XG4gICAgY29uc3Qgc3RhcnRQb3NEZXRhaWxzID0gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHN0YXJ0UG9zKTtcbiAgICBjb25zdCBlbmRQb3NEZXRhaWxzID0gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKGVuZFBvcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgb2Zmc2V0OiBzdGFydFBvcyxcbiAgICAgICAgbGluZTogc3RhcnRQb3NEZXRhaWxzLmxpbmUsXG4gICAgICAgIGNvbHVtbjogc3RhcnRQb3NEZXRhaWxzLmNvbHVtblxuICAgICAgfSxcbiAgICAgIGVuZDoge1xuICAgICAgICBvZmZzZXQ6IGVuZFBvcyxcbiAgICAgICAgbGluZTogZW5kUG9zRGV0YWlscy5saW5lLFxuICAgICAgICBjb2x1bW46IGVuZFBvc0RldGFpbHMuY29sdW1uXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRmYWlsKGV4cGVjdGVkMTogRXhwZWN0YXRpb24pIHtcbiAgICBpZiAocGVnJGN1cnJQb3MgPCBwZWckbWF4RmFpbFBvcykgeyByZXR1cm47IH1cblxuICAgIGlmIChwZWckY3VyclBvcyA+IHBlZyRtYXhGYWlsUG9zKSB7XG4gICAgICBwZWckbWF4RmFpbFBvcyA9IHBlZyRjdXJyUG9zO1xuICAgICAgcGVnJG1heEZhaWxFeHBlY3RlZCA9IFtdO1xuICAgIH1cblxuICAgIHBlZyRtYXhGYWlsRXhwZWN0ZWQucHVzaChleHBlY3RlZDEpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGJ1aWxkU2ltcGxlRXJyb3IobWVzc2FnZTogc3RyaW5nLCBsb2NhdGlvbjE6IElGaWxlUmFuZ2UpIHtcbiAgICByZXR1cm4gbmV3IFN5bnRheEVycm9yKG1lc3NhZ2UsIFtdLCBcIlwiLCBsb2NhdGlvbjEpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGJ1aWxkU3RydWN0dXJlZEVycm9yKGV4cGVjdGVkMTogRXhwZWN0YXRpb25bXSwgZm91bmQ6IHN0cmluZyB8IG51bGwsIGxvY2F0aW9uMTogSUZpbGVSYW5nZSkge1xuICAgIHJldHVybiBuZXcgU3ludGF4RXJyb3IoXG4gICAgICBTeW50YXhFcnJvci5idWlsZE1lc3NhZ2UoZXhwZWN0ZWQxLCBmb3VuZCksXG4gICAgICBleHBlY3RlZDEsXG4gICAgICBmb3VuZCxcbiAgICAgIGxvY2F0aW9uMVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VFeHByZXNzaW9uKCk6IE9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDA7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZV8oKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlTG9naWNPcigpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gW107XG4gICAgICAgIHM0ID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM1ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNiA9IHBlZyRwYXJzZU9yU2lnbigpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczggPSBwZWckcGFyc2VMb2dpY09yKCk7XG4gICAgICAgICAgICAgIGlmIChzOCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM1ID0gW3M1LCBzNiwgczcsIHM4XTtcbiAgICAgICAgICAgICAgICBzNCA9IHM1O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzLnB1c2goczQpO1xuICAgICAgICAgIHM0ID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZU9yU2lnbigpO1xuICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzOCA9IHBlZyRwYXJzZUxvZ2ljT3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoczggIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIHM1ID0gW3M1LCBzNiwgczcsIHM4XTtcbiAgICAgICAgICAgICAgICAgIHM0ID0gczU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM0O1xuICAgICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjMChzMiwgczMpO1xuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VPclNpZ24oKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMxKSB7XG4gICAgICBzMSA9IHBlZyRjMTtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyKTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMykge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMik7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0KTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzUoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUxvZ2ljT3IoKTogQmluYXJ5T3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VMb2dpY0FuZCgpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZUFuZFNpZ24oKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUxvZ2ljQW5kKCk7XG4gICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VBbmRTaWduKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUxvZ2ljQW5kKCk7XG4gICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMwKHMxLCBzMik7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQW5kU2lnbigpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMztcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzYpIHtcbiAgICAgIHMxID0gcGVnJGM2O1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzcpOyB9XG4gICAgfVxuICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMykudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM4KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAzKTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gMztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzkpOyB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTAoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUxvZ2ljQW5kKCk6IEJpbmFyeU9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgNDtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlQ29tcE9wcygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZUNvbXBhcmFibGVPcGVyYXRvcnMoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUNvbXBPcHMoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZUNvbXBhcmFibGVPcGVyYXRvcnMoKTtcbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlQ29tcE9wcygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTEoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VDb21wYXJhYmxlT3BlcmF0b3JzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA1O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTIpIHtcbiAgICAgIHMxID0gcGVnJGMxMjtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMyk7IH1cbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAxMSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGMxNCkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTEpO1xuICAgICAgICBwZWckY3VyclBvcyArPSAxMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1KTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzE2KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTcpIHtcbiAgICAgICAgczEgPSBwZWckYzE3O1xuICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTgpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTQpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMTkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTQpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDE0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjApOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzIxKCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNjEpIHtcbiAgICAgICAgICBzMSA9IHBlZyRjMjI7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzIzKTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMjQpIHtcbiAgICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyNSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzI2KCk7XG4gICAgICAgIH1cbiAgICAgICAgczAgPSBzMTtcbiAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGMyNykge1xuICAgICAgICAgICAgczEgPSBwZWckYzI3O1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzI4KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMjkpIHtcbiAgICAgICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpO1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSA4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMzApOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjMzEoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDYwKSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGMzMjtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzMzKTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDQpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjMzQpIHtcbiAgICAgICAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCk7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzM1KTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGMzNigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDYyKSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzM3O1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzOCk7IH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA3KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzM5KSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNyk7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSA3O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDApOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGM0MSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQ29tcE9wcygpOiBCaW5hcnlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDY7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZVBsdXNNaW51c09wcygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VQbHVzTWludXNPcHMoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZVBsdXNNaW51c09wcygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMChzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVBsdXNNaW51c1NpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA3O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Mykge1xuICAgICAgczEgPSBwZWckYzQyO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQzKTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzQ0KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NSkge1xuICAgICAgICBzMSA9IHBlZyRjNDU7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0Nik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzQ3KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZVBsdXNNaW51c09wcygpOiBCaW5hcnlPcGVyYW5kIHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDg7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZU11bERpdk9wcygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZU11bERpdlNpZ25zKCk7XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczcgPSBwZWckcGFyc2VNdWxEaXZPcHMoKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZU11bERpdlNpZ25zKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZU11bERpdk9wcygpO1xuICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMChzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZU11bERpdlNpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyA5O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Mikge1xuICAgICAgczEgPSBwZWckYzQ4O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQ5KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzUwKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Nykge1xuICAgICAgICBzMSA9IHBlZyRjNTE7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1Mik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzUzKCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzcpIHtcbiAgICAgICAgICBzMSA9IHBlZyRjNTQ7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzU1KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM1NigpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlTXVsRGl2T3BzKCk6IEJpbmFyeU9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTA7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUJpbmFyeUZ1bmNPcCgpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNSA9IHBlZyRwYXJzZVBvd2VyU2lnbnMoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUJpbmFyeUZ1bmNPcCgpO1xuICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMi5wdXNoKHMzKTtcbiAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlUG93ZXJTaWducygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VCaW5hcnlGdW5jT3AoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzAoczEsIHMyKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VQb3dlclNpZ25zKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxMTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gOTQpIHtcbiAgICAgIHMxID0gcGVnJGM1NztcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1OCk7IH1cbiAgICB9XG4gICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzU5KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA1KTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzYwKTsgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzYxKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VCaW5hcnlGdW5jT3AoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDEyO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VGYWN0b3IoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gW107XG4gICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBwZWckcGFyc2VCaW5GdW5jdGlvbnMoKTtcbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUZhY3RvcigpO1xuICAgICAgICAgICAgaWYgKHM3ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM3ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZUJpbkZ1bmN0aW9ucygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VGYWN0b3IoKTtcbiAgICAgICAgICAgICAgaWYgKHM3ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczcgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxMShzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUJpbkZ1bmN0aW9ucygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTM7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM2Mikge1xuICAgICAgczEgPSBwZWckYzYyO1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzYzKTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNjQpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDgpO1xuICAgICAgICBwZWckY3VyclBvcyArPSA4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNjUpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNykudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM2Nikge1xuICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA3KTtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSA3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNjcpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGM2OCgpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDExKS50b0xvd2VyQ2FzZSgpID09PSBwZWckYzY5KSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAxMSk7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDExO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNzApOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTApLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNzEpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMTApO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDEwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNzIpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzczKCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjNzQpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzc1KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM3NigpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM3Nykge1xuICAgICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpO1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzc4KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzc5KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VGYWN0b3IoKTogT3BlcmFuZCB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczU7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTQ7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQwKSB7XG4gICAgICBzMSA9IHBlZyRjODA7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjODEpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0MSkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRjODI7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4Myk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzNSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGM4NChzMyk7XG4gICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckcGFyc2VGdW5jdGlvbk9wKCk7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckcGFyc2VVbmFyeUZ1bmN0aW9uT3AoKTtcbiAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBwZWckcGFyc2VBdG9tKCk7XG4gICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMCA9IHBlZyRwYXJzZUFycmF5T3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VGdW5jdGlvbk9wKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNDtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAxNTtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlTGV0dGVyc0FuZERpZ2l0cygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0MCkge1xuICAgICAgICBzMiA9IHBlZyRjODA7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4MSk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZVNlcXVlbmNlKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDEpIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJGM4MjtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4Myk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM0ID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjODUoczEsIHMzKTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlVW5hcnlGdW5jdGlvbk9wKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE2O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzMykge1xuICAgICAgczEgPSBwZWckYzg2O1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzg3KTsgfVxuICAgIH1cbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpLnRvTG93ZXJDYXNlKCkgPT09IHBlZyRjODgpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpO1xuICAgICAgICBwZWckY3VyclBvcyArPSA2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjODkpOyB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM5MChzMyk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IHBlZyRwYXJzZUF0b20oKTtcbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSBwZWckcGFyc2VVbkZ1bmN0aW9ucygpO1xuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjOTEoczEsIHMzKTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlVW5GdW5jdGlvbnMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE3O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM5Mikge1xuICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpO1xuICAgICAgcGVnJGN1cnJQb3MgKz0gNTtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzkzKTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzk0KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgOCkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGM5NSkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgOCk7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM5Nik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzk3KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUF0b20oKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczMsIHM0O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDE4O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VfKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA5KSA9PT0gcGVnJGM5OCkge1xuICAgICAgICBzMiA9IHBlZyRjOTg7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM5OSk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KSA9PT0gcGVnJGMxMDApIHtcbiAgICAgICAgICBzMiA9IHBlZyRjMTAwO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMDEpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEwMigpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZUNvbnN0VmFsdWUoKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzEwMyhzMik7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHMxID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEyMykge1xuICAgICAgICAgICAgczIgPSBwZWckYzEwNDtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMDUpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczMgPSBwZWckcGFyc2VWYWx1ZUlucHV0KCk7XG4gICAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICBzNCA9IHBlZyRjMTA2O1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMDcpOyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzEwOChzMyk7XG4gICAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUNvbnN0VmFsdWUoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczM7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMTk7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUxvZ2ljVmFsdWUoKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzEwOShzMSk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckcGFyc2VBcml0aG1ldGljVmFsdWUoKTtcbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEwOShzMSk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHMxID0gcGVnJHBhcnNlTGV0dGVyc0FuZERpZ2l0cygpO1xuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTA5KHMxKTtcbiAgICAgICAgfVxuICAgICAgICBzMCA9IHMxO1xuICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzkpIHtcbiAgICAgICAgICAgIHMxID0gcGVnJGMxMTA7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTExKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMyID0gcGVnJHBhcnNlQW55SW5wdXQoKTtcbiAgICAgICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDM5KSB7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckYzExMDtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTExKTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGMxMTIoczIpO1xuICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzNCkge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjMTEzO1xuICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTE0KTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHMyID0gcGVnJHBhcnNlQW55SW5wdXQoKTtcbiAgICAgICAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzNCkge1xuICAgICAgICAgICAgICAgICAgczMgPSBwZWckYzExMztcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMTQpOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMTEyKHMyKTtcbiAgICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlQXJyYXlPcCgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMztcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyMDtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gOTEpIHtcbiAgICAgIHMxID0gcGVnJGMxMTU7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTE2KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlU2VxdWVuY2UoKTtcbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDkzKSB7XG4gICAgICAgICAgczMgPSBwZWckYzExNztcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTE4KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxMTkoczIpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VTZXF1ZW5jZSgpOiBBcnJheU9wZXJhbmQge1xuICAgIGxldCBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjE7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZUV4cHJlc3Npb24oKTtcbiAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRjMTIwO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMjEpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICBzNSA9IHBlZyRjMTIwO1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEyMSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZUV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEyMihzMSwgczIpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUxvZ2ljVmFsdWUoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDIyO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGMxMjMpIHtcbiAgICAgIHMxID0gaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KTtcbiAgICAgIHBlZyRjdXJyUG9zICs9IDQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMjQpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTI1KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNSkudG9Mb3dlckNhc2UoKSA9PT0gcGVnJGMxMjYpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDUpO1xuICAgICAgICBwZWckY3VyclBvcyArPSA1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTI3KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTI4KCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUFyaXRobWV0aWNWYWx1ZSgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDIzO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTI5KSB7XG4gICAgICBzMSA9IHBlZyRjMTI5O1xuICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEzMCk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMTMxKCk7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChwZWckYzEzMi50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEzMyk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMSA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VOdW1iZXIoKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzEzNChzMSwgczIpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VOdW1iZXIoKTogYW55IHtcbiAgICBsZXQgczAsIHMxLCBzMiwgczM7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjQ7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0Nikge1xuICAgICAgICBzMiA9IHBlZyRjMTM1O1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTM2KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMxMzcoKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gcGVnJHBhcnNlTm9uWmVyb0RpZ2l0cygpO1xuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgICAgIGlmIChzMiA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTM4KCk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDgpIHtcbiAgICAgICAgICBzMSA9IHBlZyRjMTM5O1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNDApOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzE0MSgpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlVmFsdWVJbnB1dCgpOiBhbnkge1xuICAgIGxldCBzMCwgczEsIHMyO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI1O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBbXTtcbiAgICBzMiA9IHBlZyRwYXJzZVZhbHVlQ2hhcmFjdGVycygpO1xuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZVZhbHVlQ2hhcmFjdGVycygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTQyKHMxKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZUFueUlucHV0KCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczI7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMjY7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IFtdO1xuICAgIHMyID0gcGVnJHBhcnNlQW55Q2hhcmFjdGVycygpO1xuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZUFueUNoYXJhY3RlcnMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzE0MihzMSk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VBbnlDaGFyYWN0ZXJzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAyNztcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzE0Mykge1xuICAgICAgczEgPSBwZWckYzE0MztcbiAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNDQpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTQ1KCk7XG4gICAgfVxuICAgIHMwID0gczE7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjMTQ2KSB7XG4gICAgICAgIHMxID0gcGVnJGMxNDY7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNDcpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxNDgoKTtcbiAgICAgIH1cbiAgICAgIHMwID0gczE7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgaWYgKHBlZyRjMTQ5LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1MCk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMTUxKCk7XG4gICAgICAgIH1cbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VWYWx1ZUNoYXJhY3RlcnMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI4O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKHBlZyRjMTUyLnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNTMpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMTUxKCk7XG4gICAgfVxuICAgIHMwID0gczE7XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VMZXR0ZXJzQW5kRGlnaXRzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2O1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDI5O1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VMZXR0ZXJzKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IFtdO1xuICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgIHM0ID0gcGVnJHBhcnNlRGlnaXRzKCk7XG4gICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczUgPSBbXTtcbiAgICAgICAgczYgPSBwZWckcGFyc2VMZXR0ZXJzKCk7XG4gICAgICAgIHdoaWxlIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1LnB1c2goczYpO1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlTGV0dGVycygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gW3M0LCBzNV07XG4gICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZURpZ2l0cygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IFtdO1xuICAgICAgICAgIHM2ID0gcGVnJHBhcnNlTGV0dGVycygpO1xuICAgICAgICAgIHdoaWxlIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczUucHVzaChzNik7XG4gICAgICAgICAgICBzNiA9IHBlZyRwYXJzZUxldHRlcnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IFtzNCwgczVdO1xuICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzE1MSgpO1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZURpZ2l0cygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMzA7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgczAgPSBbXTtcbiAgICBpZiAocGVnJGMxNTQudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1NSk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICB3aGlsZSAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAucHVzaChzMSk7XG4gICAgICAgIGlmIChwZWckYzE1NC50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNTUpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZU5vblplcm9EaWdpdHMoKTogYW55IHtcbiAgICBsZXQgczAsIHMxO1xuXG4gICAgY29uc3Qga2V5ID0gcGVnJGN1cnJQb3MgKiAzNCArIDMxO1xuICAgIGNvbnN0IGNhY2hlZDogSUNhY2hlZCA9IHBlZyRyZXN1bHRzQ2FjaGVba2V5XTtcblxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gY2FjaGVkLm5leHRQb3M7XG5cbiAgICAgIHJldHVybiBjYWNoZWQucmVzdWx0O1xuICAgIH1cblxuICAgIHMwID0gW107XG4gICAgaWYgKHBlZyRjMTU2LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNTcpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwLnB1c2goczEpO1xuICAgICAgICBpZiAocGVnJGMxNTYudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTU3KTsgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICBwZWckcmVzdWx0c0NhY2hlW2tleV0gPSB7IG5leHRQb3M6IHBlZyRjdXJyUG9zLCByZXN1bHQ6IHMwIH07XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VMZXR0ZXJzKCk6IGFueSB7XG4gICAgbGV0IHMwLCBzMTtcblxuICAgIGNvbnN0IGtleSA9IHBlZyRjdXJyUG9zICogMzQgKyAzMjtcbiAgICBjb25zdCBjYWNoZWQ6IElDYWNoZWQgPSBwZWckcmVzdWx0c0NhY2hlW2tleV07XG5cbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBwZWckY3VyclBvcyA9IGNhY2hlZC5uZXh0UG9zO1xuXG4gICAgICByZXR1cm4gY2FjaGVkLnJlc3VsdDtcbiAgICB9XG5cbiAgICBzMCA9IFtdO1xuICAgIGlmIChwZWckYzE1OC50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTU5KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHdoaWxlIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMC5wdXNoKHMxKTtcbiAgICAgICAgaWYgKHBlZyRjMTU4LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1OSk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdHNDYWNoZVtrZXldID0geyBuZXh0UG9zOiBwZWckY3VyclBvcywgcmVzdWx0OiBzMCB9O1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlXygpOiBhbnkge1xuICAgIGxldCBzMCwgczE7XG5cbiAgICBjb25zdCBrZXkgPSBwZWckY3VyclBvcyAqIDM0ICsgMzM7XG4gICAgY29uc3QgY2FjaGVkOiBJQ2FjaGVkID0gcGVnJHJlc3VsdHNDYWNoZVtrZXldO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcGVnJGN1cnJQb3MgPSBjYWNoZWQubmV4dFBvcztcblxuICAgICAgcmV0dXJuIGNhY2hlZC5yZXN1bHQ7XG4gICAgfVxuXG4gICAgcGVnJHNpbGVudEZhaWxzKys7XG4gICAgczAgPSBbXTtcbiAgICBpZiAocGVnJGMxNjEudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczEgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2Mik7IH1cbiAgICB9XG4gICAgd2hpbGUgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMC5wdXNoKHMxKTtcbiAgICAgIGlmIChwZWckYzE2MS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2Mik7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgcGVnJHNpbGVudEZhaWxzLS07XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTYwKTsgfVxuICAgIH1cblxuICAgIHBlZyRyZXN1bHRzQ2FjaGVba2V5XSA9IHsgbmV4dFBvczogcGVnJGN1cnJQb3MsIHJlc3VsdDogczAgfTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG5cbiAgICBmdW5jdGlvbiBidWlsZEJpbmFyeU9wZXJhbmQoaGVhZDogT3BlcmFuZCwgdGFpbDogQXJyYXk8YW55PiwgaXNBcml0aG1ldGljT3A6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRhaWwucmVkdWNlKFxuICAgICAgICBmdW5jdGlvbihyZXN1bHQsIGVsZW1lbnRzKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBCaW5hcnlPcGVyYW5kKGVsZW1lbnRzWzFdLCByZXN1bHQsIGVsZW1lbnRzWzNdLCBpc0FyaXRobWV0aWNPcCk7XG4gICAgICAgIH0sIFxuICAgICAgICBoZWFkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmbGF0dGVuQXJyYXkoYXJyYXk6IEFycmF5PGFueT4pOiBBcnJheTxhbnk+IHtcbiAgICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGFycmF5KTtcbiAgICB9XG5cblxuICBwZWckcmVzdWx0ID0gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uKCk7XG5cbiAgaWYgKHBlZyRyZXN1bHQgIT09IHBlZyRGQUlMRUQgJiYgcGVnJGN1cnJQb3MgPT09IGlucHV0Lmxlbmd0aCkge1xuICAgIHJldHVybiBwZWckcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIGlmIChwZWckcmVzdWx0ICE9PSBwZWckRkFJTEVEICYmIHBlZyRjdXJyUG9zIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICBwZWckZmFpbChwZWckZW5kRXhwZWN0YXRpb24oKSk7XG4gICAgfVxuXG4gICAgdGhyb3cgcGVnJGJ1aWxkU3RydWN0dXJlZEVycm9yKFxuICAgICAgcGVnJG1heEZhaWxFeHBlY3RlZCxcbiAgICAgIHBlZyRtYXhGYWlsUG9zIDwgaW5wdXQubGVuZ3RoID8gaW5wdXQuY2hhckF0KHBlZyRtYXhGYWlsUG9zKSA6IG51bGwsXG4gICAgICBwZWckbWF4RmFpbFBvcyA8IGlucHV0Lmxlbmd0aFxuICAgICAgICA/IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJG1heEZhaWxQb3MsIHBlZyRtYXhGYWlsUG9zICsgMSlcbiAgICAgICAgOiBwZWckY29tcHV0ZUxvY2F0aW9uKHBlZyRtYXhGYWlsUG9zLCBwZWckbWF4RmFpbFBvcylcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBhcnNlT3B0aW9ucyB7XG4gIGZpbGVuYW1lPzogc3RyaW5nO1xuICBzdGFydFJ1bGU/OiBzdHJpbmc7XG4gIHRyYWNlcj86IGFueTtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuZXhwb3J0IHR5cGUgUGFyc2VGdW5jdGlvbiA9IChpbnB1dDogc3RyaW5nLCBvcHRpb25zPzogSVBhcnNlT3B0aW9ucykgPT4gYW55O1xuZXhwb3J0IGNvbnN0IHBhcnNlOiBQYXJzZUZ1bmN0aW9uID0gcGVnJHBhcnNlO1xuXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXhwcmVzc2lvbnMvZXhwcmVzc2lvblBhcnNlci50cyIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBJRWxlbWVudCwgSVF1ZXN0aW9uIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCIuL3BhbmVsXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5cbi8qKlxuICogVGhlIGZsb3cgcGFuZWwgb2JqZWN0LiBJdCBpcyBhIGNvbnRhaW5lciB3aXRoIGZsb3cgbGF5b3V0IHdoZXJlIHlvdSBjYW4gbWl4IHF1ZXN0aW9ucyB3aXRoIG1hcmRvd24gdGV4dC5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBGbG93UGFuZWxNb2RlbCBleHRlbmRzIFBhbmVsTW9kZWwge1xuICBzdGF0aWMgY29udGVudEVsZW1lbnROYW1lUHJlZml4ID0gXCJlbGVtZW50OlwiO1xuICBwdWJsaWMgY29udGVudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgcHVibGljIG9uR2V0SHRtbEZvclF1ZXN0aW9uOiAocXVlc3Rpb246IFF1ZXN0aW9uKSA9PiBzdHJpbmc7XG4gIHB1YmxpYyBvbkN1c3RvbUh0bWxQcm9kdWNpbmc6ICgpID0+IHN0cmluZztcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb250ZW50XCIsIHRoaXMsIHRydWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiY29udGVudFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLm9uQ29udGVudENoYW5nZWQoKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZsb3dwYW5lbFwiO1xuICB9XG4gIGdldENoaWxkcmVuTGF5b3V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZsb3dcIjtcbiAgfVxuICBvblN1cnZleUxvYWQoKTogYW55IHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICB0aGlzLm9uQ29udGVudENoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNvbnRlbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb250ZW50XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29udGVudCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29udGVudFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jQ29udGVudCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb250ZW50XCIpO1xuICB9XG4gIHB1YmxpYyBnZXQgaHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJodG1sXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaHRtbCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImh0bWxcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Db250ZW50Q2hhbmdlZCgpOiBhbnkge1xuICAgIHZhciBodG1sID0gXCJcIjtcbiAgICBpZiAoISF0aGlzLm9uQ3VzdG9tSHRtbFByb2R1Y2luZykge1xuICAgICAgaHRtbCA9IHRoaXMub25DdXN0b21IdG1sUHJvZHVjaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh0bWwgPSB0aGlzLnByb2R1Y2VIdG1sKCk7XG4gICAgfVxuICAgIHRoaXMuaHRtbCA9IGh0bWw7XG4gICAgaWYgKCEhdGhpcy5jb250ZW50Q2hhbmdlZENhbGxiYWNrKSB0aGlzLmNvbnRlbnRDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgfVxuICBwdWJsaWMgcHJvZHVjZUh0bWwoKTogc3RyaW5nIHtcbiAgICB2YXIgaHRtbCA9IFtdO1xuICAgIC8vY29udGVudEVsZW1lbnROYW1lUHJlZml4XG4gICAgdmFyIHJlZ0V4ID0gL3soLio/KGVsZW1lbnQ6KVteJF0uKj8pfS9nO1xuICAgIHZhciBzdHIgPSB0aGlzLmNvbnRlbnQ7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSAwO1xuICAgIHZhciByZXMgPSBudWxsO1xuICAgIHdoaWxlICgocmVzID0gcmVnRXguZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHJlcy5pbmRleCA+IHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgaHRtbC5wdXNoKHN0ci5zdWJzdHIoc3RhcnRJbmRleCwgcmVzLmluZGV4IC0gc3RhcnRJbmRleCkpO1xuICAgICAgICBzdGFydEluZGV4ID0gcmVzLmluZGV4O1xuICAgICAgfVxuICAgICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkZyb21UZXh0KHJlc1swXSk7XG4gICAgICBpZiAoISFxdWVzdGlvbikge1xuICAgICAgICBodG1sLnB1c2godGhpcy5nZXRIdG1sRm9yUXVlc3Rpb24ocXVlc3Rpb24pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0bWwucHVzaChcbiAgICAgICAgICBzdHIuc3Vic3RyKHN0YXJ0SW5kZXgsIHJlcy5pbmRleCArIHJlc1swXS5sZW5ndGggLSBzdGFydEluZGV4KVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc3RhcnRJbmRleCA9IHJlcy5pbmRleCArIHJlc1swXS5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChzdGFydEluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgICAgaHRtbC5wdXNoKHN0ci5zdWJzdHIoc3RhcnRJbmRleCwgc3RyLmxlbmd0aCAtIHN0YXJ0SW5kZXgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWwuam9pbihcIlwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCI8YnI+XCIsIFwiZ1wiKSwgXCI8YnIvPlwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25Gcm9tVGV4dChzdHI6IHN0cmluZyk6IFF1ZXN0aW9uIHtcbiAgICBzdHIgPSBzdHIuc3Vic3RyKDEsIHN0ci5sZW5ndGggLSAyKTtcbiAgICBzdHIgPSBzdHIucmVwbGFjZShGbG93UGFuZWxNb2RlbC5jb250ZW50RWxlbWVudE5hbWVQcmVmaXgsIFwiXCIpLnRyaW0oKTtcbiAgICByZXR1cm4gdGhpcy5nZXRRdWVzdGlvbkJ5TmFtZShzdHIpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRIdG1sRm9yUXVlc3Rpb24ocXVlc3Rpb246IFF1ZXN0aW9uKTogc3RyaW5nIHtcbiAgICBpZiAoISF0aGlzLm9uR2V0SHRtbEZvclF1ZXN0aW9uKSByZXR1cm4gdGhpcy5vbkdldEh0bWxGb3JRdWVzdGlvbihxdWVzdGlvbik7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFF1ZXN0aW9uSHRtbElkKHF1ZXN0aW9uOiBRdWVzdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZSArIFwiX1wiICsgcXVlc3Rpb24uaWQ7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIHN1cGVyLm9uQWRkRWxlbWVudChlbGVtZW50LCBpbmRleCk7XG4gICAgdGhpcy5hZGRFbGVtZW50VG9Db250ZW50KGVsZW1lbnQpO1xuICAgIGVsZW1lbnQucmVuZGVyV2lkdGggPSBcIlwiO1xuICB9XG4gIHByb3RlY3RlZCBvblJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpIHtcbiAgICB2YXIgc2VhcmNoU3RyID0gdGhpcy5nZXRFbGVtZW50Q29udGVudFRleHQoZWxlbWVudCk7XG4gICAgdGhpcy5jb250ZW50ID0gdGhpcy5jb250ZW50LnJlcGxhY2Uoc2VhcmNoU3RyLCBcIlwiKTtcbiAgICBzdXBlci5vblJlbW92ZUVsZW1lbnQoZWxlbWVudCk7XG4gIH1cbiAgZHJhZ0Ryb3BNb3ZlRWxlbWVudChzcmM6IElFbGVtZW50LCB0YXJnZXQ6IElFbGVtZW50LCB0YXJnZXRJbmRleDogbnVtYmVyKSB7fVxuICBwcml2YXRlIGFkZEVsZW1lbnRUb0NvbnRlbnQoZWxlbWVudDogSUVsZW1lbnQpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHZhciB0ZXh0ID0gdGhpcy5nZXRFbGVtZW50Q29udGVudFRleHQoZWxlbWVudCk7XG4gICAgaWYgKCF0aGlzLmluc2VydFRleHRBdEN1cnNvcih0ZXh0KSkge1xuICAgICAgdGhpcy5jb250ZW50ID0gdGhpcy5jb250ZW50ICsgdGV4dDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpbnNlcnRUZXh0QXRDdXJzb3IodGV4dDogc3RyaW5nLCBwcmV2TmFtZTogc3RyaW5nID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmlzRGVzaWduTW9kZSB8fFxuICAgICAgdHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICAhd2luZG93LmdldFNlbGVjdGlvblxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgIGlmIChzZWwuZ2V0UmFuZ2VBdCAmJiBzZWwucmFuZ2VDb3VudCkge1xuICAgICAgbGV0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG4gICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7XG4gICAgICB2YXIgc2VsZiA9IDxhbnk+dGhpcztcbiAgICAgIGlmIChzZWxmLmdldENvbnRlbnQpIHtcbiAgICAgICAgdmFyIHN0ciA9IHNlbGYuZ2V0Q29udGVudChwcmV2TmFtZSk7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRDb250ZW50VGV4dChlbGVtZW50OiBJRWxlbWVudCkge1xuICAgIHJldHVybiBcIntcIiArIEZsb3dQYW5lbE1vZGVsLmNvbnRlbnRFbGVtZW50TmFtZVByZWZpeCArIGVsZW1lbnQubmFtZSArIFwifVwiO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiZmxvd3BhbmVsXCIsXG4gIFt7IG5hbWU6IFwiY29udGVudDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb250ZW50XCIgfV0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IEZsb3dQYW5lbE1vZGVsKCk7XG4gIH0sXG4gIFwicGFuZWxcIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbG93cGFuZWwudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGFyYWJpY1N1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLYp9mE2LPYp9io2YJcIixcbiAgcGFnZU5leHRUZXh0OiBcItin2YTYqtin2YTZilwiLFxuICBjb21wbGV0ZVRleHQ6IFwi2KXYsdiz2KfZhCDYp9mE2KjZitin2YbYp9iqXCIsXG4gIHByZXZpZXdUZXh0OiBcItmF2LnYp9mK2YbYqVwiLFxuICBlZGl0VGV4dDogXCLYqti52K/ZitmEXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLYqNiv2KfZitipXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi2YbYtSDYotiu2LFcIixcbiAgbm9uZUl0ZW1UZXh0OiBcItmE2Kcg2LTZitihXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItin2K7YqtixINin2YTZg9mEXCIsXG4gIHByb2dyZXNzVGV4dDogXCJ7MX0g2LXZgdit2KkgezB9INmF2YZcIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcItiz2KzZhCB7MH0g2YXZhiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcItiq2YXYqiDYp9mE2KXYrNin2KjYqSDYudmE2Ykg2KPYs9im2YTYqSB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi2YTYpyDYqtmI2KzYryDYtdmB2K3YqSDZhdix2KbZitipINij2Ygg2LPYpNin2YQg2YHZiiDYp9mE2YbZhdmI2LDYrFwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIti02YPYsdinINmE2YPZhSDZhNin2LPYqtmD2YXYp9mEINin2YTZhtmF2YjYsNisIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwi2KrYuNmH2LEg2LPYrNmE2KfYqtmG2Kcg2KPZhtmDINmC2K8g2KPZg9mF2YTYqiDZh9iw2Kcg2KfZhNin2LPYqti32YTYp9i5INio2KfZhNmB2LnZhC5cIixcbiAgbG9hZGluZ1N1cnZleTogXCIuLi7Zitiq2YUg2KrYrdmF2YrZhCDYp9mE2YbZhdmI2LDYrFwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCIuLi7Yp9iu2KrYsVwiLFxuICB2YWx1ZTogXCLYp9mE2YLZitmF2KlcIixcbiAgcmVxdWlyZWRFcnJvcjogXCIu2YrYsdis2Ykg2KfZhNil2KzYp9io2Kkg2LnZhNmJINin2YTYs9ik2KfZhFwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLYp9mE2LHYrNin2KEg2KfZhNil2KzYp9io2Kkg2LnZhNmJINiz2KTYp9mEINmI2KfYrdivINi52YTZiSDYp9mE2KPZgtmELlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItmK2LHYrNmJINin2YTYpdis2KfYqNipINi52YTZiSDYp9mE2KPYs9im2YTYqSDZgdmKINis2YXZiti5INin2YTYtdmB2YjZgVwiLFxuICBudW1lcmljRXJyb3I6IFwi2YrYrNioINij2YYg2KrZg9mI2YYg2KfZhNmC2YrZhdipINix2YLZhdmK2KkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi2KfZhNix2KzYp9ihINil2K/Yrtin2YQg2YXYpyDZhNinINmK2YLZhCDYudmGIHswfSDYrdix2YjZgVwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItin2YTYsdis2KfYoSDYpdiv2K7Yp9mEINij2YLZhCDZhdmGIHswfSDYrdix2YjZgVwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcItmK2LHYrNmJINil2K/Yrtin2YQg2KPZg9ir2LEg2YXZhiB7MH0g2YjYo9mC2YQg2YXZhiB7MX0g2K3YsdmI2YFcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLZitix2KzZiSDZhdmE2KEg2YXYpyDZhNinINmK2YLZhCDYudmGIHswfSDYp9mE2LXZgdmI2YFcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi2YrYsdis2Ykg2KrYrdiv2YrYryDZhdinINmE2Kcg2YrZgtmEINi52YYgezB9INin2YTZhdiq2LrZitix2KfYqlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLZitix2KzZiSDYqtit2K/ZitivINmF2Kcg2YTYpyDZitiy2YrYryDYudmGIHswfSDYp9mE2YXYqti62YrYsdin2KpcIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcItmIJ3swfScg2YrYrNioINij2YYg2KrZg9mI2YYg2YXYs9in2YjZitipINij2Ygg2KPZg9ir2LEg2YXZhiB7MX0g2YjYqtiz2KfZiNmKINij2Ygg2KPZgtmEINmF2YYgezJ92KdcIixcbiAgbnVtZXJpY01pbjogXCLZiCd7MH0nINmK2KzYqCDYo9mGINiq2YPZiNmGINmF2LPYp9mI2YrYqSDYo9mIINij2YPYq9ixINmF2YYgezF92KdcIixcbiAgbnVtZXJpY01heDogXCLZiCd7MH0nINmK2KzYqCDYo9mGINiq2YPZiNmGINmF2LPYp9mI2YrYqSDYo9mIINij2YLZhCDZhdmGIHsxfdinXCIsXG4gIGludmFsaWRFbWFpbDogXCLYp9mE2LHYrNin2KEg2KXYr9iu2KfZhCDYqNix2YrYryDYp9mE2YPYqtix2YjZhtmKINi12K3ZititXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcItmK2KzYqCDYo9mGINmK2LnYsdi2INin2YTYqti52KjZitixOiB7MH0gJ9i12YjYp9ioJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIti32YTYqCDYpdix2KzYp9i5INiu2LfYoyAnezB9Jy4gezF92KdcIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIti52KfYryDYt9mE2Kgg2KfZhNio2YrYp9mG2KfYqiDZgdin2LHYuiDYo9mIICfYp9mE2YXYs9in2LEnINi62YrYsSDYtdit2YrYrSBcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLZitmG2KjYutmKINij2YTYpyDZitiq2KzYp9mI2LIg2K3YrNmFINin2YTZhdmE2YEgezB92KdcIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItin2YTYsdis2KfYoSDYpdiv2K7Yp9mEINmC2YrZhdipINij2K7YsdmJXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi2KrYrdmF2YrZhCDYp9mE2YXZhNmBINin2YTYrtin2LUg2KjZgy4g2YrYsdis2Ykg2KfZhNin2YbYqti42KfYsSDYudiv2Kkg2KvZiNin2YYg2YjYp9mE2YXYrdin2YjZhNipINmE2KfYrdmC2YvYp1wiLFxuICBsb2FkaW5nRmlsZTogXCLYrNin2LEg2KfZhNiq2K3ZhdmK2YQuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLYp9iu2KrYsSDYp9mE2YXZhNmB2KfYqi4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwi2YTZhSDYqtmC2YUg2KjYp9iu2KrZitin2LEg2YXZhNmBXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi2YfZhCDYqtix2YrYryDYrdiw2YEg2KfZhNiz2KzZhNifXCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi2YrYrNioINij2YYg2KrZg9mI2YYg2YfYsNmHINin2YTZgtmK2YXYqSDZgdix2YrYr9ipLlwiLFxuICBhZGRDb2x1bW46IFwi2KPYttmBINin2YTYudmF2YjYr1wiLFxuICBhZGRSb3c6IFwi2KfYttin2YHYqSDYtdmBXCIsXG4gIHJlbW92ZVJvdzogXCLYpdiy2KfZhNipINi12YFcIixcbiAgYWRkUGFuZWw6IFwi2KfYttmBINis2K/ZitivXCIsXG4gIHJlbW92ZVBhbmVsOiBcItil2LLYp9mE2KlcIixcbiAgY2hvaWNlc19JdGVtOiBcItio2YbYr1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIti52YXZiNivXCIsXG4gIG1hdHJpeF9yb3c6IFwi2LXZgVwiLFxuICBzYXZpbmdEYXRhOiBcItmK2KrZhSDYrdmB2Lgg2KfZhNmG2KrYp9im2Kwg2LnZhNmJINin2YTYrtin2K/ZhSAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcItit2K/YqyDYrti32KMg2YjZhNmFINmG2KrZhdmD2YYg2YXZhiDYrdmB2Lgg2KfZhNmG2KrYp9im2KwuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcItiq2YUg2K3Zgdi4INin2YTZhtiq2KfYptisINio2YbYrNin2K0hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLYrdin2YjZhCDZhdis2K/Yr9inXCIsXG4gIHRpbWVyTWluOiBcItiv2YLZitmC2KlcIixcbiAgdGltZXJTZWM6IFwi2KvYp9mG2YrYqVwiLFxuICB0aW1lclNwZW50QWxsOiBcItmE2YLYryDYo9mG2YHZgtiqIHswfSDYudmE2Ykg2YfYsNmHINin2YTYtdmB2K3YqSDZiCB7MX0g2KXYrNmF2KfZhNin2YsuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcItmE2YLYryDYo9mG2YHZgtiqIHswfSDYudmE2Ykg2YfYsNmHINin2YTYtdmB2K3YqS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLZhNmC2K8g2KPZhtmB2YLYqiB7MH0g2KXYrNmF2KfZhNin2YsuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLZhNmC2K8g2KPZhtmB2YLYqiB7MH0g2YXZhiB7MX0g2YHZiiDZh9iw2Ycg2KfZhNi12YHYrdipINmIIHsyfSDZhdmGINil2KzZhdin2YTZiiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcItmE2YLYryDYo9mG2YHZgtiqIHswfSDZhdmGIHsxfSDZgdmKINmH2LDZhyDYp9mE2LXZgdit2KkuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi2YTZgtivINij2YbZgdmC2KogezB9INmF2YYg2KXYrNmF2KfZhNmKIHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcItmG2LjZitmBXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLZiNin2LbYrVwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLYp9iu2KrYsSDZhdmE2YFcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi2YLZhSDYqNil2LLYp9mE2Kkg2YfYsNinINin2YTZhdmE2YFcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLZhti52YVcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcItmE2KdcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi2YfZhCDYo9mG2Kog2YXYqtij2YPYryDYo9mG2YMg2KrYsdmK2K8g2KXYstin2YTYqSDZh9iw2Kcg2KfZhNmF2YTZgTogezB92J9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcItmH2YQg2KPZhtiqINmF2KrYo9mD2K8g2KPZhtmDINiq2LHZitivINil2LLYp9mE2Kkg2YPYp9mB2Kkg2KfZhNmF2YTZgdin2KrYn1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwi2LnZhtmI2KfZhiDYp9mE2LPYpNin2YRcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiYXJcIl0gPSBhcmFiaWNTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiYXJcIl0gPSBcItin2YTYudix2KjZitipXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgYnVsZ2FyaWFuU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItCd0LDQt9Cw0LRcIixcbiAgcGFnZU5leHRUZXh0OiBcItCd0LDQv9GA0LXQtFwiLFxuICBjb21wbGV0ZVRleHQ6IFwi0JrRgNCw0LlcIixcbiAgcHJldmlld1RleHQ6IFwi0JLQuNC30YPQsNC70LjQt9Cw0YbQuNGPXCIsXG4gIGVkaXRUZXh0OiBcItGA0LXQtNCw0LrRgtC40YDQsNC90LVcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcItCd0LDRh9Cw0LvQvlwiLFxuICBvdGhlckl0ZW1UZXh0OiBcItCU0YDRg9Cz0L4gKNC+0L/QuNGI0LXRgtC1KVwiLFxuICBub25lSXRlbVRleHQ6IFwi0J3QuNGC0L4g0LXQtNC40L1cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwi0JLRgdC40YfQutC4XCIsXG4gIHByb2dyZXNzVGV4dDogXCLRgdGC0YAuIHswfSwg0L7QsdGJ0L4g0YHRgtGALiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcItCX0LDQv9C40YEgezB9INC+0YIgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCLQntGC0LPQvtCy0L7RgNC10L3QuCDQvdCwIHswfSAvIHsxfSDQstGK0L/RgNC+0YHQsFwiLFxuICBlbXB0eVN1cnZleTogXCLQkNC90LrQtdGC0LDRgtCwINC90LUg0YHRitC00YrRgNC20LAg0LLQuNC00LjQvNC4INGB0YLRgNCw0L3QuNGG0Lgg0LjQu9C4INCy0YrQv9GA0L7RgdC4LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItCR0LvQsNCz0L7QtNCw0YDQuNC8INCy0Lgg0LfQsCDRg9GH0LDRgdGC0LjQtdGC0L4g0LIg0LDQvdC60LXRgtCw0YLQsCFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcItCY0LfQs9C70LXQttC00LAsINGH0LUg0LLQuNC1INCy0LXRh9C1INGB0YLQtSDQv9C+0L/RitC70L3QuNC70Lgg0LDQvdC60LXRgtCw0YLQsC5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLQl9Cw0YDQtdC20LTQsNC90LUg0L3QsCDQsNC90LrQtdGC0LDRgtCwLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcItCY0LfQsdC10YDQtdGC0LUuLi5cIixcbiAgdmFsdWU6IFwidmFsdWVcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLQnNC+0LvRjywg0L7RgtCz0L7QstC+0YDQtdGC0LUg0L3QsCDRgdC70LXQtNC90LjRjyDQstGK0L/RgNC+0YEuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcItCc0L7Qu9GPLCDQvtGC0LPQvtCy0L7RgNC10YLQtSDQv9C+0L3QtSDQvdCwINC10LTQuNC9INC+0YIg0LLRitC/0YDQvtGB0LjRgtC1LlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItCc0L7Qu9GPLCDQvtGC0LPQvtCy0L7RgNC10YLQtSDQvdCwINCy0YrQv9GA0L7RgdC40YLQtSDQvdCwINCy0YHQuNGH0LrQuCDRgNC10LTQvtCy0LUuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLQodGC0L7QudC90L7RgdGC0YLQsCDRgdC70LXQtNCy0LAg0LTQsCDQsdGK0LTQtSDRh9C40YHQu9C+LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcItCc0L7Qu9GPLCDQuNC30L/QvtC70LfQstCw0LnRgtC1INC/0L7QvdC1IHswfSDRgdC40LzQstC+0LvQsC5cIixcbiAgdGV4dE1heExlbmd0aDogXCLQnNC+0LvRjywg0LjQt9C/0L7Qu9C30LLQsNC50YLQtSDQvdC1INC/0L7QstC10YfQtSDQvtGCIHswfSDRgdC40LzQstC+0LvQsC5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLQnNC+0LvRjywg0LjQt9C/0L7Qu9C30LLQsNC50YLQtSDQv9C+0LLQtdGH0LUg0L7RgiB7MH0g0Lgg0L/Qvi3QvNCw0LvQutC+INC+0YIgezF9INGB0LjQvNCy0L7Qu9CwLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItCc0L7Qu9GPLCDQv9C+0L/RitC70L3QtdGC0LUg0L/QvtC90LUgezB9INGA0LXQtNCwLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLQnNC+0LvRjywg0LjQt9Cx0LXRgNC10YLQtSDQv9C+0L3QtSB7MH0g0LLQsNGA0LjQsNC90YLQsC5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi0JzQvtC70Y8sINC40LfQsdC10YDQtdGC0LUg0L3QtSDQv9C+0LLQtdGH0LUg0L7RgiB7MH0g0LLQsNGA0LjQsNC90YLQsC5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcItCh0YLQvtC50L3QvtGB0YLRgtCwICd7MH0nINGB0LvQtdC00LLQsCDQtNCwINCx0YrQtNC1INGA0LDQstC90LAg0LjQu9C4INC/0L4t0LPQvtC70Y/QvNCwINC+0YIgezF9INC4INGA0LDQstC90LAg0LjQu9C4INC/0L4t0LzQsNC70LrQsCDQvtGCIHsyfVwiLFxuICBudW1lcmljTWluOiBcItCh0YLQvtC50L3QvtGB0YLRgtCwICd7MH0nINGB0LvQtdC00LLQsCDQtNCwINCx0YrQtNC1INGA0LDQstC90LAg0LjQu9C4INC/0L4t0LPQvtC70Y/QvNCwINC+0YIgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwi0KHRgtC+0LnQvdC+0YHRgtGC0LAgJ3swfScg0YHQu9C10LTQstCwINC00LAg0LHRitC00LUg0YDQsNCy0L3QsCDQuNC70Lgg0L/Qvi3QvNCw0LvQutCwINC+0YIgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLQnNC+0LvRjywg0LLRitCy0LXQtNC10YLQtSDQstCw0LvQuNC00LXQvSDQsNC00YDQtdGBINC90LAg0LXQu9C10LrRgtGA0L7QvdC90LAg0L/QvtGJ0LAuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcItCY0LfRgNCw0LfRitGCOiB7MH0g0YLRgNGP0LHQstCwINC00LAg0LTQsNCy0LAg0YDQtdC30YPQu9GC0LDRgiAndHJ1ZScgKNC40YHRgtC40L3QsCkuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLQl9Cw0Y/QstC60LDRgtCwINCy0L7QtNC4INC00L4g0LPRgNC10YjQutCwICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwi0JfQsNGP0LLQutCw0YLQsCDQvdC1INCy0YDRitGJ0LAg0LTQsNC90L3QuCDQuNC70Lgg0YfQsNGB0YLRgtCwICdwYXRoJyAo0L/RitGCINC00L4g0YLRitGA0YHQtdC90LjRjyDRgNC10YHRg9GA0YEg0L3QsCDRgdGK0YDQstGK0YDQsCkg0LUg0L3QtdC/0YDQsNCy0LjQu9C90L4g0LfQsNC00LDQtNC10L3QsFwiLFxuICBleGNlZWRNYXhTaXplOiBcItCg0LDQt9C80LXRgNGK0YIg0L3QsCDRhNCw0LnQu9CwINGB0LvQtdC00LLQsCDQtNCwINC90LUg0L/RgNC10LLQuNGI0LDQstCwIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItCc0L7Qu9GPLCDQstGK0LLQtdC00LXRgtC1INC00YDRg9Cz0LDRgtCwINGB0YLQvtC50L3QvtGB0YIuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLQktCw0YjQuNGCINGE0LDQudC7INGB0LUg0LfQsNGA0LXQttC00LAg0L3QsCDRgdGK0YDQstGK0YDQsC4g0JzQvtC70Y8sINC40LfRh9Cw0LrQsNC50YLQtSDQvdGP0LrQvtC70LrQviDRgdC10LrRg9C90LTQuCDQuCDRgtC+0LPQsNCy0LAg0L7Qv9C40YLQstCw0LnRgtC1INC+0YLQvdC+0LLQvi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi0JfQsNGA0LXQttC00LDQvdC1Li4uXCIsXG4gIGNob29zZUZpbGU6IFwi0JjQt9Cx0LXRgNC10YLQtSDRhNCw0LnQuyjQvtCy0LUpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLQndGP0LzQsCDQuNC30LHRgNCw0L0g0YTQsNC50LtcIixcbiAgY29uZmlybURlbGV0ZTogXCLQltC10LvQsNC10YLQtSDQu9C4INC00LAg0LjQt9GC0YDQuNC10YLQtSDQt9Cw0L/QuNGB0LA/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi0KHRgtC+0LnQvdC+0YHRgtGC0LAg0YHQu9C10LTQstCwINC00LAg0LHRitC00LUg0YPQvdC40LrQsNC70L3QsC5cIixcbiAgYWRkQ29sdW1uOiBcItCU0L7QsdCw0LLRj9C90LUg0L3QsCDQutC+0LvQvtC90LBcIixcbiAgYWRkUm93OiBcItCU0L7QsdCw0LLRj9C90LUg0L3QsCDRgNC10LRcIixcbiAgcmVtb3ZlUm93OiBcItCf0YDQtdC80LDRhdCy0LDQvdC1INC90LAg0YDQtdC0XCIsXG4gIGFkZFBhbmVsOiBcItCU0L7QsdCw0LLRj9C90LUg0L3QsCDQv9Cw0L3QtdC7XCIsXG4gIHJlbW92ZVBhbmVsOiBcItCf0YDQtdC80LDRhdCy0LDQvdC1INC90LAg0L/QsNC90LXQu1wiLFxuICBjaG9pY2VzX0l0ZW06IFwi0LXQu9C10LzQtdC90YJcIixcbiAgbWF0cml4X2NvbHVtbjogXCLQmtC+0LvQvtC90LBcIixcbiAgbWF0cml4X3JvdzogXCLQoNC10LRcIixcbiAgc2F2aW5nRGF0YTogXCLQoNC10LfRg9C70YLQsNGC0LjRgtC1INGB0LUg0LfQsNC/0LDQt9Cy0LDRgiDQvdCwINGB0YrRgNCy0YrRgNCwLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLQn9C+0YDQsNC00Lgg0LLRitC30L3QuNC60L3QsNC70LAg0LPRgNC10YjQutCwINGA0LXQt9GD0LvRgtCw0YLQuNGC0LUg0L3QtSDQvNC+0LbQsNGF0LAg0LTQsCDQsdGK0LTQsNGCINC30LDQv9Cw0LfQtdC90LguXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcItCg0LXQt9GD0LvRgtCw0YLQuNGC0LUg0LHRj9GF0LAg0LfQsNC/0LDQt9C10L3QuCDRg9GB0L/QtdGI0L3QviFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcItCd0L7QsiDQvtC/0LjRglwiLFxuICB0aW1lck1pbjogXCLQvNC40L1cIixcbiAgdGltZXJTZWM6IFwi0YHQtdC6XCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwi0JLQuNC1INC40LfQv9C+0LvQt9Cy0LDRhdGC0LUgezB9INC90LAg0YLQsNC30Lgg0YHRgtGA0LDQvdC40YbQsCDQuCDQvtCx0YnQviB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcItCS0LjQtSDQuNC30L/QvtC70LfQstCw0YXRgtC1IHswfSDQvdCwINGC0LDQt9C4INGB0YLRgNCw0L3QuNGG0LAuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi0JLQuNC1INC40LfQv9C+0LvQt9Cy0LDRhdGC0LUg0L7QsdGJ0L4gezB9LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwi0JLQuNC1INC40LfQv9C+0LfQstCw0YXRgtC1IHswfSDQvtGCIHsxfSDQvdCwINGC0LDQt9C4INGB0YLRgNCw0L3QuNGG0LAg0Lgg0L7QsdGJ0L4gezJ9INC+0YIgezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLQktC40LUg0LjQt9C/0L7Qu9C30LLQsNGF0YLQtSB7MH0g0L7RgiB7MX0g0L3QsCDRgtCw0LfQuCDRgdGC0YDQsNC90LjRhtCwLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcItCS0LjQtSDQuNC30L/QvtC70LfQstCw0YXRgtC1INC+0LHRidC+IHswfSDQvtGCIHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcItCY0LfRh9C40YHRgtCy0LDQvdC1XCIsXG4gIGNsZWFyQ2FwdGlvbjogXCLQndCw0YfQsNC70L3QviDRgdGK0YHRgtC+0Y/QvdC40LVcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi0JjQt9Cx0LXRgNC10YLQtSDRhNCw0LnQu1wiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLQn9GA0LXQvNCw0YXQstCw0L3QtSDQvdCwINGE0LDQudC70LBcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLQlNCwXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLQndC1XCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcItCd0LDQuNGB0YLQuNC90LAg0LvQuCDQuNGB0LrQsNGC0LUg0LTQsCDQv9GA0LXQvNCw0YXQvdC10YLQtSDRgtC+0LfQuCDRhNCw0LnQuzogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwi0J3QsNC40YHRgtC40L3QsCDQu9C4INC40YHQutCw0YLQtSDQtNCwINC/0YDQtdC80LDRhdC90LXRgtC1INCy0YHQuNGH0LrQuCDRhNCw0LnQu9C+0LLQtT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcItCX0LDQs9C70LDQstC40LUg0L3QsCDQstGK0L/RgNC+0YHQsFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJiZ1wiXSA9IGJ1bGdhcmlhblN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJiZ1wiXSA9IFwiQnVsZ2FyaWFuXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2J1bGdhcmlhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgY2F0YWxhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBbnRlcmlvclwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU2Vnw7xlbnRcIixcbiAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJVbiBhbHRyZSAoZGVzY3JpZ3VpKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUMOgZ2luYSB7MH0gZGUgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIk5vIGhpIGhhIGNhcCBww6BnaW5hIHZpc2libGUgbyBwcmVndW50YSBhIGwnZW5xdWVzdGEuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3LDoGNpZXMgcGVyIGNvbXBsZXRhciBsJ2VucXVlc3RhIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkwnZW5xdWVzdGEgcydlc3TDoCBjYXJyZWdhbnQgLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlbGVjY2lvbmEgLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiU2kgdXMgcGxhdSBjb250ZXN0aSBsYSBwcmVndW50YS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJTaSB1cyBwbGF1IGNvbnRlc3RpIGxlcyBwcmVndW50ZXMgZGUgY2FkYSBmaWxlcmEuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJMJ2VzdGltYWNpw7MgaGEgZGUgc2VyIG51bcOocmljYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJTaSB1cyBwbGF1IGVudHJlIGFsbWVueXMgezB9IHPDrW1ib2xzLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlNpIHVzIHBsYXUgZW50cmUgbWVueXMgZGUgezB9IHPDrW1ib2xzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlNpIHVzIHBsYXUgZW50cmUgbcOpcyBkZSB7MH0gaSBtZW55cyBkZSB7MX0gc8OtbWJvbHMuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiU2kgdXMgcGxhdSBvbXBsaSBhbG1lbnlzIHswfSBmaWxlcmVzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTaSB1cyBwbGF1IHNlbGVjY2lvbmkgYWxtZW55cyB7MH0gdmFyaWFudHMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlNpIHVzIHBsYXUgc2VsZWNjaW9uaSBubyBtw6lzIGRlIHswfSB2YXJpYW50cy5cIixcbiAgbnVtZXJpY01pbk1heDogXCJFbCAnezB9JyBkZXUgc2VyIGlndWFsIG8gbcOpcyBkZSB7MX0gaSBpZ3VhbCBvIG1lbnlzIGRlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIkVsICd7MH0nIGhhIGRlIHNlciBpZ3VhbCBvIG3DqXMgZGUgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiRWwgJ3swfScgaGEgZGUgc2VyIGlndWFsIG8gbWVueXMgZGUgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJTaSB1cyBwbGF1IGFmZWdpdSB1biBjb3JyZXUgZWxlY3Ryw7JuaWMgdsOgbGlkLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgc29swrdsaWNpdHVkIHZhIHRvcm5hciBlcnJvciAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkxhIHNvbMK3bGljaXR1ZCB2YSB0b3JuYXIgYnVpZGEgZGUgZGF0ZXMgbyBsYSBwcm9waWV0YXQgJ3RyYWplY3TDsnJpYScgbm8gw6lzIGNvcnJlY3RhXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiTGEgbWlkYSBkZSBsJ2FyeGl1IG5vIHBvdCBleGNlZGlyIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlNpIHVzIHBsYXUgYWZlZ2l1IGwnYWx0cmEgZXN0aW1hY2nDsy5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkVsIHNldSBhcnhpdSBzJ2VzdMOgIHB1amFudC4gU2kgdXMgcGxhdSBlc3BlcmkgdW5zIHNlZ29ucyBpIGludGVudGV1LWhvIGRlIG5vdS5cIixcbiAgYWRkUm93OiBcIkFmZWdpdSB1bmEgZmlsZXJhXCIsXG4gIHJlbW92ZVJvdzogXCJFbGltaW5hciB1bmEgZmlsZXJhXCIsXG4gIGNob2ljZXNfZmlyc3RJdGVtOiBcInByaW1lciBhcnRpY2xlXCIsXG4gIGNob2ljZXNfc2Vjb25kSXRlbTogXCJzZWdvbiBhcnRpY2xlXCIsXG4gIGNob2ljZXNfdGhpcmRJdGVtOiBcInRlcmNlciBhcnRpY2xlXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sdW1uYVwiLFxuICBtYXRyaXhfcm93OiBcIkZpbGVyYVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImNhXCJdID0gY2F0YWxhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJjYVwiXSA9IFwiY2F0YWzDoFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9jYXRhbGFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBjemVjaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJQxZllZGNob3rDrVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiRGFsxaHDrVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiSG90b3ZvXCIsXG4gIHByZXZpZXdUZXh0OiBcIk7DoWhsZWRcIixcbiAgZWRpdFRleHQ6IFwiVXByYXZpdFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJKaW7DoSBvZHBvdsSbxI8gKG5hcGnFoXRlKVwiLFxuICBub25lSXRlbVRleHQ6IFwixb3DoWRuw71cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiVnlicmF0IHbFoWVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlN0cmFuYSB7MH0geiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlrDoXpuYW0gezB9IHogezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJab2Rwb3bEm3plbsOpIG90w6F6a3k6IHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJQcsWvemt1bXUgbmVvYnNhaHVqZSDFvsOhZG7DqSBvdMOhemt5LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkTEm2t1amVtZSB6YSB2eXBsbsSbbsOtIHByxa96a3VtdSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk5hxaFlIHrDoXpuYW15IHVrYXp1asOtLCDFvmUganN0ZSB0ZW50byBwcsWvemt1bSBqacW+IGRva29uxI1pbGkuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiUHJvYsOtaMOhIG5hxI3DrXTDoW7DrSBwcsWvemt1bXUuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVnliZXIuLi5cIixcbiAgdmFsdWU6IFwiaG9kbm90YVwiLFxuICByZXF1aXJlZEVycm9yOiBcIk9kcG92xJt6dGUgcHJvc8OtbSBuYSBvdMOhemt1LlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQbGVhc2UgYW5zd2VyIGF0IGxlYXN0IG9uZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJPZHBvdsSbenRlIHByb3PDrW0gbmEgdsWhZWNobnkgb3TDoXpreS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlYgdG9tdG8gcG9saSBsemUgemFkYXQgcG91emUgxI3DrXNsYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJaYWRlanRlIHByb3PDrW0gYWxlc3BvxYggezB9IHpuYWvFry5cIixcbiAgdGV4dE1heExlbmd0aDogXCJaYWRlanRlIHByb3PDrW0gbcOpbsSbIG5lxb4gezB9IHpuYWvFry5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJaYWRlanRlIHByb3PDrW0gdsOtY2UgbmXFviB7MH0gYSBtw6luxJsgbmXFviB7MX0gem5ha8WvLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlZ5cGzFiHRlIHByb3PDrW0gYWxlc3BvxYggezB9IMWZw6Fka8WvLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWeWJlcnRlIHByb3PDrW0gYWxlc3BvxYggezB9IHZhcmlhbnR5LlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJOZXZ5YsOtcmVqdGUgcHJvc8OtbSB2w61jZSBuZcW+IHswfSB2YXJpYW50LlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiT2Rwb3bEm8SPICd7MH0nIGJ5IG3Em2xvIGLDvXQgdsSbdMWhw60gbmVibyByb3ZubyB7MX0gYSBtZW7FocOtIG5lYm8gcm92bm8gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiT2Rwb3bEm8SPICd7MH0nIGJ5IG3Em2xvIGLDvXQgdsSbdMWhw60gbmVibyByb3ZubyB7MX1cIixcbiAgbnVtZXJpY01heDogXCJPZHBvdsSbxI8gJ3swfScgYnkgbcSbbG8gYsO9dCBtZW7FocOtIG5lYm8gcm92bm8gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJaYWRlanRlIHByb3PDrW0gcGxhdG5vdSBlLW1haWxvdm91IGFkcmVzdS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVsO9cmF6OiB7MH0gYnkgbcSbbCB2csOhdGl0IGhvZG5vdHUg4oCedHJ1ZeKAnC5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlBvxb5hZGF2ZWsgdnLDoXRpbCBjaHlidSAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCJQb8W+YWRhdmVrIG5ldnLDoXRpbCBkYXRhIG5lYm8gY2VzdGEgamUgbmVwbGF0bsOhXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiVmVsaWtvc3Qgc291Ym9ydSBieSBuZW3Em2xhIGLDvXQgdsSbdMWhw60gbmXFviB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJaYWRlanRlIHByb3PDrW0gamlub3UgaG9kbm90dS5cIixcbiAgdXBsb2FkaW5nRmlsZTogXCJWw6HFoSBzb3Vib3Igc2UgbmFocsOhdsOhLiBaa3VzdGUgdG8gcHJvc8OtbSB6YSBuxJtrb2xpayBzZWt1bmQuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIk5hxI3DrXTDoW7DrS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlZ5YmVydGUgc291Ym9yeSAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5lbsOtIHp2b2xlbsO9IMW+w6FkbsO9IHNvdWJvclwiLFxuICBjb25maXJtRGVsZXRlOiBcIkNoY2V0ZSBzbWF6YXQgesOhem5hbT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJUYXRvIGhvZG5vdGEgYnkgbcSbbGEgYsO9dCBqZWRpbmXEjW7DoS5cIixcbiAgYWRkQ29sdW1uOiBcIlDFmWlkYXQgc2xvdXBlY1wiLFxuICBhZGRSb3c6IFwiUMWZaWRhdCDFmcOhZGVrXCIsXG4gIHJlbW92ZVJvdzogXCJPZHN0cmFuaXRcIixcbiAgYWRkUGFuZWw6IFwiUMWZaWRhdCBub3bDvVwiLFxuICByZW1vdmVQYW5lbDogXCJPZHN0cmFuaXRcIixcbiAgY2hvaWNlc19JdGVtOiBcInBvbG/FvmthXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiU2xvdXBlY1wiLFxuICBtYXRyaXhfcm93OiBcIsWYw6FkZWtcIixcbiAgc2F2aW5nRGF0YTogXCJWw71zbGVka3kgc2UgdWtsw6FkYWrDrSBuYSBzZXJ2ZXIgLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJEb8WhbG8gayBjaHlixJsgYSB2w71zbGVka3kganNtZSBuZW1vaGxpIHVsb8W+aXQuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlbDvXNsZWRreSBieWx5IMO6c3DEm8WhbsSbIHVsb8W+ZW55IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiWmt1cyB0byB6bm92dVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiTmEgdMOpdG8gc3Ryw6FuY2UganN0ZSB1dHJhdGlsaSBjZWxrZW0gezB9IGEgY2Vsa2VtIHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiTmEgdMOpdG8gc3Ryw6FuY2UganN0ZSB1dHJhdGlsaSB7MH0uXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiQ2Vsa2VtIGpzdGUgdXRyYXRpbGkgezB9LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiTmEgdMOpdG8gc3Ryw6FuY2UganN0ZSB1dHJhdGlsaSB7MH0geiB7MX0gYSBjZWxrZW0gezJ9IHogezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJOYSB0w6l0byBzdHLDoW5jZSBqc3RlIHN0csOhdmlsaSB7MH0geiB7MX0uXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiQ2Vsa292xJsganN0ZSB1dHJhdGlsaSB7MH0geiB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLEjGlzdMO9XCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJQcsWvaGxlZG7DoVwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJWeWJlcnRlIHNvdWJvclwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJPZGViZXJ0ZSB0ZW50byBzb3Vib3JcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJBbm9cIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5lXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIk9wcmF2ZHUgY2hjZXRlIG9kZWJyYXQgdGVudG8gc291Ym9yOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCJPcHJhdmR1IGNoY2V0ZSBvZHN0cmFuaXQgdsWhZWNobnkgc291Ym9yeT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIk7DoXpldiBvdMOhemt5XCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImNzXCJdID0gY3plY2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiY3NcIl0gPSBcIsSNZcWhdGluYVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9jemVjaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZGFuaXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlRpbGJhZ2VcIixcbiAgcGFnZU5leHRUZXh0OiBcIlZpZGVyZVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiRsOmcmRpZ1wiLFxuICBwcmV2aWV3VGV4dDogXCJGb3JwcmVtaWVyZVwiLFxuICBlZGl0VGV4dDogXCJSZWRpZ8OpclwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJWYWxnZnJpdCBzdmFyLi4uXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJJbmdlblwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJWw6ZsZyBhbGxlXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTaWRlIHswfSBhZiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIk9wdGFnIHswfSBhZiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkJlc3ZhcmVkZSB7MH0gLyB7MX0gc3DDuHJnc23DpWxcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiRGVyIGVyIGluZ2VuIHN5bmxpZ2Ugc3DDuHJnc23DpWwuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiTWFuZ2UgdGFrIGZvciBkaW4gYmVzdmFyZWxzZSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIlZvcmVzIGRhdGEgdmlzZXIgYXQgZHUgYWxsZXJlZGUgaGFyIGdlbm5lbWbDuHJ0IGRldHRlIHNww7hyZ2Vza2VtYS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJTcMO4cmdlc2tlbWFldCBoZW50ZXMgZnJhIHNlcnZlcmVuLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlbDpmxnLi4uXCIsXG4gIHZhbHVlOiBcInbDpnJkaVwiLFxuICByZXF1aXJlZEVycm9yOiBcIkJlc3ZhciB2ZW5saWdzdCBzcMO4cmdzbcOlbGV0LlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJCZXN2YXIgdmVubGlnc3QgbWluZHN0IMOpdCBzcMO4cmdzbcOlbC5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJCZXN2YXIgdmVubGlnc3Qgc3DDuHJnc23DpWwgaSBhbGxlIHLDpmtrZXIuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJBbmdpdiBldCB0YWwuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiQW5naXYgbWluZHN0IHswfSB0ZWduLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlBsZWFzZSBlbnRlciBsZXNzIHRoYW4gezB9IGNoYXJhY3RlcnMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiQW5naXYgbWVyZSBlbmQgezB9IG9nIG1pbmRyZSBlbmQgezF9IHRlZ24uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVWRmeWxkIG1pbmRzdCB7MH0gcsOma2tlci5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVsOmbGcgdmVubGlnc3QgbWluZHN0IHswfSBzdmFybXVsaWdoZWQoZXIpLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJWw6ZsZyB2ZW5saWdzdCBmw6ZycmUgezB9IHN2YXJtdWxpZ2hlZGVyKGVyKS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIHNrYWwgdsOmcmUgbGlnIG1lZCBlbGxlciBzdMO4cnJlIGVuZCB7MX0gb2cgbGlnIG1lZCBlbGxlciBtaW5kcmUgZW5kIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIHNrYWwgdsOmcmUgbGlnIG1lZCBlbGxlciBzdMO4cnJlIGVuZCB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBza2FsIHbDpnJlIGxpZyBtZWQgZWxsZXIgbWluZHJlIGVuZCB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIkFuZ2l2IHZlbmxpZ3N0IGVuIGd5bGRpZyBlLW1haWwgYWRyZXNzZS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVWR0cnlra2V0OiB7MH0gc2thbCByZXR1cm5lcmUgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiRm9yZXNww7hyZ3NsZW4gcmV0dXJuZXJlZGUgZmVqbGVuICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiRm9yZXNww7hyZ3NsZW4gcmV0dXJuZXJlZGUgaW5nZW4gZGF0YSBlbGxlciAncGF0aCcgcGFyYW1ldGVyZW4gZXIgZm9ya2VydFwiLFxuICBleGNlZWRNYXhTaXplOiBcIkZpbHN0w7hycmVsc2VuIG3DpSBpa2tlIG92ZXJzdGlnZSB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJBbmdpdiBlbiB2w6ZyZGkgZm9yIGRpdCB2YWxnZnJpZSBzdmFyLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRGluIGZpbCBibGl2ZXIgdXBsb2FkZXQuIFZlbnQgbm9nbGUgc2VrdW5kZXIgb2cgcHLDuHYgZXZlbnR1ZWx0IGlnZW4uXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkluZGzDpnNlci4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlbDpmxnIGZpbChlcikuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkluZ2VuIGZpbCBlciB2YWxndFwiLFxuICBjb25maXJtRGVsZXRlOiBcIlZpbCBkdSBmamVybmUgZGVuP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkRlbm5lIHbDpnJkaSBza2FsIHbDpnJlIHVuaWsuXCIsXG4gIGFkZENvbHVtbjogXCJUaWxmw7hqIGtvbG9ubmVcIixcbiAgYWRkUm93OiBcIlRpbGbDuGogcsOma2tlXCIsXG4gIHJlbW92ZVJvdzogXCJGamVyblwiLFxuICBhZGRQYW5lbDogXCJUaWxmw7hqIG55XCIsXG4gIHJlbW92ZVBhbmVsOiBcIkZqZXJuXCIsXG4gIGNob2ljZXNfSXRlbTogXCJ2YWxnXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sb25uZVwiLFxuICBtYXRyaXhfcm93OiBcIlLDpmtrZVwiLFxuICBzYXZpbmdEYXRhOiBcIlJlc3VsdGF0ZXJuZSBibGl2ZXIgZ2VtdCBww6Ugc2VydmVyZW4uLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkRlciBvcHN0b2QgZW4gZmVqbCBvZyB2aSBrdW5uZSBpa2tlIGdlbW1lIHJlc3VsdGF0ZXQuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlc3VsdGF0ZXQgYmxldiBnZW10IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUHLDuHYgaWdlblwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiRHUgaGFyIGJydWd0IHswfSBww6UgZGVubmUgc2lkZSBvZyB7MX0gaSBhbHQuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIkR1IGhhciBicnVndCB7MH0gcMOlIGRlbm5lIHNpZGUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiRHUgaGFyIGJydWd0IHswfSBpIGFsdC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkR1IGhhciBicnVndCB7MH0gYWYgezF9IHDDpSBkZW5uZSBzaWRlIG9nIHsyfSBhZiB7M30gaSBhbHQuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkR1IGhhciBicnVndCB7MH0gYWYgezF9IHDDpSBkZW5uZSBzaWRlLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIkR1IGhhciBicnVndCB7MH0gYWYgezF9IGkgYWx0LlwiLFxuICBjbGVhbkNhcHRpb246IFwiUmVuc1wiLFxuICBjbGVhckNhcHRpb246IFwiRmplcm5cIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiVsOmbGcgZmlsXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkZqZXJuIGRlbm5lIGZpbFwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkphXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJJbmdlblwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJFciBkdSBzaWtrZXIgcMOlLCBhdCBkdSB2aWwgZmplcm5lIGRlbm5lIGZpbDogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiRXIgZHUgc2lra2VyIHDDpSwgYXQgZHUgdmlsIGZqZXJuZSBhbGxlIGZpbGVyP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiU3DDuHJnc23DpWxzIHRpdGVsXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImRhXCJdID0gZGFuaXNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImRhXCJdID0gXCJkYW5za1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9kYW5pc2gudHMiLCIvL0NyZWF0ZWQgb24gYmVoYWxmIGh0dHBzOi8vZ2l0aHViLmNvbS9GcmFuazEzXG4vL01vZGlmaWVkIG9uIGJlaGFsZiBSb2VsYW5kIFZlcmJha2VsXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGR1dGNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlZvcmlnZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVm9sZ2VuZGVcIixcbiAgY29tcGxldGVUZXh0OiBcIlZlcnplbmRlblwiLFxuICBwcmV2aWV3VGV4dDogXCJWb29yYmVlbGRcIixcbiAgZWRpdFRleHQ6IFwiQmV3ZXJrXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJCZWdpbiBtZXRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbmRlcnMsIG5sLlwiLFxuICBub25lSXRlbVRleHQ6IFwiR2VlblwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJTZWxlY3RlZXIgQWxsZXNcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2luYSB7MH0gdmFuIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiUmVjb3JkIHswfSBvZiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkdlYW50d29vcmQgezB9L3sxfSB2cmFnZW5cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiRXIgaXMgZ2VlbiB6aWNodGJhcmUgcGFnaW5hIG9mIHZyYWFnIGluIGRlemUgdnJhZ2VubGlqc3RcIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJCZWRhbmt0IHZvb3IgaGV0IGludnVsbGVuIHZhbiBkZSB2cmFnZW5saWpzdFwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgICAgXCJPbnplIGdlZ2V2ZW5zIHRvbmVuIGFhbiBkYXQgamUgZGV6ZSB2cmFnZW5saWpzdCByZWVkcyBiZWFudHdvb3JkIGhlYnQuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiRGUgdnJhZ2VubGlqc3QgaXMgYWFuIGhldCBsYWRlbi4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJLaWVzLi4uXCIsXG4gIHZhbHVlOiBcIndhYXJkZVwiLFxuICByZXF1aXJlZEVycm9yOiBcIkRpdCBpcyBlZW4gdmVyZWlzdGUgdnJhYWdcIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiR2VsaWV2ZSB0ZW4gbWluc3RlIGVlbiB2cmFhZyB0ZSBiZWFudHdvb3JkZW4uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiRGV6ZSB2cmFhZyB2ZXJlaXN0IMOpw6luIGFudHdvb3JkIHBlciByaWpcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkhldCBhbnR3b29yZCBtb2V0IGVlbiBnZXRhbCB6aWpuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiVnVsIG1pbnN0ZW5zIHswfSBrYXJha3RlcnMgaW5cIixcbiAgdGV4dE1heExlbmd0aDogXCJHZWxpZXZlIG1pbmRlciBkYW4gezB9IGthcmFrdGVycyBpbiB0ZSB2dWxsZW4uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiR2VsaWV2ZSBtZWVyIGRhbiB7MH0gZW4gbWluZGVyIGRhbiB7MX0ga2FyYWt0ZXJzIGluIHRlIHZ1bGxlbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJHZWxpZXZlIHRlbiBtaW5zdGUgezB9IHJpamVuIGluIHRlIHZ1bGxlbi5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiU2VsZWN0ZWVyIG1pbmltdW0gezB9IGFudHdvb3JkZW5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiU2VsZWN0ZWVyIG5pZXQgbWVlciBkYW4gezB9IGFudHdvb3JkZW5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICAgIFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfSBlbiBrbGVpbmVyIG9mIGdlbGlqayBhYW4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiVXcgYW50d29vcmQgJ3swfScgbW9ldCBncm90ZXIgb2YgZ2VsaWprIHppam4gYWFuIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIlV3IGFudHdvb3JkICd7MH0nIG1vZXQgZ3JvdGVyIG9mIGdlbGlqayB6aWpuIGFhbiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlZ1bCBlZW4gZ2VsZGlnIGUtbWFpbGFkcmVzIGluXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkRlIHVpdGRydWtraW5nOiB7MH0gbW9ldCAnd2FhcicgdGVydWdnZXZlbi5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkRlIHZyYWFnIGtlZXJkZSBlZW4gZm91dCB0ZXJ1ZyAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICAgIFwiRGUgdnJhYWcgZ2FmIGVlbiBsZWVnIGFudHdvb3JkIHRlcnVnIG9mIGRlICdwYWQnIGVpZ2Vuc2NoYXAgaXMgbmlldCBjb3JyZWN0XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRGUgZ3Jvb3R0ZSB2YW4gaGV0IGJlc3RhbmQgbWFnIG5pZXQgZ3JvdGVyIHppam4gZGFuIHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVnVsIGhldCB2ZWxkICdBbmRlcnMsIG5sLicgaW5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICAgIFwiVXcgYmVzdGFuZCB3b3JkdCBvcGdlbGFkZW4uIEdlbGlldmUgZW5rZWxlIHNlY29uZGVuIHRlIHdhY2h0ZW4gZW4gb3BuaWV1dyB0ZSBwcm9iZXJlbi5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiT3BsYWRlbi4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIktpZXMgdXcgYmVzdGFuZChlbikuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkdlZW4gYmVzdGFuZCBnZWtvemVuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiV2lsIGplIGRlemUgZ2VnZXZlbnMgdmVyd2lqZGVyZW4/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiRGV6ZSB3YWFyZGUgbW9ldCB1bmllayB6aWpuLlwiLFxuICBhZGRDb2x1bW46IFwiVm9lZyBrb2xvbSB0b2VcIixcbiAgYWRkUm93OiBcIlZvZWcgcmlqIHRvZVwiLFxuICByZW1vdmVSb3c6IFwiVmVyd2lqZGVyXCIsXG4gIGFkZFBhbmVsOiBcIk5pZXV3ZSB0b2V2b2VnZW5cIixcbiAgcmVtb3ZlUGFuZWw6IFwiVmVyd2lqZGVyXCIsXG4gIGNob2ljZXNfSXRlbTogXCJvbmRlcndlcnBcIixcbiAgbWF0cml4X2NvbHVtbjogXCJLb2xvbVwiLFxuICBtYXRyaXhfcm93OiBcIlJpalwiLFxuICBzYXZpbmdEYXRhOiBcIkRlIHJlc3VsdGF0ZW4gd29yZGVuIGJld2FhcmQgb3AgZGUgc2VydmVyLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJFciB3YXMgZWVuIHByb2JsZWVtIGVuIHdlIGtvbmRlbiBkZSByZXN1bHRhdGVuIG5pZXQgYmV3YXJlbi5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiRGUgcmVzdWx0YXRlbiB3ZXJkZW4gc3VjY2Vzdm9sIGJld2FhcmQhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcm9iZWVyIG9wbmlldXdcIixcbiAgdGltZXJNaW46IFwibWluaW11bVwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCJVIGhlZWZ0IHswfSBnZXNwZW5kZWVyZCBvcCBkZXplIHBhZ2luYSBlbiB7MX0gaW4gdG90YWFsLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJVIGhlZWZ0IHswfSBvcCBkZXplIHBhZ2luYSBnZXNwZW5kZWVyZC5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJVIGhlZWZ0IGluIHRvdGFhbCB7MH0gZ2VzcGVuZGVlcmQuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgICBcIlUgaGVlZnQgezB9IHZhbiB7MX0gb3AgZGV6ZSBwYWdpbmEgZ2VzcGVuZGVlcmQgZW4gezJ9IHZhbiB7M30gaW4gdG90YWFsLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJVIGhlZWZ0IHswfSB2YW4gezF9IGdlc3BlbmRlZXJkIG9wIGRlemUgcGFnaW5hLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIlUgaGVlZnQgezB9IHZhbiB7MX0gaW4gaGV0IHRvdGFhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkt1aXMgb3BcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkt1aXMgb3BcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiR2Vrb3plbiBiZXN0YW5kXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlZlcndpamRlciBkZXplIGZpbGVcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJKYVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTmVlblwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJCZW50IHUgemVrZXIgZGF0IHUgZGV6ZSBmaWxlIHdpbHQgdmVyd2lqZGVyZW46IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkJlbnQgdSB6ZWtlciBkYXQgdSBhbCBkZXplIGZpbGVzIHdpbHQgdmVyd2lqZGVyZW4/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJUaXRlbCB2YW4gZGUgdnJhYWdcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wibmxcIl0gPSBkdXRjaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJubFwiXSA9IFwibmVkZXJsYW5kc1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9kdXRjaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZXN0b25pYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiVGFnYXNpXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJFZGFzaVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiTMO1cGV0YVwiLFxuICBwcmV2aWV3VGV4dDogXCJFZWx2YWFkZVwiLFxuICBlZGl0VGV4dDogXCJNdXVkYVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiQWx1c3RhXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiTXV1ICh0w6Rwc3VzdGEpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJNaXR0ZSBtaWRhZ2lcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiVmFsaSBrw7Vpa1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiTGVoZWvDvGxnIHswfS97MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIktpcmplIHswfS97MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIlZhc3RhdHVkIHswfSBrw7xzaW11c3QgezF9LXN0XCIsXG4gIGVtcHR5U3VydmV5OiBcIlNlbGxlcyB1dXJpbmd1cyBlaSBvbGUgw7xodGtpIG7DpGh0YXZhdCBsZWhla8O8bGdlIHbDtWkga8O8c2ltdXN0LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkFpdMOkaCwgZXQgdmFzdGFzaWQgYW5rZWVkaWxlIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiTWVpZSBhbmRtZXRlbCBvbGVkIHNhIHNlbGxlbGUgYW5rZWVkaWxlIGp1YmEgdmFzdGFudWQuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTGFlbiBhbmtlZXRpLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlZhbGkuLi5cIixcbiAgdmFsdWU6IFwidsOkw6RydHVzXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUGFsdW4gdmFzdGEga8O8c2ltdXNlbGUuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlBhbHVuIHZhc3RhIHbDpGhlbWFsdCDDvGhlbGUga8O8c2ltdXNlbGUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUGFsdW4gYW5uYSB2YXN0dXMgaWdhbCByZWFsLlwiLFxuICBudW1lcmljRXJyb3I6IFwiU2VlIHBlYWtzIG9sZW1hIG51bWJyaWxpbmUgdsOkw6RydHVzLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlBhbHVuIHNpc2VzdGEgdsOkaGVtYWx0IHswfSB0w6RoZW3DpHJraS5cIixcbiAgdGV4dE1heExlbmd0aDogXCJQYWx1biDDpHJhIHNpc2VzdGEgcm9oa2VtIGt1aSB7MH0gdMOkaGVtw6Rya2kuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiU2lzZXN0YSBwYWx1biB7MH0gLSB7MX0gdMOkaGVtw6Rya2kuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiU2lzZXN0YSBwbGF1biB2w6RoZW1hbHQgezB9IHJpZGEuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlBhbHVuIHZhbGkgdsOkaGVtYWx0IHswfSB2YXJpYW50aS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUGFsdW4gdmFsaSBrw7VpZ2Ugcm9oa2VtIHswfSB2YXJpYW50aS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIHBlYWtzIG9sZW1hIHbDtXJkbmUgdsO1aSBzdXVyZW0ga3VpIHsxfSBqYSB2w7VyZG5lIHbDtWkgdsOkaWtzZW0ga3VpIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIHBlYWtzIG9sZW1hIHbDtXJkbmUgdsO1aSBzdXVyZW0ga3VpIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIHBlYWtzIG9sZW1hIHbDtXJuZGUgdsO1aSB2w6Rpa3NlbSBrdWkgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJTaXNlc3RhIHBhbHVuIGtvcnJla3RuZSBlLXBvc3RpIGFhZHJlc3MuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkF2YWxkaXM6IHswfSBwZWFrcyB0YWdhc3RhbWEgdMO1ZXNlLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiVGFvdGx1cyB0YWdhc3RhcyB2ZWEg4oCeezB94oCdLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiVGFvdGx1cyB0YWdhc3RhcyB0w7xoamFkIGFuZG1lZCB2w7VpIGF0cmlidXV0ICdwYXRoJyBvbiB2YWxlXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRmFpbGkgc3V1cnVzIGVpIHRvaGkgw7xsZXRhZGEgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiU2lzZXN0YSBwYWx1biBtdXUgdmFzdHVzLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiU2ludSBmYWlsIGxhZWIgw7xsZXMuIFBhbHVuIG9vdGEgbcO1bmVkIHNla3VuZGlkIG5pbmcgcHJvb3ZpIHNlZWrDpHJlbCB1dWVzdGkuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkxhZW4uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJWYWxpIGZhaWwoaWQpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJGYWlsaSBwb2xlIHZhbGl0dWRcIixcbiAgY29uZmlybURlbGV0ZTogXCJLYXMgdGFoYWQga2lyamUga3VzdHV0YWRhP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlNlZSB2w6TDpHJ0dXMgcGVhYiBvbGVtYSB1bmlrYWFsbmUuXCIsXG4gIGFkZENvbHVtbjogXCJMaXNhIHZlZXJnXCIsXG4gIGFkZFJvdzogXCJMaXNhIHJpZGFcIixcbiAgcmVtb3ZlUm93OiBcIkVlbWFsZGFcIixcbiAgYWRkUGFuZWw6IFwiTGlzYSB1dXNcIixcbiAgcmVtb3ZlUGFuZWw6IFwiRWVtYWxkYVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiw7xrc3VzXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiVmVlcmdcIixcbiAgbWF0cml4X3JvdzogXCJSaWRhXCIsXG4gIHNhdmluZ0RhdGE6IFwiU2FsdmVzdGFuIGFuZG1lZCBzZXJ2ZXJpcy4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiVGVra2lzIHZpZ2EgbmluZyBtZSBlaSBzYWFudWQgdmFzdHVzZWlkIHNhbHZlc3RhZGEuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlZhc3R1c3RlIHNhbHZlc3RhbWluZSDDtW5uZXN0dXMhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcm9vdmkgdXVlc3RpXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJPbGVkIHZlZXRudWQgezB9IHNlbGxlbCBsZWhlbCBuaW5nIGtva2t1IHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiT2xlZCB2ZWV0bnVkIHswfSBzZWxsZWwgbGVoZWwuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiT2xlZCB2ZWV0bnVkIHswfSBrb2trdS5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIk9sZWQga3VsdXRhbnVkIHswfSB2w7VpbWFsaWt1c3QgezF9IHNlbGxlbCBsZWhlbCBuaW5nIHsyfSB2w7VpbWFsaWt1c3QgezN9IGtva2t1LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJPbGVkIGt1bHV0YW51ZCB7MH0gdsO1aW1hbGlrdXN0IHsxfSBzZWxsZWwgbGVoZWwuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiT2xlZCBrdWx1dGFudWQgezB9IHbDtWltYWxpa3VzdCB7MX0ga29ndWFqYXN0LlwiLFxuICBjbGVhbkNhcHRpb246IFwiUHVoYXN0YVwiLFxuICBjbGVhckNhcHRpb246IFwiUHVoYXN0YVwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJWYWxpIGZhaWxcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiRWVtYWxkYSBzZWUgZmFpbFwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkphaFwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiRWlcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiT2xlZCBzYSBraW5kZWwsIGV0IHNvb3ZpZCBzZWxsZSBmYWlsaSBlZW1hbGRhZGE6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIk9sZWQgc2Ega2luZGVsLCBldCBzb292aWQgZWVtYWxkYWRhIGvDtWlrIGZhaWxpZD9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIkvDvHNpbXVzZSBwZWFsa2lyaVwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJldFwiXSA9IGVzdG9uaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImV0XCJdID0gXCJlZXN0aSBrZWVsXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2VzdG9uaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBmaW5uaXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkVkZWxsaW5lblwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU2V1cmFhdmFcIixcbiAgY29tcGxldGVUZXh0OiBcIlZhbG1pc1wiLFxuICBwcmV2aWV3VGV4dDogXCJFc2lrYXRzZWx1XCIsXG4gIGVkaXRUZXh0OiBcIk11b2thdGFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcImFsa2FhXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiTXV1IChrdXZhaWxlKVwiLFxuICBub25lSXRlbVRleHQ6IFwiRWkgbWl0w6TDpG5cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiVmFsaXRzZSBrYWlra2lcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNpdnUgezB9L3sxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiTmF1aG9pdGEgezB9IC8gezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJWYXN0YXNpIGt5c3lteWtzaWluIHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTpcbiAgICBcIlTDpHNzw6Qga3lzZWx5c3PDpCBlaSBvbGUgeWh0w6Rrw6TDpG4gbsOka3l2aWxsw6Qgb2xldmFhIHNpdnVhIHRhaSBreXN5bXlzdMOkLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIktpaXRvcyBreXNlbHl5biB2YXN0YWFtaXNlc3RhIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiVGlldG9qZW1tZSBtdWthYW4gb2xldCBqbyBzdW9yaXR0YW51dCB0w6Rtw6RuIGt5c2VseW4uXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiS3lzZWx5w6QgbGFkYXRhYW4gcGFsdmVsaW1lbHRhLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlZhbGl0c2UuLi5cIixcbiAgdmFsdWU6IFwiYXJ2b1wiLFxuICByZXF1aXJlZEVycm9yOiBcIlZhc3RhYSBreXN5bXlrc2Vlbiwga2lpdG9zLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJWYXN0YWEgYWluYWtpbiB5aHRlZW4ga3lzeW15a3NlZW4uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVmFzdGFhIGt5c3lteWtzaWluIGthaWtpbGxhIHJpdmVpbGzDpC5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkFydm9uIHR1bGVlIG9sbGEgbnVtZWVyaW5lbi5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJPbGUgaHl2w6QgamEgc3nDtnTDpCB2w6RoaW50w6TDpG4gezB9IG1lcmtracOkLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIkFubmEgYWxsZSB7MH0gbWVya2tpw6QuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiQW5uYSB5bGkgezB9IGphIGFsbGUgezF9IG1lcmtracOkLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlTDpHl0w6QgdsOkaGludMOkw6RuIHswfSByaXZpw6QuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIk9sZSBoeXbDpCBqYSB2YWxpdHNlIHbDpGhpbnTDpMOkbiB7MH0gdmFpaHRvZWh0b2EuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk9sZSBoeXbDpCBqYSB2YWxpdHNlIGVuaW50w6TDpG4gezB9IHZhaWh0b2VodG9hLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgdMOkeXR5eSBvbGxhIGVuZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsxfSBqYSB2w6RoZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIHTDpHl0eXkgb2xsYSBlbmVtbcOkbiB0YWkgeWh0w6Qgc3V1cmkga3VpbiB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyB0w6R5dHl5IG9sbGEgdsOkaGVtbcOkbiB0YWkgeWh0w6Qgc3V1cmkga3VpbiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlN5w7Z0w6QgdmFsaWRpIHPDpGhrw7Zwb3N0aW9zb2l0ZS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiTGF1c2Vra2VlbjogezB9IHBpdMOkaXNpIHBhbGF1dHRhYSAndHJ1ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJQeXludMO2IHBhbGF1dHRpIHZpcmhlZW4gezB9LiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiUHl5bnTDtiBwYWxhdXR0aSB0eWhqw6R0IHRpZWRvdCB0YWkgcG9sa3Utb21pbmFpc3V1cyBvbiB2w6TDpHLDpFwiLFxuICBleGNlZWRNYXhTaXplOiBcIlRpZWRvc3RvbiBrb2tvIGVpIHNhYSBvbGxhIHN1dXJlbXBpIGt1aW4gezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQW5uYSB0b2luZW4gYXJ2by5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIlRpZWRvc3RvYSBsYWRhdGFhbi4gT2RvdGEgbXV1dGFtYSBzZWt1bnRpIGphIHlyaXTDpCB1dWRlbGxlZW4uXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkxhZGF0YWFuLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiVmFsaXRzZSB0aWVkb3N0byAodCkgLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJFaSB0aWVkb3N0b2EgdmFsaXR0dW5hXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiSGFsdWF0a28gcG9pc3RhYSB0aWV0dWVlbj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJUw6Rtw6RuIGFydm9uIHR1bGlzaSBvbGxhIGFpbnV0bGFhdHVpbmVuLlwiLFxuICBhZGRDb2x1bW46IFwiTGlzw6TDpCBzYXJha2VcIixcbiAgYWRkUm93OiBcIkxpc8Okw6Qgcml2aVwiLFxuICByZW1vdmVSb3c6IFwiUG9pc3RhXCIsXG4gIGFkZFBhbmVsOiBcIkxpc8Okw6QgdXVzaVwiLFxuICByZW1vdmVQYW5lbDogXCJQb2lzdGFcIixcbiAgY2hvaWNlc19JdGVtOiBcImtvaGRlXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiU2FyYWtlXCIsXG4gIG1hdHJpeF9yb3c6IFwiUml2aVwiLFxuICBzYXZpbmdEYXRhOiBcIlR1bG9rc2V0IHRhbGxlbm5ldGFhbiBwYWx2ZWxpbWVsbGUgLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJUYXBhaHR1aSB2aXJoZSwgZW1tZWvDpCB2b2luZWV0IHRhbGxlbnRhYSB0dWxva3NpYS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiVHVsb2tzZXQgdGFsbGVubmV0dGlpbiBvbm5pc3R1bmVlc3RpIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiWXJpdMOkIHV1ZGVsbGVlblwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiT2xldCBrw6R5dHTDpG55dCB7MH0gdMOkbGzDpCBzaXZ1bGxhIGphIHlodGVlbnPDpCB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIk9sZXQgdmlldHTDpG55dCB7MH0gdMOkbGzDpCBzaXZ1bGxhLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIk9sZXQga8OkeXR0w6RueXQgeWh0ZWVuc8OkIHswfS5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIk9sZXQga8OkeXR0w6RueXQgdMOkbGzDpCBzaXZ1bGxhIHswfSAvIHsxfSBqYSB5aHRlZW5zw6QgezJ9IC8gezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJPbGV0IGvDpHl0dMOkbnl0IHswfSAvIHsxfSB0w6RsbMOkIHNpdnVsbGEuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiT2xldCBrw6R5dHTDpG55dCB5aHRlZW5zw6QgezB9IC8gezF9LlwiLFxuICBjbGVhbkNhcHRpb246IFwiUHVoZGFzXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJBc2lhIHNlbHbDpFwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJWYWxpdHNlIHRpZWRvc3RvXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlBvaXN0YSB0w6Rtw6QgdGllZG9zdG9cIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJKb29cIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIkVpXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkhhbHVhdGtvIHZhcm1hc3RpIHBvaXN0YWEgdMOkbcOkbiB0aWVkb3N0b246IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkhhbHVhdGtvIHZhcm1hc3RpIHBvaXN0YWEga2Fpa2tpIHRpZWRvc3RvdD9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIkt5c3lteWtzZW4gb3RzaWtrb1wiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmaVwiXSA9IGZpbm5pc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZmlcIl0gPSBcInN1b21hbGFpbmVuXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2Zpbm5pc2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGZyZW5jaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJQcsOpY8OpZGVudFwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU3VpdmFudFwiLFxuICBjb21wbGV0ZVRleHQ6IFwiVGVybWluZXJcIixcbiAgcHJldmlld1RleHQ6IFwiQXBlcsOndVwiLFxuICBlZGl0VGV4dDogXCLDiWRpdGVyXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJDb21tZW5jZXJcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBdXRyZSAocHLDqWNpc2VyKVwiLFxuICBub25lSXRlbVRleHQ6IFwiQXVjdW5cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiVG91dCBzw6lsZWN0aW9ubmVyXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQYWdlIHswfSBzdXIgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJFbnJlZ2lzdHJlbWVudCB7MH0gc3VyIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiezB9L3sxfSBxdWVzdGlvbihzKSByw6lwb25kdWUocylcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiSWwgbid5IGEgbmkgcGFnZSB2aXNpYmxlIG5pIHF1ZXN0aW9uIHZpc2libGUgZGFucyBjZSBxdWVzdGlvbm5haXJlXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiTWVyY2kgZCdhdm9pciByw6lwb25kdSBhdSBxdWVzdGlvbm5haXJlICFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCJOb3MgZG9ubsOpZXMgaW5kaXF1ZW50IHF1ZSB2b3VzIGF2ZXogZMOpasOgIHJlbXBsaSBjZSBxdWVzdGlvbm5haXJlLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxlIHF1ZXN0aW9ubmFpcmUgZXN0IGVuIGNvdXJzIGRlIGNoYXJnZW1lbnQuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQ2hvaXNpc3Nlei4uLlwiLFxuICB2YWx1ZTogXCJ2YWxldXJcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJMYSByw6lwb25zZSDDoCBjZXR0ZSBxdWVzdGlvbiBlc3Qgb2JsaWdhdG9pcmUuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIk1lcmNpIGRlIHLDqXBvbmRyZSBhdSBtb2lucyDDoCB1bmUgcXVlc3Rpb24uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVG91dGVzIGxlcyBsaWduZXMgc29udCBvYmxpZ2F0b2lyZXNcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkxhIHLDqXBvbnNlIGRvaXQgw6p0cmUgdW4gbm9tYnJlLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIk1lcmNpIGRlIHNhaXNpciBhdSBtb2lucyB7MH0gY2FyYWN0w6hyZXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTWVyY2kgZGUgc2Fpc2lyIG1vaW5zIGRlIHswfSBjYXJhY3TDqHJlcy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJNZXJjaSBkZSBzYWlzaXIgZW50cmUgezB9IGV0IHsxfSBjYXJhY3TDqHJlcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJNZXJjaSBkZSBjb21wbMOpdGVyIGF1IG1vaW5zIHswfSBsaWduZXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIk1lcmNpIGRlIHPDqWxlY3Rpb25uZXIgYXUgbWluaW11bSB7MH0gcsOpcG9uc2VzLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJNZXJjaSBkZSBzw6lsZWN0aW9ubmVyIGF1IG1heGltdW0gezB9IHLDqXBvbnNlcy5cIixcbiAgbnVtZXJpY01pbk1heDogXCJWb3RyZSByw6lwb25zZSAnezB9JyBkb2l0IMOqdHJlIHN1cMOpcmlldXJlIG91IMOpZ2FsZSDDoCB7MX0gZXQgaW5mw6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsyfVwiLFxuICBudW1lcmljTWluOiBcIlZvdHJlIHLDqXBvbnNlICd7MH0nIGRvaXQgw6p0cmUgc3Vww6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIlZvdHJlIHLDqXBvbnNlICd7MH0nIGRvaXQgw6p0cmUgaW5mw6lyaWV1cmUgb3Ugw6lnYWxlIMOgIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiTWVyY2kgZCdlbnRyZXIgdW5lIGFkcmVzc2UgbWFpbCB2YWxpZGUuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkwnZXhwcmVzc2lvbjogezB9IGRvaXQgcmV0b3VybmVyICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkxhIHJlcXXDqnRlIGEgcmVudm95w6kgdW5lIGVycmV1ciAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCJMYSByZXF1w6p0ZSBhIHJlbnZvecOpIGRlcyBkb25uw6llcyB2aWRlcyBvdSBsYSBwcm9wcmnDqXTDqSAncGF0aCcgZXN0IGluY29ycmVjdGVcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJMYSB0YWlsbGUgZHUgZmljaGllciBuZSBkb2l0IHBhcyBleGPDqWRlciB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJNZXJjaSBkZSBwcsOpY2lzZXIgbGUgY2hhbXAgJ0F1dHJlJy5cIixcbiAgdXBsb2FkaW5nRmlsZTogXCJWb3RyZSBmaWNoaWVyIGVzdCBlbiBjb3VycyBkZSBjaGFyZ2VtZW50LiBNZXJjaSBkJ2F0dGVuZHJlIHF1ZWxxdWVzIHNlY29uZGVzIGV0IGRlIHLDqWVzc2F5ZXIuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkNoYXJnZW1lbnQuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJBam91dGVyIGRlcyBmaWNoaWVycy4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiQXVjdW4gZmljaGllciBham91dMOpXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVm91bGV6LXZvdXMgc3VwcHJpbWVyIGNldCBlbnJlZ2lzdHJlbWVudCA/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiQ2V0dGUgdmFsZXVyIGRvaXQgw6p0cmUgdW5pcXVlLlwiLFxuICBhZGRDb2x1bW46IFwiQWpvdXRlciB1bmUgY29sb25uZVwiLFxuICBhZGRSb3c6IFwiQWpvdXRlciB1bmUgbGlnbmVcIixcbiAgcmVtb3ZlUm93OiBcIlN1cHByaW1lclwiLFxuICBhZGRQYW5lbDogXCJBam91dGVyXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlN1cHByaW1lclwiLFxuICBjaG9pY2VzX0l0ZW06IFwiaXRlbVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbG9ubmVcIixcbiAgbWF0cml4X3JvdzogXCJMaWduZVwiLFxuICBzYXZpbmdEYXRhOiBcIkxlcyByw6lzdWx0YXRzIHNvbnQgZW4gY291cnMgZGUgc2F1dmVnYXJkZSBzdXIgbGUgc2VydmV1ci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiVW5lIGVycmV1ciBlc3Qgc3VydmVudWUgZXQgYSBlbXDDqmNow6kgbGEgc2F1dmVnYXJkZSBkZXMgcsOpc3VsdGF0cy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiTGVzIHLDqXN1bHRhdHMgb250IGJpZW4gw6l0w6kgZW5yZWdpc3Ryw6lzICFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlLDqWVzc2F5ZXJcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlZvdXMgYXZleiBwYXNzw6kgezB9IHN1ciBjZXR0ZSBwYWdlIGV0IHsxfSBhdSB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gc3VyIGNldHRlIHBhZ2UuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gYXUgdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gc3VyIHsxfSBzdXIgY2V0dGUgcGFnZSBldCB7Mn0gc3VyIHszfSBhdSB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiVm91cyBhdmV6IHBhc3PDqSB7MH0gc3VyIHsxfSBzdXIgY2V0dGUgcGFnZS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJWb3VzIGF2ZXogcGFzc8OpIHswfSBzdXIgezF9IGF1IHRvdGFsLlwiLFxuICBjbGVhbkNhcHRpb246IFwiTmV0dG95ZXJcIixcbiAgY2xlYXJDYXB0aW9uOiBcIlZpZGVyXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIkFqb3V0ZXIgdW4gZmljaGllclwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJFbmxldmVyIGNlIGZpY2hpZXJcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJPdWlcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5vblwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLDinRlcy12b3VzIGNlcnRhaW5zIGRlIHZvdWxvaXIgc3VwcHJpbWVyIGNlIGZpY2hpZXIgOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLDinRlcy12b3VzIGNlcnRhaW5zIGRlIHZvdWxvaXIgc3VwcHJpbWVyIHRvdXMgbGVzIGZpY2hpZXJzP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiVGl0cmUgZGUgbGEgcXVlc3Rpb25cIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZnJcIl0gPSBmcmVuY2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZnJcIl0gPSBcImZyYW7Dp2Fpc1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9mcmVuY2gudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGdlb3JnaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIuGDo+GDmeGDkOGDnFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi4YOo4YOU4YOb4YOT4YOU4YOSXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLhg5Phg5Dhg6Hhg6Dhg6Phg5rhg5Thg5Hhg5BcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIuGDkuGDleGDlOGDoOGDk+GDmCB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi4YOQ4YOg4YOq4YOU4YOg4YOX4YOYIOGDmeGDmOGDl+GDruGDleGDkCDhg5Dhg6Ag4YOQ4YOg4YOY4YOhLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuGDkuGDm+GDkOGDk+GDmuGDneGDkeGDlyDhg5nhg5jhg5fhg67hg5Xhg5Dhg6Dhg5jhg6Eg4YOo4YOU4YOV4YOh4YOU4YOR4YOY4YOh4YOX4YOV4YOY4YOhIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIuGDqeGDkOGDouGDleGDmOGDoOGDl+GDleGDkCDhg6Hhg5Thg6Dhg5Xhg5Thg6Dhg5jhg5Phg5Dhg5wuLi5cIixcbiAgb3RoZXJJdGVtVGV4dDogXCLhg6Hhg67hg5Xhg5AgKOGDkuGDl+GDruGDneGDleGDlyDhg5vhg5jhg6Phg5fhg5jhg5fhg5Thg5cpXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIuGDkOGDoOGDqeGDlOGDleGDkC4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg6Phg57hg5Dhg6Hhg6Phg67hg5Thg5cg4YOZ4YOY4YOX4YOu4YOV4YOQ4YOhLlwiLFxuICBudW1lcmljRXJyb3I6IFwi4YOe4YOQ4YOh4YOj4YOu4YOYIOGDo+GDnOGDk+GDkCDhg5jhg6fhg53hg6Eg4YOg4YOY4YOq4YOu4YOV4YOYLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg6jhg5Thg5jhg6fhg5Xhg5Dhg5zhg5Thg5cg4YOQ4YOg4YOQ4YOc4YOQ4YOZ4YOa4YOU4YORIHswfSDhg6Hhg5jhg5vhg5Hhg53hg5rhg50uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg5Dhg5jhg6Dhg6nhg5jhg5Thg5cg4YOQ4YOg4YOQ4YOc4YOQ4YOZ4YOa4YOU4YORIHswfSDhg5Xhg5Dhg6Dhg5jhg5Dhg5zhg6Lhg5guXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg5Dhg5jhg6Dhg6nhg5jhg5Thg5cg4YOQ4YOg4YOQ4YOj4YOb4YOU4YOi4YOU4YOhIHswfSDhg5Xhg5Dhg6Dhg5jhg5Dhg5zhg6Lhg5guXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhIOGDm+GDlOGDouGDmCDhg5Dhg5wg4YOi4YOd4YOa4YOYLCDhg5Xhg5jhg5Phg6Dhg5QgezF9LCDhg5Phg5Ag4YOc4YOQ4YOZ4YOa4YOU4YOR4YOYIOGDkOGDnCDhg6Lhg53hg5rhg5gg4YOV4YOY4YOT4YOg4YOUIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIOGDo+GDnOGDk+GDkCDhg5jhg6fhg53hg6Eg4YOb4YOU4YOi4YOYIOGDkOGDnCDhg6Lhg53hg5rhg5gg4YOV4YOY4YOT4YOg4YOUIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIOGDo+GDnOGDk+GDkCDhg5jhg6fhg53hg6Eg4YOc4YOQ4YOZ4YOa4YOU4YOR4YOYIOGDkOGDnCDhg6Lhg53hg5rhg5gg4YOV4YOY4YOT4YOg4YOUIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDqOGDlOGDmOGDp+GDleGDkOGDnOGDneGDlyDhg5Thg5ouIOGDpOGDneGDoeGDouGDmOGDoSDhg6Dhg5Thg5Dhg5rhg6Phg6Dhg5gg4YOb4YOY4YOh4YOQ4YOb4YOQ4YOg4YOX4YOYLlwiLFxuICBvdGhlclJlcXVpcmVkRXJvcjogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOo4YOU4YOQ4YOV4YOh4YOU4YOXIOGDleGDlOGDmuGDmCAn4YOh4YOu4YOV4YOQJ1wiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImthXCJdID0gZ2VvcmdpYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wia2FcIl0gPSBcIuGDpeGDkOGDoOGDl+GDo+GDmuGDmFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9nZW9yZ2lhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZ2VybWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlp1csO8Y2tcIixcbiAgcGFnZU5leHRUZXh0OiBcIldlaXRlclwiLFxuICBjb21wbGV0ZVRleHQ6IFwiQWJzY2hsaWXDn2VuXCIsXG4gIHByZXZpZXdUZXh0OiBcIlZvcnNjaGF1XCIsXG4gIGVkaXRUZXh0OiBcIkJlYXJiZWl0ZW5cIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlN0YXJ0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiU29uc3RpZ2VzIChCaXR0ZSBhbmdlYmVuKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTmljaHRzIHRyaWZmdCB6dVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJBbGxlcyBhdXN3w6RobGVuXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTZWl0ZSB7MH0gdm9uIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiRWludHJhZyB7MH0gdm9uIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiezB9L3sxfSBGcmFnZW4gYmVhbnR3b3J0ZXRcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiRXMgc2luZCBrZWluZSBGcmFnZW4gdm9yaGFuZGVuLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlZpZWxlbiBEYW5rLCBkYXNzIFNpZSBkaWUgVW1mcmFnZSBhYmdlc2NobG9zc2VuIGhhYmVuIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiV2lyIGhhYmVuIGZlc3RnZXN0ZWxsdCwgZGFzcyBTaWUgZGllc2UgVW1mcmFnZSBiZXJlaXRzIGFiZ2VzY2hsb3NzZW4gaGFiZW4uXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiVW1mcmFnZSB3aXJkIGdlbGFkZW4uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQml0dGUgYXVzd8OkaGxlbi4uLlwiLFxuICB2YWx1ZTogXCJXZXJ0XCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiQml0dGUgYmVhbnR3b3J0ZW4gU2llIGRpZXNlIEZyYWdlLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJCaXR0ZSBiZWFudHdvcnRlbiBTaWUgbWluZGVzdGVucyBlaW5lIEZyYWdlLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkJpdHRlIGJlYW50d29ydGVuIFNpZSBhbGxlIEZyYWdlbi5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkRlciBXZXJ0IG11c3MgZWluZSBaYWhsIHNlaW4uXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiQml0dGUgZ2ViZW4gU2llIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZWluLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIkJpdHRlIGdlYmVuIFNpZSBuaWNodCBtZWhyIGFscyB7MH0gWmVpY2hlbiBlaW4uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiQml0dGUgZ2ViZW4gU2llIG1pbmRlc3RlbnMgezB9IHVuZCBtYXhpbWFsIHsxfSBaZWljaGVuIGVpbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJCaXR0ZSBtYWNoZW4gU2llIGluIG1pbmRlc3RlbnMgezB9IFplaWxlbiBlaW5lIEVpbmdhYmUuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkJpdHRlIHfDpGhsZW4gU2llIG1pbmRlc3RlbnMgezB9IEFudHdvcnQoZW4pIGF1cy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiQml0dGUgd8OkaGxlbiBTaWUgbmljaHQgbWVociBhbHMgezB9IEFudHdvcnQoZW4pIGF1cy5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIG11c3MgZ3LDtsOfZXIgb2RlciBnbGVpY2ggezF9IHVuZCBrbGVpbmVyIG9kZXIgZ2xlaWNoIHsyfSBzZWluXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgbXVzcyBncsO2w59lciBvZGVyIGdsZWljaCB7MX0gc2VpblwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIG11c3Mga2xlaW5lciBvZGVyIGdsZWljaCB7MX0gc2VpblwiLFxuICBpbnZhbGlkRW1haWw6IFwiQml0dGUgZ2ViZW4gU2llIGVpbmUgZ8O8bHRpZ2UgRS1NYWlsLUFkcmVzc2UgZWluLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJEZXIgQXVzZHJ1Y2s6IHswfSBtdXNzIGRlbiBXZXJ0ICd3YWhyJyB6dXLDvGNrZ2ViZW4uXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJFaW4gTmV0endlcmtkaWVuc3QgaGF0IGZvbGdlbmRlbiBGZWhsZXIgenVyw7xja2dlZ2ViZW4gJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJFaW5lIE5ldHp3ZXJrZGllbnN0IGhhdCB1bmfDvGx0aWdlIERhdGVuIHp1csO8Y2tnZWdlYmVuXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRGllIERhdGVpIGRhcmYgbmljaHQgZ3LDtsOfZXIgYWxzIHswfSBzZWluLlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQml0dGUgZ2ViZW4gU2llIGVpbmVuIFdlcnQgYW4uXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJCaXR0ZSB3YXJ0ZW4gU2llIGJpcyBkZXIgVXBsb2FkIElocmVyIERhdGVpZW4gYWJnZXNjaGxvc3NlbiBpc3QuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIldpcmQgaG9jaGdlbGFkZW4uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJEYXRlaShlbikgYXVzd8OkaGxlbi4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiS2VpbmUgRGF0ZWkgYXVzZ2V3w6RobHRcIixcbiAgY29uZmlybURlbGV0ZTogXCJXb2xsZW4gU2llIGRlbiBFaW50cmFnIGzDtnNjaGVuP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkRpZXNlciBXZXJ0IG11c3MgZWlubWFsaWcgc2Vpbi5cIixcbiAgYWRkQ29sdW1uOiBcIlNwYWx0ZSBoaW56dWbDvGdlblwiLFxuICBhZGRSb3c6IFwiWmVpbGUgaGluenVmw7xnZW5cIixcbiAgcmVtb3ZlUm93OiBcIkVudGZlcm5lblwiLFxuICBhZGRQYW5lbDogXCJOZXUgaGluenVmw7xnZW5cIixcbiAgcmVtb3ZlUGFuZWw6IFwiRW50ZmVybmVuXCIsXG4gIGNob2ljZXNfSXRlbTogXCJFbGVtZW50XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiU3BhbHRlXCIsXG4gIG1hdHJpeF9yb3c6IFwiWmVpbGVcIixcbiAgc2F2aW5nRGF0YTogXCJEaWUgRXJnZWJuaXNzZSB3ZXJkZW4gYXVmIGRlbSBTZXJ2ZXIgZ2VzcGVpY2hlcnQuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkVzIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBEaWUgRXJnZWJuaXNzZSBrb25udGVuIG5pY2h0IGdlc3BlaWNoZXJ0IHdlcmRlbi5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiRGllIEVyZ2Vibmlzc2Ugd3VyZGVuIGdlc3BlaWNoZXJ0IVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiRXJuZXV0IGFic2VuZGVuXCIsXG4gIHRpbWVyTWluOiBcIk1pbi5cIixcbiAgdGltZXJTZWM6IFwiU2VrLlwiLFxuICB0aW1lclNwZW50QWxsOiBcIlNpZSB3YXJlbiB7MH0gYXVmIGRpZXNlciBTZWl0ZSB1bmQgYnJhdWNodGVuIGluc2dlc2FtdCB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlNpZSB3YXJlbiB7MH0gYXVmIGRpZXNlciBTZWl0ZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJTaWUgaGFiZW4gaW5zZ2VzYW10IHswfSBnZWJyYXVjaHQuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJTaWUgd2FyZW4gezB9IHZvbiB7MX0gYXVmIGRpZXNlciBTZWl0ZSB1bmQgYnJhdWNodGVuIGluc2dlc2FtdCB7Mn0gdm9uIHszfS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiU2llIHdhcmVuIHswfSB2b24gezF9IGF1ZiBkaWVzZXIgU2VpdGUuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiU2llIGhhYmVuIGluc2dlc2FtdCB7MH0gdm9uIHsxfSBnZWJyYXVjaHQuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJBbGxlcyBsw7ZzY2hlblwiLFxuICBjbGVhckNhcHRpb246IFwiQXVzd2FobCBlbnRmZXJuZW5cIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiRGF0ZWkgYXVzd8OkaGxlblwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJEYXRlaSBsw7ZzY2hlblwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkphXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOZWluXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIlNpbmQgU2llIHNpY2hlciwgZGFzcyBTaWUgZGllc2UgRGF0ZWkgbMO2c2NoZW4gbcO2Y2h0ZW46IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIlNpbmQgU2llIHNpY2hlciwgZGFzcyBTaWUgYWxsZSBEYXRlaWVuIGzDtnNjaGVuIG3DtmNodGVuP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiRnJhZ2VudGl0ZWxcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZGVcIl0gPSBnZXJtYW5TdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wiZGVcIl0gPSBcImRldXRzY2hcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZ2VybWFuLnRzIiwiLy9DcmVhdGVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9hZ2Vsb3NwYW5hZ2lvdGFraXNcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZ3JlZWtTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwizqDPgc6/zrfOs86/z43OvM61zr3Ov1wiLFxuICBwYWdlTmV4dFRleHQ6IFwizpXPgM+MzrzOtc69zr9cIixcbiAgY29tcGxldGVUZXh0OiBcIs6fzrvOv866zrvOrs+Bz4nPg863XCIsXG4gIHByZXZpZXdUZXh0OiBcIs6gz4HOv861z4DOuc+DzrrPjM+AzrfPg863XCIsXG4gIGVkaXRUZXh0OiBcIs6Vz4DOtc6+zrXPgc6zzrHPg86vzrFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIs6Rz4HPh86uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwizobOu867zr8gKM+AzrHPgc6xzrrOsc67z44gzrTOuc61z4XOus+BzrnOvc6vz4PPhM61KVwiLFxuICBub25lSXRlbVRleHQ6IFwizprOsc69zq3Ovc6xz4JcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwizpXPgM65zrvOv86zzq4gz4zOu8+Jzr1cIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIs6jzrXOu86vzrTOsSB7MH0gzrHPgM+MIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwizpXOs86zz4HOsc+Gzq4gezB9IM6xz4DPjCB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIs6Rz4DOsc69z4TOrs64zrfOus6xzr0gezB9IC8gezF9IM61z4HPic+Ezq7Pg861zrnPglwiLFxuICBlbXB0eVN1cnZleTpcbiAgICBcIs6UzrXOvSDPhc+AzqzPgc+HzrXOuSDOus6xzrzOr86xIM6/z4HOsc+Ezq4gz4POtc67zq/OtM6xIM6uIM6/z4HOsc+Ezq4gzrXPgc+Oz4TOt8+Dzrcgz4POtSDOsc+Fz4TPjCDPhM6/IM61z4HPic+EzrfOvM6xz4TOv867z4zOs865zr8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6XG4gICAgXCLOlc+Fz4fOsc+BzrnPg8+Ezr/Pjc68zrUgzrPOuc6xIM+EzrfOvSDPg8+FzrzPgM67zq7Pgc+Jz4POtyDOsc+Fz4TOv8+NIM+Ezr/PhSDOtc+Bz4nPhM63zrzOsc+Ezr/Ou86/zrPOr86/z4UhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLOpM6xIM6xz4HPh861zq/OsSDOvM6xz4IgzrTOtc6vz4fOvc6/z4XOvSDPjM+Ezrkgzq3Ph861z4TOtSDOrs60zrcgzr/Ou86/zrrOu863z4HPjs+DzrXOuSDOsc+Fz4TOrs69IM+EzrfOvSDOrc+BzrXPhc69zrEuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwizqTOvyDOtc+Bz4nPhM63zrzOsc+Ezr/Ou8+MzrPOuc6/IM+Gzr/Pgc+Ez47Ovc61z4TOsc65IM6xz4DOvyDPhM6/IM60zrnOsc66zr/OvM65z4PPhM6uLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIs6Vz4DOuc67zq3Ovs+EzrUuLi5cIixcbiAgdmFsdWU6IFwizrHOvs6vzrFcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM6xz4DOsc69z4TOrs+Dz4TOtSDPg8+EzrfOvSDOtc+Bz47PhM63z4POty5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwizpHPgM6xzr3PhM6uz4PPhM61IM+DzrUgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSDOvM6vzrEgzrXPgc+Oz4TOt8+DzrcuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6XG4gICAgXCLOoM6xz4HOsc66zrHOu8+OIM6xz4DOsc69z4TOrs+Dz4TOtSDPg8+EzrnPgiDOtc+Bz4nPhM6uz4POtc65z4Igz4POtSDPjM67zrXPgiDPhM65z4IgzrPPgc6xzrzOvM6tz4IuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLOlyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM6xz4HOuc64zrzOt8+EzrnOus6uLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIs6gzrHPgc6xzrrOsc67z44gz4PPhc68z4DOu863z4HPjs+Dz4TOtSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDPg8+NzrzOss6/zrvOsS5cIixcbiAgdGV4dE1heExlbmd0aDogXCLOlc65z4POsc6zzqzOs861z4TOtSDOu865zrPPjM+EzrXPgc6/z4XPgiDOsc+Az4wgezB9IM+HzrHPgc6xzrrPhM6uz4HOtc+CLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIs6VzrnPg86xzrPOrM6zzrXPhM61IM+AzrXPgc65z4PPg8+Mz4TOtc+Bzr/Phc+CIM6xz4DPjCB7MH0gzrrOsc65IM67zrnOs8+Mz4TOtc+Bzr/Phc+CIM6xz4DPjCB7MX0gz4fOsc+BzrHOus+Ezq7Pgc61z4IuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDPg8+FzrzPgM67zrfPgc+Oz4PPhM61IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM6zz4HOsc68zrzOrc+CLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM61z4DOuc67zq3Ovs+EzrUgz4TOv8+FzrvOrM+HzrnPg8+Ezr/OvSB7MH0gz4DOsc+BzrHOu867zrHOs86tz4IuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gzrXPgM65zrvOrc6+z4TOtSDPjM+Hzrkgz4DOsc+BzrHPgM6szr3PiSDOsc+Azr8gezB9IM+AzrHPgc6xzrvOu86xzrPOrc+CLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwizqTOvyAnezB9JyDOuM6xIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzq/Pg86/IM6uIM68zrXOs86xzrvPjc+EzrXPgc6/IM6xz4DOvyDPhM6/IHsxfSDOus6xzrkgzq/Pg86/IM6uIM68zrnOus+Bz4zPhM61z4HOvyDOsc+Azr8gz4TOvyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCLOpM6/ICd7MH0nIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrzOtc6zzrHOu8+Nz4TOtc+Bzr8gzq4gzrnPg86/IM68zrUgz4TOvyB7MX1cIixcbiAgbnVtZXJpY01heDogXCLOpM6/ICd7MH0nIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrzOuc66z4HPjM+EzrXPgc6/IM6uIM6vz4POvyDOsc+Azr8gz4TOvyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIs6gzrHPgc6xzrrOsc67z44gzrTPjs+Dz4TOtSDOvM65zrEgzrHPgM6/zrTOtc66z4TOriDOtM65zrXPjc64z4XOvc+DzrcgZS1tYWlsLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLOlyDOrc66z4bPgc6xz4POtzogezB9IM64zrEgz4DPgc6tz4DOtc65IM69zrEgzrXPgM65z4PPhM+Bzq3PiM61zrkgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwizpcgzrHOr8+EzrfPg863IM61z4DOrc+Dz4TPgc61z4jOtSDPg8+GzqzOu868zrEgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLOlyDOsc6vz4TOt8+DzrcgzrXPgM6tz4PPhM+BzrXPiM61IM66zrXOvc6sIM60zrXOtM6/zrzOrc69zrEgzq4gzrcgzrnOtM65z4zPhM63z4TOsSAnzrzOv869zr/PgM6sz4TOuS9wYXRoJyDOtc6vzr3Osc65IM61z4PPhs6xzrvOvM6tzr3Ot1wiLFxuICBleGNlZWRNYXhTaXplOiBcIs6kzr8gzrzOrc6zzrXOuM6/z4IgzrTOtc69IM68z4DOv8+BzrXOryDOvc6xIM+Fz4DOtc+BzrLOsc6vzr3Otc65IM+EzrEgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDPg8+FzrzPgM67zrfPgc+Oz4PPhM61IM+EzrfOvSDPhM65zrzOriDOs865zrEgz4TOvyDPgM61zrTOr86/ICfOrM67zrvOvycuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLOpM6/IM6xz4HPh861zq/OvyDPg86xz4IgzrHOvc61zrLOsc6vzr3Otc65LiDOoM6xz4HOsc66zrHOu8+OIM+AzrXPgc65zrzOrc69zrXPhM61IM66zrHPgM6/zrnOsSDOtM61z4XPhM61z4HPjM67zrXPgM+EzrEgzrrOsc65IM60zr/Ous65zrzOrM+Dz4TOtSDOvs6xzr3OrC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwizqbPjM+Bz4TPic+DzrcuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLOlc+AzrnOu86/zrPOriDOsc+Bz4fOtc6vz4nOvSAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIs6UzrXOvSDOrc+HzrXOuSDOtc+AzrnOu861zrPOtc6vIM6xz4HPh861zq/Ov1wiLFxuICBjb25maXJtRGVsZXRlOiBcIs6Yzq3Ou861z4TOtSDOvc6xIM60zrnOsc6zz4HOrM+IzrXPhM61IM+EzrfOvSDOtc6zzrPPgc6xz4bOrjtcIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLOkc+Fz4TOriDOtyDPhM65zrzOriDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM68zr/Ovc6xzrTOuc66zq4uXCIsXG4gIGFkZENvbHVtbjogXCLOoM+Bzr/Pg864zq7Ous63IM+Dz4TOrs67zrfPglwiLFxuICBhZGRSb3c6IFwizqDPgc6/z4POuM6uzrrOtyDOs8+BzrHOvM68zq7PglwiLFxuICByZW1vdmVSb3c6IFwizpHPhs6xzq/Pgc61z4POt1wiLFxuICBhZGRQYW5lbDogXCLOoM+Bzr/Pg864zrXPg861IM69zrXOv1wiLFxuICByZW1vdmVQYW5lbDogXCLOkc+GzrHOuc+Bz45cIixcbiAgY2hvaWNlc19JdGVtOiBcIs61zq/OtM6/z4JcIixcbiAgbWF0cml4X2NvbHVtbjogXCLOo8+Ezq7Ou863XCIsXG4gIG1hdHJpeF9yb3c6IFwizqPOtc65z4HOrFwiLFxuICBzYXZpbmdEYXRhOiBcIs6kzrEgzrHPgM6/z4TOtc67zq3Pg868zrHPhM6xIM6xz4DOv864zrfOus61z43Ov869z4TOsc65IM+Dz4TOv869IM60zrnOsc66zr/OvM65z4PPhM6uIC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwizqDOsc+Bzr/Phc+DzrnOrM+Dz4TOt866zrUgz4PPhs6szrvOvM6xIM66zrHOuSDOtM61zr0gzq7PhM6xzr0gzrTPhc69zrHPhM6uIM63IM6xz4DOv864zq7Ous61z4XPg863IM+Ez4nOvSDOsc+Azr/PhM61zrvOtc+DzrzOrM+Ez4nOvS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwizqTOsSDOsc+Azr/PhM61zrvOrc+DzrzOsc+EzrEgzrHPgM6/zrjOt866zrXPjc+EzrfOus6xzr0gzrzOtSDOtc+AzrnPhM+Fz4fOr86xIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwizqDPgc6/z4PPgM6szrjOt8+DzrUgzr7Osc69zqxcIixcbiAgdGltZXJNaW46IFwizrXOu86sz4dcIixcbiAgdGltZXJTZWM6IFwizrTOtc+Fz4RcIixcbiAgdGltZXJTcGVudEFsbDogXCLOiM+HzrXPhM61IM60zrHPgM6xzr3Ors+DzrXOuSB7MH0gz4POtSDOsc+Fz4TOrs69IM+Ezrcgz4POtc67zq/OtM6xIM66zrHOuSB7MX0gz4PPhc69zr/Ou865zrrOrC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwizojPh861z4TOtSDOvs6/zrTOrc+IzrXOuSB7MH0gz4POtSDOsc+Fz4TOrs69IM+Ezrcgz4POtc67zq/OtM6xLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIs6Iz4fOtc+EzrUgzr7Ov860zq3PiM61zrkgz4PPhc69zr/Ou865zrrOrCB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLOiM+HzrXPhM61IM60zrHPgM6xzr3Ors+DzrXOuSB7MH0gzrHPgM+MIHsxfSDPg861IM6xz4XPhM6uzr0gz4TOtyDPg861zrvOr860zrEgzrrOsc65IHsyfSDOsc+Az4wgezN9IM+Dz4XOvc6/zrvOuc66zqwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIs6Iz4fOtc+EzrUgzr7Ov860zq3PiM61zrkgezB9IM6xz4DPjCB7MX0gz4POtSDOsc+Fz4TOrs69IM+Ezrcgz4POtc67zq/OtM6xLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIs6Iz4fOtc+EzrUgzr7Ov860zq3PiM61zrkgezB9IM6xz4DPjCB7MX0gz4PPhc69zr/Ou865zrrOrC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIs6azpHOmM6RzqHOl1wiLFxuICBjbGVhckNhcHRpb246IFwizqPOsc+Gzq5cIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwizpXPgM65zrvOrc6+z4TOtSDPhM6/IM6xz4HPh861zq/Ov1wiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLOms6xz4TOsc+BzrPOrs+Dz4TOtSDOsc+Fz4TPjCDPhM6/IM6xz4HPh861zq/Ov1wiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIs6dzrHOr1wiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwizp/Ph865XCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIs6Vzq/Pg8+EzrUgzrLOrc6yzrHOuc6/zrkgz4zPhM65IM64zq3Ou861z4TOtSDOvc6xIM66zrHPhM6xz4HOs86uz4POtc+EzrUgzrHPhc+Ez4wgz4TOvyDOsc+Bz4fOtc6vzr86IHswfTtcIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIs6Vzq/Pg8+EzrUgzrLOrc6yzrHOuc6/zrkgz4zPhM65IM64zq3Ou861z4TOtSDOvc6xIM66zrHPhM6xz4HOs86uz4POtc+EzrUgz4zOu86xIM+EzrEgzrHPgc+HzrXOr86xO1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwizqTOr8+EzrvOv8+CIM61z4HPjs+EzrfPg863z4JcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZ3JcIl0gPSBncmVla1N1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJnclwiXSA9IFwizrXOu867zrfOvc65zrrOrFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9ncmVlay50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaGVicmV3U3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIteQ15fXldeo15RcIixcbiAgcGFnZU5leHRUZXh0OiBcIten15PXmdee15RcIixcbiAgY29tcGxldGVUZXh0OiBcIteh15nXldedXCIsXG4gIHByZXZpZXdUZXh0OiBcIteq16bXldeS15Qg157Xp9eT15nXnteUXCIsXG4gIGVkaXRUZXh0OiBcItec1rfXotay16jXlda515pcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIteU1rfXqteX1rjXnNa415RcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLXkNeX16ggKNeg15Ag15zXqteQ16gpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLXkNejINeQ15fXk1wiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLXkdeX16gg15TXm9ecXCIsXG4gIHByb2dyZXNzVGV4dDogXCLXk9ejIHsxfSDXnteq15XXmiB7MH1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIteU16fXnNeY15QgezB9INee16rXldeaIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwi16LXoNeUINei15wg16nXkNec15XXqlwiLFxuICBlbXB0eVN1cnZleTogXCLXkNeZ158g16nXkNec15XXqlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIteq15XXk9eUINei15wg157Xmdec15XXmSDXlNep15DXnNeV158hXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLXlNeo16nXldee15XXqiDXqdec16DXlSDXnteo15DXldeqINep15vXkdeoINeh15nXmdee16og15DXqiDXlNeh16fXqCDXlNeW15QuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi15jXoteZ16DXlCDXnteU16nXqNeqLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIteR15fXqC4uLlwiLFxuICB2YWx1ZTogXCLXoteo15pcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLXkNeg15Ag15TXqdeRINei15wg15TXqdeQ15zXlFwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLXkNeg15Ag16LXoNeUINec16TXl9eV16og16LXnCDXqdeQ15zXlCDXkNeX16ouXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi15DXoNeQINei16DXlCDXotecINep15DXnNeV16og15HXm9ecINeU16nXldeo15XXqi5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIteU16rXqdeV15HXlCDXpteo15nXm9eUINec15TXmdeV16og157Xodek16guXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi15TXltefINec16TXl9eV16ogezB9INeq15XXldeZ150uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi15TXltefINek15fXldeqINeeLSB7MH0g16rXldeV15nXnS5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLXlNeW158g15nXldeq16gg154tIHswfSDXldek15fXldeqINeeLSB7MX0g16rXldeV15nXnS5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLXkNeg15Ag157XnNeQINec16TXl9eV16ogezB9INep15XXqNeV16ouXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIteR15fXqCDXnNek15fXldeqIHswfSDXkNek16nXqNeV15nXldeqLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLXkdeX16gg16LXkyB7MH0g15DXpNep16jXldeZ15XXqi5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nINeX15nXmdeRINec15TXmdeV16og16nXldeV15Qg15DXlSDXkteT15XXnCDXniB7MX0sINeV16nXldeV15Qg15wtIHsyfSDXkNeVINek15fXldeqINeeLSB7fX1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyDXl9eZ15nXkSDXnNeU15nXldeqINep15XXldeUINeQ15Ug15LXk9eV15wg154gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg15fXmdeZ15Eg15zXlNeZ15XXqiDXqdeV15XXlCDXkNeVINen15jXnyDXniB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiAn15TXltefINeb16rXldeR16og15PXldeQXCLXnCDXl9eV16fXmdeqLicsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIteU15HXmdeY15XXmTogezB9INem16jXmdeaINec15TXl9eW15nXqCAn15DXnteqJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIteU15HXp9ep15Qg15TXl9eW15nXqNeUINeQ16og15TXqdeS15nXkNeUICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwi15TXkden16nXlCDXlNeX15bXmdeo15Qg16DXqteV16DXmdedINeo15nXp9eZ150g15DXlSDXqdeU157XkNek15nXmdefICfXoNeq15nXkScg16nXkteV15lcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLXkteV15PXnCDXlNen15XXkdelINec15Ag15nXotec15Qg16LXnCB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogJ9eg15Ag15zXlNeW15nXnyDXoNeq15XXoNeZ150g15HXqdeT15QgXCLXkNeX16hcIicsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLXlNen15XXkdelINep15zXmiDXoNeY16LXny4g15TXnteq158g157Xodek16gg16nXoNeZ15XXqiDXldeg16HXlCDXqdeV15EuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIteY15XXotefLi4uXCIsXG4gIGNob29zZUZpbGU6IFwi15zXkdeX15XXqCDXp9eR16bXmdedLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLXnNeQINeg15HXl9eoINen15XXkdelXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi15TXkNedINeQ16rXlCDXqNeV16bXlCDXnNee15fXldenINeQ16og15TXqNep15XXnteUP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItei16jXmiDXlteUINem16jXmdeaINec15TXmdeV16og15nXmdeX15XXk9eZLlwiLFxuICBhZGRDb2x1bW46IFwi15TXldeh16Mg16LXnteV15PXlFwiLFxuICBhZGRSb3c6IFwi15zXlNeV16HXmdejINep15XXqNeUXCIsXG4gIHJlbW92ZVJvdzogXCLXnNaw15TWt9eh1rTXmdeoXCIsXG4gIGFkZFBhbmVsOiBcIteU15XXodejINeX15PXqVwiLFxuICByZW1vdmVQYW5lbDogXCLXnNaw15TWt9eh1rTXmdeoXCIsXG4gIGNob2ljZXNfSXRlbTogXCLXpNeo15nXmFwiLFxuICBtYXRyaXhfY29sdW1uOiBcIteY15XXqFwiLFxuICBtYXRyaXhfcm93OiBcItep14HXlda816jWuNeUXCIsXG4gIHNhdmluZ0RhdGE6IFwi15TXqteV16bXkNeV16og16DXqdee16jXldeqINeR16nXqNeqIC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi15DXmdeo16LXlCDXqdeS15nXkNeUINeV15zXkCDXlNem15zXl9eg15Ug15zXqdee15XXqCDXkNeqINeU16rXldem15DXldeqLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLXlNeq15XXpteQ15XXqiDXoNep157XqNeVINeR15TXptec15fXlCFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIteg16HXlCDXqdeV15FcIixcbiAgdGltZXJNaW46IFwi15PXp9eUXCIsXG4gIHRpbWVyU2VjOiBcItep16DXmdeV16pcIixcbiAgdGltZXJTcGVudEFsbDogXCLXlNeV16bXkNeqIHswfSDXkdeT16Mg15bXlCDXldeR16HXmiDXlNeb15wgezF9LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCLXlNeV16bXkNeqIHswfSDXkdeT16Mg15bXlC5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLXlNeV16bXkNeqINeh15vXldedINeb15XXnNecINep15wgezB9LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwi15TXldem15DXqiB7MH0g157XqteV15ogezF9INeR15PXoyDXlteUINeVLSB7Mn0g157XqteV15ogezN9INeR16HXmiDXlNeb15wuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIteU15XXpteQ16ogezB9INee16rXldeaIHsxfSDXkdeT16Mg15bXlC5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLXlNeV16bXkNeqINeh15vXldedINeb15XXnNecINep15wgezB9INee16rXldeaIHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcItec1rDXoNa316fXlda516pcIixcbiAgY2xlYXJDYXB0aW9uOiBcIteR16jXldeoXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIteR15fXqCDXp9eV15HXpVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLXlNeh16gg16fXldeR16Ug15bXlFwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIteb159cIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcItec15BcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi15TXkNedINeQ16rXlCDXkdeY15XXlyDXqdeR16jXpteV16DXmiDXnNeU16HXmdeoINen15XXkdelINeW15Q6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIteU15DXnSDXkNeq15Qg15HXmNeV15cg16nXkdeo16bXldeg15og15zXlNeh15nXqCDXkNeqINeb15wg15TXp9eR16bXmdedP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwi15vXldeq16jXqiDXqdeQ15zXlFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJoZVwiXSA9IGhlYnJld1N1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJoZVwiXSA9IFwi16LXkdeo15nXqlwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9oZWJyZXcudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGh1bmdhcmlhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJWaXNzemFcIixcbiAgcGFnZU5leHRUZXh0OiBcIlRvdsOhYmJcIixcbiAgY29tcGxldGVUZXh0OiBcIkvDqXN6XCIsXG4gIHByZXZpZXdUZXh0OiBcIkVsxZFuw6l6ZXRcIixcbiAgZWRpdFRleHQ6IFwiU3plcmtlc3p0w6lzXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJSYWp0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiRWd5w6liIChhZGphIG1lZylcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIkVneWlrIHNlbVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJNaW5kZXQga2l2w6FsYXN6dFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiezB9Li97MX0gb2xkYWxcIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcInswfSAvIHsxfSByZWtvcmRcIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIlbDoWxhc3pvbHQga8OpcmTDqXNlazogezB9IC8gezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIlRoZXJlIGlzIG5vIHZpc2libGUgcGFnZSBvciBxdWVzdGlvbiBpbiB0aGUgc3VydmV5LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkvDtnN6w7ZuasO8aywgaG9neSBraXTDtmx0w7Z0dGUgZmVsbcOpcsOpc8O8bmtldCFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCJNw6FyIGtpdMO2bHTDtnR0ZSBhIGZlbG3DqXLDqXN0LlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkZlbG3DqXLDqXMgYmV0w7ZsdMOpc2UuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVsOhbGFzc3pvbi4uLlwiLFxuICB2YWx1ZTogXCLDqXJ0w6lrXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiS8OpcmrDvGssIHbDoWxhc3pvbGphIG1lZyBlenQgYSBrw6lyZMOpc3QhXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIkvDqXJqw7xrLCB2w6FsYXN6b2xqb24gbGVnYWzDoWJiIGVneSBrw6lyZMOpc3JlLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkvDqXJqw7xrIGFkam9uIHbDoWxhc3p0IG1pbmRlbiBzb3JiYW4hXCIsXG4gIG51bWVyaWNFcnJvcjogXCJBeiDDqXJ0w6lrIHN6w6FtIGtlbGwsIGhvZ3kgbGVneWVuIVwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIkFkam9uIG1lZyBsZWdhbMOhYmIgezB9IGthcmFrdGVydCFcIixcbiAgdGV4dE1heExlbmd0aDogXCJMZWdmZWxqZWJiIHswfSBrYXJha3RlcnQgYWRqb24gbWVnIVwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIkFkam9uIG1lZyBsZWdhbMOhYmIgezB9LCBkZSBsZWdmZWxqZWJiIHsxfSBrYXJha3RlcnQhXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVMO2bHRzw7ZuIGtpIG1pbmltdW0gezB9IHNvcnQhXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlbDoWxhc3N6b24ga2kgbGVnYWzDoWJiIHswfSBsZWhldMWRc8OpZ2V0IVwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJOZSB2w6FsYXNzem9uIHTDtmJiZXQsIG1pbnQgezB9IGxlaGV0xZFzw6lnIVwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgbGVneWVuIG5hZ3lvYmIsIHZhZ3kgZWd5ZW5sxZEsIG1pbnQgezF9IMOpcyBraXNlYmIsIHZhZ3kgZWd5ZW5sxZEsIG1pbnQgezJ9IVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGxlZ3llbiBsZWdhbMOhYmIgezF9IVwiLFxuICBudW1lcmljTWF4OiBcIlRoZSAnezB9JyBuZSBsZWd5ZW4gbmFneW9iYiwgbWludCB7MX0hXCIsXG4gIGludmFsaWRFbWFpbDogXCJBZGpvbiBtZWcgZWd5IHZhbMOzcyBlbWFpbCBjw61tZXQhXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkEga8O2dmV0a2V6xZEga2lmZWplesOpczogezB9IHZpc3N6YSBrZWxsIGFkbmlhIGF6IOKAnmlnYXrigJ0gw6lydMOpa2V0LlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiQSBsZWvDqXJkZXrDqXMgaGliw6F2YWwgdMOpcnQgdmlzc3phOiAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkEgbGVrw6lyZGV6w6lzIMO8cmVzIGFkYXR0YWwgdMOpcnQgdmlzc3phLCB2YWd5IGEgJ3BhdGgnIHBhcmFtw6l0ZXIgaGVseXRlbGVuLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkEgbcOpcmV0IG5lbSBsZWhldCBuYWd5b2JiLCBtaW50IHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkFkamEgbWVnIGF6IGVnecOpYiDDqXJ0w6lrZXQhXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJGZWx0w7ZsdMOpcyBmb2x5YW1hdGJhbi4gVsOhcmpvbiBww6FyIG3DoXNvZHBlcmNldCwgbWFqZCBwcsOzYsOhbGphIMO6anJhLlwiLFxuICBsb2FkaW5nRmlsZTogXCJCZXTDtmx0w6lzLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiRsOhamxvayBraXbDoWxhc3p0w6FzYSAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5pbmNzIGtpdsOhbGFzenR2YSBmw6FqbFwiLFxuICBjb25maXJtRGVsZXRlOiBcIlTDtnJsaSBlenQgYSByZWtvcmRvdD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJBeiDDqXJ0w6lrbmVrIGVneWVkaW5layBrZWxsIGxlbm5pZS5cIixcbiAgYWRkQ29sdW1uOiBcIk9zemxvcCBob3p6w6FhZMOhc2FcIixcbiAgYWRkUm93OiBcIlNvciBob3p6w6FhZMOhc2FcIixcbiAgcmVtb3ZlUm93OiBcIkVsdMOhdm9sw610w6FzXCIsXG4gIGFkZFBhbmVsOiBcIsOaaiBob3p6w6FhZMOhc2FcIixcbiAgcmVtb3ZlUGFuZWw6IFwiRWx0w6F2b2zDrXTDoXNcIixcbiAgY2hvaWNlc19JdGVtOiBcImVsZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJPc3psb3BcIixcbiAgbWF0cml4X3JvdzogXCJTb3JcIixcbiAgc2F2aW5nRGF0YTogXCJFcmVkbcOpbnkgbWVudMOpc2UgYSBzemVydmVycmUuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkVneSBoaWJhIGZvbHl0w6FuIG5lbSB0dWR0dWsgZWxtZW50ZW5pIGF6IGVyZWRtw6lueXQuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIkVyZWRtw6lueSBzaWtlcmVzZW4gbWVudHZlIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUHLDs2LDoWxqYSDDumpyYVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiw5ZuIHswfSDDtnNzemVnZXQga8O2bHTDtnR0IGV6ZW4gYXogb2xkYWxvbiwgw6lzIMO2c3N6ZXNlbiB7MX0uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcInswfSDDtnNzemVnZXQga8O2bHTDtnR0IGV6ZW4gYXogb2xkYWxvbi5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLDlnNzemVzZW4gezB9IGvDtmx0w7Z0dC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIsOWbiB7MH0gLyB7MX0gw7Zzc3plZ2V0IGvDtmx0w7Z0dCBlemVuIGF6IG9sZGFsb24sIMOpcyDDtnNzemVzZW4gezJ9IC8gezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLDlm4gezB9IC8gezF9IMO2c3N6ZWdldCBrw7ZsdMO2dHQgZXplbiBheiBvbGRhbG9uLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIsOWc3N6ZXNlbiB7MH0gLyB7MX0gw7Zzc3plZ2V0IGvDtmx0w7Z0dCBlbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIlRpc3p0YVwiLFxuICBjbGVhckNhcHRpb246IFwiRWd5w6lydGVsbcWxXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlbDoWxhc3N6IGbDoWpsdFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJUw6F2b2zDrXRzYSBlbCBlenQgYSBmw6FqbHRcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJJZ2VuXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOZW1cIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiQml6dG9zYW4gZWx0w6F2b2zDrXRqYSBlenQgYSBmw6FqbHQ6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkJpenRvc2FuIGVsIGFrYXJqYSB0w6F2b2zDrXRhbmkgYXogw7Zzc3plcyBmw6FqbHQ/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJLw6lyZMOpcyBjw61tZVwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJodVwiXSA9IGh1bmdhcmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJodVwiXSA9IFwibWFneWFyXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2h1bmdhcmlhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgaWNlbGFuZGljU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlRpbGJha2FcIixcbiAgcGFnZU5leHRUZXh0OiBcIsOBZnJhbVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiTG9racOwXCIsXG4gIHByZXZpZXdUZXh0OiBcIkZvcnNrb8OwYVwiLFxuICBlZGl0VGV4dDogXCJCcmV5dGFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkJ5cmphw7B1XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiSGlubiAoc2vDvXJpbmcpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJFbmdpbm5cIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiVmVsamEgYWxsdFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU8Otw7BhIHswfSBvZiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlRha2EgdXBwIHswfSBhZiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIlN2YXJhw7AgezB9IC8gezF9IHNwdXJuaW5ndW1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiw55hw7AgZXIgZW5naW5uIHPDrcOwYSBlw7BhIHNwdXJuaW5nYXIgw60gw75lc3Nhcmkga8O2bm51bi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUYWtrIGZ5cmlyIGHDsCBmeWxsamEgw7p0IMO+ZXNzYSBrw7ZubnVuIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiU2tyw6FyIG9ra2FyIHPDvW5hIGHDsCDDvsO6IGhlZnVyIMO+ZWdhciBsb2tpw7Agw75lc3Nhcmkga8O2bm51bi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJLw7ZubnVuaW4gZXIgYcOwIGhsYcOwYS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWZWxkdS4uLlwiLFxuICB2YWx1ZTogXCJnaWxkaVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZpbnNhbWxlZ2FzdCBzdmFyacOwIHNwdXJuaW5ndW5uaS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiVmluc2FtbGVnYXN0IHN2YXJhw7B1IGHDsCBtaW5uc3RhIGtvc3RpIGVpbm5pIHNwdXJuaW5ndS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWaW5zYW1sZWdhc3Qgc3ZhcmnDsCBzcHVybmluZ3VtIMOtIMO2bGx1bSByw7bDsHVtLlwiLFxuICBudW1lcmljRXJyb3I6IFwiw55ldHRhIGdpbGRpIHZlcsOwdXIgYcOwIHZlcmEgdGFsYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLDnmHDsCDDpnR0aSBhw7AgdmVyYSBtaW5uc3QgezB9IHTDoWtuLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIG1lc3QgezB9IHTDoWtuLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIGZsZWlyaSBlbiB7MH0gb2cgZsOmcnJpIGVuIHsxfSB0w6Frbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJWaW5zYW1sZWdhc3QgZnlsbGnDsCDDunIgYcOwIG1pbm5zdGEga29zdGkgezB9IHJhw7Bpci5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVmluc2FtbGVnYXN0IHZlbGppw7AgYcOwIG1pbm5zdGEga29zdGkgezB9IG3Dtmd1bGVpa2EuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlZpbnNhbWxlZ2FzdCB2ZWxqacOwIGVra2kgZmxlaXJpIGVuIHswfSBtw7ZndWxlaWthLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgw6Z0dGkgYcOwIHZlcmEgbWVpcmEgZW4gZcOwYSBqYWZudCBvZyB7MX0gbWlubmEgZW4gZcOwYSBqYWZudCBvZyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJ7MH0nIMOmdHRpIGHDsCB2ZXJhIG1laXJhIGVuIGXDsGEgamFmbnQgb2cgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgw6Z0dGkgYcOwIHZlcmEgbWlubmEgZW4gZcOwYSBqYWZudCBvZyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlZpbnNhbWxlZ2FzdCBzbMOhacOwIGlubiBnaWx0IG5ldGZhbmcuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlRqw6FuaW5naW46IHswfSDDpnR0aSBhw7Agc2tpbGEgJ3NhdHQnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiQmVpw7BuaW5uIHNraWxhw7BpIGVmdGlyZmFyYW5hZGkgdmlsbHUgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiQmVpw7BuaW5uZyBza2lsYcOwaSBlbmd1bSBnw7ZnbnVtIGXDsGEgc2zDs8OwaW5uIHZhciByw7ZuZ1wiLFxuICBleGNlZWRNYXhTaXplOiBcIlNrcsOhaW5uIHNrYWwgZWtraSB2ZXJhIHN0w6ZycmkgZW4gezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVmluYW1sZWdhc3QgZnlsbGnDsCDDunQgaGl0dCBnaWxkacOwLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiU2tyw6Fpbm4gw77DrW4gdmFyIHNlbmQuIFZpbnNhbWxlZ2FzdCBiw63DsGnDsCDDrSBub2trcmFyIHNla8O6bmR1ciBvZyByZXluacOwIGFmdHVyLlwiLFxuICBsb2FkaW5nRmlsZTogXCJIbGXDsHVyIC4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlZlbGR1IHNrcsOhciAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkVuZ2luIHNrcsOhIHZhbGluXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVmlsdHUgZXnDsGEgc2tyw6Fubmk/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiw55ldHRhIGdpbGRpIMOmdHRpIGHDsCB2ZXJhIGVpbnN0YWt0LlwiLFxuICBhZGRDb2x1bW46IFwiQsOmdGEgdmnDsCBkw6Fsa2lcIixcbiAgYWRkUm93OiBcIkLDpnRhIHZpw7AgcsO2w7BcIixcbiAgcmVtb3ZlUm93OiBcIkZqYXJsw6ZnamFcIixcbiAgYWRkUGFuZWw6IFwiQsOmdGEgdmnDsCBuw71qdVwiLFxuICByZW1vdmVQYW5lbDogXCJGamFybMOmZ8OwdVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiaGx1dHVyXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiRMOhbGt1clwiLFxuICBtYXRyaXhfcm93OiBcIlLDtsOwXCIsXG5cbiAgc2F2aW5nRGF0YTogXCJOacOwdXJzdMO2w7B1cm5hciBlcnUgYcOwIHNwYXJhIMOhIG5ldMO+asOzbmludW0gLi4uIFwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiVmlsbGEga29tIHVwcCBvZyB2acOwIGfDoXR1bSBla2tpIHZpc3Rhw7AgbmnDsHVyc3TDtsOwdXJuYXIuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIsOBcmFuZ3VyaW5uIHZhciB2aXN0YcOwdXIgbWXDsCBnw7PDsHVtIMOhcmFuZ3JpIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiUmV5bmR1IGFmdHVyXCIsXG4gIHRpbWVyTWluOiBcIm3DrW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiw57DuiBoZWZ1ciBleXR0IHswfSDDoSDDvmVzc2FyaSBzw63DsHUgb2cgezF9IHNhbXRhbHMuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIsOew7ogaGVmdXIgZXl0dCB7MH0gw6Egw75lc3Nhcmkgc8Otw7B1LlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIsOew7ogaGVmdXIgZXl0dCB7MH0gc2FtdGFscy5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIsOew7ogaGVmdXIgZXl0dCB7MH0gYWYgezF9IMOhIMO+ZXNzYXJpIHPDrcOwdSBvZyB7Mn0gYWYgezN9IHNhbXRhbHMuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIsOew7ogaGVmdXIgZXl0dCB7MH0gYWYgezF9IMOhIMO+ZXNzYXJpIHPDrcOwdS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLDnsO6IGhlZnVyIGV5dHQgezB9IGFmIHsxfSBzYW10YWxzLlwiLFxuICBjbGVhbkNhcHRpb246IFwiSHJlaW50XCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJIcmVpbnNhXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlZlbGR1IHNrcsOhXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkZqYXJsw6Znw7B1IMO+ZXNzYSBza3LDoVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkrDoVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTmVpXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIkVydHUgdmlzcyB1bSBhw7Agw77DuiB2aWxqaXIgZmphcmzDpmdqYSDDvmVzc2Egc2tyw6E6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkVydHUgdmlzcyB1bSBhw7Agw77DuiB2aWxqaXIgZmphcmzDpmdqYSBhbGxhciBza3LDoXI/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJTcHVybmluZ2FydGl0aWxsXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImlzXCJdID0gaWNlbGFuZGljU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImlzXCJdID0gXCLDrXNsZW5za2FcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vaWNlbGFuZGljLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBpbmRvbmVzaWFuU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlNlYmVsdW1ueWFcIixcbiAgcGFnZU5leHRUZXh0OiBcIlNlbGFuanV0bnlhXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJTZWxlc2FpXCIsXG4gIHByZXZpZXdUZXh0OiBcIlByYXRpbmphdVwiLFxuICBlZGl0VGV4dDogXCJTdW50aW5nXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJNdWxhaVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkxhaW5ueWEgKGplbGFza2FuKVwiLFxuICBub25lSXRlbVRleHQ6IFwiVGlkYWsgQWRhXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlBpbGloIFNlbXVhXCIsXG4gIHByb2dyZXNzVGV4dDogXCJIYWxhbWFuIHswfSBkYXJpIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiUmVrYW0gezB9IGRhcmkgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJNZW5qYXdhYiBwZXJ0YW55YWFuIHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJUaWRhayBhZGEgaGFsYW1hbiBhdGF1IHBlcnRhbnlhYW4gZGFsYW0gc3VydmVpLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlRlcmltYSBrYXNpaCB0ZWxhaCBtZW55ZWxlc2Fpa2FuIHN1cnZlaSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIkNhdGF0YW4ga2FtaSBtZW51bmp1a2thbiBiYWh3YSBBbmRhIHRlbGFoIG1lbnllbGVzYWlrYW4gc3VydmVpIGluaS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJNZW11YXQgc3VydmVpLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlBpbGloLi4uXCIsXG4gIHZhbHVlOiBcIm5pbGFpXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiU2lsYWhrYW4gamF3YWIgcGVydGFueWFhbiBiZXJpa3V0LlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJTaWxhaGthbiBqYXdhYiBzZXRpZGFrbnlhIHNhdHUgcGV0YW55YWFuLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlNpbGFoa2FuIGphd2FiIHBlcnRhbnlhYW4gcGFkYSBzZW11YSBiYXJpcy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIk5pbGFpIGhhcnVzIGJlcnVwYSBhbmdrYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJTaWxhaGthbiBtYXN1a2thbiBzZXRpZGFrbnlhIHswfSBrYXJha3Rlci5cIixcbiAgdGV4dE1heExlbmd0aDogXCJTaWxhaGthbiBtYXN1a2thbiBrdXJhbmcgezB9IGthcmFrdGVyLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlBTaWxhaGthbiBtYXN1a2thbiBsZWJpaCBkYXJpIHswfSBkYW4ga3VyYW5nIGRhcmkgezF9IGthcmFrdGVyLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlNpbGFoa2FuIGlzaSBzZXRpZGFrbnlhIHswfSBiYXJpcy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiU2lsYWhrYW4gcGlsaWggc2V0aWRha255YSB7MH0gdmFyaWFuLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJTaWxhaGthbiBwaWxpaCB0aWRhayBsZWJpaCBkYXJpIHswfSB2YXJpYW4uXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiJ3swfScgaGFydXMgc2FtYSBkZW5nYW4gYXRhdSBsZWJpaCBkYXJpIHsxfSBkYW4gaGFydXMgc2FtYSBkZW5nYW4gYXRhdSBrdXJhbmcgZGFyaSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBoYXJ1cyBzYW1hIGRlbmdhbiBhdGF1IGxlYmloIGRhcmkgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgaGFydXMgc2FtYSBkZW5nYW4gYXRhdSBrdXJhbmcgZGFyaSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlNpbGFoa2FuIG1hc3Vra2FuIGUtbWFpbCB5YW5nIGJlbmFyLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJFa3NwcmVzaTogezB9IGhhcnVzIG1lbmdlbWJhbGlrYW4gJ2JlbmFyJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlBlcm1pbnRhYW4gbWVuZ2VtYmFsaWthbiBrZXNhbGFoYW4gJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwiUGVybWludGFhbiBtZW5nZW1iYWxpa2FuIGRhdGEga29zb25nIGF0YXUgcHJvcGVydGkgJ3BhdGgnIHNhbGFoLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIlVrdXJhbiBiZXJrYXMgdGlkYWsgYm9sZWggbWVsZWJpaGkgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiU2lsYWhrYW4gbWFzdWtrYW4gbmlsYWkgbGFpbm5ueWEuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwiQmVya2FzIEFuZGEgc2VkYW5nIGRpdW5nZ2FoLiBTaWxhaGthbiB0dW5nZ3UgYmViZXJhcGEgc2FhdCBhdGF1IGNvYmEgbGFnaS5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiTWVtdWF0Li4uXCIsXG4gIGNob29zZUZpbGU6IFwiUGlsaWggYmVya2FzLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJUaWRhayBhZGEgZmlsZSB5YW5nIGRpcGlsaWhcIixcbiAgY29uZmlybURlbGV0ZTogXCJBcGFrYWggQW5kYSBpbmdpbiBtZW5naGFwdXMgY2F0YXRhbj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJOaWxhaSBoYXJ1cyB1bmlrLlwiLFxuICBhZGRDb2x1bW46IFwiVGFtYmFoIGtvbG9tXCIsXG4gIGFkZFJvdzogXCJUYW1iYWggYmFyaXNcIixcbiAgcmVtb3ZlUm93OiBcIkhhcHVzXCIsXG4gIGFkZFBhbmVsOiBcIlRhbWJhaCBiYXJ1XCIsXG4gIHJlbW92ZVBhbmVsOiBcIkhhcHVzXCIsXG4gIGNob2ljZXNfSXRlbTogXCJpdGVtXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sb21cIixcbiAgbWF0cml4X3JvdzogXCJCYXJpc1wiLFxuICBzYXZpbmdEYXRhOiBcIkhhc2lsIHNlZGFuZyBkaXNpbXBhbiBwYWRhIHNlcnZlci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiS2VzYWxhaGFuIHRlcmphZGkgZGFuIGthbWkgdGlkYWsgZGFwYXQgbWVueWltcGFuIGhhc2lsLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJIYXNpbCB0ZWxhaCBzdWtzZXMgZGlzaW1wYW4hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJDb2JhIGxhZ2lcIixcbiAgdGltZXJNaW46IFwibWVuaXRcIixcbiAgdGltZXJTZWM6IFwiZGV0aWtcIixcbiAgdGltZXJTcGVudEFsbDogXCJBbmRhIHRlbGFoIG1lbmdoYWJpc2thbiB7MH0gcGFkYSBoYWxhbWFuIGluaSBkYW4gezF9IHNlY2FyYSBrZXNlbHVydWhhbi5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiWUFuZGEgdGVsYWggbWVuZ2hhYmlza2FuIHswfSBwYWRhIGhhbGFtYW4gaW5pLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkFuZGEgdGVsYWggbWVuZ2hhYmlza2FuIHswfSBzZWNhcmEga2VzZWx1cnVoYW4uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJBbmRhIHRlbGFoIG1lbmdoYWJpc2thbiB7MH0gZGFyaSB7MX0gcGFkYSBoYWxhbWFuIGluaSBkYW4gezJ9IGRhcmkgezN9IHNlY2FyYSBrZXNlbHVydWhhbi5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiQW5kYSB0ZWxhaCBtZW5naGFiaXNrYW4gezB9IGRhcmkgezF9IHBhZGEgaGFsYW1hbiBpbmkuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiQW5kYSB0ZWxhaCBtZW5naGFiaXNrYW4gezB9IGRhcmkgezF9IHNlY2FyYSBrZXNlbHVydWhhbi5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkJlcnNpaGthblwiLFxuICBjbGVhckNhcHRpb246IFwiQmVyc2loa2FuXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlBpbGloIEZpbGVcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiSGFwdXMgYmVya2FzIGluaVwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkl5YVwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiVGlkYWtcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiQW5kYSB5YWtpbiBpbmdpbiBtZW5naGFwdXMgZmlsZSBpbmk6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkFuZGEgeWFraW4gaW5naW4gbWVuZ2hhcHVzIHNlbXVhIGZpbGU/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJKdWR1bCBwZXJ0YW55YWFuXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImlkXCJdID0gaW5kb25lc2lhblN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJpZFwiXSA9IFwiQmFoYXNhIEluZG9uZXNpYVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9pbmRvbmVzaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBpdGFsaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlByZWNlZGVudGVcIixcbiAgcGFnZU5leHRUZXh0OiBcIlN1Y2Nlc3Npdm9cIixcbiAgY29tcGxldGVUZXh0OiBcIlNhbHZhXCIsXG4gIHByZXZpZXdUZXh0OiBcIkFudGVwcmltYVwiLFxuICBlZGl0VGV4dDogXCJNb2RpZmljYVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiSW5pemlvXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQWx0cm8gKGRlc2NyaXZpKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTmVzc3Vub1wiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJTZWxlemlvbmEgdHV0dGlcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2luYSB7MH0gZGkgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJSZWNvcmQgZGkgezB9IGRpIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiUmlzcG9zdGUgYSB7MH0vezF9IGRvbWFuZGVcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTm9uIGNpIHNvbm8gcGFnaW5lIG8gZG9tYW5kZSB2aXNpYmlsaSBuZWwgcXVlc3Rpb25hcmlvLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkdyYXppZSBwZXIgYXZlciBjb21wbGV0YXRvIGlsIHF1ZXN0aW9uYXJpbyFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIkkgbm9zdHJpIHJlY29yZHMgbW9zdHJhbm8gY2hlIGhhaSBnacOgIGNvbXBsZXRhdG8gcXVlc3RvIHF1ZXN0aW9uYXJpby5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJDYXJpY2FtZW50byBkZWwgcXVlc3Rpb25hcmlvIGluIGNvcnNvLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNjZWdsaS4uLlwiLFxuICB2YWx1ZTogXCJ2YWxvcmVcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJDYW1wbyBvYmJsaWdhdG9yaW9cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiUGVyIEZhdm9yZSwgcmlzcG9uZGkgYWQgYWxtZW5vIHVuYSBkb21hbmRhLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkNvbXBsZXRhcmUgdHV0dGUgbGUgcmlnaGVcIixcbiAgbnVtZXJpY0Vycm9yOiBcIklsIHZhbG9yZSBkZXZlIGVzc2VyZSBudW1lcmljb1wiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIkluc2VyaXJlIGFsbWVubyB7MH0gY2FyYXR0ZXJpXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTHVuZ2hlenphIG1hc3NpbWEgY29uc2VudGl0YSB7MH0gY2FyYXR0ZXJpXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6XG4gICAgXCJJbnNlcmlyZSB1bmEgc3RyaW5nYSBjb24gbWluaW1vIHswfSBlIG1hc3NpbW8gezF9IGNhcmF0dGVyaVwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIkNvbXBsZXRhcmUgYWxtZW5vIHswfSByaWdoZS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiU2VsZXppb25hcmUgYWxtZW5vIHswfSB2YXJpYW50aS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiU2VsZXppb25hcmUgbWFzc2ltbyB7MH0gdmFyaWFudGkuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBkZXZlIGVzc2VyZSB1Z3VhbGUgbyBzdXBlcmlvcmUgYSB7MX0gZSB1Z3VhbGUgbyBpbmZlcmlvcmUgYSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBkZXZlIGVzc2VyZSB1Z3VhbGUgbyBzdXBlcmlvcmUgYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBkZXZlIGVzc2VyZSB1Z3VhbGUgbyBpbmZlcmlvcmUgYSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIkluc2VyaXJlIGluZGlyaXp6byBtYWlsIHZhbGlkb1wiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJMJ2VzcHJlc3Npb25lOiB7MH0gZG92cmViYmUgdG9ybmFyZSAndmVybycuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJMYSByaWNoaWVzdGEgaGEgcmlzcG9zdG8gY29uIHVuIGVycm9yZSAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkxhIHJpY2hpZXN0YSBoYSByaXNwb3N0byBudWxsIG9wcHVyZSBpbCBwZXJjb3JzbyBub24gw6ggY29ycmV0dG9cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJJbCBmaWxlIG5vbiBwdcOyIGVjY2VkZXJlIHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiSW5zZXJpcmUgaWwgdmFsb3JlICdhbHRybydcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZpbGUgaW4gY2FyaWNhbWVudG8uIEF0dGVuZGkgYWxjdW5pIHNlY29uZGkgZSByaXByb3ZhXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkNhcmljYW1lbnRvLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiU2VsZXppb25hcmUgZmlsZShzKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTmVzc3VuIGZpbGUgc2VsZXppb25hdG9cIixcbiAgY29uZmlybURlbGV0ZTogXCJTZWkgc2ljdXJvIGRpIHZvbGVyIGVsbWluYXJlIGlsIHJlY29yZD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJRdWVzdG8gdmFsb3JlIGRldmUgZXNzZXJlIHVuaXZvY28uXCIsXG4gIGFkZENvbHVtbjogXCJBZ2dpdW5naSBjb2xvbm5hXCIsXG4gIGFkZFJvdzogXCJBZ2dpdW5naSByaWdhXCIsXG4gIHJlbW92ZVJvdzogXCJSaW11b3ZpIHJpZ2FcIixcbiAgYWRkUGFuZWw6IFwiQWdnaXVuZ2kgcmlnYVwiLFxuICByZW1vdmVQYW5lbDogXCJFbGltaW5hXCIsXG4gIGNob2ljZXNfSXRlbTogXCJFbGVtZW50b1wiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbG9ubmFcIixcbiAgbWF0cml4X3JvdzogXCJSaWdhXCIsXG4gIHNhdmluZ0RhdGE6IFwiU2FsdmF0YWdnaW8gZGF0aSBzdWwgc2VydmVyLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJTaSDDqCB2ZXJpZmljYXRvIHVuIGVycm9yZSBlIG5vbiDDqCBzdGF0byBwb3NzaWJpbGUgc2FsdmFyZSBpIHJpc3VsdGF0aS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiSSByaXN1bHRhdGkgc29ubyBzdGF0aSBzYWx2YXRpIGNvbiBzdWNjZXNzbyFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlJpcHJvdmFcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIkhhaSBpbXBpZWdhdG8gezB9IHN1IHF1ZXN0YSBwYWdpbmEgZSB7MX0gaW4gdG90YWxlLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJIYWkgaW1waWVnYXRvIHswfSBzdSBxdWVzdGEgcGFnaW5hLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkhhaSBpbXBpZWdhdG8gezB9IGluIHRvdGFsZS5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkhhaSBpbXBpZWdhdG8gezB9IGRpIHsxfSBzdSBxdWVzdGEgcGFnaW5hIGUgezJ9IGRpIHszfSBpbiB0b3RhbGUuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkhhaSBpbXBpZWdhdG8gezB9IGRpIHsxfSBzdSBxdWVzdGEgcGFnaW5hLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIkhhaSBpbXBpZWdhdG8gezB9IGRpIHsxfSBpbiB0b3RhbGUuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJQdWxpc2NpXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJDYW5jZWxsYVwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJTY2VnbGllcmUgaWwgZmlsZVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJSaW11b3ZlcmUgcXVlc3RvIGZpbGVcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJTw6xcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5vXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIlNlaSBzaWN1cm8gZGkgdm9sZXIgZWxtaW5hcmUgcXVlc3RvIGZpbGU6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIlNlaSBzaWN1cm8gZGkgdm9sZXIgZWxtaW5hcmUgdHV0dGkgaSBmaWxlcz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlRpdG9sbyBkZWxsYSBkb21hbmRhXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcIml0XCJdID0gaXRhbGlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJpdFwiXSA9IFwiaXRhbGlhbm9cIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vaXRhbGlhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XHJcblxyXG5leHBvcnQgdmFyIGphcGFuZXNlU3VydmV5U3RyaW5ncyA9IHtcclxuICBwYWdlUHJldlRleHQ6IFwi5YmN44G4XCIsXHJcbiAgcGFnZU5leHRUZXh0OiBcIuasoeOBuFwiLFxyXG4gIGNvbXBsZXRlVGV4dDogXCLlrozkuoZcIixcclxuICBwcmV2aWV3VGV4dDogXCLjg5fjg6zjg5Pjg6Xjg7xcIixcclxuICBlZGl0VGV4dDogXCLnt6jpm4ZcIixcclxuICBzdGFydFN1cnZleVRleHQ6IFwi44K544K/44O844OIXCIsXHJcbiAgb3RoZXJJdGVtVGV4dDogXCLjgZ3jga7ku5bvvIjoqqzmmI7vvIlcIixcclxuICBub25lSXRlbVRleHQ6IFwi44Gq44GXXCIsXHJcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwi44GZ44G544Gm6YG45oqeXCIsXHJcbiAgcHJvZ3Jlc3NUZXh0OiBcInswfS97MX3poIFcIixcclxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiezF944GuezB944KS6KiY6Yyy44GZ44KLXCIsXHJcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcInswfS97MX3jga7os6rllY/jgavlm57nrZTjgZfjgb7jgZfjgZ/jgIJcIixcclxuICBlbXB0eVN1cnZleTogXCLjgZPjga7oqr/mn7vjgavooajnpLrjgafjgY3jgovjg5rjg7zjgrjjgoTos6rllY/jga/jgYLjgorjgb7jgZvjgpNcIixcclxuICBjb21wbGV0aW5nU3VydmV5OiBcIuiqv+afu+OCkuWujOS6huOBl+OBpuOBj+OCjOOBpuOBguOCiuOBjOOBqOOBhuOBlOOBluOBhOOBvuOBl+OBn1wiLFxyXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XHJcbiAgICBcIuW9k+ekvuOBruiomOmMsuOBq+OCiOOCi+OBqOOAgeOBk+OBruiqv+afu+OBr+OBmeOBp+OBq+WujOS6huOBl+OBpuOBhOOBvuOBmeOAglwiLFxyXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi6Kq/5p+744KS44OA44Km44Oz44Ot44O844OJ5LitXCIsXHJcbiAgb3B0aW9uc0NhcHRpb246IFwi6YG45oqeXCIsXHJcbiAgdmFsdWU6IFwi5YCk5omT44GhXCIsXHJcbiAgcmVxdWlyZWRFcnJvcjogXCLos6rllY/jgavjgYrnrZTjgYjkuIvjgZXjgYRcIixcclxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLmnIDkvY7jgafjgoIx44Gk44Gu6LOq5ZWP44Gr562U44GI44Gm44GP44Gg44GV44GE44CCXCIsXHJcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLos6rllY/jgavjga/lhajliJfjgaflm57nrZTjgZfjgabjgY/jgaDjgZXjgYTjgIJcIixcclxuICBudW1lcmljRXJyb3I6IFwi5pWw5a2X44Gn44GU6KiY5YWl5LiL44GV44GEXCIsXHJcbiAgdGV4dE1pbkxlbmd0aDogXCJ7MH0g5paH5a2X5Lul5LiK44Gn5YWl5Yqb44GX44Gm5LiL44GV44GEXCIsXHJcbiAgdGV4dE1heExlbmd0aDogXCJ7MH3mloflrZfku6XkuIvjgaflhaXlipvjgZfjgabjgY/jgaDjgZXjgYTjgIJcIixcclxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcInswfeS7peS4insxfeacqua6gOOBruaWh+Wtl+OCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhOOAglwiLFxyXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiezB96KGM5Lul5LiK44Gn5YWl5Yqb44GX44Gm5LiL44GV44GEXCIsXHJcbiAgbWluU2VsZWN0RXJyb3I6IFwiezB956iu6aGe5Lul5LiK44KS6YG45oqe44GX44Gm5LiL44GV44GEXCIsXHJcbiAgbWF4U2VsZWN0RXJyb3I6IFwiezB95Lul5LiK44Gu44OQ44Oq44Ki44Oz44OI44KS6YG45oqe44GX44Gq44GE44Gn44GP44Gg44GV44GE44CCXCIsXHJcbiAgbnVtZXJpY01pbk1heDpcclxuICAgIFwiezB944GvezF95Lul5LiK44Gn44GC44KK44CBezJ95Lul5LiL44Gn44GC44KL44GT44Go44GM5pyb44G+44GX44GE44CCXCIsXHJcbiAgbnVtZXJpY01pbjogXCInezB9JyDjga/lkIznrYnjgYt7MX3jgojjgorlpKfjgY3jgY/jgarjgZHjgozjgbDjgarjgorjgb7jgZvjgpNcIixcclxuICBudW1lcmljTWF4OiBcIid7MH0nIOOBr+WQjOetieOBi3sxfeOCiOOCiuWwj+OBleOBj+OBquOBkeOCjOOBsOOBquOCiuOBvuOBm+OCk1wiLFxyXG4gIGludmFsaWRFbWFpbDogXCLmnInlirnjgarjg6Hjg7zjg6vjgqLjg4njg6zjgrnjgpLjgZToqJjlhaXkuIvjgZXjgYRcIixcclxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLlvI/jga8gezB944GvJ3RydWUn44KS6L+U44GZ44G544GN44Gn44GZ44CCXCIsXHJcbiAgdXJsUmVxdWVzdEVycm9yOiBcIuODquOCr+OCqOOCueODiOOBr+OCqOODqeODvCAnezB9JyDjgpLov5TjgZfjgb7jgZfjgZ/jgIJ7MX1cIixcclxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XHJcbiAgICBcIuODquOCr+OCqOOCueODiOOBjOepuuOBruODh+ODvOOCv+OCkui/lOOBl+OBn+OBi+OAgSdwYXRoJyDjg5fjg63jg5Hjg4bjgqPjgYzmraPjgZfjgY/jgYLjgorjgb7jgZvjgpPjgIJcIixcclxuICBleGNlZWRNYXhTaXplOiBcIuODleOCoeOCpOODq+OBruOCteOCpOOCuuOBr3swfeOCkui2heOBiOOBpuOBr+OBhOOBkeOBvuOBm+OCk1wiLFxyXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLjgZ3jga7ku5bjga7lgKTjgpLlhaXlipvjgZfjgabjgY/jgaDjgZXjgYTjgIJcIixcclxuICB1cGxvYWRpbmdGaWxlOlxyXG4gICAgXCLjg5XjgqHjgqTjg6vjgpLjgqLjg4Pjg5fjg63jg7zjg4nkuK3jgafjgZnjgILjgZfjgbDjgonjgY/jgZfjgabjgYvjgonlho3luqbjgYroqabjgZfkuIvjgZXjgYRcIixcclxuICBsb2FkaW5nRmlsZTogXCLoqq3jgb/ovrzjgb/kuK1cIixcclxuICBjaG9vc2VGaWxlOiBcIuODleOCoeOCpOODq+OCkumBuOaKnlwiLFxyXG4gIG5vRmlsZUNob3NlbjogXCLpgbjmip7jgZXjgozjgZ/jg5XjgqHjgqTjg6vjga/jgYLjgorjgb7jgZvjgpNcIixcclxuICBjb25maXJtRGVsZXRlOiBcIuODrOOCs+ODvOODieOCkuWJiumZpOOBl+OBvuOBmeOBi++8n1wiLFxyXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi44GT44Gu5YCk44Gv5LiA5oSP44Gn44Gq44GR44KM44Gw44Gq44KK44G+44Gb44KT44CCXCIsXHJcbiAgYWRkQ29sdW1uOiBcIuWIl+OBrui/veWKoFwiLFxyXG4gIGFkZFJvdzogXCLov73liqDooYxcIixcclxuICByZW1vdmVSb3c6IFwi6Zmk5Y67XCIsXHJcbiAgYWRkUGFuZWw6IFwi5paw6KaP6L+95YqgXCIsXHJcbiAgcmVtb3ZlUGFuZWw6IFwi6Zmk5Y67XCIsXHJcbiAgY2hvaWNlc19JdGVtOiBcIuWTgeebrlwiLFxyXG4gIG1hdHJpeF9jb2x1bW46IFwi44Kz44Op44OgXCIsXHJcbiAgbWF0cml4X3JvdzogXCLooYxcIixcclxuICBzYXZpbmdEYXRhOiBcIue1kOaenOOBr+OCteODvOODkOODvOOBq+S/neWtmOOBleOCjOOBpuOBhOOBvuOBmS4uLuOAglwiLFxyXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLjgqjjg6njg7zjgYznmbrnlJ/jgZfjgIHntZDmnpzjgpLkv53lrZjjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/jgIJcIixcclxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLntZDmnpzjga/nhKHkuovjgavkv53lrZjjgZXjgozjgb7jgZfjgZ9cIixcclxuICBzYXZlQWdhaW5CdXR0b246IFwi44KC44GG5LiA5bqm6Kmm44GX44Gm44G/44Gm44GP44Gg44GV44GE44CCXCIsXHJcbiAgdGltZXJNaW46IFwi5YOF5bCRXCIsXHJcbiAgdGltZXJTZWM6IFwi44K744OD44KvXCIsXHJcbiAgdGltZXJTcGVudEFsbDogXCLjgYLjgarjgZ/jga/jgZPjga7jg5rjg7zjgrjjgat7MH3jgpLosrvjgoTjgZfjgIHlkIjoqIjjgad7MX3jgpLosrvjgoTjgZfjgb7jgZfjgZ/jgIJcIixcclxuICB0aW1lclNwZW50UGFnZTogXCLjgYLjgarjgZ/jga/jgZPjga7jg5rjg7zjgrjjgat7MH3jgpLosrvjgoTjgZfjgb7jgZfjgZ/jgIJcIixcclxuICB0aW1lclNwZW50U3VydmV5OiBcIuWQiOioiOOBp3swfeOCkuS9v+OBo+OBn+OBk+OBqOOBq+OBquOCiuOBvuOBmeOAglwiLFxyXG4gIHRpbWVyTGltaXRBbGw6XHJcbiAgICBcIuOBk+OBruODmuODvOOCuOOBq3sxfeOBruOBhuOBoXswfeOCkuiyu+OChOOBl+OAgXszfeOBruOBhuOBoXsyfeOCkuWQiOioiOOBp+iyu+OChOOBl+OBvuOBl+OBn+OAglwiLFxyXG4gIHRpbWVyTGltaXRQYWdlOiBcIuOBk+OBruODmuODvOOCuOOBp3sxfeOBrnswfeOCkuS9v+OBo+OBn+OBk+OBqOOBjOOBguOCiuOBvuOBmeOAglwiLFxyXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi5ZCI6KiI44GnezF944GuezB944KS5L2/44Gj44Gf44GT44Go44GM44GC44KK44G+44GZ44CCXCIsXHJcbiAgY2xlYW5DYXB0aW9uOiBcIuWJiumZpFwiLFxyXG4gIGNsZWFyQ2FwdGlvbjogXCLnqbrnmb1cIixcclxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLjg5XjgqHjgqTjg6vjgpLpgbjmip5cIixcclxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLjgZPjga7jg5XjgqHjgqTjg6vjgpLliYrpmaRcIixcclxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIuWZq1wiLFxyXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLlkKZcIixcclxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLjgZPjga7jg5XjgqHjgqTjg6vjgpLliYrpmaTjgZfjgabjgoLjgojjgo3jgZfjgYTjgafjgZnjgYvvvJ97MH0/XCIsXHJcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIuOBmeOBueOBpuOBruODleOCoeOCpOODq+OCkuWJiumZpOOBl+OBpuOCguOCiOOCjeOBl+OBhOOBp+OBmeOBi++8n1wiLFxyXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLos6rllY/lkI1cIixcclxufTtcclxuXHJcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiamFcIl0gPSBqYXBhbmVzZVN1cnZleVN0cmluZ3M7XHJcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImphXCJdID0gXCLml6XmnKzoqp5cIjtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9qYXBhbmVzZS50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIga29yZWFuU3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIuydtOyghFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi64uk7J2MXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLsmYTro4xcIixcbiAgcHJldmlld1RleHQ6IFwi7Iuc7IKsXCIsXG4gIGVkaXRUZXh0OiBcIu2OuOynke2VmOuLpFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi7Iuc7J6RXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi6riw7YOAKOyEpOuqhSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIuyXhuydjFwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLrqqjrkZAg7ISg7YOdXCIsXG4gIHByb2dyZXNzVGV4dDogXCLtjpjsnbTsp4AgezF9IOykkSB7MH1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcInswfSAvIHsxfSDquLDroZ1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcInswfSAvIHsxfSDqsJzsnZgg7KeI66y47JeQIOuLteuzgCDtlahcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi7ISk66y47KeA7JeQIOuztOyXrOyngOuKlCDtjpjsnbTsp4Drgpgg7KeI66y47J20IOyXhuyKteuLiOuLpFwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuyEpOusuCDsobDsgqzrpbwg7JmE66OM7ZW0IOyjvOyFlOyEnCDqsJDsgqztlanri4jri6QhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6IFwi6riw66Gd7JeQIOuUsOultOuptCDsnbTrr7gg7ISk66y4IOyhsOyCrOulvCDrp4jsuZjshajsirXri4jri6QuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi7ISk66y47KGw7IKs6rCAIOuhnOuTnOykkeyeheuLiOuLpC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLshKDtg53tlZjsi63si5zsmKQuLi5cIixcbiAgdmFsdWU6IFwi6rCSXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi7KeI66y47JeQIOuLte2VmOyLnOyYpC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi7ZWY64KYIOydtOyDgeydmCDsp4jrrLjsl5Ag64u17ZWY7Iut7Iuc7JikLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuuqqOuToCDtlonsl5Ag7J6I64qUIOyniOusuOyXkCDri7XtlZjsi63si5zsmKQuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLqsJLsnYAg7Iir7J6Q7Jes7JW8IO2VqeuLiOuLpC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLri7Xrs4DsnZgg6ri47J2064qUIOy1nOyGjCB7MH3snpDsl6zslbwg7J6F64uI64ukLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIuuLteuzgOydmCDquLjsnbTripQgezB97J6Q66W8IOy0iOqzvCDtlaAg7IiYIOyXhuyKteuLiOuLpC5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLri7Xrs4DsnZgg6ri47J2064qUIHswfSAtIHsxfeyekCDsgqzsnbTsl6zslbwg7ZWp64uI64ukLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuy1nOyGjCB7MH3qsJzsnZgg7ZaJ7J2EIOyxhOyasOyLreyLnOyYpFwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLstZzshowgezB96rCc7J2YIOuzgOyImOulvCDshKDtg53tlZjsi63si5zsmKQuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuy1nOuMgCB7MH3qsJzsnZgg67OA7IiY66W8IOyEoO2Dne2VmOyLreyLnOyYpC5cIixcbiAgbnVtZXJpY01pbk1heDogXCInezB9J+ydgCB7MX3rs7Tri6Qg7YGs6rGw64KYIOqwmeqzoCB7Mn3rs7Tri6Qg7J6R6rGw64KYIOqwmeyVhOyVvO2VqeuLiOuLpC5cIixcbiAgbnVtZXJpY01pbjogXCInezB9J+ydgCB7MX3rs7Tri6Qg7YGs6rGw64KYIOqwmeyVhOyVvO2VqeuLiOuLpC5cIixcbiAgbnVtZXJpY01heDogXCInezB9J+ydgCB7MX3rs7Tri6Qg7J6R6rGw64KYIOqwmeyVhOyVvO2VqeuLiOuLpC5cIixcbiAgaW52YWxpZEVtYWlsOiBcIuyYrOuwlOuluCDsnbTrqZTsnbwg7KO87IaM66W8IOyeheugpe2VmOyLreyLnOyYpC5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwi7ZGc7ZiE7IudOiB7MH3snYAgJ+ywuCfsnbTslrTslbwg7ZWp64uI64ukLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiJ3swfSfsnLzroZwg7J6Y66q765CcIOyalOyyreyeheuLiOuLpC4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLruYTslrTsnojripQg642w7J207YSw66W8IOyalOyyre2WiOqxsOuCmCDsnpjrqrvrkJwg7IaN7ISx7J2YIOqyveuhnOyeheuLiOuLpC5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLtjIzsnbwg7YGs6riw6rCAIHswfeydhCDstIjqs7wg7ZWgIOyImCDsl4bsirXri4jri6QuXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLri6Trpbgg7KeI66y47J2EIOyekeyEse2VmOyLreyLnOyYpC5cIixcbiAgdXBsb2FkaW5nRmlsZTogXCLtjIzsnbwg7JeF66Gc65OcIOykkeyeheuLiOuLpC4g7J6g7IucIO2bhCDri6Tsi5wg7Iuc64+E7ZWY7Iut7Iuc7JikLlwiLFxuICBsb2FkaW5nRmlsZTogXCLroZzrk5wg7KSRLi4uXCIsXG4gIGNob29zZUZpbGU6IFwi7YyM7J28IOyEoO2DnS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwi7ISg7YOd65CcIO2MjOydvOydtCDsl4bsirXri4jri6RcIixcbiAgY29uZmlybURlbGV0ZTogXCLquLDroZ3snYQg7IKt7KCc7ZWY7Iuc6rKg7Iq164uI6rmMP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIiDsnbQg6rCS7J2AIOqzoOycoO2VtOyVvO2VqeuLiOuLpC5cIixcbiAgYWRkQ29sdW1uOiBcIuyXtCDstpTqsIBcIixcbiAgYWRkUm93OiBcIu2WiSDstpTqsIBcIixcbiAgcmVtb3ZlUm93OiBcIuygnOqxsFwiLFxuICBhZGRQYW5lbDogXCLsg4jroa3qsowg7LaU6rCAXCIsXG4gIHJlbW92ZVBhbmVsOiBcIuygnOqxsFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi7ZWt66qpXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi7Je0XCIsXG4gIG1hdHJpeF9yb3c6IFwi7ZaJXCIsXG4gIHNhdmluZ0RhdGE6IFwi6rKw6rO86rCAIOyEnOuyhOyXkCDsoIDsnqUg7KSR7J6F64uI64ukLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLsmKTrpZjqsIAg67Cc7IOd7ZWY7JesIOqysOqzvOulvCDsoIDsnqXtlaAg7IiYIOyXhuyKteuLiOuLpC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi6rKw6rO86rCAIOyEseqzteyggeycvOuhnCDsoIDsnqXrkJjsl4jsirXri4jri6QhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLri6Tsi5wg7Iuc64+E7ZWY7Iut7Iuc7JikXCIsXG4gIHRpbWVyTWluOiBcIuu2hFwiLFxuICB0aW1lclNlYzogXCLstIhcIixcbiAgdGltZXJTcGVudEFsbDogXCLtmITsnqwg7Y6Y7J207KeA7JeQ7IScIHswfeydhCDshozsmpTtlbQg7LSdIHsxfeydtCDqsbjroLjsirXri4jri6QuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezBd7J20IOqxuOuguOyKteuLiOuLpFwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIuy0nSB7MH3snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0QWxsOiBcIu2YhOyerCDtjpjsnbTsp4Dsl5DshJwgezB9L3sxfeydhCDshozsmpTtlbQg7LSdIHsyfS97M33snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLtmITsnqwg7Y6Y7J207KeA7JeQ7IScIHswfS97MX3snbQg6rG466C47Iq164uI64ukLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIuy0nSB7MH0vezF97J20IOqxuOuguOyKteuLiOuLpC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIuuLpuq4sFwiLFxuICBjbGVhckNhcHRpb246IFwi7KeA7Jqw6riwXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIu2MjOydvOydhCDshKDtg51cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi7J20IO2MjOydvCDsoJzqsbBcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLsmIhcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIuyVhOuLiFwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJ7MH0g7YyM7J287J2EIOygnOqxsCDtlZjsi5zqsqDsirXri4jquYw/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLrqqjrk6Ag7YyM7J287J2EIOygnOqxsCDtlZjsi5zqsqDsirXri4jquYw/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLsp4jrrLgg7KCc66qpXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImtvXCJdID0ga29yZWFuU3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcImtvXCJdID0gXCLtlZzqta3slrRcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24va29yZWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBsYXR2aWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkF0cGFrYcS8XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJUxIFsxIFrXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJQYWJlaWd0XCIsXG4gIHByZXZpZXdUZXh0OiBcIlByaWVrxaFza2F0xKtqdW1zXCIsXG4gIGVkaXRUZXh0OiBcIlJlZGnEo8STdFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU8SBa3RcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJDaXRzIChsxatkenUsIGFwcmFrc3RpZXQhKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTmF2XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIkl6dsSTbMSTdGllcyB2aXN1c1wiLFxuICBwcm9ncmVzc1RleHQ6IFwiTGFwcHVzZSB7MH0gbm8gezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCJJZXJha3N0xKt0IHswfSBubyB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkF0YmlsZMSTamEgdXogamF1dMSBanVtaWVtIHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJOYXYgbmV2aWVuYSBqYXV0xIFqdW1hLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlBhdGVpY2FtaWVzIEp1bXMgcGFyIGFua2V0YXMgYWl6cGlsZMSrxaFhbnUhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJNxatzdSBpZXJha3N0aSBsaWVjaW5hLCBrYSBqxatzIGphdSBlc2F0IGFpenBpbGTEq2ppcyDFoW8gYXB0YXVqdS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJJZWzEgWRlIG5vIHNlcnZlcmEuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiSXp2xJNsxJN0aWVzLi4uXCIsXG4gIHZhbHVlOiBcInZhbHVlXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiTMWrZHp1LCBhdGJpbGRpZXQgdXogamF1dMSBanVtdSFcIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiTMWrZHp1LCBhdGJpbGRpZXQgdXogdmlzbWF6IHZpZW51IGphdXTEgWp1bXUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiTMWrZHp1LCBhdGJpbGRpZXQgdXogamF1dMSBanVtaWVtIHZpc8SBcyByaW5kxIFzLlwiLFxuICBudW1lcmljRXJyb3I6IFwiQXRiaWxkZWkgaXIgasSBYsWrdCBza2FpdGxpbS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJMxatkenUsIGlldmFkaWV0IHZpc21heiB7MH0gc2ltYm9sdXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTMWrZHp1LCBpZXZhZGlldCBtYXrEgWsgbmVrxIEgezB9IHJha3N0esSrbWVzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIkzFq2R6dSwgaWV2YWRpZXQgdmFpcsSBayBuZWvEgSB7MH0gcmFrc3R6xKttZXMgdW4gbWF6xIFrIG5la8SBIHsxfSByYWtzdHrEq21lcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJMxatkenUsIGFpenBpbGRpZXQgdmlzbWF6IHswfSByaW5kYXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkzFq2R6dSwgaXp2xJNsaWV0aWVzIHZpc21heiB7MH0gdmFyaWFudHUuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIkzFq2R6dSwgaXp2xJNsaWV0aWVzIG5lIHZhaXJhayBwYXIgezB9IHZhcmlhbnRpZW0uXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBqxIFixat0IHZpZW7EgWRhbSB2YWkgbGllbMSBa2FtIG5la8SBIHsxfSwgdW4gdmllbsSBZGFtIHZhaSBtYXrEgWthbSwgbmVrxIEgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBqxIFixat0IHZpZW7EgWRhbSB2YWkgbGllbMSBa2FtIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiTMWrZHp1LCBpZXZhZGlldCBwYXRpZXN1IGUtcGFzdGEgYWRyZXNpIVwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJJenRlaWNpZW5hbTogezB9IGrEgWF0Z3JpZcW+IOKAnHRydWXigJ0uXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJQaWVwcmFzxKtqdW3EgSB0aWthIGF0Z3JpZXp0YSBrxLzFq2RhIOKAnHswfeKAnS4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlBpZXByYXPEq2p1bXMgYXRncmllemEgdHVrxaF1cyBkYXR1cyB2YWkgcmVrdml6xKt0cyDigJxwYXRo4oCdIGlyIG5lcGFyZWl6c1wiLFxuICBleGNlZWRNYXhTaXplOiBcIkZhaWxhIGxpZWx1bXMgbmVkcsSra3N0IHDEgXJzbmllZ3QgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTMWrZHp1LCBpZXZhZGlldCBkYXR1cyBsYXVrxIEgJ0NpdHMnXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJKxatzdSBmYWlscyB0aWVrIGF1Z8WhdXBpZWzEgWTEk3RzLiBMxatkenUsIHV6Z2FpZGlldCB2YWlyxIFrYXMgc2VrdW5kZXMgdW4gbcSTxKNpbmlldCB2xJNscmVpei5cIixcbiAgbG9hZGluZ0ZpbGU6IFwiTm90aWVrIGllbMSBZGUgLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiSXp2xJNsaWV0aWVzIGZhaWx1cyAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5hdiBpenbEk2zEk3RzIG5ldmllbnMgZmFpbHNcIixcbiAgY29uZmlybURlbGV0ZTogXCJWYWkgdsSTbGF0aWVzIGl6ZHrEk3N0IGllcmFrc3R1P1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIsWgYWkgdsSTcnTEq2JhaSBqxIFixat0IHVuaWvEgWxhaS5cIixcbiAgYWRkQ29sdW1uOiBcIlBpZXZpZW5vdCBrb2xvbm51XCIsXG4gIGFkZFJvdzogXCJQaWV2aWVub3QgcmluZHVcIixcbiAgcmVtb3ZlUm93OiBcIk5vxYZlbXRcIixcbiAgYWRkUGFuZWw6IFwiUGlldmllbm8gamF1bnVcIixcbiAgcmVtb3ZlUGFuZWw6IFwiTm/FhmVtdFwiLFxuICBjaG9pY2VzX0l0ZW06IFwibGlldGFcIixcbiAgbWF0cml4X2NvbHVtbjogXCJTbGVqYVwiLFxuICBtYXRyaXhfcm93OiBcIlJpbmRhXCIsXG4gIHNhdmluZ0RhdGE6IFwiUmV6dWx0xIF0aSB0aWVrIHNhZ2xhYsSBdGkgc2VydmVyxKsgLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJSYWTEgXMga8S8xatkYSwgdW4gbcSTcyBuZXZhcsSTasSBbSBzYWdsYWLEgXQgcmV6dWx0xIF0dXMuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlenVsdMSBdGkgdGlrYSB2ZWlrc23Eq2dpIHNhZ2xhYsSBdGkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJNxJPEo2luaSB2xJNscmVpelwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwixaBhasSBIGxhcMSBIGVzYXQgaXp0xJNyxJNqaXMgezB9IHVuIGtvcMSBIHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwixaBhasSBIGxhcMSBIGVzYXQgaXp0xJNyxJNqaXMgezB9LlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIktvcMSBIGVzYXQgaXp0xJNyxJNqaXMgezB9LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwixaBhasSBIGxhcMSBIGVzYXQgaXp0xJNyxJNqaXMgezB9IG5vIHsxfSB1biBrb3DEgSB7Mn0gbm8gezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLFoGFqxIEgbGFwxIEgZXNhdCBpenTEk3LEk2ppcyB7MH0gbm8gezF9LlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIktvcMSBIGVzYXQgaXp0xJNyxJNqaXMgezB9IG5vIHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIlTEq3JzXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJTa2FpZHJzXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIkl6dsSTbMSTdGllcyBmYWlsdVwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJOb8WGZW1pZXQgxaFvIGZhaWx1XCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiSsSBXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOxJNcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiVmFpIHRpZcWhxIFtIHbEk2xhdGllcyBub8WGZW10IMWhbyBmYWlsdTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiVmFpIHRpZcWhxIFtIHbEk2xhdGllcyBub8WGZW10IHZpc3VzIGZhaWx1cz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIkphdXTEgWp1bWEgbm9zYXVrdW1zXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImx2XCJdID0gbGF0dmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJsdlwiXSA9IFwibGF0dmllxaF1XCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2xhdHZpYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGxpdGh1YW5pYVN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBdGdhbFwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVG9saWF1XCIsXG4gIGNvbXBsZXRlVGV4dDogXCJCYWlndGlcIixcbiAgcHJldmlld1RleHQ6IFwiUGVyxb5pxatyYVwiLFxuICBlZGl0VGV4dDogXCJSZWRhZ3VvdGlcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlByYWTEl3RpXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiS2l0YSAoxK92ZXN0aSlcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIk7El3JhXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlBhc2lyaW5rdGkgdmlzdXNcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlB1c2xhcGlzIHswfSBpxaEgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCLErnJhxaF5dGkgezB9IGnFoSB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkF0c2FrxJcgxK8gezB9IC8gezF9IGtsYXVzaW11c1wiLFxuICBlbXB0eVN1cnZleTogXCJBcGtsYXVzb2plIG7El3JhIG1hdG9tbyBwdXNsYXBpbyBhciBrbGF1c2ltby5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJExJdrb2phbWUgdcW+IGRhbHl2YXZpbcSFIGFwa2xhdXNvamUhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJNxatzxbMgxK9yYcWhYWkgcm9kbywga2FkIGphdSBhdGxpa290ZSDFoWnEhSBhcGtsYXVzxIUuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiUHJhxaFvbWUgcGFsYXVrdGkuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiUGFzaXJpbmt0aS4uLlwiLFxuICB2YWx1ZTogXCJyZWlrxaFtxJdcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJCxat0aW5hIGF0c2FreXRpIMSvIMWhxK8ga2xhdXNpbcSFLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJCxat0aW5hIGF0c2FreXRpIGJlbnQgxK8gdmllbsSFIGtsYXVzaW3EhS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJQcmHFoW9tZSBhdHNha3l0aSDEryBrbGF1c2ltdXMgdmlzb3NlIGVpbHV0xJdzZS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlR1cmkgYsWrdGkgc2thacSNaWFpLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlByYcWhb21lIHN1dmVzdGkgYmVudCB7MH0gc2ltYm9saXVzLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlByYcWhb21lIHN1dmVzdGkgbWHFvmlhdSBuZWkgezB9IHNpbWJvbGnFsy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJQcmHFoW9tZSBzdXZlc3RpIGRhdWdpYXUgbmVpIHswfSBpciBtYcW+aWF1IG5laSB7MX0gc2ltYm9sacWzLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlByYcWhb21lIHN1dmVzdGkgbmUgbWHFvmlhdSBuZWkgezB9IGVpbHXEjWnFsy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUHJhxaFvbWUgcGFzaXJpbmt0aSBiZW50IHswfSB2YXJpYW50xbMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBhc2lyaW5raXRlIG5lIGRhdWdpYXUga2FpcCB7MH0gdmFyaWFudHVzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgdHVyaSBixat0aSBseWd1cyBhcmJhIGRpZGVzbmlzIG5laSB7MX0gaXIgbHlndXMgYXJiYSBtYcW+ZXNuaXMgbmVpIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIHR1csSXdMWzIGLFq3RpIGx5Z3VzIGFyYmEgZGlkZXNuaXMgbmVpIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIHR1csSXdMWzIGLFq3RpIGx5Z3VzIGFyIG1hxb5lc25pcyB1xb4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQcmHFoW9tZSDEr3Zlc3RpIGdhbGlvamFudMSvIGVsZWt0cm9uaW5pbyBwYcWhdG8gYWRyZXPEhS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiUmVpa8WhbcSXOiB7MH0gdHVyaSBncsSFxb5pbnRpICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlXFvmtsYXVzYSBncsSFxb5pbm8ga2xhaWTEhSd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiVcW+a2xhdXNhIGdyxIXFvmlubyB0dcWhxI1pdXMgZHVvbWVuaXMgYXJiYSAncGF0aCcgc2F2eWLElyB5cmEgbmV0ZWlzaW5nYVwiLFxuICBleGNlZWRNYXhTaXplOiBcIkZhaWxvIGR5ZGlzIG5ldHVyaSB2aXLFoXl0aSB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLErnZlc2tpdGUga2l0xIUgcmVpa8WhbcSZLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiSsWrc8WzIGZhaWxhcyB5cmEga2VsaWFtYXMuIFBhbGF1a2l0ZSBrZWxldMSFIHNla3VuZMW+acWzIGlyIGJhbmR5a2l0ZSBkYXIga2FydMSFLlwiLFxuICBsb2FkaW5nRmlsZTogXCJQcmHFoW9tZSBwYWxhdWt0aS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIlBhc2lyaW5rdGkgZmFpbMSFKHVzKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTmVwYXNpcmlua3RhcyBqb2tzIGZhaWxhc1wiLFxuICBjb25maXJtRGVsZXRlOiBcIkFyIG5vcml0ZSBpxaF0cmludGkgxK9yYcWhxIU/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwixaBpIHJlaWvFoW3ElyB0dXLEl3TFsyBixat0aSB1bmlrYWxpLlwiLFxuICBhZGRDb2x1bW46IFwiUHJpZMSXdGkgc3R1bHBlbMSvXCIsXG4gIGFkZFJvdzogXCJQcmlkxJd0aSBlaWx1dMSZXCIsXG4gIHJlbW92ZVJvdzogXCJJxaF0cmludGlcIixcbiAgYWRkUGFuZWw6IFwiUHJpZMSXdGkgbmF1asSFXCIsXG4gIHJlbW92ZVBhbmVsOiBcIknFoXRyaW50aVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWxlbWVudGFzXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiU3R1bHBlbGlzXCIsXG4gIG1hdHJpeF9yb3c6IFwiRWlsdXTEl1wiLFxuICBzYXZpbmdEYXRhOiBcIlJlenVsdGF0YWkgc2F1Z29taSBzZXJ2ZXJ5amUuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIsSudnlrbyBrbGFpZGEgaXIgbWVzIG5lZ2FsxJdqb21lIGnFoXNhdWdvdGkgcmV6dWx0YXTFsy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiUmV6dWx0YXRhaSBidXZvIGnFoXNhdWdvdGkgc8SXa21pbmdhaSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIkJhbmR5dGkgZGFyIGthcnTEhVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiUHJhbGVpZG90ZSB7MH0gxaFpYW1lIHB1c2xhcHlqZSBpciB7MX0gacWhIHZpc28uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlByYWxlaWRvdGUgezB9IMWhaWFtZSBwdXNsYXB5amUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiUHJhbGVpZG90ZSB7MH0gacWhIHZpc28uXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJQcmFsZWlkb3RlIHswfSBpxaEgezF9IMWhaWFtZSBwdXNsYXB5amUgaXIgezJ9IGnFoSB7M30gacWhIHZpc28uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIlByYWxlaWRvdGUgezB9IGnFoSB7MX0gxaFpYW1lIHB1c2xhcHlqZS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJQcmFsZWlkb3RlIHswfSBpxaEgezF9IGnFoSB2aXNvLlwiLFxuICBjbGVhbkNhcHRpb246IFwiScWhdmFseXRpXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJWYWx5dGlcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiUGFzaXJpbmt0aSBmYWlsxIVcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiScWhdHJpbnRpIMWhxK8gZmFpbMSFXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiVGFpcFwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwiTmVcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiQXIgdGlrcmFpIG5vcml0ZSBwYcWhYWxpbnRpIMWhxK8gZmFpbMSFOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCJBciB0aWtyYWkgbm9yaXRlIHBhxaFhbGludGkgdmlzdXMgZmFpbHVzP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiS2xhdXNpbW8gcGF2YWRpbmltYXNcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wibHRcIl0gPSBsaXRodWFuaWFTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wibHRcIl0gPSBcIkxpZXR1dmnFs1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9saXRodWFuaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBub3J3ZWdpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiRm9ycmlnZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiTmVzdGVcIixcbiAgY29tcGxldGVUZXh0OiBcIkZ1bGxmw7hyXCIsXG4gIHByZXZpZXdUZXh0OiBcIkZvcmjDpW5kc3Zpc25pbmdcIixcbiAgZWRpdFRleHQ6IFwiUmVkaWdlcmVcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlN0YXJ0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQW5uZXQgKGJlc2tyaXYpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJJbmdlblwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJWZWxnIGFsbGVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNpZGUgezB9IGF2IHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiVGEgb3BwIHswfSBhdiB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIkJlc3ZhcnRlIHswfSAvIHsxfSBzcMO4cnNtw6VsXCIsXG4gIGVtcHR5U3VydmV5OiBcIkRldCBlciBpbmdlbiBzeW5saWcgc2lkZSBlbGxlciBzcMO4cnNtw6VsIGkgdW5kZXJzw7hrZWxzZW4uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVGFrayBmb3IgYXQgZHUgZnVsbGbDuHJ0ZSB1bmRlcnPDuGtlbHNlbiFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIlbDpXJlIGRhdGEgdmlzZXIgYXQgZHUgYWxsZXJlZGUgaGFyIGdqZW5ub21mw7hydCBkZW5uZSB1bmRlcnPDuGtlbHNlbi5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJVbmRlcnPDuGtlbHNlbiBsYXN0ZXIuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVmVsZy4uLlwiLFxuICB2YWx1ZTogXCJ2ZXJkaVwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZlbm5saWdzdCBzdmFyIHDDpSBzcMO4cnNtw6VsZXQuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlZlbm5saWdzdCBzdmFyIHDDpSBtaW5zdCBldHQgc3DDuHJzbcOlbC5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWZW5ubGlnc3Qgc3ZhciBww6Ugc3DDuHJzbcOlbCBpIGFsbGUgcmFkZXIuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJWZXJkaWVuIHNrYWwgdsOmcmUgbnVtZXJpc2suXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBtaW5zdCB7MH0gdGVnbi5cIixcbiAgdGV4dE1heExlbmd0aDogXCJWZW5ubGlnc3Qgc2tyaXYgaW5uIG1pbmRyZSBlbm4gezB9IHRlZ24uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBtZXIgZW5uIHswfSBvZyBtaW5kcmUgZW5uIHsxfSB0ZWduLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlZlbm5saWdzdCBmeWxsIGlubiBtaW5zdCB7MH0gcmFkZXIuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlZlbm5saWdzdCB2ZWxnIG1pbnN0IHswfSB2YXJpYW50ZXIuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlZlbm5saWdzdCBpa2tlIHZlbGcgbWVyIGVubiB7MH0gdmFyaWFudGVyLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgYsO4ciB2w6ZyZSBsaWsgZWxsZXIgbWVyIGVubiB7MX0gb2cgbGlrIGVsbGVyIG1pbmRyZSBlbm4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgYsO4ciB2w6ZyZSBsaWsgZWxsZXIgbWVyIGVubiB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBiw7hyIHbDpnJlIGxpayBlbGxlciBtaW5kcmUgZW5uIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVmVubmxpZ3N0IHNrcml2IGlubiBlbiBneWxkaWcgZS1wb3N0IGFkcmVzc2UuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlV0dHJ5a2tldDogezB9IHNrYWwgcmV0dXJuZXJlICdzYW50Jy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkZvcmVzcMO4cnNlbGVuIHJldHVybmVydGUgZmVpbGVuICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiRm9yZXNww7hyc2VsZW4gcmV0dXJuZXJ0ZSB0b21tZSBkYXRhLCBlbGxlciAnc3RpJyAtZWdlbnNrYXBlbiBlciBmZWlsXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRmlsc3TDuHJyZWxzZW4gYsO4ciBpa2tlIG92ZXJzdGlnZSB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJWZW5ubGlnc3Qgc2tyaXYgaW5uIGRlbiBhbmRyZSB2ZXJkaWVuLlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRmlsZW4gZGluIGxhc3RlcyBvcHAuIFZlbm5saWdzdCB2ZW50IG5vZW4gc2VrdW5kZXIgb2cgcHLDuHYgaWdqZW4uXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkxhc3RlciBpbm4gLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiVmVsZyBmaWwgKGVyKSAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkluZ2VuIGZpbCB2YWxndFwiLFxuICBjb25maXJtRGVsZXRlOiBcIsOYbnNrZXIgZHUgw6Ugc2xldHRlIHBvc3Rlbj9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJEZW5uZSB2ZXJkaWVuIHNrYWwgdsOmcmUgdW5pay5cIixcbiAgYWRkQ29sdW1uOiBcIkxlZ2cgdGlsIGtvbG9ubmVcIixcbiAgYWRkUm93OiBcIkxlZ2cgdGlsIHJhZFwiLFxuICByZW1vdmVSb3c6IFwiRmplcm5cIixcbiAgYWRkUGFuZWw6IFwiTGVnZyB0aWwgbnlcIixcbiAgcmVtb3ZlUGFuZWw6IFwiRmplcm5lXCIsXG4gIGNob2ljZXNfSXRlbTogXCJlbGVtZW50XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sb25uZVwiLFxuICBtYXRyaXhfcm93OiBcIlJhZFwiLFxuICBzYXZpbmdEYXRhOiBcIlJlc3VsdGF0ZW5lIGxhZ3JlcyBww6Ugc2VydmVyZW4gLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJEZXQgb3Bwc3RvIGVuIGZlaWwsIG9nIHZpIGt1bm5lIGlra2UgbGFncmUgcmVzdWx0YXRlbmUuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlc3VsdGF0ZW5lIGJsZSBsYWdyZXQhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcsO4diBpZ2plblwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VrXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSBww6UgZGVubmUgc2lkZW4gb2cgezF9IHRvdGFsdC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSBww6UgZGVubmUgc2lkZW4uXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiRHUgaGFyIHRpbGJyYWt0IHswfSB0b3RhbHQuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJEdSBoYXIgdGlsYnJha3QgezB9IGF2IHsxfSBww6UgZGVubmUgc2lkZW4gb2cgdG90YWx0IHsyfSBhdiB7M30uXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkR1IGhhciB0aWxicmFrdCB7MH0gYXYgezF9IHDDpSBkZW5uZSBzaWRlbi5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJEdSBoYXIgdGlsYnJha3QgezB9IGF2IHsxfSB0b3RhbHQuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJSZW5zXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJLbGFyXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlZlbGcgRmlsXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIkZqZXJuIGRlbm5lIGZpbGVuXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiSmFcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5laVwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJFciBkdSBzaWtrZXIgcMOlIGF0IGR1IHZpbCBmamVybmUgZGVubmUgZmlsZW46IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkVyIGR1IHNpa2tlciBww6UgYXQgZHUgdmlsIGZqZXJuZSBhbGxlIGZpbGVuZT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlNww7hyc23DpWxzdGl0dGVsXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcIm5vXCJdID0gbm9yd2VnaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcIm5vXCJdID0gXCJub3Jza1wiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9ub3J3ZWdpYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBlcnNpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi2YLYqNmE24xcIixcbiAgcGFnZU5leHRUZXh0OiBcItio2LnYr9uMXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLYqtqp2YXbjNmEXCIsXG4gIHByZXZpZXdUZXh0OiBcItm+24zYtCDZhtmF2KfbjNi0XCIsXG4gIGVkaXRUZXh0OiBcItmI24zYsdin24zYtFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi2LTYsdmI2LlcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLYr9uM2q/YsSjYqtmI2LbbjNitKVwiLFxuICBub25lSXRlbVRleHQ6IFwi2YfbjNqGXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItin2YbYqtiu2KfYqCDZh9mF2YdcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIti12YHYrdmHIHswfSDYp9iyIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwi2YXZiNix2K8gezB9INin2LIgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCLYqti52K/Yp9ivINm+2KfYs9iuIHswfS97MX0g2LPZiNin2YRcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi2LXZgdit2Ycg2KfbjCDbjNinINqv2LLbjNmG2Ycg2KfbjCDYqNix2KfbjCDYp9uM2YYg2b7Ysdiz2LTZhtin2YXZhyDZhdmI2KzZiNivINmG24zYs9iqLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItin2LIg2LTZhdinINio2KfYqNiqINiq2qnZhduM2YQg2KfbjNmGINm+2LHYs9i02YbYp9mF2Ycg2YXYqti02qnYsduM2YVcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcItio2Ycg2YbYuNixINmF24wg2LHYs9ivINmH2YUg2YfZhSDYp9qp2YbZiNmGINm+2LHYs9i02YbYp9mF2Ycg2LHYpyDYqtqp2YXbjNmEINqp2LHYr9mHINin24zYry5cIixcbiAgbG9hZGluZ1N1cnZleTogXCLYr9ix2K3Yp9mEINin24zYrNin2K8g2b7Ysdiz2LTZhtin2YXZh1wiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLYp9mG2KrYrtin2Kgg2qnZhtuM2K8uLi5cIixcbiAgdmFsdWU6IFwi2YXZgtiv2KfYsVwiLFxuICByZXF1aXJlZEVycm9yOiBcItmE2LfZgdinINio2Ycg2LPZiNin2YQg2b7Yp9iz2K4g2K/Zh9uM2K9cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi2YTYt9mB2Kcg2K3Yr9in2YLZhCDYqNmHINuM2qkg2LPZiNin2YQg2b7Yp9iz2K4g2K/Zh9uM2K8uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi2YTYt9mB2Kcg2LPZiNin2YTYp9iqINiq2YXYp9mFINiz2LfYsdmH2Kcg2LHYpyDZvtin2LPYriDYr9mH24zYry5cIixcbiAgbnVtZXJpY0Vycm9yOiBcItmF2YLYr9in2LEg2KjYp9uM2K8g2LnYr9iv24wg2KjYp9i02K9cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLZhNi32YHYpyDYrdiv2KfZgtmEICB7MH0g2K3YsdmBINmI2KfYsdivINqp2YbbjNivXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi2YTYt9mB2Kcg2qnZhdiq2LEg2KfYsiAgezB9INit2LHZgSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLZhNi32YHYpyDYqNuM2LTYqtixINin2LIgIHswfSDYrdix2YEg2Ygg2qnZhdiq2LEg2KfYsiB7MX0g2K3YsdmBINmI2KfYsdivINqp2YbbjNivLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItmE2LfZgdinINit2K/Yp9mC2YQgezB9INiz2LfYsSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi2K3Yr9in2YLZhCB7MH0g2KfZhtiq2K7Yp9ioINqp2YbbjNivLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLZhNi32YHYpyDYqNuM2LTYqtixINin2LIgIHswfSDYp9mG2KrYrtin2Kgg2qnZhtuM2K8uXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICBcIid7MH0nINio2KfbjNivINio24zZhiB7MX0g2YggezJ9INio2KfYtNivXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg2KjYstix2q/YqtixINmF2LPYp9mI24wgezF9INio2KfYtNivXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg2KjYp9uM2K8g2qnZiNqG2qnYqtixINuM2Kcg2YXYs9in2YjbjCB7MX0g2KjYp9i02K9cIixcbiAgaW52YWxpZEVtYWlsOiBcItmE2LfZgdinINin24zZhduM2YQg2LXYrduM2K0g2K/YsdisINqp2YbbjNivXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIti52KjYp9ix2Ko6IHswfSDZvtin2LPYriDYqNin24zYryAndHJ1ZScg2KjYp9i02K8uXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLYr9ix2K7ZiNin2LPYqiDYqNinINiu2LfYpyDYsdmI2KjYsdmIINi02K86ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgXCLYr9ix2K7ZiNin2LPYqiDZhdiz24zYsduMINiu2KfZhNuMINio2KfYstqv2LTYqiDYr9in2K/ZhyDbjNinINmF2LPbjNixINiv2LHYs9iqINiq2YbYuNuM2YUg2YbYtNiv2YdcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLYqNuM2LTYqtix24zZhiDYrdis2YUg2YXYrNin2LIg2YHYp9uM2YQ6IHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi2YXZgtiv2KfYsSAn2K/bjNqv2LEnINix2Kcg2YjYp9ix2K8g2qnZhtuM2K9cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgIFwi2YHYp9uM2YQg2K/YsSDYrdin2YQg2KLbjNmE2YjYryDYp9iz2KouINmE2LfZgdinINi12KjYsSDaqdmG24zYry5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi2KjYp9ix2q/bjNix24wuLi5cIixcbiAgY2hvb3NlRmlsZTogXCLYp9mG2KrYrtin2Kgg2YHYp9uM2YQo2YfYpykuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcItmH24zahiDZgdin24zZhNuMINin2YbYqtiu2KfYqCDZhti02K/Zh1wiLFxuICBjb25maXJtRGVsZXRlOiBcItii24zYpyDZhdin24zZhCDYqNmHINit2LDZgSDYp9uM2YYg2LHYr9uM2YEg2YfYs9iq24zYr9ifXCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi2KfbjNmGINmF2YLYr9in2LEg2KjYp9uM2K8g2LrbjNixINiq2qnYsdin2LHbjCDYqNin2LTYr1wiLFxuICBhZGRDb2x1bW46IFwi2LPYqtmI2YYg2KzYr9uM2K9cIixcbiAgYWRkUm93OiBcItiz2LfYsSDYrNiv24zYr1wiLFxuICByZW1vdmVSb3c6IFwi2K3YsNmBXCIsXG4gIGFkZFBhbmVsOiBcItis2K/bjNivXCIsXG4gIHJlbW92ZVBhbmVsOiBcItit2LDZgVwiLFxuICBjaG9pY2VzX0l0ZW06IFwi2KLbjNiq2YVcIixcbiAgbWF0cml4X2NvbHVtbjogXCLYs9iq2YjZhlwiLFxuICBtYXRyaXhfcm93OiBcItiz2LfYsVwiLFxuICBzYXZpbmdEYXRhOiBcItmG2KrYp9uM2Kwg2K/YsSDYrdin2YQg2LDYrtuM2LHZhyDYs9in2LLbjCDYr9ixINiz2LHZiNixINin2LPYqlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi2K7Yt9in24zbjCDYr9ixINiw2K7bjNix2Ycg2LPYp9iy24wg2YbYqtin24zYrCDYsdiuINiv2KfYr9mHINin2LPYqlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLZhtiq2KfbjNisINio2Kcg2YXZiNmB2YLbjNiqINiw2K7bjNix2Ycg2LTYr1wiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi2YXYrNiv2K8g2KrZhNin2LQg2qnZhtuM2K9cIixcbiAgdGltZXJNaW46IFwi2K/ZgtuM2YLZh1wiLFxuICB0aW1lclNlYzogXCLYq9in2YbbjNmHXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwi2LTZhdinINmF2K/YqiB7MH0g2K/YsSDYp9uM2YYg2LXZgdit2Ycg2Ygg2YXYr9iqIHsxfSDYsdinINiv2LEg2YXYrNmF2YjYuSDYs9m+2LHbjCDaqdix2K/ZhyDYp9uM2K8uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIti02YXYpyDZhdiv2KogezB9INix2Kcg2K/YsSDYp9uM2YYg2LXZgdit2Ycg2LPZvtix24wg2qnYsdiv2Ycg2KfbjNivLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIti02YXYpyDZhdiv2KogezB9INix2Kcg2K/YsSDZhdis2YXZiNi5INiz2b7YsduMINqp2LHYr9mHINin24zYry5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIti02YXYpyDZhdiv2KogezB9INin2LIgezF9INiv2LEg2KfbjNmGINi12YHYrdmHINmIINmF2K/YqiB7Mn0g2KfYsiB7M30g2LHYpyDYr9ixINmF2KzZhdmI2Lkg2LPZvtix24wg2qnYsdiv2Ycg2KfbjNivLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLYtNmF2Kcg2YXYr9iqIHswfSDYp9iyIHsxfSDYsdinINiv2LEg2KfbjNmGINi12YHYrdmHINiz2b7YsduMINqp2LHYr9mHINin24zYry5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLYtNmF2Kcg2YXYr9iqIHswfSDYp9iyIHsxfSDYsdinINiv2LEg2YXYrNmF2YjYuSDYs9m+2LHbjCDaqdix2K/ZhyDYp9uM2K8uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLZvtin2qnYs9in2LLbjFwiLFxuICBjbGVhckNhcHRpb246IFwi2K7Yp9mE24wg2qnYsdiv2YZcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi2KfZhtiq2K7Yp9ioINmB2KfbjNmEXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcItit2LDZgSDYp9uM2YYg2YHYp9uM2YRcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCLYqNmE2YdcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcItiu24zYsVwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLYotuM2Kcg2YXbjNiu2YjYp9mH24zYryDYp9uM2YYg2YHYp9uM2YQg2LHYpyDZvtin2qkg2qnZhtuM2K86IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcItii24zYpyDZhduM2K7ZiNin2YfbjNivINiq2YXYp9mFINmB2KfbjNmEINmH2Kcg2LHYpyDZvtin2qkg2qnZhtuM2K8/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLYudmG2YjYp9mGINiz2YjYp9mEXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImZhXCJdID0gcGVyc2lhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJmYVwiXSA9IFwi2YHYp9ix2ZLYs9mQ2YlcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vcGVyc2lhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgcG9saXNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIldzdGVjelwiLFxuICBwYWdlTmV4dFRleHQ6IFwiRGFsZWpcIixcbiAgY29tcGxldGVUZXh0OiBcIkdvdG93ZVwiLFxuICBwcmV2aWV3VGV4dDogXCJQcmVtaWVyYVwiLFxuICBlZGl0VGV4dDogXCJFZHljamFcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIlN0YXJ0XCIsXG4gIG90aGVySXRlbVRleHQ6IFwiSW5uYSBvZHBvd2llZMW6ICh3cGlzeilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIkJyYWtcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiV3liaWVyeiB3c3p5c3RraWVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlN0cm9uYSB7MH0geiB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlphcGlzIHswfSB6IHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiT2Rwb3dpZWR6aSBuYSB7MH0vezF9IHB5dGFuaWFcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTmllIG1hIHdpZG9jem55Y2ggcHl0YcWELlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkR6acSZa3VqZW15IHphIHd5cGXFgm5pZW5pZSBhbmtpZXR5IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiWiBuYXN6eWNoIHphcGlzw7N3IHd5bmlrYSwgxbxlIHd5cGXFgm5pxYJlxZsganXFvCB0xJkgYW5raWV0xJkuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiVHJ3YSB3Y3p5dHl3YW5pZSBhbmtpZXR5Li4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIld5YmllcnouLi5cIixcbiAgdmFsdWU6IFwiV2FydG/Fm8SHXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUHJvc3rEmSBvZHBvd2llZHppZcSHIG5hIHRvIHB5dGFuaWUuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIlByb3N6xJkgb2Rwb3dpZWR6aWXEhyBuYSBjbyBuYWptbmllaiBqZWRubyBweXRhbmllLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlByb3N6xJkgb2Rwb3dpZWR6aWXEhyBuYSB3c3p5c3RraWUgcHl0YW5pYS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlcgdHltIHBvbHUgbW/FvG5hIHdwaXNhxIcgdHlsa28gbGljemJ5LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlByb3N6xJkgd3Bpc2HEhyBjbyBuYWptbmllaiB7MH0gem5ha8Ozdy5cIixcbiAgdGV4dE1heExlbmd0aDogXCJQcm9zesSZIHdwaXNhxIcgbW5pZWogbmnFvCB7MH0gem5ha8Ozdy5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJQcm9zesSZIHdwaXNhxIcgd2nEmWNlaiBuacW8IHswfSBpIG1uaWVqIG5pxbwgezF9IHpuYWvDs3cuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUHJvc3rEmSB1enVwZcWCbmnEhyBwcnp5bmFqbW5pZWogezB9IHdpZXJzenkuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlByb3N6xJkgd3licmHEhyBjbyBuYWptbmllaiB7MH0gcG96eWNqaS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUHJvc3rEmSB3eWJyYcSHIG5pZSB3acSZY2VqIG5pxbwgezB9IHBvenljamkuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPZHBvd2llZMW6ICd7MH0nIHBvd2lubmEgYnnEhyB3acSZa3N6YSBsdWIgcsOzd25hIHsxfSBvcmF6IG1uaWVqc3phIGx1YiByw7N3bmEgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiT2Rwb3dpZWTFuiAnezB9JyBwb3dpbm5hIGJ5xIcgd2nEmWtzemEgbHViIHLDs3duYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJPZHBvd2llZMW6ICd7MH0nIHBvd2lubmEgYnnEhyBtbmllanN6YSBsdWIgcsOzd25hIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUHJvc3rEmSBwb2RhxIcgcHJhd2lkxYJvd3kgYWRyZXMgZW1haWwuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIld5cmHFvGVuaWU6IHswfSBwb3dpbm5vIHdyYWNhxIcgJ3ByYXdkeml3ZScuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLFu8SFZGFuaWUgendyw7NjacWCbyBixYLEhWQgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCLFu8SFZGFuaWUgbmllIHp3csOzY2nFgm8gZGFueWNoIGFsYm8gxZtjaWXFvGthIGplc3QgbmllcHJhd2lkxYJvd2FcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJSb3ptaWFyIHByemVzxYJhbmVnbyBwbGlrdSBuaWUgbW/FvGUgcHJ6ZWtyYWN6YcSHIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlByb3N6xJkgcG9kYcSHIGlubsSFIG9kcG93aWVkxbouXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJUcndhIHByemVub3N6ZW5pZSBUd29qZWdvIHBsaWt1LCBwcm9zesSZIHNwcsOzYm93YcSHIHBvbm93bmllIHphIGtpbGthIHNla3VuZC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwixYFhZG93YW5pZS4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIld5YmllcnogcGxpayhpKS4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiTmllIHd5YnJhbm8gxbxhZG5lZ28gcGxpa3VcIixcbiAgY29uZmlybURlbGV0ZTogXCJDaGNlc3ogc2thc293YcSHIG5hZ3JhbmllP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIlRhIHdhcnRvxZvEhyBwb3dpbm5hIGJ5xIcgd3lqxIV0a293YS5cIixcbiAgYWRkQ29sdW1uOiBcIkRvZGFqIGtvbHVtbsSZXCIsXG4gIGFkZFJvdzogXCJEb2RhaiB3aWVyc3pcIixcbiAgcmVtb3ZlUm93OiBcIlVzdcWEXCIsXG4gIGFkZFBhbmVsOiBcIkRvZGFqIHBhbmVsXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlVzdcWEXCIsXG4gIGNob2ljZXNfSXRlbTogXCJlbGVtZW50XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiS29sdW1uYVwiLFxuICBtYXRyaXhfcm93OiBcIldpZXJzelwiLFxuICBzYXZpbmdEYXRhOiBcIlphcGlzdWrEmSB3eW5pa2kgYW5raWV0eSBuYSBzZXJ3ZXJ6ZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiV3lzdMSFcGnFgiBixYLEhWQgaSB3eW5pa2kgbmllIG1vZ8WCeSB6b3N0YcSHIHphcGlzYW5lLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJXeW5pa2kgem9zdGHFgnkgcG9wcmF3bmllIHphcGlzYW5lIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiU3Byw7NidWogcG9ub3duaWVcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlNwxJlkemnFgmXFmyB7MH0gbmEgdGVqIHN0cm9uaWUgYSB3IHN1bWllIHsxfS5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiU3DEmWR6acWCZcWbIHswfSBuYSB0ZWogc3Ryb25pZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJTcMSZZHppxYJlxZsgdyBzdW1pZSB7MH0uXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwiU3DEmWR6acWCZcWbIHswfSB6IHsxfSBuYSB0ZWogc3Ryb25pZSBhIHcgc3VtaWUgezJ9IHogezN9LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJTcMSZZHppxYJlxZsgezB9IHogezF9IG5hIHRlaiBzdHJvbmllXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiU3DEmWR6acWCZcWbIHswfSB6IHsxfS5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIld5Y3p5xZvEh1wiLFxuICBjbGVhckNhcHRpb246IFwiSmFzbmVcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwiV3liaWVyeiBwbGlrXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlVzdcWEIHRlbiBwbGlrXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiVGFrXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOaWVcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiSmVzdGXFmyBwZXdpZW4sIMW8ZSBjaGNlc3ogdXN1bsSFxIcgdGVuIHBsaWs6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIkplc3RlxZsgcGV3aWVuLCDFvGUgY2hjZXN6IHVzdW7EhcSHIHdzenlzdGtpZSBwbGlraT9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlR5dHXFgiBweXRhbmlhXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInBsXCJdID0gcG9saXNoU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInBsXCJdID0gXCJwb2xza2lcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vcG9saXNoLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBwb3J0dWd1ZXNlU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkFudGVyaW9yXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJQcsOzeGltb1wiLFxuICBjb21wbGV0ZVRleHQ6IFwiRmluYWxpemFyXCIsXG4gIHByZXZpZXdUZXh0OiBcIlByw6ktdmlzdWFsaXphw6fDo29cIixcbiAgZWRpdFRleHQ6IFwiRWRpdGFyXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJDb21lw6dhclwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk91dHJvcyAoZGVzY3JldmVyKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTmVuaHVtXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlNlbGVjaW9uYXIgVG9kb3NcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlDDoWdpbmEgezB9IGRlIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiUmVnaXN0byB7MH0gZGUgezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJSZXNwb3N0YXMgezB9L3sxfSBwZXJndW50YXNcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTsOjbyBow6EgcMOhZ2luYSB2aXPDrXZlbCBvdSBwZXJndW50YSBuYSBwZXNxdWlzYS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJPYnJpZ2FkbyBwb3IgZmluYWxpemFyIGEgcGVzcXVpc2EhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCJOb3Nzb3MgcmVnaXN0cm9zIG1vc3RyYW0gcXVlIHZvY8OqIGrDoSBmaW5hbGl6b3UgYSBwZXNxdWlzYS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJBIHBlc3F1aXNhIGVzdMOhIGNhcnJlZ2FuZG8uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2VsZWNpb25lLi4uXCIsXG4gIHZhbHVlOiBcInZhbG9yXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yLCByZXNwb25kYSBhIHBlcmd1bnRhLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJQb3IgZmF2b3IsIHJlc3BvbmRhIHBlbG8gbWVub3MgdW1hIHBlcmd1bnRhLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlBvciBmYXZvciwgcmVzcG9uZGEgYXMgcGVyZ3VudGFzIGVtIHRvZGFzIGFzIGxpbmhhcy5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIk8gdmFsb3IgZGV2ZSBzZXIgbnVtw6lyaWNvLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIHBlbG8gbWVub3MgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWVub3MgZGUgezB9IGNhcmFjdGVyZXMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUG9yIGZhdm9yLCBpbnNpcmEgbWFpcyBkZSB7MH0gZSBtZW5vcyBkZSB7MX0gY2FyYWN0ZXJlcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQcmVlbmNoYSBwZWxvIG1lbm9zIHswfSBsaW5oYXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlNlbGVjaW9uZSBwZWxvIG1lbm9zIHswfSBvcMOnw7Vlcy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUG9yIGZhdm9yLCBzZWxlY2lvbmUgbsOjbyBtYWlzIGRvIHF1ZSB7MH0gb3DDp8O1ZXMuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IHN1cGVyaW9yIGEgezF9IGUgaWd1YWwgb3UgbWVub3IgcXVlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIk8gJ3swfScgZGV2ZSBzZXIgaWd1YWwgb3Ugc3VwZXJpb3IgYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IGluZmVyaW9yIGEgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQb3IgZmF2b3IsIGluZm9ybWUgdW0gZS1tYWlsIHbDoWxpZG8uXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIkEgZXhwcmVzc8OjbzogezB9IGRldmUgcmV0b3JuYXIgJ3ZlcmRhZGVpcm8nLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiQSByZXF1aXNpw6fDo28gcmV0b3Jub3UgbyBlcnJvICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQSByZXF1aXNpw6fDo28gbsOjbyByZXRvcm5vdSBkYWRvcyBvdSBvICdjYW1pbmhvJyBkYSByZXF1aXNpw6fDo28gbsOjbyBlc3TDoSBjb3JyZXRvXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiTyB0YW1hbmhvIGRvIGFycXVpdm8gbsOjbyBkZXZlIGV4Y2VkZXIgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yLCBpbmZvcm1lIG8gb3V0cm8gdmFsb3IuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJTZXUgYXJxdWl2byBlc3TDoSBzZW5kbyBjYXJyZWdhZG8uIFBvciBmYXZvciwgYWd1YXJkZSBhbGd1bnMgc2VndW5kb3MgZSB0ZW50ZSBub3ZhbWVudGUuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkNhcnJlZ2FuZG8uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJTZWxlY2lvbmUgbyhzKSBhcnF1aXZvKHMpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJOZW5odW0gZmljaGVpcm8gZXNjb2xoaWRvXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVGVtIGNlcnRlemEgcXVlIGRlc2VqYSBkZWxldGFyP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkVzc2UgdmFsb3IgZGV2ZSBzZXIgw7puaWNvLlwiLFxuICBhZGRDb2x1bW46IFwiQWRpY2lvbmFyIGNvbHVuYVwiLFxuICBhZGRSb3c6IFwiQWRpY2lvbmFyIGxpbmhhXCIsXG4gIHJlbW92ZVJvdzogXCJSZW1vdmVyIGxpbmhhXCIsXG4gIGFkZFBhbmVsOiBcIkFkaWNpb25hciBub3ZvXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlJlbW92ZXJcIixcbiAgY2hvaWNlc19JdGVtOiBcIml0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bmFcIixcbiAgbWF0cml4X3JvdzogXCJMaW5oYVwiLFxuICBzYXZpbmdEYXRhOiBcIk9zIHJlc3VsdGFkb3MgZXN0byBzZW5kbyBzYWx2b3Mgbm8gc2Vydmlkb3IuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIk9jb3JyZXUgdW0gZXJybyBlIG7Do28gZm9pIHBvc3PDrXZlbCBzYWx2YXIgb3MgcmVzdWx0YWRvcy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiT3MgcmVzdWx0YWRvcyBmb3JhbSBzYWx2b3MgY29tIHN1Y2Vzc28hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJUZW50ZSBub3ZhbWVudGVcIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlZ1wiLFxuICB0aW1lclNwZW50QWxsOiBcIlZvY8OqIGdhc3RvdSB7MH0gbmVzdGEgcMOhZ2luYSBlIHsxfSBubyB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiVm9jw6ogZ2FzdG91IHswfSBuZXN0YSBww6FnaW5hLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlZvY8OqIGdhc3RvdSB7MH0gbm8gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJWb2PDqiBnYXN0b3UgezB9IGRlIHsxfSBuZXN0YSBww6FnaW5hIGUgezJ9IGRlIHszfSBubyB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiVm9jw6ogZ2FzdG91IHswfSBkZSB7MX0gbmVzdGEgcMOhZ2luYS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJWb2PDqiBnYXN0b3UgezB9IGRlIHsxfSBubyB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkxpbXBhclwiLFxuICBjbGVhckNhcHRpb246IFwiTGltcGFyXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIkVzY29saGVyIGZpY2hlaXJvXCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcIlJlbW92ZXIgZXN0ZSBhcnF1aXZvXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiU2ltXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJOw6NvXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIlRlbSBjZXJ0ZXphIHF1ZSBkZXNlamEgcmVtb3ZlciBlc3RlIGFycXVpdm86IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIlRlbSBjZXJ0ZXphIHF1ZSBkZXNlamEgcmVtb3ZlciB0b2RvcyBvcyBhcnF1aXZvcz9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIlTDrXR1bG8gZGEgcXVlc3TDo29cIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicHRcIl0gPSBwb3J0dWd1ZXNlU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInB0XCJdID0gXCJwb3J0dWd1w6pzXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHJvbWFuaWFuU3VydmV5U3RyaW5nczogYW55ID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJlY2VkZW50XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJVcm3Eg3RvclwiLFxuICBjb21wbGV0ZVRleHQ6IFwiRmluYWxpemFyZVwiLFxuICBwcmV2aWV3VGV4dDogXCJwcmV2aXp1YWxpemFyZVwiLFxuICBlZGl0VGV4dDogXCJFZGl0YcibaVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwic3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbHR1bChwcmVjaXphxaNpKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTmljaSB1bnVsXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlNlbGVjdGVhesSDIHRvdFwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSBkaW4gezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCLDjm5yZWdpc3RyYXJlIHswfSBkaW4gezF9XCIsXG4gIHF1ZXN0aW9uc1Byb2dyZXNzVGV4dDogXCJSxINzcHVuc3VyaSBsYSB7MH0gLyB7MX0gw65udHJlYsSDcmlcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTnUgc3VudCDDrm50cmVixINyaSBwZW50cnUgYWNlc3QgY2hlc3Rpb25hclwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlbEgyBtdWzFo3VtaW0gcGVudHJ1IHRpbXB1bCBhY29yZGF0IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiRGluIMOubnJlZ2lzdHLEg3JpbGUgbm9hc3RyZSByZWllc2UgY8SDIGHIm2kgY29tcGxldGF0IGRlamEgYWNlc3QgY2hlc3Rpb25hci5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJDaGVzdGlvbmFydWwgc2Ugw65uY2FyY8SDLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIkFsZWdlxaNpLi4uXCIsXG4gIHZhbHVlOiBcInZhbG9hcmVcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJSxINzcHVuc3VsIGxhIGFjZWFzdMSDIMOubnRyZWJhcmUgZXN0ZSBvYmxpZ2F0b3JpdS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiVsSDIHJ1Z8SDbSBzxIMgcsSDc3B1bmRlyJtpIGxhIGNlbCBwdcibaW4gbyDDrm50cmViYXJlLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlRvYXRlIHLEg3NwdW5zdXJpbGUgc3VudCBvYmxpZ2F0b3JpaVwiLFxuICBudW1lcmljRXJyb3I6IFwiUsSDc3B1bnN1bCB0cmVidWllIHPEgyBmaWUgbnVtZXJpYy5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJUcmVidWllIHPEgyBpbnRyb2R1Y2XIm2kgbWluaW0gezB9IGNhcmFjdGVyZS5cIixcbiAgdGV4dE1heExlbmd0aDogXCJUcmVidWllIHPEgyBpbnRyb2R1Y2XIm2kgbWF4aW0gezB9IGNhcmFjdGVyZS5cIixcbiAgdGV4dE1pbk1heExlbmd0aDpcbiAgICBcIlRyZWJ1aWUgc8SDIGludHJvZHVjZcibaSBtYWkgbXVsdCBkZSB7MH0gyJlpIG1haSBwdcibaW4gZGUgezF9IGNhcmFjdGVyZS5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJUcmVidWllIHPEgyBjb21wbGV0YcibaSBtaW5pbSB7MH0gcsOibmR1cmkuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlRyZWJ1aWUgc8SDIHNlbGVjdGHIm2kgbWluaW0gezB9IG9wxaNpdW5pLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJUcmVidWllIHPEgyBzZWxlY3RhyJtpIG1heGltIHswfSBvcMWjaXVuaS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIlLEg3NwdW5zdWwgJ3swfScgdHJlYnVpZSBzxIMgZmllIG1haSBtYXJlIHNhdSBlZ2FsIGNhIHsxfSDFn8OuIG1haSBtaWMgc2F1IGVnYWwgY3UgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1hcmUgc2F1IGVnYWwgY2EgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1pYyBzYXUgZWdhbCBjYSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlRyZWJ1aWUgc8SDIGludHJvZHVjZcWjaSBvIGFkcmVzYSBkZSBlbWFpbCB2YWxpZMSDLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJFeHByZXNpYTogezB9IGFyIHRyZWJ1aSBzxIMgcmV0dXJuZXplIOKAnmFkZXbEg3JhdOKAnS5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlJlcXVlc3QtdWwgYSByZXR1cm5hdCBlcm9hcmVhICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiUmVxdWVzdC11bCBudSBhIHJldHVybmF0IGRhdGUgc2F1IHByb3ByaWV0YXRlYSAncGF0aCcgZXN0ZSBpbmNvcmVjdMSDXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRGltZW5zaXVuZWEgZmnFn2llcnVsdWkgbnUgdHJlYnVpZSBzxIMgZGVwxIPFn2Vhc2PEgyB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJUcmVidWllIHPEgyBjb21wbGV0YcibaSBjw6JtcHVsICdBbHR1bCcuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJGaciZaWVydWwgZHVtbmVhdm9hc3RyxIMgZXN0ZSDDrm4gY3VycyBkZSDDrm5jxINyY2FyZS4gVsSDIHJ1Z8SDbSBhyJl0ZXB0YcibaSBjw6J0ZXZhIHNlY3VuZGUgyJlpIHJldmVuacibaSBhcG9pLlwiLFxuICBsb2FkaW5nRmlsZTogXCJTZSDDrm5jYXJjxIMuLi5cIixcbiAgY2hvb3NlRmlsZTogXCJBbGVnZSBmaXNpZXJlbGUuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5pY2l1biBmaciZaWVyIGFsZXNcIixcbiAgY29uZmlybURlbGV0ZTogXCJTdW50ZcibaSBzaWd1ciBjxIMgZG9yacibaSBzxIMgyJl0ZXJnZcibaSDDrm5yZWdpc3RyYXJlYT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJWYWxvYXJlYSB0cmVidWllIHPEgyBmaWUgdW5pY8SDLlwiLFxuICBhZGRDb2x1bW46IFwiQWTEg3VnYcibaSBjb2xvYW7Eg1wiLFxuICBhZGRSb3c6IFwiQWTEg3VnYXJlIHLDom5kXCIsXG4gIHJlbW92ZVJvdzogXCLImHRlcmdlcmVcIixcbiAgYWRkUGFuZWw6IFwiQWTEg3VnYXJlXCIsXG4gIHJlbW92ZVBhbmVsOiBcIsiYdGVyZ2VyZVwiLFxuICBjaG9pY2VzX0l0ZW06IFwib3DIm2l1bmVcIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2xvYW7Eg1wiLFxuICBtYXRyaXhfcm93OiBcIlLDom5kXCIsXG4gIHNhdmluZ0RhdGE6IFwiUmV6dWx0YXRlbGUgc3VudCDDrm4gY3VycyBkZSBzYWx2YXJlLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCJBIGludGVydmVuaXQgbyBlcm9hcmUsIHJlenVsdGF0ZWxlIG51IGF1IHB1dHV0IGZpIHNhbHZhdGUuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIlJlenVsdGF0ZWxlIGF1IGZvc3Qgc2FsdmF0ZSBjdSBzdWNjZXMhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLDjm5jZXJjYcibaSBkaW4gbm91XCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzZWNcIixcbiAgdGltZXJTcGVudEFsbDogXCJByJtpIHBldHJlY3V0IHswfSBwZSBhY2Vhc3TEgyBwYWdpbsSDIMiZaSB7MX0gw65uIHRvdGFsLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJByJtpIHBldHJlY3V0IHswfSBwZSBhY2Vhc3TEgyBwYWdpbsSDLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkHIm2kgcGV0cmVjdXQgezB9IMOubiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkHIm2kgcGV0cmVjdXQgezB9IGRpbiB7MX0gcGUgYWNlYXN0xIMgcGFnaW7EgyDImWkgezJ9IGRpbiB7M30gw65uIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJByJtpIHBldHJlY3V0IHswfSBkaW4gezF9IHBlIGFjZWFzdMSDIHBhZ2luxIMuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiQcibaSBwZXRyZWN1dCB7MH0gZGluIHsxfSDDrm4gdG90YWwuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJDdXJhdFwiLFxuICBjbGVhckNhcHRpb246IFwiY2xhclwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJBbGVnZSBmaciZaWVydWxcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiRWxpbWluYcibaSBhY2VzdCBmaciZaWVyXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiZGFcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk51XCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIlNpZ3VyIGRvcmnIm2kgc8SDIGVsaW1pbmHIm2kgYWNlc3QgZmnImWllcjogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiU2lndXIgZG9yacibaSBzxIMgZWxpbWluYcibaSB0b2F0ZSBmaciZaWVyZWxlP1wiLFxuICBxdWVzdGlvblRpdGxlUGF0dGVyblRleHQ6IFwiVGl0bHVsIGludHJlYmFyaWlcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicm9cIl0gPSByb21hbmlhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJyb1wiXSA9IFwicm9tw6JuxINcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vcm9tYW5pYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHJ1c3NpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi0J3QsNC30LDQtFwiLFxuICBwYWdlTmV4dFRleHQ6IFwi0JTQsNC70LXQtVwiLFxuICBjb21wbGV0ZVRleHQ6IFwi0JPQvtGC0L7QstC+XCIsXG4gIHByZXZpZXdUZXh0OiBcItCf0YDQtdC00LLQsNGA0LjRgtC10LvRjNC90YvQuSDQv9GA0L7RgdC80L7RgtGAXCIsXG4gIGVkaXRUZXh0OiBcItCg0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40LVcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcItCd0LDRh9Cw0YLRjFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcItCU0YDRg9Cz0L7QtSAo0L/QvtC20LDQu9GD0LnRgdGC0LAsINC+0L/QuNGI0LjRgtC1KVwiLFxuICBub25lSXRlbVRleHQ6IFwi0J3QtdGCXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItCS0YvQsdGA0LDRgtGMINCy0YHRkVwiLFxuICBwcm9ncmVzc1RleHQ6IFwi0KHRgtGA0LDQvdC40YbQsCB7MH0g0LjQtyB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcItCX0LDQv9C40YHRjCB7MH0g0LjQtyB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcItCe0YLQstC10YLRiyDQvdCwIHswfS97MX3QstC+0L/RgNC+0YHRi1wiLFxuICBlbXB0eVN1cnZleTogXCLQndC10YIg0L3QuCDQvtC00L3QvtCz0L4g0LLQvtC/0YDQvtGB0LAuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi0JHQu9Cw0LPQvtC00LDRgNC40Lwg0JLQsNGBINC30LAg0LfQsNC/0L7Qu9C90LXQvdC40LUg0LDQvdC60LXRgtGLIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwi0JLRiyDRg9C20LUg0L/RgNC+0YXQvtC00LjQu9C4INGN0YLQvtGCINC+0L/RgNC+0YEuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi0JfQsNCz0YDRg9C30LrQsCDRgSDRgdC10YDQstC10YDQsC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLQktGL0LHRgNCw0YLRjC4uLlwiLFxuICB2YWx1ZTogXCLQt9C90LDRh9C10L3QuNC1XCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINC+0YLQstC10YLRjNGC0LUg0L3QsCDQstC+0L/RgNC+0YEuXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQvtGC0LLQtdGC0YzRgtC1INC/0L4g0LrRgNCw0LnQvdC10Lkg0LzQtdGA0LUg0L3QsCDQvtC00LjQvSDQstC+0L/RgNC+0YEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINC+0YLQstC10YLRjNGC0LUg0L3QsCDQstC+0L/RgNC+0YHRiyDQsiDQutCw0LbQtNC+0Lkg0YHRgtGA0L7QutC1LlwiLFxuICBudW1lcmljRXJyb3I6IFwi0J7RgtCy0LXRgiDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0YfQuNGB0LvQvtC8LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcItCf0L7QttCw0LvRg9C50YHRgtCwINCy0LLQtdC00LjRgtC1INCx0L7Qu9GM0YjQtSB7MH0g0YHQuNC80LLQvtC70L7Qsi5cIixcbiAgdGV4dE1heExlbmd0aDogXCLQn9C+0LbQsNC70YPQudGB0YLQsCDQstCy0LXQtNC40YLQtSDQvNC10L3RjNGI0LUgezB9INGB0LjQvNCy0L7Qu9C+0LIuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAg0LLQstC10LTQuNGC0LUg0LHQvtC70YzRiNC1IHswfSDQuCDQvNC10L3RjNGI0LUgezF9INGB0LjQvNCy0L7Qu9C+0LIuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINC30LDQv9C+0LvQvdC40YLQtSDQvdC1INC80LXQvdGM0YjQtSB7MH0g0YHRgtGA0L7Qui5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0YvQsdC10YDQuNGC0LUg0YXQvtGC0Y8g0LHRiyB7MH0g0LLQsNGA0LjQsNC90YLQvtCyLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLRi9Cx0LXRgNC40YLQtSDQvdC1INCx0L7Qu9C10LUgezB9INCy0LDRgNC40LDQvdGC0L7Qsi5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nINC00L7Qu9C20L3QviDQsdGL0YLRjCDQvdC1INC80LXQvdGM0YjQtSDRh9C10LwgezF9LCDQuCDQvdC1INCx0L7Qu9GM0YjQtSDRh9C10LwgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg0LTQvtC70LbQvdC+INCx0YvRgtGMINC90LUg0LzQtdC90YzRiNC1INGH0LXQvCB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0L3QtSDQsdC+0LvRjNGI0LUg0YfQtdC8IHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC00LXQudGB0YLQstC40YLQtdC70YzQvdGL0Lkg0LDQtNGA0LXRgSDRjdC70LXQutGC0YDQvtC90L3QvtC5INC/0L7Rh9GC0YsuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcItCS0YvRgNCw0LbQtdC90LjQtSB7MH0g0LTQvtC70LbQvdC+INCy0L7Qt9Cy0YDQsNGJ0LDRgtGMICd0cnVlJy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcItCX0LDQv9GA0L7RgSDQstC10YDQvdGD0Lsg0L7RiNC40LHQutGDICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwi0J7RgtCy0LXRgiDQvdCwINC30LDQv9GA0L7RgSDQv9GA0LjRiNC10Lsg0L/Rg9GB0YLQvtC5INC40LvQuCDRgdCy0L7QudGB0YLQstC+ICdwYXRoJyDRg9C60LDQt9Cw0L3QviDQvdC10LLQtdGA0L3QvlwiLFxuICBleGNlZWRNYXhTaXplOiBcItCg0LDQt9C80LXRgCDRhNCw0LnQu9CwINC90LUg0LTQvtC70LbQtdC9INC/0YDQtdCy0YvRiNCw0YLRjCB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLQstC10LTQuNGC0LUg0LTQsNC90L3Ri9C1INCyINC/0L7Qu9C1ICfQlNGA0YPQs9C+0LUnXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCLQktCw0Ygg0YTQsNC50Lsg0LfQsNCz0YDRg9C20LDQtdGC0YHRjy4g0J/QvtC00L7QttC00LjRgtC1INC90LXRgdC60L7Qu9GM0LrQviDRgdC10LrRg9C90LQg0Lgg0L/QvtC/0YDQvtCx0YPQudGC0LUg0YHQvdC+0LLQsC5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi0JfQsNCz0YDRg9C30LrQsC4uLlwiLFxuICBjaG9vc2VGaWxlOiBcItCS0YvQsdC10YDQuNGC0LUg0YTQsNC50Lso0YspLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLQpNCw0LnQuyDQvdC1INCy0YvQsdGA0LDQvVwiLFxuICBjb25maXJtRGVsZXRlOiBcItCS0Ysg0YLQvtGH0L3QviDRhdC+0YLQuNGC0LUg0YPQtNCw0LvQuNGC0Ywg0LfQsNC/0LjRgdGMP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItCt0YLQviDQt9C90LDRh9C10L3QuNC1INC00L7Qu9C20L3QviDQsdGL0YLRjCDRg9C90LjQutCw0LvRjNC90YvQvC5cIixcbiAgYWRkQ29sdW1uOiBcItCU0L7QsdCw0LLQuNGC0Ywg0LrQvtC70L7QvdC60YNcIixcbiAgYWRkUm93OiBcItCU0L7QsdCw0LLQuNGC0Ywg0YHRgtGA0L7QutGDXCIsXG4gIHJlbW92ZVJvdzogXCLQo9C00LDQu9C40YLRjFwiLFxuICBhZGRQYW5lbDogXCLQlNC+0LHQsNCy0LjRgtGMINC90L7QstGD0Y5cIixcbiAgcmVtb3ZlUGFuZWw6IFwi0KPQtNCw0LvQuNGC0YxcIixcbiAgY2hvaWNlc19JdGVtOiBcItCS0LDRgNC40LDQvdGCXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi0JrQvtC70L7QvdC60LBcIixcbiAgbWF0cml4X3JvdzogXCLQodGC0YDQvtC60LBcIixcbiAgc2F2aW5nRGF0YTogXCLQoNC10LfRg9C70YzRgtCw0YLRiyDRgdC+0YXRgNCw0L3Rj9GO0YLRgdGPINC90LAg0YHQtdGA0LLQtdGALi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLQn9GA0L7QuNC30L7RiNC70LAg0L7RiNC40LHQutCwLCDRgNC10LfRg9C70YzRgtCw0YIg0L3QtSDQsdGL0Lsg0YHQvtGF0YDQsNC90ZHQvS5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi0KDQtdC30YPQu9GM0YLQsNGCINGD0YHQv9C10YjQvdC+INGB0L7RhdGA0LDQvdGR0L0hXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLQn9C+0L/RgNC+0LHQvtCy0LDRgtGMINGB0L3QvtCy0LBcIixcbiAgdGltZXJNaW46IFwi0LzQuNC9XCIsXG4gIHRpbWVyU2VjOiBcItGB0LXQulwiLFxuICB0aW1lclNwZW50QWxsOiBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQvdCwINGN0YLQvtC5INGB0YLRgNCw0L3QuNGG0LUg0LggezF9INCy0YHQtdCz0L4uXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQvdCwINGN0YLQvtC5INGB0YLRgNCw0L3QuNGG0LUuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi0JLRiyDQv9C+0YLRgNCw0YLQuNC70LggezB9INCyINGC0LXRh9C10L3QuNC1INGC0LXRgdGC0LAuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLQktGLINC/0L7RgtGA0LDRgtC40LvQuCB7MH0g0LjQtyB7MX0g0L3QsCDRjdGC0L7QuSDRgdGC0YDQsNC90LjRhtC1INC4IHsyfSDQuNC3IHszfSDQtNC70Y8g0LLRgdC10LPQviDRgtC10YHRgtCwLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCLQktGLINC/0L7RgtGA0LDRgtC40LvQuCB7MH0g0LjQtyB7MX0g0L3QsCDRjdGC0L7QuSDRgdGC0YDQsNC90LjRhtC1LlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcItCS0Ysg0L/QvtGC0YDQsNGC0LjQu9C4IHswfSDQuNC3IHsxfSDQtNC70Y8g0LLRgdC10LPQviDRgtC10YHRgtCwLlwiLFxuICBjbGVhbkNhcHRpb246IFwi0J7Rh9C40YHRgtC40YLRjFwiLFxuICBjbGVhckNhcHRpb246IFwi0J7Rh9C40YHRgtC40YLRjFwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLQktGL0LHQtdGA0LjRgtC1INGE0LDQudC7XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcItCj0LTQsNC70LjRgtGMINGE0LDQudC7XCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi0JTQsFwiLFxuICBib29sZWFuVW5jaGVja2VkTGFiZWw6IFwi0J3QtdGCXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcItCS0Ysg0YPQstC10YDQtdC90YssINGH0YLQviDRhdC+0YLQuNGC0LUg0YPQtNCw0LvQuNGC0Ywg0Y3RgtC+0YIg0YTQsNC50Ls6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcItCS0Ysg0YPQstC10YDQtdC90YssINGH0YLQviDRhdC+0YLQuNGC0LUg0YPQtNCw0LvQuNGC0Ywg0LLRgdC1INGE0LDQudC70Ys/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLQndCw0LfQstCw0L3QuNC1INCy0L7Qv9GA0L7RgdCwXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInJ1XCJdID0gcnVzc2lhblN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJydVwiXSA9IFwi0YDRg9GB0YHQutC40LlcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vcnVzc2lhbi50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc2ltcGxpZmllZENoaW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi5LiK5LiA6aG1XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLkuIvkuIDpobVcIixcbiAgY29tcGxldGVUZXh0OiBcIuaPkOS6pOmXruWNt1wiLFxuICBwcmV2aWV3VGV4dDogXCLpooTop4hcIixcbiAgZWRpdFRleHQ6IFwi57yW6L6RXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCLlvIDlp4vpl67ljbdcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLloavlhpnlhbbku5bnrZTmoYhcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIuaXoFwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLpgInmi6nlhajpg6hcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIuesrCB7MH0g6aG1LCDlhbEgezF9IOmhtVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiezB9IG9mIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwi56ysIHswfS97MX0g6aKYXCIsXG4gIGVtcHR5U3VydmV5OiBcIumXruWNt+S4reayoeaciemXrumimOaIlumhtemdolwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuaEn+iwouaCqOeahOWPguS4jiFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTogXCLkvaDlt7LlrozmiJDpl67ljbcuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi6Zeu5Y235q2j5Zyo5Yqg6L295LitLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIuivt+mAieaLqS4uLlwiLFxuICB2YWx1ZTogXCLlgLxcIixcbiAgcmVxdWlyZWRFcnJvcjogXCLor7floavlhpnmraTpl67pophcIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi6Iez5bCR5Zue562U5LiA6aKYLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuivt+Whq+WGmeaJgOacieihjOS4remXrumimFwiLFxuICBudW1lcmljRXJyb3I6IFwi562U5qGI5b+F6aG75piv5Liq5pWw5a2XXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi562U5qGI6ZW/5bqm6Iez5bCRIHswfSDkuKrlrZfnrKZcIixcbiAgdGV4dE1heExlbmd0aDogXCLnrZTmoYjplb/luqbkuI3og73otoXov4cgezB9IOS4quWtl+esplwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIuetlOahiOmVv+W6puW/hemhu+WcqCB7MH0gLSB7MX0g5Liq5a2X56ym5LmL6Ze0XCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwi5pyA5bCR6ZyA6KaB5aGr5YaZIHswfSDooYznrZTmoYhcIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi5pyA5bCR6ZyA6KaB6YCJ5oupIHswfSDpobnnrZTmoYhcIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi5pyA5aSa5Y+q6IO96YCJ5oupIHswfSDpobnnrZTmoYhcIixcbiAgbnVtZXJpY01pbk1heDogXCLnrZTmoYggJ3swfScg5b+F6aG75aSn5LqO562J5LqOIHsxfSDkuJTlsI/kuo7nrYnkuo4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwi562U5qGIICd7MH0nIOW/hemhu+Wkp+S6juetieS6jiB7MX1cIixcbiAgbnVtZXJpY01heDogXCLnrZTmoYggJ3swfScg5b+F6aG75bCP5LqO562J5LqOIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwi6K+36L6T5YWl5pyJ5pWI55qEIEVtYWlsIOWcsOWdgFwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLlhazlvI86IHswfSDml6DmlYguXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLovb3lhaXpgInpobnml7blj5HnlJ/plJnor68gJ3swfSc6IHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwi5pyq6IO96L295YWl5pyJ5pWI55qE6YCJ6aG55oiW6K+35rGC5Y+C5pWw6Lev5b6E5pyJ6K+vXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi5paH5Lu25aSn5bCP5LiN6IO96LaF6L+HIHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi6K+35a6M5oiQ5YW25LuW6Zeu6aKYXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi5paH5Lu25LiK5Lyg5LitLi4uIOivt+iAkOW/g+etieW+heWHoOenkuWQjumHjeivlVwiLFxuICBsb2FkaW5nRmlsZTogXCLliqDovb0uLi5cIixcbiAgY2hvb3NlRmlsZTogXCLpgInmi6nmlofku7YuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIuacqumAieaLqeaWh+S7tlwiLFxuICBjb25maXJtRGVsZXRlOiBcIuWIoOmZpOiusOW9lT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLkuLvplK7kuI3og73ph43lpI1cIixcbiAgYWRkQ29sdW1uOiBcIua3u+WKoOWIl1wiLFxuICBhZGRSb3c6IFwi5re75Yqg6KGMXCIsXG4gIHJlbW92ZVJvdzogXCLliKDpmaTnrZTmoYhcIixcbiAgYWRkUGFuZWw6IFwi5paw5re7XCIsXG4gIHJlbW92ZVBhbmVsOiBcIuWIoOmZpFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi6YCJ6aG5XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi5YiXXCIsXG4gIG1hdHJpeF9yb3c6IFwi6KGMXCIsXG4gIHNhdmluZ0RhdGE6IFwi5q2j5Zyo5bCG57uT5p6c5L+d5a2Y5Yiw5pyN5Yqh5ZmoLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLlnKjkv53lrZjnu5Pmnpzov4fnqIvkuK3lj5HnlJ/kuobplJnor6/vvIznu5PmnpzmnKrog73kv53lrZhcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi57uT5p6c5L+d5a2Y5oiQ5YqfIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi6K+36YeN6K+VXCIsXG4gIHRpbWVyTWluOiBcIuWIhlwiLFxuICB0aW1lclNlYzogXCLnp5JcIixcbiAgdGltZXJTcGVudEFsbDogXCLmnKzpobXnlKjml7YgezB9IOaAu+iuoeeUqOaXtnsxfSAuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIuacrOmhteeUqOaXtnswfSAuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi5oC76K6h55So5pe2IHswfSAuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLmnKzpobXnlKjml7YgezB9IOWFsSB7MX3vvIwg5oC76K6h55So5pe2IHsyfSDlhbEgezN9IC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi5pys6aG155So5pe2IHswfSDlhbEgezF9IC5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLmgLvorqHnlKjml7YgezB9IOWFsSB7MX0uXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLmuIXnkIZcIixcbiAgY2xlYXJDYXB0aW9uOiBcIua4hemZpFwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLpgInmi6nmlofku7ZcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi56e76Zmk5paH5Lu2XCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi5pivXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLlkKZcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi5Yig6Zmk5paH5Lu2OiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLliKDpmaTmiYDmnInmlofku7Y/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCLmoIfpophcIixcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiemgtY25cIl0gPSBzaW1wbGlmaWVkQ2hpbmVzZVN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJ6aC1jblwiXSA9IFwi566A5L2T5Lit5paHXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3NpbXBsaWZpZWQtY2hpbmVzZS50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc3BhbmlzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBbnRlcmlvclwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU2lndWllbnRlXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJDb21wbGV0YXJcIixcbiAgcHJldmlld1RleHQ6IFwiVmlzdGEgcHJldmlhXCIsXG4gIGVkaXRUZXh0OiBcIkVkaXRhXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJDb21pZW56YVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk90cm8gKGRlc2NyaWJhKVwiLFxuICBub25lSXRlbVRleHQ6IFwiTmluZ3Vub1wiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJTZWxlY2Npb25hciB0b2RvXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQw6FnaW5hIHswfSBkZSB7MX1cIixcbiAgcGFuZWxEeW5hbWljUHJvZ3Jlc3NUZXh0OiBcIlJlZ2lzdHJvIHswfSBkZSB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIlJlc3BvbmRpw7MgYSB7MH0vezF9IHByZWd1bnRhc1wiLFxuICBlbXB0eVN1cnZleTogXCJObyBoYXkgcMOhZ2luYSB2aXNpYmxlIG8gcHJlZ3VudGEgZW4gbGEgZW5jdWVzdGEuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3JhY2lhcyBwb3IgY29tcGxldGFyIGxhIGVuY3Vlc3RhIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiTnVlc3Ryb3MgcmVnaXN0cm9zIG11ZXN0cmFuIHF1ZSB5YSBoYSBjb21wbGV0YWRvIGVzdGEgZW5jdWVzdGEuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTGEgZW5jdWVzdGEgZXN0w6EgY2FyZ2FuZG8uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2VsZWNjaW9uZS4uLlwiLFxuICB2YWx1ZTogXCJ2YWxvclwiLFxuICByZXF1aXJlZEVycm9yOiBcIlBvciBmYXZvciBjb250ZXN0ZSBsYSBwcmVndW50YS5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiUG9yIGZhdm9yLCByZXNwb25kYSBhbCBtZW5vcyB1bmEgcHJlZ3VudGEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUG9yIGZhdm9yIGNvbnRlc3RlIGxhcyBwcmVndW50YXMgZW4gY2FkYSBoaWxlcmEuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJMYSBlc3RpbWFjacOzbiBkZWJlIHNlciBudW3DqXJpY2EuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUG9yIGZhdm9yIGVudHJlIHBvciBsbyBtZW5vcyB7MH0gc8OtbWJvbG9zLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlBvciBmYXZvciBlbnRyZSBtZW5vcyBkZSB7MH0gc8OtbWJvbG9zLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlBvciBmYXZvciBlbnRyZSBtw6FzIGRlIHswfSB5IG1lbm9zIGRlIHsxfSBzw61tYm9sb3MuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUG9yIGZhdm9yIGxsZW5lIHBvciBsbyBtZW5vcyB7MH0gaGlsZXJhcy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUG9yIGZhdm9yIHNlbGVjY2lvbmUgcG9yIGxvIG1lbm9zIHswfSB2YXJpYW50ZXMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBvciBmYXZvciBzZWxlY2Npb25lIG5vIG3DoXMgZGUgezB9IHZhcmlhbnRlcy5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIkVsICd7MH0nIGRlYmUgZGUgc2VyIGlndWFsIG8gbcOhcyBkZSB7MX0geSBpZ3VhbCBvIG1lbm9zIGRlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIkVsICd7MH0nIGRlYmUgc2VyIGlndWFsIG8gbcOhcyBkZSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJFbCAnezB9JyBkZWJlIHNlciBpZ3VhbCBvIG1lbm9zIGRlIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUG9yIGZhdm9yIGFncmVndWUgdW4gY29ycmVvIGVsZWN0csOzbmljbyB2w6FsaWRvLlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCJMYSBleHByZXNpw7NuOiB7MH0gZGViZXLDrWEgZGV2b2x2ZXIgJ3ZlcmRhZGVybycuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJMYSBzb2xpY2l0dWQgcmVncmVzw7MgZXJyb3IgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJMYSBzb2xpY2l0dWQgcmVncmVzw7MgdmFjw61vIGRlIGRhdGEgbyBsYSBwcm9waWVkYWQgJ3RyYXllY3RvcmlhJyBubyBlcyBjb3JyZWN0YVwiLFxuICBleGNlZWRNYXhTaXplOiBcIkVsIHRhbWHDsW8gZGVsIGFyY2hpdm8gbm8gZGViZSBkZSBleGNlZGVyIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlBvciBmYXZvciBhZ3JlZ3VlIGxhIG90cmEgZXN0aW1hY2nDs24uXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJTdSBhcmNoaXZvIHNlIGVzdMOhIHN1YmllbmRvLiBQb3IgZmF2b3IgZXNwZXJlIHVub3Mgc2VndW5kb3MgZSBpbnRlbnRlIGRlIG51ZXZvLlwiLFxuICBsb2FkaW5nRmlsZTogXCJDYXJnYW5kby4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkVsaWphIGFyY2hpdm8ocykuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIk5vIHNlIGhhIGVsZWdpZG8gbmluZ8O6biBhcmNoaXZvXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiwr9RdWllcmVzIGJvcnJhciBlbCByZWdpc3Rybz9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJFc3RlIHZhbG9yIGRlYmUgc2VyIMO6bmljby5cIixcbiAgYWRkQ29sdW1uOiBcIkHDsWFkaXIgY29sdW1uYVwiLFxuICBhZGRSb3c6IFwiQWdyZWd1ZSB1bmEgaGlsZXJhXCIsXG4gIHJlbW92ZVJvdzogXCJFbGltaW5hciB1bmEgaGlsZXJhXCIsXG4gIGFkZFBhbmVsOiBcIkHDsWFkaXIgbnVldm9cIixcbiAgcmVtb3ZlUGFuZWw6IFwiUmV0aXJlXCIsXG4gIGNob2ljZXNfSXRlbTogXCJhcnTDrWN1bG9cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bW5hXCIsXG4gIG1hdHJpeF9yb3c6IFwiSGlsZXJhXCIsXG4gIHNhdmluZ0RhdGE6IFwiTG9zIHJlc3VsdGFkb3Mgc2UgZXN0w6FuIGd1YXJkYW5kbyBlbiBlbCBzZXJ2aWRvci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiTG9zIHJlc3VsdGFkb3Mgc2UgZXN0w6FuIGd1YXJkYW5kbyBlbiBlbCBzZXJ2aWRvci4uLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLCoUxvcyByZXN1bHRhZG9zIHNlIGd1YXJkYXJvbiBjb24gw6l4aXRvIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiSW50w6ludGFsbyBkZSBudWV2by5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIkhhcyBnYXN0YWRvIHswfSBlbiBlc3RhIHDDoWdpbmEgeSB7MX0gZW4gdG90YWwuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcIlVzdGVkIGhhIHBhc2FkbyB7MH0gZW4gZXN0YSBww6FnaW5hLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkhhcyBnYXN0YWRvIGVuIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwiSGFzIGdhc3RhZG8gezB9IGRlIHsxfSBlbiBlc3RhIHDDoWdpbmEgeSB7Mn0gZGUgezN9IGVuIHRvdGFsLlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJIYXMgZ2FzdGFkbyB7MH0gZGUgezF9IGVuIGVzdGEgcMOhZ2luYS5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJVc3RlZCBoYSBnYXN0YWRvIHswfSBkZSB7MX0gZW4gdG90YWwuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJMaW1waWFcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkRlc3BlamVuXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIkVsaWphIGVsIGFyY2hpdm9cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiRWxpbWluYSBlc3RlIGFyY2hpdm9cIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJTw61cIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5vXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcIsK/RXN0w6FzIHNlZ3VybyBkZSBxdWUgcXVpZXJlcyBlbGltaW5hciBlc3RlIGFyY2hpdm86IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIsK/RXN0w6FzIHNlZ3VybyBkZSBxdWUgcXVpZXJlcyBlbGltaW5hciB0b2RvcyBsb3MgYXJjaGl2b3M/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJUw610dWxvIGRlIGxhIHByZWd1bnRhXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImVzXCJdID0gc3BhbmlzaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJlc1wiXSA9IFwiZXNwYcOxb2xcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vc3BhbmlzaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc3dhaGlsaVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJJbGl5b3Rhbmd1bGlhXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJJZnVhdGF5b1wiLFxuICBjb21wbGV0ZVRleHQ6IFwiS2FtaWxpXCIsXG4gIHByZXZpZXdUZXh0OiBcIkhha2lraVwiLFxuICBlZGl0VGV4dDogXCJIYXJpcmlcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkFuemFcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJOeWluZ2luZSAoZWxlemEpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCJIYWt1bmFcIixcbiAgc2VsZWN0QWxsSXRlbVRleHQ6IFwiQ2hhZ3VhIFpvdGVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlVrdXJhc2EgezB9IHdhIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiUmVrb2RpIHswfSB5YSB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIllhbGl5b2ppYml3YSB7MH0vezF9IG1hc3dhbGlcIixcbiAgZW1wdHlTdXJ2ZXk6IFwiSGFrdW5hIHVrdXJhc2EgdW5hb29uZWthbmEgYXUgc3dhbGkga2F0aWthIHV0YWZpdGkuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiQXNhbnRpIGt3YSBrdWthbWlsaXNoYSB1dGFmaXRpIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiUmVjb2RpIHpldHUgemluYXR1b255ZXNoYSB0YXlhcmkgdW1la2FtaWxpc2hhIHV0YWZpdGkuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiVHVuYWFuZGFhIHV0YWZpdGkuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQ2hhZ3VhLi4uXCIsXG4gIHZhbHVlOiBcInRoYW1hbmlcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJUYWZhZGhhbGkgamlidSBoaWxpIHN3YWxpLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJUYWZhZGhhbGkgamlidSBzd2FsaSBhbmdhbGF1IG1vamEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVGFmYWRoYWxpIGppYnUgbWFzd2FsaSBrYXRpa2Egc2FmdSB6b3RlLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVGhhbWFuaSBpbmFwYXN3YSBrdXdhIHlhIG5hbWJhcmkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiVGFmYWRoYWxpIGluZ2l6YSBhbmdhbGF1ezB9IGh1c2lrYS5cIixcbiAgdGV4dE1heExlbmd0aDogXCJUYWZhZGhhbGkgaW5naXphIGlzaW96aWRpIHswfSBodXNpa2EuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiVGFmYWRoYWxpIGluZ2l6YSBraXdhbmdvIHphaWRpIHlhIHswfSBuYSBraXNpY2hvcHVuZ3VhIHsxfSBodXNpa2EuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVGFmYWRoYWxpIGphemEgaXNpb3B1bmd1YSB7MH0gc2FmdS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVGFmYWRoYWxpIGNoYWd1YSBhbmdhbGF1IHswfSBsYWhhamEuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlRhZmFkaGFsaSBjaGFuZ3VhIGlzaW96aWRpIHswfSBsYWhhamEuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCIgJ3swfScgaW5hcGFzd2Ega3V3YSBzYXdhIGF1IHphaWRpIHlhIHsxfSBuYSBzYXdhIGF1IGNoaW5pIHlhIHsyfVwiLFxuICBudW1lcmljTWluOiBcIiAnezB9J2luYXBhc3dhIGt1d2Egc2F3YSBhdSB6YWlkaSB5YSB7MX1cIixcbiAgbnVtZXJpY01heDogXCIgJ3swfSdpbmFwYXN3YSBrdXdhIHNhd2EgYXUgY2hpbmkgeWEgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJUYWZhZGhhbGkgaW5naXphIGFud2FuaSBoYWxhbGkgeWEgYmFydWEtcGVwZS5cIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVXNlbWk6ezB9IGluYXBhc3dhIGt1cnVkaSAna3dlbGknLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiT21iaSBsaW5hIGtvc2EgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJPbWJpIGxpbGlydWRpc2hhIGRhdGEgdHVwdSBhdSB0aGUgJ3BhdGgnIG1hbGkgeWEgbmppYSBzaW8gc2FoaWhpXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiU2FpemkgeWEgZmFpbGkgaGFpcGFzd2kga3V6aWRpIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlRhZmFkaGFsaSBpbmdpemEgdGhhbWFuaSBueWluZ2luZS5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZhaWxpIHlha28gaW5hcGFraWEuVGFmYWRoYWxpIHN1YmlyaSBzZWt1bmRlIGthZGhhYSBuYSB1amFyaWJ1IHRlbmEuXCIsXG4gIGxvYWRpbmdGaWxlOiBcIkluYXBha2lhLi4uXCIsXG4gIGNob29zZUZpbGU6IFwiQ2hhZ3VhIGZhaWxpLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCJIdWphY2hhZ3VhIGZhaWxpXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiSmUhIFVuYXRha2Ega3VmdXRhIHJla29kaT9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJUaGFtYW5pIGhpaSBpbmFwYXN3YSBrdXdhIHlhIGtpcGVrZWUuXCIsXG4gIGFkZENvbHVtbjogXCJPbmdlemEgS29sYW11XCIsXG4gIGFkZFJvdzogXCJPbmdlemEgc2FmdVwiLFxuICByZW1vdmVSb3c6IFwiVG9hXCIsXG4gIGFkZFBhbmVsOiBcIk9uZ2V6YSBtcHlhXCIsXG4gIHJlbW92ZVBhbmVsOiBcIlRvYVwiLFxuICBjaG9pY2VzX0l0ZW06IFwia2l0dVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIktvbGFtdVwiLFxuICBtYXRyaXhfcm93OiBcIlNhZnVcIixcbiAgc2F2aW5nRGF0YTogXCJNYXRva2VvIHlhbWVoaWZhZGhpd2Ega3dhIHNldmEuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIktvc2EgbGltZXRva2VhIG5hIGhhdHVrdXdlemEga3VoaWZhZGhpIG1hdG9rZW8uXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIk1hdG9rZW8geWFtZWhpZmFkaGl3YSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIkphcmlidSB0ZW5hXCIsXG4gIHRpbWVyTWluOiBcImRha2lrYVwiLFxuICB0aW1lclNlYzogXCJzZWt1bmRlXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiVW1ldHVtaWEgezB9IGt3ZW55ZSB1a3VyYXNhIGh1dSBuYSB7MX0ga3dhIGp1bWxhLlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJVbWV0dW1pYSB7MH0ga3dlbnllIHVrdXJhc2EgaHV1LlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIlVtZXR1bWlhIHswfSBrd2EganVtbGEuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJVbWV0dW1pYSB7MH0geWEgezF9IGt3ZW55ZSB1a3VyYXNhIGh1dSB7Mn0gd2EgezN9IGt3YSBqdW1sYS5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiVW1ldHVtaWEgezB9IHlhIHsxfSBrd2VueWUgdWt1cmFzYSBodXUuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiVW1ldHVtaWEgezB9IHlhIHsxfSBrd2EganVtbGEuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJTYWZpc2hhXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJPbmRvYVwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJDaGFndWEgZmFpbGlcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiT25kb2EgZmFpbGlcIixcbiAgYm9vbGVhbkNoZWNrZWRMYWJlbDogXCJOZGlvXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCJIYXBhbmFcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwiSmUhIFVuYSB1aGFraWthIGt1d2EgdW5hdGFrYSBrdW9uZG9hIGZhaWxpIGhpaTogezB9P1wiLFxuICBjb25maXJtUmVtb3ZlQWxsRmlsZXM6IFwiSmUhIFVuYSB1aGFraWthIGt1d2EgdW5hdGFrYSBrdW9uZG9hIGZhaWxpIHpvdGU/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJLaWNod2EgY2hhIFN3YWxpXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInN3XCJdID0gc3dhaGlsaVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJzd1wiXSA9IFwiU3dhaGlsaVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9zd2FoaWxpLnRzIiwiLy9DcmVhdGUgYnkgTWF0dGlhcyBBc3BsdW5kXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHN3ZWRpc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiRsO2cmVnw6VlbmRlXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJOw6RzdGFcIixcbiAgY29tcGxldGVUZXh0OiBcIkbDpHJkaWdcIixcbiAgcHJldmlld1RleHQ6IFwiRsO2cmhhbmRzdmlzbmluZ1wiLFxuICBlZGl0VGV4dDogXCJSZWRpZ2VyYVwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwiU3RhcnRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbm5hdCAoYmVza3JpdilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIkluZ2VuXCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIlbDpGxqIGFsbGFcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNpZGEgezB9IGF2IHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiU3BlbGEgaW4gezB9IGF2IHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiQmVzdmFyYWRlIHswfSAvIHsxfSBmcsOlZ29yXCIsXG4gIGVtcHR5U3VydmV5OiBcIkRldCBmaW5ucyBpbmdlbiBzeW5saWcgc2lkYSBlbGxlciBmcsOlZ2EgaSBlbmvDpHRlbi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUYWNrIGbDtnIgYXR0IGR1IGdlbm9tZsO2cnQgZW5rw6R0ZW4hIVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiVsOlcmEgcmVnaXN0ZXIgdmlzYXIgYXR0IGR1IHJlZGFuIGhhciBzbHV0ZsO2cnQgZGVubmEgdW5kZXJzw7ZrbmluZy5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJFbmvDpHRlbiBsYWRkYXMuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVsOkbGouLi5cIixcbiAgdmFsdWU6IFwidsOkcmRlXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiVmFyIHbDpG5saWcgYmVzdmFyYSBmcsOlZ2FuLlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJWw6RubGlnZW4gc3ZhcmEgcMOlIG1pbnN0IGVuIGZyw6VnYS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWYXIgdsOkbmxpZyBiZXN2YXJhIGZyw6Vnb3JuYSBww6UgYWxsYSByYWRlci5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlbDpHJkZXQgc2thIHZhcmEgbnVtZXJpc2t0LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlZhciB2w6RubGlnIGFuZ2UgbWluc3QgezB9IHRlY2tlbi5cIixcbiAgdGV4dE1heExlbmd0aDogXCJBbmdlIGbDpHJyZSDDpG4gezB9IHRlY2tlbi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCJBbmdlIG1lciDDpG4gezB9IG9jaCBmw6RycmUgw6RuIHsxfSB0ZWNrZW4uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVmFyIHbDpG5saWcgZnlsbCBpIG1pbnN0IHswfSByYWRlci5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVmFyIHbDpG5saWcgdsOkbGogw6V0bWluc3RvbmUgezB9IHZhcmlhbnRlci5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVmFyIHbDpG5saWcgdsOkbGogaW50ZSBmbGVyIMOkbiB7MH0gdmFyaWFudGVyLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgc2thIHZhcmEgbGlrYSBtZWQgZWxsZXIgbWVyIMOkbiB7MX0gc2FtdCBsaWthIG1lZCBlbGxlciBtaW5kcmUgw6RuIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIHNrYSB2YXJhIGxpa2EgbWVkIGVsbGVyIG1lciDDpG4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgc2thIHZhcmEgbGlrYSBtZWQgZWxsZXIgbWluZHJlIMOkbiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlZhciB2w6RubGlnIGFuZ2UgZW4ga29ycmVrdCBlLXBvc3RhZHJlc3MuXCIsXG4gIGludmFsaWRFeHByZXNzaW9uOiBcIlV0dHJ5Y2tldDogezB9IHNrYSByZXR1cm5lcmEgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiRsO2cmZyw6VnYW4gcmV0dXJuZXJhZGUgZmVsZXQgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJBbnRpbmdlbiByZXR1cm5lcmFkZSBmw7ZyZnLDpWdhbiBpbmdlbiBkYXRhIGVsbGVyIHPDpSDDpHIgZWdlbnNrYXBlbiAncGF0aCcgaW50ZSBrb3JyZWt0XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRmlsc3Rvcmxla2VuIGbDpXIgZWogw7Z2ZXJzdGlnYSB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJWYXIgdsOkbmxpZyBhbmdlIGRldCBhbmRyYSB2w6RyZGV0LlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRGluIGZpbCBsYWRkYXMgdXBwLiBWYXIgdsOkbmxpZyB2w6RudGEgbsOlZ3JhIHNla3VuZGVyIG9jaCBmw7Zyc8O2ayBzZWRhbiBpZ2VuLlwiLFxuICBsb2FkaW5nRmlsZTogXCJMw6RzZXIgaW4uLi5cIixcbiAgY2hvb3NlRmlsZTogXCJWw6RsaiBmaWwgKGVyKSAuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcIkluZ2VuIGZpbCB2YWxkXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVmlsbCBkdSByYWRlcmEgcG9zdGVuP1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkRldHRhIHbDpHJkZSBza2EgdmFyYSB1bmlrdC5cIixcbiAgYWRkQ29sdW1uOiBcIkzDpGdnIHRpbGwga29sdW1uXCIsXG4gIGFkZFJvdzogXCJMw6RnZyB0aWxsIHJhZFwiLFxuICByZW1vdmVSb3c6IFwiVGEgYm9ydFwiLFxuICBhZGRQYW5lbDogXCJMw6RnZyB0aWxsIG55XCIsXG4gIHJlbW92ZVBhbmVsOiBcIlRhIGJvcnRcIixcbiAgY2hvaWNlc19JdGVtOiBcIkFydGlrZWxcIixcbiAgbWF0cml4X2NvbHVtbjogXCJLb2x1bW5cIixcbiAgbWF0cml4X3JvdzogXCJSYWRcIixcbiAgc2F2aW5nRGF0YTogXCJSZXN1bHRhdGVuIHNwYXJhcyBww6Ugc2VydmVybiAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkV0dCBmZWwgaW50csOkZmZhZGUgb2NoIHZpIGt1bmRlIGludGUgc3BhcmEgcmVzdWx0YXRlbi5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiUmVzdWx0YXRlbiBzcGFyYWRlcyBmcmFtZ8OlbmdzcmlrdCFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIkbDtnJzw7ZrIGlnZW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNla1wiLFxuICB0aW1lclNwZW50QWxsOiBcIkR1IGhhciBzcGVuZGVyYXQgezB9IHDDpSBkZW4gaMOkciBzaWRhbiBvY2ggezF9IHRvdGFsdC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiRHUgaGFyIHNwZW5kZXJhdCB7MH0gcMOlIGRlbiBow6RyIHNpZGFuLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcIkR1IGhhciBzcGVuZGVyYXQgezB9IHRvdGFsdC5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkR1IGhhciBzcGVuZGVyYXQgezB9IGF2IHsxfSBww6UgZGVuIGjDpHIgc2lkYW4gb2NoIHsyfSBhdiB7M30gdG90YWx0LlwiLFxuICB0aW1lckxpbWl0UGFnZTogXCJEdSBoYXIgc3BlbmRlcmF0IHswfSBhdiB7MX0gcMOlIGRlbiBow6RyIHNpZGFuLlwiLFxuICB0aW1lckxpbWl0U3VydmV5OiBcIkR1IGhhciBzcGVuZGVyYXQgezB9IGF2IHsxfSB0b3RhbHQuXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCJSZW5hXCIsXG4gIGNsZWFyQ2FwdGlvbjogXCJLbGFyXCIsXG4gIGNob29zZUZpbGVDYXB0aW9uOiBcIlbDpGxqIEZJTFwiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCJUYSBib3J0IGRlbiBow6RyIGZpbGVuXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwiSmFcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIk5lalwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCLDhHIgZHUgc8Oka2VyIHDDpSBhdHQgZHUgdmlsbCB0YSBib3J0IGRlbiBow6RyIGZpbGVuOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLDhHIgZHUgc8Oka2VyIHDDpSBhdHQgZHUgdmlsbCB0YSBib3J0IGFsbGEgZmlsZXI/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJGcsOlZ2V0aXRlbFwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJzdlwiXSA9IHN3ZWRpc2hTdXJ2ZXlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1wic3ZcIl0gPSBcInN2ZW5za2FcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vc3dlZGlzaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgdGFqaWtTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi0JHQvtC30LPQsNGI0YJcIixcbiAgcGFnZU5leHRUZXh0OiBcItCe0Y/QvdC00LBcIixcbiAgY29tcGxldGVUZXh0OiBcItCY0rfRgNC+INGI0YPQtFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi0J7Sk9C+0LdcIixcbiAgb3RoZXJJdGVtVGV4dDogXCLQlNC40LPQsNGAICjQu9GD0YLRhNCw0L0g0YLQsNCy0YHQuNGEINC60YPQvdC10LQpXCIsXG4gIG5vbmVJdGVtVGV4dDogXCLQndC1XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcItKy0LDQvNCw0YDQviDQuNC90YLQuNGF0L7QsSDQutCw0YDQtNCw0L1cIixcbiAgcHJvZ3Jlc3NUZXh0OiBcItCh0LDSs9C40YTQsNC4IHswfSDQsNC3IHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCLQr9Cz0L7QvSDRgdCw0LLQvtC7INCy0YPSt9GD0LQg0L3QsNC00L7RgNCw0LQuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi0KLQsNGI0LDQutC60YPRgCDQsdCw0YDQvtC4INC/0YPRgCDQutCw0YDQtNCw0L3QuCDRgdCw0LLQvtC70L3QvtC80LAhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6XG4gICAgXCLQqNGD0LzQviDQsNC70LvQsNC60LDQuSDQuNC9INC/0YPRgNGB0LjRiNGA0L4g0LDQvdK30L7QvCDQtNC+0LTQsNC10LQuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi0JHQvtGA0LPQuNGA06Mg0LDQtyDRgdC10YDQstC10YAuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi0JjQvdGC0LjRhdC+0LEg0LrQsNGA0LTQsNC9Li4uXCIsXG4gIHZhbHVlOiBcItKb0LjQvNC80LDRglwiLFxuICByZXF1aXJlZEVycm9yOiBcItCY0LvRgtC40LzQvtGBLCDQsdCwINGB0LDQstC+0Lsg0rfQsNCy0L7QsSDQtNC40rPQtdC0LlwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCLQmNC70YLQuNC80L7RgSwg0LDSm9Cw0LvQsNC9INCx0LAg0Y/QuiDRgdCw0LLQvtC7INK30LDQstC+0LEg0LTQuNKz0LXQtC5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLQmNC70YLQuNC80L7RgSwg0LHQsCDSs9Cw0LzQsNC4INGB0LDQstC+0LvSs9C+INC00LDRgCDSs9Cw0LzQsNC4INGB0LDRgtGA0rPQviDSt9Cw0LLQvtCxINC00LjSs9C10LQuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLSttCw0LLQvtCxINCx0L7Rj9C0INGA0LDSm9Cw0Lwg0LHQvtGI0LDQtC5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLQmNC70YLQuNC80L7RgSwg0LDQtyB7MH0g0LfQuNGR0LTRgtCw0YAg0YDQsNC80Lcg0LLQvtGA0LjQtCDQutGD0L3QtdC0LlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItCY0LvRgtC40LzQvtGBLCDQsNC3IHswfSDQutCw0LzRgtCw0YAg0YDQsNC80Lcg0LLQvtGA0LjQtCDQutGD0L3QtdC0LlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcItCY0LvRgtC40LzQvtGBLCDQsNC3IHswfSDQt9C40ZHQtNGC0LDRgCDQstCwINCw0LcgezF9INC60LDQvNGC0LDRgCDRgNCw0LzQtyDQstC+0YDQuNC0INC60YPQvdC10LQuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwi0JjQu9GC0LjQvNC+0YEsINC90LAg0LrQsNC80YLQsNGAINCw0LcgezB9INGB0LDRgtGAINC/0YPRgCDQutGD0L3QtdC0LlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLQmNC70YLQuNC80L7RgSwg0LDSm9Cw0LvQsNC9IHswfSDQstCw0YDQuNCw0L3RgiDQuNC90YLQuNGF0L7QsSDQutGD0L3QtdC0LlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLQmNC70YLQuNC80L7RgSwg0L3QsCDQt9C40ZHQtNGC0LDRgCDQsNC3IHswfSDQstCw0YDQuNCw0L3RgiDQuNC90YLQuNGF0L7QsSDQutGD0L3QtdC0LlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScg0LHQvtGP0LQg0L3QsCDQutCw0Lwg0LDQtyB7MX0g0LLQsCDQvdCwINCx0LjRgdGR0YAg0LDQtyB7Mn0g0LHQvtGI0LDQtFwiLFxuICBudW1lcmljTWluOiBcIid7MH0nINCx0L7Rj9C0INC90LAg0LrQsNC8INCw0LcgezF9INCx0L7RiNCw0LRcIixcbiAgbnVtZXJpY01heDogXCInezB9JyDQsdC+0Y/QtCDQvdCwINC30LjRkdC0INCw0LcgezF9INCx0L7RiNCw0LRcIixcbiAgaW52YWxpZEVtYWlsOiBcItCY0LvRgtC40LzQvtGBLCDQv9C+0YfRgtCw0Lgg0Y3Qu9C10LrRgtGA0L7QvdC40Lgg0LLQvtKb0LXQuNGA0L4g0LLQvtGA0LjQtCDQutGD0L3QtdC0LlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLQmNGE0L7QtNCw0LggezB9INCx0L7Rj9C0ICd0cnVlJyDQsdCw0YDQs9Cw0YDQtNC+0L3QsNC0LlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi0JTQsNGA0YXQvtGB0YIg0YXQsNGC0L7Qs9OjINCx0L7Qt9Cz0LDRgNC00L7QvdC0ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwi0rbQsNCy0L7QsSDQsdCwINC00LDRgNGF0L7RgdGCINGF0L7Qu9OjINC+0LzQsNC0INGRINGF0L7RgdC40Y/RgtC4ICdwYXRoJyDQvdC+0LTRg9GA0YPRgdGCINC80YPQsNC50Y/QvSDQutCw0YDQtNCwINGI0YPQtNCw0LDRgdGCXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi0JDQvdC00L7Qt9Cw0Lgg0YTQsNC50Lsg0LHQvtGP0LQg0L3QsCDQutCw0LvQvtC9INCw0LcgezB9INCx0L7RiNCw0LQuXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLQmNC70YLQuNC80L7RgSwg0LHQsCDQvNCw0LnQtNC+0L3QuCAn0JTQuNCz0LDRgCcg0LTQvtC00LDSs9C+0YDQviDQstC+0YDQuNC0INC60YPQvdC10LRcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcItCk0LDQudC70Lgg0YjRg9C80L4g0LHQvtGAINGI0YPQtNCwINC40YHRgtC+0LTQsNCw0YHRgi4g0K/QutGH0LDQvdC0INGB0L7QvdC40Y8g0LjQvdGC0LjQt9C+0YAg0YjQsNCy0LXQtCDQstCwINCx0L7RgNC4INC00LjQs9Cw0YAg0LrTr9GI0LjRiCDQutGD0L3QtdC0LlwiLFxuICBsb2FkaW5nRmlsZTogXCLQkdC+0YDQutGD0L3Toy4uLlwiLFxuICBjaG9vc2VGaWxlOiBcItCk0LDQudC7KNKz0L4pLdGA0L4g0LjQvdGC0LjRhdC+0LEg0LrRg9C90LXQtC4uLlwiLFxuICBjb25maXJtRGVsZXRlOiBcItCo0YPQvNC+INC80YPRgtC80LDQuNC9INKz0LDRgdGC0LXQtCwg0LrQuCDQvNC10YXQvtKz0LXQtCDQstC+0YDQuNC00YDQviDRgtC+0LfQsCDQutGD0L3QtdC0P1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcItCY0L0g0LDRgNC30LjRiCDQsdC+0Y/QtCDQsdC10L3QsNC30LjRgCDQsdC+0YjQsNC0LlwiLFxuICBhZGRDb2x1bW46IFwi0JjQu9C+0LLQsNC4INGB0YPRgtGD0L1cIixcbiAgYWRkUm93OiBcItCY0LvQvtCy0LDQuCDRgdCw0YLRgFwiLFxuICByZW1vdmVSb3c6IFwi0J3QtdGB0YIg0LrQsNGA0LTQsNC9XCIsXG4gIGFkZFBhbmVsOiBcItCY0LvQvtCy0LAg0LrQsNGA0LTQsNC9XCIsXG4gIHJlbW92ZVBhbmVsOiBcItCd0LXRgdGCINC60LDRgNC00LDQvVwiLFxuICBjaG9pY2VzX0l0ZW06IFwi0JLQsNGA0LjQsNC90YJcIixcbiAgbWF0cml4X2NvbHVtbjogXCLQodGD0YLRg9C9XCIsXG4gIG1hdHJpeF9yb3c6IFwi0KHQsNGC0YBcIixcbiAgc2F2aW5nRGF0YTogXCLQndCw0YLQuNK30LAg0LHQsCDRgdC10YDQstC10YAg0YHQsNCx0YIg0YjRg9C00LAg0LjRgdGC0L7QtNCw0LDQvdC0Li4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLQpdCw0YLQvtCz06Mg0LHQsCDQsNC80LDQuyDQvtC80LDQtCwg0L3QsNGC0LjSt9CwINGB0LDQsdGCINC90LDRiNGD0LQuXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcItCd0LDRgtC40rfQsCDQsdC+0LzRg9Cy0LDRhNGE0LDQutC40Y/RgiDRgdCw0LHRgiDRiNGD0LQhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLQkdC+0YDQuCDQtNC40LPQsNGAINC606/RiNC40Ygg0LrQsNGA0LTQsNC90LRcIixcbiAgdGltZXJNaW46IFwi0LTQsNKbXCIsXG4gIHRpbWVyU2VjOiBcItGB0L7QvVwiLFxuICB0aW1lclNwZW50QWxsOiBcItCo0YPQvNC+IHswfSDQtNCw0YAg0LjQvSDRgdCw0rPQuNGE0LAg0LLQsCB7MX0g0LTQsNGAINGD0LzRg9C8INGB0LDRgNGEINC60LDRgNC00LXQtC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi0KjRg9C80L4gezB9INC00LDRgCDQuNC9INGB0LDSs9C40YTQsCDRgdCw0YDRhCDQutCw0YDQtNC10LQuXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwi0KjRg9C80L4gezB9INC00LDRgCDQuNC9INGC0LXRgdGCINGB0LDRgNGEINC90LDQvNGD0LTQtdC0LlwiLFxuICB0aW1lckxpbWl0QWxsOlxuICAgIFwi0KjRg9C80L4gezB9INCw0LcgezF9INC00LDRgCDQuNC9INGB0LDSs9C40YTQsCDQstCwIHsyfSDQsNC3IHszfSDQtNCw0YAg0YPQvNGD0Lwg0YHQsNGA0YQg0LrQsNGA0LTQtdC0INC00LDRgCDQtNC+0YXQuNC70Lgg0LjQvSDRgtC10YHRgi5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwi0KjRg9C80L4gezB9INCw0LcgezF9INC00LDRgCDQuNC9INGB0LDSs9C40YTQsCDRgdCw0YDRhCDQutCw0YDQtNC10LQuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwi0KjRg9C80L4gezB9INCw0LcgezF9INC00LDRgCDSs9Cw0LzQsNC4INGC0LXRgdGCINGB0LDRgNGEINC60LDRgNC00LXQtC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcItCi0L7Qt9CwINC60LDRgNC00LDQvVwiLFxuICBjbGVhckNhcHRpb246IFwi0KLQvtC30LAg0LrQsNGA0LTQsNC9XCIsXG4gIHJlbW92ZUZpbGVDYXB0aW9uOiBcItCk0LDQudC70YDQviDQvdC10YHRgiDQutCw0YDQtNCw0L1cIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJ0Z1wiXSA9IHRhamlrU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInRnXCJdID0gXCLRgtC+0rfQuNC606NcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vdGFqaWsudHMiLCIvL0NyZWF0ZWQgYnkgUGFkZXQgVGF3ZWVrdW5rYW5cbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgdGhhaVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLguIHguYjguK3guJnguKvguJnguYnguLJcIixcbiAgcGFnZU5leHRUZXh0OiBcIuC4luC4seC4lOC5hOC4m1wiLFxuICBjb21wbGV0ZVRleHQ6IFwi4Liq4Liz4LmA4Lij4LmH4LiIXCIsXG4gIHByZXZpZXdUZXh0OiBcIuC4lOC4ueC4leC4seC4p+C4reC4ouC5iOC4suC4h1wiLFxuICBlZGl0VGV4dDogXCLguYHguIHguYnguYTguIJcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIuC5gOC4o+C4tOC5iOC4oVwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIuC4reC4t+C5iOC4meC5hiAo4LmC4Lib4Lij4LiU4Lij4Liw4Lia4Li4KVwiLFxuICBub25lSXRlbVRleHQ6IFwi4LmE4Lih4LmI4Lih4Li1XCIsXG4gIHNlbGVjdEFsbEl0ZW1UZXh0OiBcIuC5gOC4peC4t+C4reC4geC4l+C4seC5ieC4h+C4q+C4oeC4lFwiLFxuICBwcm9ncmVzc1RleHQ6IFwi4Lir4LiZ4LmJ4Liy4LiX4Li14LmIIHswfSDguIjguLLguIEgezF9XCIsXG4gIHBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dDogXCLguKPguLLguKLguIHguLLguKPguJfguLXguYggezB9IOC4iOC4suC4gSB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcIuC4hOC4s+C4leC4reC4muC4l+C4teC5iCB7MH0vezF9IOC4iOC4s+C4meC4p+C4meC4hOC4s+C4luC4suC4oVwiLFxuICBlbXB0eVN1cnZleTogXCLguYTguKHguYjguKHguLXguKvguJnguYnguLLguYDguJ7guIjguJfguLXguYjguKHguK3guIfguYDguKvguYfguJkg4Lir4Lij4Li34LitIOC4hOC4s+C4luC4suC4oeC5g+C4mSBzdXJ2ZXkg4LiZ4Li14LmJXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi4LiC4Lit4Lia4LiE4Li44LiT4LiX4Li14LmI4LiX4LizIHN1cnZleSDguIjguJnguYDguKrguKPguYfguIhcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIuC4o+C4suC4ouC4geC4suC4o+C4guC4reC4h+C5gOC4o+C4suC5geC4quC4lOC4h+C4p+C5iOC4suC4hOC4uOC4k+C5hOC4lOC5ieC4l+C4syBzdXJ2ZXkg4LmA4Liq4Lij4LmH4LiI4LmA4Lij4Li14Lii4Lia4Lij4LmJ4Lit4Lii4LmB4Lil4LmJ4LinXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi4LiB4Liz4Lil4Lix4LiH4LmC4Lir4Lil4LiUIFN1cnZleS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLguYDguKXguLfguK3guIEuLi5cIixcbiAgdmFsdWU6IFwi4LiC4LmJ4Lit4Lih4Li54LilXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi4LiB4Lij4Li44LiT4Liy4LiV4Lit4Lia4LiE4Liz4LiW4Liy4LihXCIsXG4gIHJlcXVpcmVkRXJyb3JJblBhbmVsOiBcIuC4geC4o+C4uOC4k+C4suC4leC4reC4muC4guC4seC5ieC4meC4leC5iOC4s+C4q+C4meC4tuC5iOC4h+C4hOC4s+C4luC4suC4oVwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIuC4geC4o+C4uOC4k+C4suC4leC4reC4muC4hOC4s+C4luC4suC4oeC5g+C4meC4l+C4uOC4geC5huC5geC4luC4p1wiLFxuICBudW1lcmljRXJyb3I6IFwi4LiC4LmJ4Lit4Lih4Li54Lil4LiX4Li14LmI4LmD4Liq4LmI4LiV4LmJ4Lit4LiH4LmA4Lib4LmH4LiZ4LiV4Lix4Lin4LmA4Lil4LiCXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi4LiB4Lij4Li44LiT4Liy4LmD4Liq4LmI4LiC4Lix4LmJ4LiZ4LiV4LmI4Liz4LiI4Liz4LiZ4Lin4LiZIHswfSDguJXguLHguKfguK3guLHguIHguKnguKNcIixcbiAgdGV4dE1heExlbmd0aDogXCLguIHguKPguLjguJPguLLguYPguKrguYjguYTguKHguYjguYDguIHguLTguJnguIjguLPguJnguKfguJkgezB9IOC4leC4seC4p+C4reC4seC4geC4qeC4o1wiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIuC4geC4o+C4uOC4k+C4suC5g+C4quC5iOC4guC4seC5ieC4meC4leC5iOC4s+C4iOC4s+C4meC4p+C4mSB7MH0g4LmB4Lil4Liw4LmE4Lih4LmI4LmA4LiB4Li04LiZ4LiI4Liz4LiZ4Lin4LiZIHsxfSDguJXguLHguKfguK3guLHguIHguKnguKNcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLguIHguKPguLjguJPguLLguYPguKrguYjguILguLHguYnguJnguJXguYjguLPguIjguLPguJnguKfguJkgezB9IOC5geC4luC4p1wiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLguIHguKPguLjguJPguLLguYDguKXguLfguK3guIHguK3guKLguYjguLLguIfguJnguYnguK3guKIgezB9IOC4o+C4suC4ouC4geC4suC4o1wiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLguIHguKPguLjguJPguLLguYDguKXguLfguK3guIHguYTguKHguYjguYDguIHguLTguJkgezB9IOC4o+C4suC4ouC4geC4suC4o1wiLFxuICBudW1lcmljTWluTWF4OiBcIid7MH0nIOC4leC5ieC4reC4h+C4oeC4suC4geC4geC4p+C5iOC4suC4q+C4o+C4t+C4reC5gOC4l+C5iOC4suC4geC4seC4miB7MX0g4LmB4Lil4Liw4LiZ4LmJ4Lit4Lii4LiB4Lin4LmI4Liy4Lir4Lij4Li34Lit4LmA4LiX4LmI4Liy4LiB4Lix4LiaIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIOC4leC5ieC4reC4h+C4oeC4suC4geC4geC4p+C5iOC4suC4q+C4o+C4t+C4reC5gOC4l+C5iOC4suC4geC4seC4miB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDguJnguYnguK3guKLguIHguKfguYjguLLguKvguKPguLfguK3guYDguJfguYjguLLguIHguLHguJogezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLguIHguKPguLjguJPguLLguYPguKrguYjguK3guLXguYDguKHguKXguYzguYHguK3guJTguYDguJTguKPguKrguJfguLXguYjguJbguLnguIHguJXguYnguK3guIdcIixcbiAgaW52YWxpZEV4cHJlc3Npb246IFwiVGhlIGV4cHJlc3Npb246IHswfSDguJXguYnguK3guIfguKPguLXguYDguJfguLTguKPguYzguJkgJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi4Lij4Li14LmA4LiE4Lin4Liq4Lij4Li14LmA4LiX4Li04Lij4LmM4LiZIGVycm9yICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwi4Lij4Li14LmA4LiE4Lin4Liq4Lij4Li14LmA4LiX4Li04Lij4LmM4LiZ4LiC4LmJ4Lit4Lih4Li54Lil4Lin4LmI4Liy4LiH4LmA4Lib4Lil4LmI4LiyIOC4q+C4o+C4t+C4rSAncGF0aCcgcHJvcGVydHkg4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi4LiC4LiZ4Liy4LiU4LmE4Lif4Lil4LmM4LiV4LmJ4Lit4LiH4LmE4Lih4LmI4LmA4LiB4Li04LiZIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIuC4geC4o+C4uOC4k+C4suC5g+C4quC5iOC4hOC5iOC4suC4reC4t+C5iOC4mVwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwi4LmE4Lif4Lil4LmM4LiC4Lit4LiH4LiE4Li44LiT4LiB4Liz4Lil4Lix4LiH4Lit4Lix4Lie4LmC4Lir4Lil4LiU4Lit4Lii4Li54LmILiDguIHguKPguLjguJPguLLguKPguK3guKrguLHguIHguITguKPguLnguYjguYHguKXguYnguKfguJfguLPguIHguLLguKPguKXguK3guIfguK3guLXguIHguITguKPguLHguYnguIdcIixcbiAgbG9hZGluZ0ZpbGU6IFwi4LiB4Liz4Lil4Lix4LiH4LmC4Lir4Lil4LiULi4uXCIsXG4gIGNob29zZUZpbGU6IFwi4LmA4Lil4Li34Lit4LiB4LmE4Lif4Lil4LmMLi4uXCIsXG4gIG5vRmlsZUNob3NlbjogXCLguYTguKHguYjguYTguJ/guKXguYzguJfguLXguYjguYDguKXguLfguK3guIFcIixcbiAgY29uZmlybURlbGV0ZTogXCLguITguLjguJPguJXguYnguK3guIfguIHguLLguKPguKXguJrguKPguLLguKLguIHguLLguKPguJnguLXguYnguIjguKPguLTguIfguKvguKPguLfguK3guYTguKHguYg/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi4LiC4LmJ4Lit4Lih4Li54Lil4LiZ4Li14LmJ4LiV4LmJ4Lit4LiH4LmA4Lib4LmH4LiZIHVuaXF1ZS5cIixcbiAgYWRkQ29sdW1uOiBcIuC5gOC4nuC4tOC5iOC4oeC4hOC4reC4peC4seC4oeC4meC5jFwiLFxuICBhZGRSb3c6IFwi4LmA4Lie4Li04LmI4Lih4LmB4LiW4LinXCIsXG4gIHJlbW92ZVJvdzogXCLguKXguJpcIixcbiAgYWRkUGFuZWw6IFwi4LmA4Lie4Li04LmI4LihXCIsXG4gIHJlbW92ZVBhbmVsOiBcIuC4peC4mlwiLFxuICBjaG9pY2VzX0l0ZW06IFwi4LiK4Li04LmJ4LiZXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi4LiE4Lit4Lil4Lix4Lih4LiZ4LmMXCIsXG4gIG1hdHJpeF9yb3c6IFwi4LmB4LiW4LinXCIsXG4gIHNhdmluZ0RhdGE6IFwi4Lic4Lil4Lil4Lix4Lie4LiX4LmM4LiB4Liz4Lil4Lix4LiH4Lia4Lix4LiZ4LiX4Li24LiB4Lil4LiH4LiX4Li14LmI4LmA4LiL4Li04Lij4LmM4Lif4LmA4Lin4Lit4Lij4LmMLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLguKHguLXguITguKfguLLguKHguJzguLTguJTguJ7guKXguLLguJTguYDguIHguLTguJTguILguLbguYnguJnguKrguYjguIfguJzguKXguYPguKvguYnguYTguKHguYjguKrguLLguKHguLLguKPguJbguJrguLHguJnguJfguLbguIHguJzguKXguYTguJTguYlcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi4Lia4Lix4LiZ4LiX4Li24LiB4Liq4Liz4LmA4Lij4LmH4LiI4LmB4Lil4LmJ4LinXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLguKPguJrguIHguKfguJnguKXguK3guIfguK3guLXguIHguITguKPguLHguYnguIdcIixcbiAgdGltZXJNaW46IFwi4LiZ4Liy4LiX4Li1XCIsXG4gIHRpbWVyU2VjOiBcIuC4p+C4tOC4meC4suC4l+C4tVwiLFxuICB0aW1lclNwZW50QWxsOiBcIuC4hOC4uOC4k+C5g+C4iuC5ieC5gOC4p+C4peC4siB7MH0g4Lia4LiZ4Lir4LiZ4LmJ4Liy4LiZ4Li14LmJ4LmB4Lil4LiwIHsxfSDguKPguKfguKHguJfguLHguYnguIfguKvguKHguJRcIixcbiAgdGltZXJTcGVudFBhZ2U6IFwi4LiE4Li44LiT4LmD4LiK4LmJ4LmA4Lin4Lil4LiyIHswfSDguJrguJnguKvguJnguYnguLLguJnguLXguYlcIixcbiAgdGltZXJTcGVudFN1cnZleTogXCLguITguLjguJPguYPguIrguYnguYDguKfguKXguLIgezB9IOC4o+C4p+C4oeC4l+C4seC5ieC4h+C4q+C4oeC4lFwiLFxuICB0aW1lckxpbWl0QWxsOiBcIuC4hOC4uOC4k+C5g+C4iuC5ieC5gOC4p+C4peC4siB7MH0g4LiC4Lit4LiHIHsxfSDguJrguJnguKvguJnguYnguLLguJnguLXguYnguYHguKXguLAgezJ9IOC4guC4reC4hyB7M30g4Lij4Lin4Lih4LiX4Lix4LmJ4LiH4Lir4Lih4LiUXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIuC4hOC4uOC4k+C5g+C4iuC5ieC5gOC4p+C4peC4siB7MH0g4LiC4Lit4LiHIHsxfSDguJrguJnguKvguJnguYnguLLguJnguLXguYlcIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLguITguLjguJPguYPguIrguYnguYDguKfguKXguLIgezB9IOC4guC4reC4hyB7MX0g4Lij4Lin4Lih4LiX4Lix4LmJ4LiH4Lir4Lih4LiUXCIsXG4gIGNsZWFuQ2FwdGlvbjogXCLguITguKXguLXguJlcIixcbiAgY2xlYXJDYXB0aW9uOiBcIuC5gOC4hOC4peC4teC4ouC4o+C5jFwiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCLguYDguKXguLfguK3guIHguYTguJ/guKXguYxcIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwi4LiZ4Liz4LmE4Lif4Lil4LmM4LiZ4Li14LmJ4Lit4Lit4LiBXCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi4LmD4LiK4LmIXCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLguYTguKHguYjguYPguIrguYhcIixcbiAgY29uZmlybVJlbW92ZUZpbGU6IFwi4LiE4Li44LiT4LmB4LiZ4LmI4LmD4LiI4LiX4Li14LmI4LiI4Liw4LiZ4Liz4LmE4Lif4Lil4LmM4LiZ4Li14LmJ4Lit4Lit4LiB4LmD4LiK4LmI4Lir4Lij4Li34Lit4LmE4Lih4LmIOiB7MH0/XCIsXG4gIGNvbmZpcm1SZW1vdmVBbGxGaWxlczogXCLguITguLjguJPguYHguJnguYjguYPguIjguJfguLXguYjguIjguLDguJnguLPguYTguJ/guKXguYzguJfguLHguYnguIfguKvguKHguJTguK3guK3guIHguYPguIrguYjguKvguKPguLfguK3guYTguKHguYhcIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcIuC4iuC4t+C5iOC4reC4hOC4s+C4luC4suC4oVwiLFxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJ0aFwiXSA9IHRoYWlTdHJpbmdzO1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZU5hbWVzW1widGhcIl0gPSBcIuC5hOC4l+C4olwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi90aGFpLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciB0cmFkaXRpb25hbENoaW5lc2VTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi5LiK5LiA6aCBXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLkuIvkuIDpoIFcIixcbiAgY29tcGxldGVUZXh0OiBcIuaPkOS6pOWVj+WNt1wiLFxuICBvdGhlckl0ZW1UZXh0OiBcIuWhq+Wvq+WFtuS7luetlOahiFwiLFxuICBwcm9ncmVzc1RleHQ6IFwi56ysIHswfSDpoIEsIOWFsSB7MX0g6aCBXCIsXG4gIGVtcHR5U3VydmV5OiBcIuWVj+WNt+S4reaykuacieWVj+mhjOaIlumggemdolwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIuaEn+isneaCqOeahOWPg+iIhyFcIixcbiAgbG9hZGluZ1N1cnZleTogXCLllY/ljbfovInlhaXkuK0uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwi6KuL6YG45pOHLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi6KuL5aGr5a+r5q2k5ZWP6aGMXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwi6KuL5aGr5a+r5omA5pyJ6KGM5Lit5ZWP6aGMXCIsXG4gIG51bWVyaWNFcnJvcjogXCLnrZTmoYjlv4XpoIjmmK/lgIvmlbjlrZdcIixcbiAgdGV4dE1pbkxlbmd0aDogXCLnrZTmoYjplbfluqboh7PlsJEgezB9IOWAi+Wtl+WFg1wiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIuetlOahiOmVt+W6puS4jeiDvei2hemBjiB7MH0g5YCL5a2X5YWDXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwi562U5qGI6ZW35bqm5b+F6aCI5ZyoIHswfSAtIHsxfSDlgIvlrZflhYPkuYvplpNcIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLmnIDlsJHpnIDopoHloavlr6sgezB9IOihjOetlOahiFwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLmnIDlsJHpnIDopoHpgbjmk4cgezB9IOmgheetlOahiFwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLmnIDlpJrlj6rog73pgbjmk4cgezB9IOmgheetlOahiFwiLFxuICBudW1lcmljTWluTWF4OiBcIuetlOahiCAnezB9JyDlv4XpoIjlpKfmlrznrYnmlrwgezF9IOS4lOWwj+aWvOetieaWvCB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCLnrZTmoYggJ3swfScg5b+F6aCI5aSn5pa8562J5pa8IHsxfVwiLFxuICBudW1lcmljTWF4OiBcIuetlOahiCAnezB9JyDlv4XpoIjlsI/mlrznrYnmlrwgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLoq4vovLjlhaXmnInmlYjnmoQgRW1haWwg5Zyw5Z2AXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCLovInlhaXpgbjpoIXmmYLnmbznlJ/pjK/oqqQgJ3swfSc6IHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwi5pyq6IO96LyJ5YWl5pyJ5pWI55qE6YG46aCF5oiW6KuL5rGC5Y+D5pW46Lev5b6R5pyJ6KqkXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi5paH5Lu25aSn5bCP5LiN6IO96LaF6YGOIHswfVwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi6KuL5a6M5oiQ5YW25LuW5ZWP6aGMXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi5paH5Lu25LiK5YKz5LitLi4uIOiri+iAkOW/g+etieW+heW5vuenkuW+jOmHjeipplwiLFxuICBhZGRSb3c6IFwi5re75Yqg562U5qGIXCIsXG4gIHJlbW92ZVJvdzogXCLliKrpmaTnrZTmoYhcIixcbiAgY2hvaWNlc19JdGVtOiBcIumBuOmghVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIuWIl1wiLFxuICBtYXRyaXhfcm93OiBcIuihjFwiLFxuICBzYXZpbmdEYXRhOiBcIuato+WcqOWwh+e1kOaenOS/neWtmOWIsOacjeWLmeWZqC4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwi5Zyo5L+d5a2Y57WQ5p6c6YGO56iL5Lit55m855Sf5LqG6Yyv6Kqk77yM57WQ5p6c5pyq6IO95L+d5a2YXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcIue1kOaenOS/neWtmOaIkOWKnyFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIuiri+mHjeipplwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInpoLXR3XCJdID0gdHJhZGl0aW9uYWxDaGluZXNlU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInpoLXR3XCJdID0gXCLnuYHpq5TkuK3mlodcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vdHJhZGl0aW9uYWwtY2hpbmVzZS50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgdHVya2lzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJHZXJpXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLEsGxlcmlcIixcbiAgY29tcGxldGVUZXh0OiBcIkFua2V0aSBUYW1hbWxhXCIsXG4gIHByZXZpZXdUZXh0OiBcIsOWbiBpemxlbWVcIixcbiAgZWRpdFRleHQ6IFwiRMO8emVubGVcIixcbiAgc3RhcnRTdXJ2ZXlUZXh0OiBcIkJhxZ9sYXRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJEacSfZXIgKGHDp8Sxa2xhecSxbsSxeilcIixcbiAgbm9uZUl0ZW1UZXh0OiBcIllva1wiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCJIZXBzaW5pIHNlw6dcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlNheWZhIHswfSAvIHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwiS2F5xLF0IHswfSAvIHsxfVwiLFxuICBxdWVzdGlvbnNQcm9ncmVzc1RleHQ6IFwiU29ydWxhcsSxIGNldmFwbGFkxLEgezB9IC8gezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkFua2V0dGUgZ8O2csO8bnTDvGxlbmVjZWsgc2F5ZmEgeWEgZGEgc29ydSBtZXZjdXQgZGXEn2lsLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkFua2V0aW1pemkgdGFtYW1sYWTEscSfxLFuxLF6IGnDp2luIHRlxZ9la2vDvHIgZWRlcml6LlwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwiS2F5xLF0bGFyxLFtxLF6LCBidSBhbmtldGkgemF0ZW4gdGFtYW1sYWTEscSfxLFuxLF6xLEgZ8O2c3Rlcml5b3IuXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiQW5rZXQgc3VudWN1ZGFuIHnDvGtsZW5peW9yIC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJTZcOnaW5peiAuLi5cIixcbiAgdmFsdWU6IFwiZGXEn2VyXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiTMO8dGZlbiBzb3J1eWEgY2V2YXAgdmVyaW5pelwiLFxuICByZXF1aXJlZEVycm9ySW5QYW5lbDogXCJMw7x0ZmVuIGVuIGF6IGJpciBzb3J1eXUgeWFuxLF0bGF5xLFuLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkzDvHRmZW4gdMO8bSBzYXTEsXJsYXJkYWtpIHNvcnVsYXLEsSBjZXZhcGxhecSxbsSxei5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkdpcmlsZW4gZGXEn2VyIG51bWVyaWsgb2xtYWzEsWTEsXJcIixcbiAgdGV4dE1pbkxlbmd0aDogXCJFbiBheiB7MH0gc2VtYm9sIGdpcmluaXouXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTMO8dGZlbiB7MH0ga2FyYWt0ZXJkZW4gYXogZ2lyaW4uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiTMO8dGZlbiB7MH0g4oCZZGVuIGZhemxhIHZlIHsxfSDigJlkZW4gYXoga2FyYWt0ZXIgZ2lyaW4uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiTMO8dGZlbiBlbiBheiB7MH0gc2F0xLFyxLEgZG9sZHVydW4uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkzDvHRmZW4gZW4gYXogezB9IHNlw6dlbmXEn2kgc2XDp2luaXouXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIkzDvHRmZW4gezB9IGFkZXR0ZW4gZmF6bGEgc2XDp21leWluaXouXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJUaGUgJ3swfScgc2hvdWxkIGJlIGVxdWFsIG9yIG1vcmUgdGhhbiB7MX0gYW5kIGVxdWFsIG9yIGxlc3MgdGhhbiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBkZcSfZXJpIHsxfSBkZcSfZXJpbmUgZcWfaXQgdmV5YSBiw7x5w7xrIG9sbWFsxLFkxLFyXCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgZGXEn2VyaSB7MX0gZGXEn2VyaW5lIGXFn2l0IHlhIGRhIGvDvMOnw7xrIG9sbWFsxLFkxLFyLlwiLFxuICBpbnZhbGlkRW1haWw6IFwiTMO8dGZlbiBnZcOnZXJsaSBiaXIgZXBvc3RhIGFkcmVzaSBnaXJpbml6LlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLEsGZhZGU6IHswfSAndHJ1ZScgZMO2bmTDvHJtZWxpZGlyLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiVGFsZWJpIMWfdSBoYXRhecSxIGTDtm5kw7wgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJUYWxlcCBoZXJoYW5naSBiaXIgdmVyaSBkw7ZubWVkaSB5YSBkYSAncGF0aCcgw7Z6ZWxsacSfaSBoYXRhbMSxLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkRvc3lhIGJveXV0dSB7MH0gZGXEn2VyaW5pIGdlw6dlbWV6LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiTMO8dGZlbiBkacSfZXIgZGXEn2VybGVyaSBnaXJpbml6LlwiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwiRG9zeWFuxLF6IHnDvGtsZW5peW9yLiBMw5x0ZmVuIGJpcmthw6cgc2FuaXllIGJla2xleWluIHZlIHRla3JhciBkZW5leWluLlwiLFxuICBsb2FkaW5nRmlsZTogXCJZw7xrbGVuaXlvci4uLlwiLFxuICBjaG9vc2VGaWxlOiBcIkRvc3lhbGFyxLEgc2XDp2luIC4uLlwiLFxuICBub0ZpbGVDaG9zZW46IFwiRG9zeWEgc2XDp2lsaSBkZcSfaWxcIixcbiAgY29uZmlybURlbGV0ZTogXCJLYXlkxLEgc2lsbWVrIGlzdGl5b3IgbXVzdW51ej9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJCdSBkZcSfZXIgYmVuemVyc2l6IG9sbWFsxLFkxLFyLlwiLFxuICBhZGRDb2x1bW46IFwiU8O8dHVuIGVrbGV5aW5cIixcbiAgYWRkUm93OiBcIlNhdMSxciBFa2xlXCIsXG4gIHJlbW92ZVJvdzogXCJLYWxkxLFyXCIsXG4gIGFkZFBhbmVsOiBcIlllbmkgZWtsZVwiLFxuICByZW1vdmVQYW5lbDogXCJLYWxkxLFybWFrXCIsXG4gIGNob2ljZXNfSXRlbTogXCJlxZ95YVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIlPDvHR1blwiLFxuICBtYXRyaXhfcm93OiBcIkvDvHJlayDDp2VrbWVrXCIsXG4gIHNhdmluZ0RhdGE6IFwiU29udcOnbGFyIHN1bnVjdXlhIGtheWRlZGlsaXlvciAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkJpciBoYXRhIG9sdcWfdHUgdmUgc29udcOnbGFyxLEga2F5ZGVkZW1lZGlrLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJTb251w6dsYXIgYmHFn2FyxLF5bGEga2F5ZGVkaWxkaSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlRla3JhciBkZW5leWluXCIsXG4gIHRpbWVyTWluOiBcIm1pblwiLFxuICB0aW1lclNlYzogXCJzYW5peWVcIixcbiAgdGltZXJTcGVudEFsbDogXCJCdSBzYXlmYWRhIHswfSB2ZSB0b3BsYW1kYSB7MX0gaGFyY2FkxLFuxLF6LlwiLFxuICB0aW1lclNwZW50UGFnZTogXCJCdSBzYXlmYXlhIHswfSBoYXJjYWTEsW7EsXouXCIsXG4gIHRpbWVyU3BlbnRTdXJ2ZXk6IFwiVG9wbGFtZGEgezB9IGhhcmNhZMSxbsSxei5cIixcbiAgdGltZXJMaW1pdEFsbDpcbiAgICBcIkJ1IHNheWZheWEgezB9IC8gezF9IHZlIHRvcGxhbWRhIHsyfSAvIHszfSBoYXJjYWTEsW7EsXouXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkJ1IHNheWZheWEgezB9IC8gezF9IGhhcmNhZMSxbsSxei5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJUb3BsYW1kYSB7MH0gLyB7MX0gaGFyY2FkxLFuxLF6LlwiLFxuICBjbGVhbkNhcHRpb246IFwiVGVtaXpcIixcbiAgY2xlYXJDYXB0aW9uOiBcIkHDp8Sxa1wiLFxuICBjaG9vc2VGaWxlQ2FwdGlvbjogXCJEb3N5YSBzZcOnaW5cIixcbiAgcmVtb3ZlRmlsZUNhcHRpb246IFwiQnUgZG9zeWF5xLEga2FsZMSxclwiLFxuICBib29sZWFuQ2hlY2tlZExhYmVsOiBcIkV2ZXRcIixcbiAgYm9vbGVhblVuY2hlY2tlZExhYmVsOiBcIkhhecSxclwiLFxuICBjb25maXJtUmVtb3ZlRmlsZTogXCJCdSBkb3N5YXnEsSBrYWxkxLFybWFrIGlzdGVkacSfaW5pemRlbiBlbWluIG1pc2luaXo6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcIlTDvG0gZG9zeWFsYXLEsSBrYWxkxLFybWFrIGlzdGVkacSfaW5pemRlbiBlbWluIG1pc2luaXo/XCIsXG4gIHF1ZXN0aW9uVGl0bGVQYXR0ZXJuVGV4dDogXCJTb3J1IGJhxZ9sxLHEn8SxXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInRyXCJdID0gdHVya2lzaFN1cnZleVN0cmluZ3M7XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlTmFtZXNbXCJ0clwiXSA9IFwidMO8cmvDp2VcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vdHVya2lzaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgdWtyYWluaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItCd0LDQt9Cw0LRcIixcbiAgcGFnZU5leHRUZXh0OiBcItCU0LDQu9GWXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLQl9Cw0LLQtdGA0YjQuNGC0LhcIixcbiAgcHJldmlld1RleHQ6IFwi0J/QvtC/0LXRgNC10LTQvdGW0Lkg0L/QtdGA0LXQs9C70Y/QtFwiLFxuICBlZGl0VGV4dDogXCLQoNC10LTQsNCz0YPQstCw0YLQuFwiLFxuICBzdGFydFN1cnZleVRleHQ6IFwi0J/QvtGH0LDRgtC4XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi0IbQvdGI0LUgKNCx0YPQtNGMINC70LDRgdC60LAsINC+0L/QuNGI0ZbRgtGMKVwiLFxuICBub25lSXRlbVRleHQ6IFwi0JbQvtC00LXQvVwiLFxuICBzZWxlY3RBbGxJdGVtVGV4dDogXCLQktC40LHRgNCw0YLQuCDQstGB0LVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcItCh0YLQvtGA0ZbQvdC60LAgezB9INC3IHsxfVwiLFxuICBwYW5lbER5bmFtaWNQcm9ncmVzc1RleHQ6IFwi0JfQsNC/0LjRgSB7MH0g0ZbQtyB7MX1cIixcbiAgcXVlc3Rpb25zUHJvZ3Jlc3NUZXh0OiBcItCS0ZbQtNC/0L7QstGW0LvQuCDQvdCwIHswfS97MX0g0L/QuNGC0LDQvdGMXCIsXG4gIGVtcHR5U3VydmV5OiBcItCd0LXQvNCw0ZQg0LbQvtC00L3QvtCz0L4g0L/QuNGC0LDQvdC90Y8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi0JTRj9C60YPRlNC80L4g0JLQsNC8INC30LAg0LfQsNC/0L7QstC90LXQvdC90Y8g0LDQvdC60LXRgtC4IVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwi0JLQuCDQstC20LUg0L/RgNC+0YXQvtC00LjQu9C4INGG0LUg0L7Qv9C40YLRg9Cy0LDQvdC90Y8uXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi0JfQsNCy0LDQvdGC0LDQttC10L3QvdGPINC+0L/QuNGC0YPQstCw0L3QvdGPLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcItCS0LjQsdGA0LDRgtC4Li4uXCIsXG4gIHZhbHVlOiBcItC30L3QsNGH0LXQvdC90Y9cIixcbiAgcmVxdWlyZWRFcnJvcjogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQtNCw0LnRgtC1INCy0ZbQtNC/0L7QstGW0LTRjC5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LTQsNC50YLQtSDQstGW0LTQv9C+0LLRltC00Ywg0YXQvtGH0LAg0LEg0L3QsCDQvtC00L3QtSDQv9C40YLQsNC90L3Rjy5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQtNCw0LnRgtC1INCy0ZbQtNC/0L7QstGW0LTRjCDQvdCwINC/0LjRgtCw0L3QvdGPINCyINC60L7QttC90L7QvNGDINGA0Y/QtNC60YMuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLQktGW0LTQv9C+0LLRltC00Ywg0L/QvtCy0LjQvdC90LAg0LHRg9GC0Lgg0YfQuNGB0LvQvtC8LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcItCR0YPQtNGMINC70LDRgdC60LAg0LLQstC10LTRltGC0Ywg0LHRltC70YzRiNC1IHswfSDRgdC40LzQstC+0LvRltCyLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItCR0YPQtNGMINC70LDRgdC60LAg0LLQstC10LTRltGC0Ywg0LzQtdC90YjQtSB7MH0g0YHQuNC80LLQvtC70ZbQsi5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLQkdGD0LTRjCDQu9Cw0YHQutCwINCy0LLQtdC00ZbRgtGMINCx0ZbQu9GM0YjQtSB7MH0g0Lgg0LzQtdC90YjQtSB7MX0g0YHQuNC80LLQvtC70ZbQsi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCLQkdGD0LTRjCDQu9Cw0YHQutCwLCDQt9Cw0L/QvtCy0L3RltGC0Ywg0L3QtSDQvNC10L3RiNC1IHswfSDRgNGP0LTQutGW0LIuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItCR0YPQtNGMINC70LDRgdC60LAsINCy0LjQsdC10YDRltGC0Ywg0YXQvtGH0LAg0LEgezB9INCy0LDRgNGW0LDQvdGC0ZbQsi5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LLQuNCx0LXRgNGW0YLRjCDQvdC1INCx0ZbQu9GM0YjQtSB7MH0g0LLQsNGA0ZbQsNC90YLRltCyLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScg0L/QvtCy0LjQvdC90L4g0LHRg9GC0Lgg0L3QtSDQvNC10L3RiNC1INC90ZbQtiB7MX0sINGWINC90LUg0LHRltC70YzRiNC1INC90ZbQtiB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyDQv9C+0LLQuNC90L3QviDQsdGD0YLQuCDQvdC1INC80LXQvdGI0LUg0L3RltC2IHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nINC/0L7QstC40L3QvdC+INCx0YPRgtC4INC90LUg0LHRltC70YzRiNC1INC90ZbQtiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcItCR0YPQtNGMINC70LDRgdC60LAsINCy0LLQtdC00ZbRgtGMINC00ZbQudGB0L3RgyDQsNC00YDQtdGB0YMg0LXQu9C10LrRgtGA0L7QvdC90L7RlyDQv9C+0YjRgtC4LlwiLFxuICBpbnZhbGlkRXhwcmVzc2lvbjogXCLQktC40YDQsNC3IHswfSDQv9C+0LLQuNC90LXQvSDQv9C+0LLQtdGA0YLQsNGC0LggJ3RydWUnLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwi0JfQsNC/0LjRgiDQv9C+0LLQtdGA0L3Rg9CyINC/0L7QvNC40LvQutGDICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwi0JLRltC00L/QvtCy0ZbQtNGMINC90LAg0LfQsNC/0LjRgiDQv9C+0LLQtdGA0L3Rg9C70LDRgdGMINC/0L7RgNC+0LbQvdGM0L7RjiDQsNCx0L4g0LLQu9Cw0YHRgtC40LLRltGC0YwgJ3BhdGgnINCy0LrQsNC30LDQvdC+INC90LXQstGW0YDQvdC+XCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi0KDQvtC30LzRltGAINGE0LDQudC70YMg0L3QtSDQv9C+0LLQuNC90LXQvSDQv9C10YDQtdCy0LjRidGD0LLQsNGC0LggezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi0JHRg9C00Ywg0LvQsNGB0LrQsCwg0LLQstC10LTRltGC0Ywg0LTQsNC90ZYg0LIg0L/QvtC70LUgJ9CG0L3RiNC1J1wiLFxuICB1cGxvYWRpbmdGaWxlOlxuICAgIFwi0JLQsNGIINGE0LDQudC7INC30LDQstCw0L3RgtCw0LbRg9GU0YLRjNGB0Y8uINCX0LDRh9C10LrQsNC50YLQtSDQtNC10LrRltC70YzQutCwINGB0LXQutGD0L3QtCDRliDRgdC/0YDQvtCx0YPQudGC0LUg0LfQvdC+0LLRgy5cIixcbiAgbG9hZGluZ0ZpbGU6IFwi0JfQsNCy0LDQvdGC0LDQttC10L3QvdGPLi4uXCIsXG4gIGNob29zZUZpbGU6IFwi0JLQuNCx0LXRgNGW0YLRjCDRhNCw0LnQuyjQuCkuLi5cIixcbiAgbm9GaWxlQ2hvc2VuOiBcItCk0LDQudC7INC90LUg0LLQuNCx0YDQsNC90L5cIixcbiAgY29uZmlybURlbGV0ZTogXCLQktC4INGF0L7Rh9C10YLQtSDQstC40LTQsNC70LjRgtC4INC30LDQv9C40YE/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwi0KbQtSDQt9C90LDRh9C10L3QvdGPINC/0L7QstC40L3QvdC+INCx0YPRgtC4INGD0L3RltC60LDQu9GM0L3QuNC8LlwiLFxuICBhZGRDb2x1bW46IFwi0JTQvtC00LDRgtC4INC60L7Qu9C+0L3QutGDXCIsXG4gIGFkZFJvdzogXCLQlNC+0LTQsNGC0Lgg0YDRj9C00L7QulwiLFxuICByZW1vdmVSb3c6IFwi0JLQuNC00LDQu9C40YLQuFwiLFxuICBhZGRQYW5lbDogXCLQlNC+0LTQsNGC0Lgg0L3QvtCy0YNcIixcbiAgcmVtb3ZlUGFuZWw6IFwi0JLQuNC00LDQu9C40YLQuFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi0JLQsNGA0ZbQsNC90YJcIixcbiAgbWF0cml4X2NvbHVtbjogXCLQmtC+0LvQvtC90LrQsFwiLFxuICBtYXRyaXhfcm93OiBcItCg0Y/QtNC+0LpcIixcbiAgc2F2aW5nRGF0YTogXCLQoNC10LfRg9C70YzRgtCw0YLQuCDQt9Cx0LXRgNGW0LPQsNGO0YLRjNGB0Y8g0L3QsCDRgdC10YDQstC10YAuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcItCS0ZbQtNCx0YPQu9Cw0YHRjyDQv9C+0LzQuNC70LrQsCwg0YDQtdC30YPQu9GM0YLQsNGCINC90LUg0LHRg9CyINC30LHQtdGA0LXQttC10L3QuNC5LlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCLQoNC10LfQstGD0LvRjNGC0LDRgiDRg9GB0L/RltGI0L3QviDQt9Cx0LXRgNC10LbQtdC90LjQuSFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcItCh0L/RgNC+0LHRg9Cy0LDRgtC4INC30L3QvtCy0YNcIixcbiAgdGltZXJNaW46IFwi0YXQslwiLFxuICB0aW1lclNlYzogXCLRgdC10LpcIixcbiAgdGltZXJTcGVudEFsbDogXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0L3QsCDRhtGW0Lkg0YHRgtC+0YDRltC90YbRliDRliB7MX0g0LfQsNCz0LDQu9C+0LwuXCIsXG4gIHRpbWVyU3BlbnRQYWdlOiBcItCS0Lgg0LLQuNGC0YDQsNGC0LjQu9C4IHswfSDQvdCwINGG0ZbQuSDRgdGC0L7RgNGW0L3RhtGWLlwiLFxuICB0aW1lclNwZW50U3VydmV5OiBcItCS0Lgg0LLQuNGC0YDQsNGC0LjQu9C4IHswfSDQv9GA0L7RgtGP0LPQvtC8INGC0LXRgdGC0YMuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0LcgezF9INC90LAg0YbRltC5INGB0YLQvtGA0ZbQvdGG0ZYg0ZYgezJ9INC3IHszfSDQtNC70Y8g0LLRgdGM0L7Qs9C+INGC0LXRgdGC0YMuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcItCS0Lgg0LLQuNGC0YDQsNGC0LjQu9C4IHswfSDQtyB7MX0g0L3QsCDRhtGW0Lkg0YHRgtC+0YDRltC90YbRli5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCLQktC4INCy0LjRgtGA0LDRgtC40LvQuCB7MH0g0LcgezF9INC00LvRjyDQstGB0YzQvtCz0L4g0YLQtdGB0YLRgy5cIixcbiAgY2xlYW5DYXB0aW9uOiBcItCe0YfQuNGB0YLQuNGC0LhcIixcbiAgY2xlYXJDYXB0aW9uOiBcItCe0YfQuNGB0YLQuNGC0LhcIixcbiAgY2hvb3NlRmlsZUNhcHRpb246IFwi0JLQuNCx0LXRgNGW0YLRjCDRhNCw0LnQu1wiLFxuICByZW1vdmVGaWxlQ2FwdGlvbjogXCLQktC40LTQsNC70LjRgtC4INGE0LDQudC7XCIsXG4gIGJvb2xlYW5DaGVja2VkTGFiZWw6IFwi0KLQsNC6XCIsXG4gIGJvb2xlYW5VbmNoZWNrZWRMYWJlbDogXCLQndGWXCIsXG4gIGNvbmZpcm1SZW1vdmVGaWxlOiBcItCS0Lgg0LLQv9C10LLQvdC10L3Rliwg0YnQviDRhdC+0YfQtdGC0LUg0LLQuNC00LDQu9C40YLQuCDRhtC10Lkg0YTQsNC50Ls6IHswfT9cIixcbiAgY29uZmlybVJlbW92ZUFsbEZpbGVzOiBcItCS0Lgg0LLQv9C10LLQvdC10L3Rliwg0YnQviDRhdC+0YfQtdGC0LUg0LLQuNC00LDQu9C40YLQuCDQstGB0ZYg0YTQsNC50LvQuD9cIixcbiAgcXVlc3Rpb25UaXRsZVBhdHRlcm5UZXh0OiBcItCd0LDQt9Cy0LAg0LfQsNC/0LjRgtCw0L3QvdGPXCIsXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInVhXCJdID0gdWtyYWluaWFuU3VydmV5U3RyaW5ncztcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVOYW1lc1tcInVhXCJdID0gXCLRg9C60YDQsNGX0L3RgdGM0LrQsFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi91a3JhaW5pYW4udHMiLCJpbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IHByb3BlcnR5LCBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgYm9vbGVhbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQm9vbGVhbk1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsRmFsc2VcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsVHJ1ZVwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLmxvY0xhYmVsRmFsc2Uub25HZXRUZXh0Q2FsbGJhY2sgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiAhIXRleHRcbiAgICAgICAgPyB0ZXh0XG4gICAgICAgIDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImJvb2xlYW5VbmNoZWNrZWRMYWJlbFwiKTtcbiAgICB9O1xuICAgIHRoaXMubG9jTGFiZWxUcnVlLm9uR2V0VGV4dENhbGxiYWNrID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICByZXR1cm4gISF0ZXh0XG4gICAgICAgID8gdGV4dFxuICAgICAgICA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJib29sZWFuQ2hlY2tlZExhYmVsXCIpO1xuICAgIH07XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH1cbiAgaXNMYXlvdXRUeXBlU3VwcG9ydGVkKGxheW91dFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIGNoZWNrIHdpbGwgYmUgcmVuZGVyZWQgaW4gaW5kZXRlcm1pbmF0ZSBtb2RlLiB2YWx1ZSBpcyBlbXB0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNJbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRW1wdHkoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQvc2V0IHF1ZXN0aW9uIHZhbHVlIGluIDMgbW9kZXM6IGluZGV0ZXJtaW5hdGUgKHZhbHVlIGlzIGVtcHR5KSwgdHJ1ZSAoY2hlY2sgaXMgc2V0KSBhbmQgZmFsc2UgKGNoZWNrIGlzIHVuc2V0KS5cbiAgICogQHNlZSB2YWx1ZVRydWVcbiAgICogQHNlZSB2YWx1ZUZhbHNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNoZWNrZWRWYWx1ZSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPT0gdGhpcy5nZXRWYWx1ZVRydWUoKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNoZWNrZWRWYWx1ZSh2YWw6IGFueSkge1xuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsID09IHRydWUgPyB0aGlzLmdldFZhbHVlVHJ1ZSgpIDogdGhpcy5nZXRWYWx1ZUZhbHNlKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIGRlZmF1bHQgc3RhdGUgb2YgdGhlIGNoZWNrOiBcImluZGV0ZXJtaW5hdGVcIiAtIGRlZmF1bHQgKHZhbHVlIGlzIGVtcHR5L251bGwpLCBcInRydWVcIiAtIHZhbHVlIGVxdWFscyB2YWx1ZVRydWUgb3IgdHJ1ZSwgXCJmYWxzZVwiIC0gdmFsdWUgZXF1YWxzIHZhbHVlRmFsc2Ugb3IgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0VmFsdWUodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB2YWwgPSBcInRydWVcIjtcbiAgICBpZiAodmFsID09PSBmYWxzZSkgdmFsID0gXCJmYWxzZVwiO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZVwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgfVxuICBwdWJsaWMgZ2V0RGVmYXVsdFZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09IFwiaW5kZXRlcm1pbmF0ZVwiKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWUgPT0gXCJ0cnVlXCJcbiAgICAgID8gdGhpcy5nZXRWYWx1ZVRydWUoKVxuICAgICAgOiB0aGlzLmdldFZhbHVlRmFsc2UoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zaG93VGl0bGUgfHwgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5sb2NMYWJlbC50ZXh0KVxuICAgICAgPyB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIilcbiAgICAgIDogdGhpcy5sb2NMYWJlbDtcbiAgfVxuICAvKipcbiAgICogVGhlIGNoZWNrYm94IGxhYmVsLiBJZiBpdCBpcyBlbXB0eSBhbmQgc2hvd1RpdGxlIGlzIGZhbHNlIHRoZW4gdGl0bGUgaXMgcmVuZGVyZWRcbiAgICogQHNlZSBzaG93VGl0bGVcbiAgICogQHNlZSB0aXRsZVxuICAgKi9cbiAgQHByb3BlcnR5KHsgbG9jYWxpemFibGU6IHRydWUgfSlcbiAgbGFiZWw6IHN0cmluZztcblxuICBnZXQgbG9jRGlzcGxheUxhYmVsKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICBpZiAodGhpcy5sb2NMYWJlbC50ZXh0KSByZXR1cm4gdGhpcy5sb2NMYWJlbDtcbiAgICByZXR1cm4gdGhpcy5zaG93VGl0bGUgPyB0aGlzLmxvY0xhYmVsIDogdGhpcy5sb2NUaXRsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIGRpZmZlcmVudCBsYWJlbCBmb3Igc3RhdGUgd2hlbiBjaGVjayBpcyBzZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxhYmVsVHJ1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxhYmVsVHJ1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxhYmVsVHJ1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibGFiZWxUcnVlXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0xhYmVsVHJ1ZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJsYWJlbFRydWVcIik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHksIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkaWZmZXJlbnQgbGFiZWwgZm9yIHN0YXRlIHdoZW4gY2hlY2sgaXMgdW5zZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGxhYmVsRmFsc2UoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJsYWJlbEZhbHNlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbGFiZWxGYWxzZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibGFiZWxGYWxzZVwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NMYWJlbEZhbHNlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsRmFsc2VcIik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBzaG93IHRoZSBxdWVzdGlvbiB0aXRsZS4gSXQgaXMgaGlkZGVuIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBAcHJvcGVydHkoKVxuICBzaG93VGl0bGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5LCBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGZyb20gdHJ1ZSB3aGVuIGNoZWNrIGlzIHNldC5cbiAgICovXG4gIEBwcm9wZXJ0eSgpXG4gIHZhbHVlVHJ1ZTogYW55O1xuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHksIGlmIHlvdSB3YW50IHRvIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgZnJvbSBmYWxzZSB3aGVuIGNoZWNrIGlzIHVuc2V0LlxuICAgKi9cbiAgQHByb3BlcnR5KClcbiAgdmFsdWVGYWxzZTogYW55O1xuXG4gIHByaXZhdGUgZ2V0VmFsdWVUcnVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVUcnVlID8gdGhpcy52YWx1ZVRydWUgOiB0cnVlO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVGYWxzZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlRmFsc2UgPyB0aGlzLnZhbHVlRmFsc2UgOiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RGVmYXVsdFZhbHVlKCkge1xuICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZSA9PSBcInRydWVcIikgdGhpcy5jaGVja2VkVmFsdWUgPSB0cnVlO1xuICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZSA9PSBcImZhbHNlXCIpIHRoaXMuY2hlY2tlZFZhbHVlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09IFwiaW5kZXRlcm1pbmF0ZVwiKSB0aGlzLnZhbHVlID0gbnVsbDtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImJvb2xlYW5cIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdFZhbHVlOmRyb3Bkb3duXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwiYm9vbGVhbkRlZmF1bHRWYWx1ZVwiLFxuICAgICAgZGVmYXVsdDogXCJpbmRldGVybWluYXRlXCIsXG4gICAgICBjaG9pY2VzOiBbXCJpbmRldGVybWluYXRlXCIsIFwiZmFsc2VcIiwgXCJ0cnVlXCJdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImxhYmVsOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0xhYmVsXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImxhYmVsVHJ1ZTp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTGFiZWxUcnVlXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImxhYmVsRmFsc2U6dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0xhYmVsRmFsc2VcIixcbiAgICB9LFxuICAgIFwic2hvd1RpdGxlOmJvb2xlYW5cIixcbiAgICBcInZhbHVlVHJ1ZVwiLFxuICAgIFwidmFsdWVGYWxzZVwiLFxuICBdLFxuICBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkJvb2xlYW5Nb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJib29sZWFuXCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuTW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9ib29sZWFuLnRzIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBjaGVja2JveCBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2Uge1xuICBwcml2YXRlIG5vbmVJdGVtVmFsdWU6IEl0ZW1WYWx1ZSA9IG5ldyBJdGVtVmFsdWUoXCJub25lXCIpO1xuICBwcml2YXRlIHNlbGVjdEFsbEl0ZW1WYWx1ZTogSXRlbVZhbHVlID0gbmV3IEl0ZW1WYWx1ZShcInNlbGVjdGFsbFwiKTtcbiAgcHJpdmF0ZSBpbnZpc2libGVPbGRWYWx1ZXM6IGFueSA9IHt9O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdmFyIG5vbmVJdGVtVGV4dCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJub25lVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICBub25lSXRlbVRleHQub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiAodGV4dCkge1xuICAgICAgcmV0dXJuICEhdGV4dCA/IHRleHQgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9uZUl0ZW1UZXh0XCIpO1xuICAgIH07XG4gICAgdGhpcy5ub25lSXRlbVZhbHVlLmxvY093bmVyID0gdGhpcztcbiAgICB0aGlzLm5vbmVJdGVtVmFsdWUuc2V0TG9jVGV4dChub25lSXRlbVRleHQpO1xuXG4gICAgdmFyIHNlbGVjdEFsbEl0ZW1UZXh0ID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwic2VsZWN0QWxsVGV4dFwiLFxuICAgICAgdGhpcyxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIHNlbGVjdEFsbEl0ZW1UZXh0Lm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgIHJldHVybiAhIXRleHQgPyB0ZXh0IDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInNlbGVjdEFsbEl0ZW1UZXh0XCIpO1xuICAgIH07XG4gICAgdGhpcy5zZWxlY3RBbGxJdGVtLmxvY093bmVyID0gdGhpcztcbiAgICB0aGlzLnNlbGVjdEFsbEl0ZW0uc2V0TG9jVGV4dChzZWxlY3RBbGxJdGVtVGV4dCk7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wiaGFzTm9uZVwiLCBcIm5vbmVUZXh0XCIsIFwiaGFzU2VsZWN0QWxsXCIsIFwic2VsZWN0QWxsVGV4dFwiXSxcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBhcmlhUm9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImdyb3VwXCI7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjaGVja2JveFwiO1xuICB9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge1xuICAgIHN1cGVyLm9uQ3JlYXRpbmcoKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicmVuZGVyZWRWYWx1ZVwiKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwidmFsdWVcIik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dElkICsgXCJfMFwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZWxlY3QgYWxsIGl0ZW0uIEJ5IHVzaW5nIHRoaXMgcHJvcGVydHksIHlvdSBtYXkgY2hhbmdlIHByb2dyYW1tYXRpY2FsbHkgaXQncyB2YWx1ZSBhbmQgdGV4dC5cbiAgICogQHNlZSBoYXNTZWxlY3RBbGxcbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0QWxsSXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdEFsbEl0ZW1WYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbm9uZSBpdGVtLiBCeSB1c2luZyB0aGlzIHByb3BlcnR5LCB5b3UgbWF5IGNoYW5nZSBwcm9ncmFtbWF0aWNhbGx5IGl0J3MgdmFsdWUgYW5kIHRleHQuXG4gICAqIEBzZWUgaGFzTm9uZVxuICAgKi9cbiAgcHVibGljIGdldCBub25lSXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIHJldHVybiB0aGlzLm5vbmVJdGVtVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgZGlmZmVyZW50IHRleHQgZm9yIG5vbmUgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbm9uZVRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcIm5vbmVUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibm9uZUl0ZW1UZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5vbmVUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJub25lVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NOb25lVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJub25lVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2V0IHRoZSBkaWZmZXJlbnQgdGV4dCBmb3IgU2VsZWN0IEFsbCBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBzZWxlY3RBbGxUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJzZWxlY3RBbGxUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwic2VsZWN0QWxsSXRlbVRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgc2VsZWN0QWxsVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwic2VsZWN0QWxsVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NTZWxlY3RBbGxUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInNlbGVjdEFsbFRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIHNob3cgdGhlIFwiU2VsZWN0IEFsbFwiIGl0ZW0gb24gdGhlIHRvcC4gSWYgZW5kLXVzZXIgY2hlY2tzIHRoaXMgaXRlbSwgdGhlbiBhbGwgaXRlbXMgYXJlIGNoZWNrZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhhc1NlbGVjdEFsbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGFzU2VsZWN0QWxsXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc1NlbGVjdEFsbCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJoYXNTZWxlY3RBbGxcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGFsbCBpdGVtcyBhcmUgc2VsZWN0ZWRcbiAgICogQHNlZSB0b2dnbGVTZWxlY3RBbGxcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuaXNJdGVtU2VsZWN0ZWQodGhpcy5ub25lSXRlbSkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgYWxsSXRlbUNvdW50ID0gdGhpcy52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgaWYgKHRoaXMuaGFzT3RoZXIpIGFsbEl0ZW1Db3VudC0tO1xuICAgIGlmICh0aGlzLmhhc05vbmUpIGFsbEl0ZW1Db3VudC0tO1xuICAgIGlmICh0aGlzLmhhc1NlbGVjdEFsbCkgYWxsSXRlbUNvdW50LS07XG4gICAgdmFyIHNlbGVjdGVkQ291bnQgPSB2YWwubGVuZ3RoO1xuICAgIGlmICh0aGlzLmlzSXRlbVNlbGVjdGVkKHRoaXMub3RoZXJJdGVtKSkgc2VsZWN0ZWRDb3VudC0tO1xuICAgIHJldHVybiBzZWxlY3RlZENvdW50ID09PSBhbGxJdGVtQ291bnQ7XG4gIH1cbiAgcHVibGljIHNldCBpc0FsbFNlbGVjdGVkKHZhbDogYm9vbGVhbikge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMuc2VsZWN0QWxsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXJWYWx1ZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogSXQgd2lsbCBzZWxlY3QgYWxsIGl0ZW1zLCBleGNlcHQgb3RoZXIgYW5kIG5vbmUuIElmIGFsbCBpdGVtcyBoYXZlIGJlZW4gYWxyZWFkeSBzZWxlY3RlZCB0aGVuIGl0IHdpbGwgY2xlYXIgdGhlIHZhbHVlXG4gICAqIEBzZWUgaXNBbGxTZWxlY3RlZFxuICAgKiBAc2VlIHNlbGVjdEFsbFxuICAgKi9cbiAgcHVibGljIHRvZ2dsZVNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSAhdGhpcy5pc0FsbFNlbGVjdGVkO1xuICB9XG4gIC8qKlxuICAgKiBTZWxlY3QgYWxsIGl0ZW1zLCBleGNlcHQgb3RoZXIgYW5kIG5vbmUuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsKCkge1xuICAgIHZhciB2YWwgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmlzaWJsZUNob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy52aXNpYmxlQ2hvaWNlc1tpXTtcbiAgICAgIGlmIChcbiAgICAgICAgaXRlbSA9PT0gdGhpcy5ub25lSXRlbSB8fFxuICAgICAgICBpdGVtID09PSB0aGlzLm90aGVySXRlbSB8fFxuICAgICAgICBpdGVtID09PSB0aGlzLnNlbGVjdEFsbEl0ZW1cbiAgICAgIClcbiAgICAgICAgY29udGludWU7XG4gICAgICB2YWwucHVzaChpdGVtLnZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gc2hvdyB0aGUgXCJOb25lXCIgaXRlbSBvbiB0aGUgYm90dG9tLiBJZiBlbmQtdXNlciBjaGVja3MgdGhpcyBpdGVtLCBhbGwgb3RoZXIgaXRlbXMgd291bGQgYmUgdW5jaGVja2VkLlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNOb25lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJoYXNOb25lXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhhc05vbmUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzTm9uZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgaXRlbSBpcyBjaGVja2VkXG4gICAqIEBwYXJhbSBpdGVtIGNoZWNrYm94IGl0ZW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBpc0l0ZW1TZWxlY3RlZChpdGVtOiBJdGVtVmFsdWUpOiBib29sZWFuIHtcbiAgICBpZiAoaXRlbSA9PT0gdGhpcy5zZWxlY3RBbGxJdGVtKSByZXR1cm4gdGhpcy5pc0FsbFNlbGVjdGVkO1xuICAgIHZhciB2YWwgPSB0aGlzLnJlbmRlcmVkVmFsdWU7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHZhbFtpXSwgaXRlbS52YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0SXRlbUNsYXNzKGl0ZW06IGFueSkge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlOyAvL3RyaWdnZXIgZGVwZW5kZW5jaWVzIGZyb20ga29WYWx1ZSBmb3Iga25vY2tvdXRcbiAgICB2YXIgaXNDaGVja2VkID0gdGhpcy5pc0l0ZW1TZWxlY3RlZChpdGVtKTtcbiAgICB2YXIgaXNEaXNhYmxlZCA9IHRoaXMuaXNSZWFkT25seSB8fCAhaXRlbS5pc0VuYWJsZWQ7XG4gICAgdmFyIGFsbG93SG92ZXIgPSAhaXNDaGVja2VkICYmICFpc0Rpc2FibGVkO1xuICAgIHZhciBpc1NlbGVjdEFsbCA9IGl0ZW0gPT09IHRoaXMuc2VsZWN0QWxsSXRlbTtcbiAgICB2YXIgaXNOb25lID0gaXRlbSA9PT0gdGhpcy5ub25lSXRlbTtcbiAgICB2YXIgaXRlbUNsYXNzID0gdGhpcy5jc3NDbGFzc2VzLml0ZW07XG4gICAgaWYgKCF0aGlzLmhhc0NvbHVtbnMpIHtcbiAgICAgIGl0ZW1DbGFzcyArPVxuICAgICAgICB0aGlzLmNvbENvdW50ID09PSAwXG4gICAgICAgICAgPyBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSW5saW5lXG4gICAgICAgICAgOiBcIiBzdi1xLWNvbC1cIiArIHRoaXMuY29sQ291bnQ7XG4gICAgfVxuICAgIGlmIChpc0Rpc2FibGVkICYmICEhdGhpcy5jc3NDbGFzc2VzLml0ZW1EaXNhYmxlZClcbiAgICAgIGl0ZW1DbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtRGlzYWJsZWQ7XG4gICAgaWYgKGlzQ2hlY2tlZCAmJiAhIXRoaXMuY3NzQ2xhc3Nlcy5pdGVtQ2hlY2tlZClcbiAgICAgIGl0ZW1DbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtQ2hlY2tlZDtcbiAgICBpZiAoYWxsb3dIb3ZlciAmJiAhIXRoaXMuY3NzQ2xhc3Nlcy5pdGVtSG92ZXIpXG4gICAgICBpdGVtQ2xhc3MgKz0gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuaXRlbUhvdmVyO1xuICAgIGlmIChpc1NlbGVjdEFsbCAmJiAhIXRoaXMuY3NzQ2xhc3Nlcy5pdGVtU2VsZWN0QWxsKVxuICAgICAgaXRlbUNsYXNzICs9IFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLml0ZW1TZWxlY3RBbGw7XG4gICAgaWYgKGlzTm9uZSAmJiAhIXRoaXMuY3NzQ2xhc3Nlcy5pdGVtTm9uZSlcbiAgICAgIGl0ZW1DbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtTm9uZTtcbiAgICByZXR1cm4gaXRlbUNsYXNzO1xuICB9XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLmlzQ2hhbmdpbmdWYWx1ZU9uQ2xlYXJJbmNvcnJlY3QpIHtcbiAgICAgIHRoaXMuaW52aXNpYmxlT2xkVmFsdWVzID0gW107XG4gICAgfVxuICAgIG5ld1ZhbHVlID0gdGhpcy52YWx1ZUZyb21EYXRhKG5ld1ZhbHVlKTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghbmV3VmFsdWUpIG5ld1ZhbHVlID0gW107XG4gICAgaWYgKCF2YWx1ZSkgdmFsdWUgPSBbXTtcbiAgICBpZiAoSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHZhbHVlLCBuZXdWYWx1ZSkpIHJldHVybjtcbiAgICBpZiAodGhpcy5oYXNOb25lKSB7XG4gICAgICB2YXIgcHJldk5vbmVJbmRleCA9IHRoaXMubm9uZUluZGV4SW5BcnJheSh2YWx1ZSk7XG4gICAgICB2YXIgbmV3Tm9uZUluZGV4ID0gdGhpcy5ub25lSW5kZXhJbkFycmF5KG5ld1ZhbHVlKTtcbiAgICAgIGlmIChwcmV2Tm9uZUluZGV4ID4gLTEpIHtcbiAgICAgICAgaWYgKG5ld05vbmVJbmRleCA+IC0xICYmIG5ld1ZhbHVlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBuZXdWYWx1ZS5zcGxpY2UobmV3Tm9uZUluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5ld05vbmVJbmRleCA+IC0xKSB7XG4gICAgICAgICAgbmV3VmFsdWUuc3BsaWNlKDAsIG5ld1ZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgbmV3VmFsdWUucHVzaCh0aGlzLm5vbmVJdGVtLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci5zZXROZXdWYWx1ZSh0aGlzLnJlbmRyZWRWYWx1ZVRvRGF0YShuZXdWYWx1ZSkpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc011bHRpcGxlVmFsdWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbW1lbnRGcm9tVmFsdWUobmV3VmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIGluZCA9IHRoaXMuZ2V0Rmlyc3RVbmtub3duSW5kZXgobmV3VmFsdWUpO1xuICAgIGlmIChpbmQgPCAwKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gbmV3VmFsdWVbaW5kXTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0T3RoZXJWYWx1ZUludG9WYWx1ZShuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICB2YXIgaW5kID0gdGhpcy5nZXRGaXJzdFVua25vd25JbmRleChuZXdWYWx1ZSk7XG4gICAgaWYgKGluZCA8IDApIHJldHVybiBuZXdWYWx1ZTtcbiAgICBuZXdWYWx1ZS5zcGxpY2UoaW5kLCAxLCB0aGlzLm90aGVySXRlbS52YWx1ZSk7XG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xuICB9XG4gIHByaXZhdGUgZ2V0Rmlyc3RVbmtub3duSW5kZXgobmV3VmFsdWU6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSkgcmV0dXJuIC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmhhc1Vua25vd25WYWx1ZShuZXdWYWx1ZVtpXSkpIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgcHJpdmF0ZSBub25lSW5kZXhJbkFycmF5KHZhbDogYW55KSB7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIC0xO1xuICAgIHZhciBub25lVmFsdWUgPSB0aGlzLm5vbmVJdGVtLnZhbHVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsW2ldID09IG5vbmVWYWx1ZSkgcmV0dXJuIGk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBwcm90ZWN0ZWQgY2FuVXNlRmlsdGVyZWRDaG9pY2VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5oYXNOb25lICYmICF0aGlzLmhhc1NlbGVjdEFsbCAmJiBzdXBlci5jYW5Vc2VGaWx0ZXJlZENob2ljZXMoKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWRkVG9WaXNpYmxlQ2hvaWNlcyhpdGVtczogQXJyYXk8SXRlbVZhbHVlPikge1xuICAgIGlmICh0aGlzLmhhc1NlbGVjdEFsbCkge1xuICAgICAgaXRlbXMudW5zaGlmdCh0aGlzLnNlbGVjdEFsbEl0ZW0pO1xuICAgIH1cbiAgICBzdXBlci5hZGRUb1Zpc2libGVDaG9pY2VzKGl0ZW1zKTtcbiAgICBpZiAodGhpcy5oYXNOb25lKSB7XG4gICAgICBpdGVtcy5wdXNoKHRoaXMubm9uZUl0ZW0pO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgcmV0dXJuIHN1cGVyLmdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dCwgdmFsdWUpO1xuICAgIHZhciBpdGVtcyA9IHRoaXMudmlzaWJsZUNob2ljZXM7XG4gICAgdmFyIHN0ciA9IFwiXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbFN0ciA9IHRoaXMuZ2V0Q2hvaWNlc0Rpc3BsYXlWYWx1ZShpdGVtcywgdmFsdWVbaV0pO1xuICAgICAgaWYgKHZhbFN0cikge1xuICAgICAgICBpZiAoc3RyKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICBzdHIgKz0gdmFsU3RyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHByb3RlY3RlZCBjbGVhckluY29ycmVjdFZhbHVlc0NvcmUoKSB7XG4gICAgdGhpcy5jbGVhckluY29ycmVjdEFuZERpc2FibGVkVmFsdWVzKGZhbHNlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJEaXNhYmxlZFZhbHVlc0NvcmUoKSB7XG4gICAgdGhpcy5jbGVhckluY29ycmVjdEFuZERpc2FibGVkVmFsdWVzKHRydWUpO1xuICB9XG4gIHByaXZhdGUgaXNDaGFuZ2luZ1ZhbHVlT25DbGVhckluY29ycmVjdDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGNsZWFySW5jb3JyZWN0QW5kRGlzYWJsZWRWYWx1ZXMoY2xlYXJEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIHZhciBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIHJlc3RvcmVkVmFsdWVzID0gdGhpcy5yZXN0b3JlVmFsdWVzRnJvbUludmlzaWJsZSgpO1xuICAgIGlmICghdmFsICYmIHJlc3RvcmVkVmFsdWVzLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkgfHwgdmFsLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmlzQ2hhbmdpbmdWYWx1ZU9uQ2xlYXJJbmNvcnJlY3QgPSB0cnVlO1xuICAgICAgaWYgKCFjbGVhckRpc2FibGVkKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pc0NoYW5naW5nVmFsdWVPbkNsZWFySW5jb3JyZWN0ID0gZmFsc2U7XG4gICAgICBpZiAocmVzdG9yZWRWYWx1ZXMubGVuZ3RoID09IDApIHJldHVybjtcbiAgICAgIHZhbCA9IFtdO1xuICAgIH1cbiAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlzVW5rb3duID0gdGhpcy5jYW5DbGVhclZhbHVlQW5Vbmtub3codmFsW2ldKTtcbiAgICAgIGlmIChcbiAgICAgICAgKCFjbGVhckRpc2FibGVkICYmICFpc1Vua293bikgfHxcbiAgICAgICAgKGNsZWFyRGlzYWJsZWQgJiYgIXRoaXMuaXNWYWx1ZURpc2FibGVkKHZhbFtpXSkpXG4gICAgICApIHtcbiAgICAgICAgbmV3VmFsdWUucHVzaCh2YWxbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIGlmIChpc1Vua293bikge1xuICAgICAgICAgIHRoaXMuaW52aXNpYmxlT2xkVmFsdWVzW3ZhbFtpXV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdG9yZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld1ZhbHVlLnB1c2gocmVzdG9yZWRWYWx1ZXNbaV0pO1xuICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmICghaGFzQ2hhbmdlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNDaGFuZ2luZ1ZhbHVlT25DbGVhckluY29ycmVjdCA9IHRydWU7XG4gICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICB0aGlzLmlzQ2hhbmdpbmdWYWx1ZU9uQ2xlYXJJbmNvcnJlY3QgPSBmYWxzZTtcbiAgfVxuICBwcml2YXRlIHJlc3RvcmVWYWx1ZXNGcm9tSW52aXNpYmxlKCk6IEFycmF5PGFueT4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgdmlzSXRlbXMgPSB0aGlzLnZpc2libGVDaG9pY2VzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlzSXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWwgPSB2aXNJdGVtc1tpXS52YWx1ZTtcbiAgICAgIGlmICh0aGlzLmludmlzaWJsZU9sZFZhbHVlc1t2YWxdKSB7XG4gICAgICAgIHJlcy5wdXNoKHZhbCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmludmlzaWJsZU9sZFZhbHVlc1t2YWxdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXRDb25kaXRpb25Kc29uKG9wZXJhdG9yOiBzdHJpbmcgPSBudWxsLCBwYXRoOiBzdHJpbmcgPSBudWxsKTogYW55IHtcbiAgICB2YXIganNvbiA9IHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICBpZiAob3BlcmF0b3IgPT0gXCJjb250YWluc1wiIHx8IG9wZXJhdG9yID09IFwibm90Y29udGFpbnNcIikge1xuICAgICAganNvbltcInR5cGVcIl0gPSBcInJhZGlvZ3JvdXBcIjtcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgcHVibGljIGlzQW5zd2VyQ29ycmVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gSGVscGVycy5pc0FycmF5Q29udGFpbnNFcXVhbCh0aGlzLnZhbHVlLCB0aGlzLmNvcnJlY3RBbnN3ZXIpO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWVXaXRoT3RoZXJzKCkge1xuICAgIHRoaXMudmFsdWUgPSB0aGlzLnJlbmRlcmVkVmFsdWVGcm9tRGF0YUNvcmUodGhpcy5kZWZhdWx0VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRIYXNPdGhlcih2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdmFsLmluZGV4T2YodGhpcy5vdGhlckl0ZW0udmFsdWUpID49IDA7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICghdmFsKSByZXR1cm4gdmFsO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gW3N1cGVyLnZhbHVlRnJvbURhdGEodmFsKV07XG4gICAgbGV0IHZhbHVlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjaG9pY2VpdGVtID0gSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHRoaXMuYWN0aXZlQ2hvaWNlcywgdmFsW2ldKTtcbiAgICAgIGlmICghIWNob2ljZWl0ZW0pIHtcbiAgICAgICAgdmFsdWUucHVzaChjaG9pY2VpdGVtLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlLnB1c2godmFsW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJlZFZhbHVlRnJvbURhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSB2YWwgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbFtpXSA9PSB0aGlzLm90aGVySXRlbS52YWx1ZSkgcmV0dXJuIHZhbDtcbiAgICAgIGlmICh0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWxbaV0pKSB7XG4gICAgICAgIHRoaXMuY29tbWVudCA9IHZhbFtpXTtcbiAgICAgICAgdmFyIG5ld1ZhbCA9IHZhbC5zbGljZSgpO1xuICAgICAgICBuZXdWYWxbaV0gPSB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIG5ld1ZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZHJlZFZhbHVlVG9EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKCF2YWwgfHwgIXZhbC5sZW5ndGgpIHJldHVybiB2YWw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWxbaV0gPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuZ2V0UXVlc3Rpb25Db21tZW50KCkpIHtcbiAgICAgICAgICB2YXIgbmV3VmFsID0gdmFsLnNsaWNlKCk7XG4gICAgICAgICAgbmV3VmFsW2ldID0gdGhpcy5nZXRRdWVzdGlvbkNvbW1lbnQoKTtcbiAgICAgICAgICByZXR1cm4gbmV3VmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc1Vua25vd25WYWx1ZSh2YWw6IGFueSwgaW5jbHVkZU90aGVyOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNOb25lICYmIHZhbCA9PSB0aGlzLm5vbmVJdGVtVmFsdWUudmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gc3VwZXIuaGFzVW5rbm93blZhbHVlKHZhbCwgaW5jbHVkZU90aGVyKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWRkU3VwcG9ydGVkVmFsaWRhdG9ycyhzdXBwb3J0ZWRWYWxpZGF0b3JzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgc3VwZXIuYWRkU3VwcG9ydGVkVmFsaWRhdG9ycyhzdXBwb3J0ZWRWYWxpZGF0b3JzKTtcbiAgICBzdXBwb3J0ZWRWYWxpZGF0b3JzLnB1c2goXCJhbnN3ZXJjb3VudFwiKTtcbiAgfVxufVxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJjaGVja2JveFwiLFxuICBbXG4gICAgXCJoYXNTZWxlY3RBbGw6Ym9vbGVhblwiLFxuICAgIFwiaGFzTm9uZTpib29sZWFuXCIsXG4gICAgeyBuYW1lOiBcIm5vbmVUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NOb25lVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInNlbGVjdEFsbFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1NlbGVjdEFsbFRleHRcIiB9LFxuICBdLFxuICBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkNoZWNrYm94TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwiY2hlY2tib3hiYXNlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNoZWNrYm94XCIsIChuYW1lKSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2NoZWNrYm94LnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIGNvbW1lbnQgcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ29tbWVudE1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBsYWNlSG9sZGVyXCIsIHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBpc1RleHRWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gdGV4dCBsZW5ndGguIElmIGl0IGlzIC0xLCBkZWZhdWwgdmFsdWUsIHRoZW4gdGhlIHN1cnZleSBtYXhUZXh0TGVuZ3RoIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAgICogSWYgaXQgaXMgMCwgdGhlbiB0aGUgdmFsdWUgaXMgdW5saW1pdGVkXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubWF4VGV4dExlbmd0aFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4TGVuZ3RoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4TGVuZ3RoKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4TGVuZ3RoXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldE1heExlbmd0aCgpOiBhbnkge1xuICAgIHJldHVybiBIZWxwZXJzLmdldE1heExlbmd0aChcbiAgICAgIHRoaXMubWF4TGVuZ3RoLFxuICAgICAgdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5tYXhUZXh0TGVuZ3RoIDogLTFcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIGlucHV0IHBsYWNlIGhvbGRlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGxhY2VIb2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGh0bWwgcm93cyBhdHRyaWJ1dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd3MoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJvd3ModmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBodG1sIGNvbHMgYXR0cmlidXRlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2xzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbHNcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb2xzKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sc1wiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICB9XG4gIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLmlzRW1wdHkoKSB8fCB0aGlzLnZhbHVlID09PSBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSB2YWx1ZSB0aGF0IHNwZWNpZmllcyBob3cgdGhlIHF1ZXN0aW9uIHVwZGF0ZXMgaXQncyB2YWx1ZS5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGU6XG4gICAqIC0gYGRlZmF1bHRgIC0gZ2V0IHRoZSB2YWx1ZSBmcm9tIHN1cnZleS50ZXh0VXBkYXRlTW9kZVxuICAgKiAtIGBvbkJsdXJgIC0gdGhlIHZhbHVlIGlzIHVwZGF0ZWQgYWZ0ZXIgYW4gaW5wdXQgbG9zZXMgdGhlIGZvY3VzLlxuICAgKiAtIGBvblR5cGluZ2AgLSB1cGRhdGUgdGhlIHZhbHVlIG9mIHRleHQgcXVlc3Rpb25zLCBcInRleHRcIiBhbmQgXCJjb21tZW50XCIsIG9uIGV2ZXJ5IGtleSBwcmVzcy5cbiAgICpcbiAgICogTm90ZSwgdGhhdCBzZXR0aW5nIHRvIFwib25UeXBpbmdcIiBtYXkgbGVhZCB0byBhIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLCBpbiBjYXNlIHlvdSBoYXZlIG1hbnkgZXhwcmVzc2lvbnMgaW4gdGhlIHN1cnZleS5cbiAgICogQHNlZSBzdXJ2ZXkudGV4dFVwZGF0ZU1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgdGV4dFVwZGF0ZU1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGV4dFVwZGF0ZU1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCB0ZXh0VXBkYXRlTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRleHRVcGRhdGVNb2RlXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBpc1N1cnZleUlucHV0VGV4dFVwZGF0ZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy50ZXh0VXBkYXRlTW9kZSA9PSBcImRlZmF1bHRcIilcbiAgICAgIHJldHVybiAhIXRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkuaXNVcGRhdGVWYWx1ZVRleHRPblR5cGluZyA6IGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnRleHRVcGRhdGVNb2RlID09IFwib25UeXBpbmdcIjtcbiAgfVxuICBwcm90ZWN0ZWQgYWRkU3VwcG9ydGVkVmFsaWRhdG9ycyhzdXBwb3J0ZWRWYWxpZGF0b3JzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgc3VwZXIuYWRkU3VwcG9ydGVkVmFsaWRhdG9ycyhzdXBwb3J0ZWRWYWxpZGF0b3JzKTtcbiAgICBzdXBwb3J0ZWRWYWxpZGF0b3JzLnB1c2goXCJ0ZXh0XCIsIFwicmVnZXhcIik7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiY29tbWVudFwiLFxuICBbXG4gICAgeyBuYW1lOiBcIm1heExlbmd0aDpudW1iZXJcIiwgZGVmYXVsdDogLTEgfSxcbiAgICB7IG5hbWU6IFwiY29sczpudW1iZXJcIiwgZGVmYXVsdDogNTAgfSxcbiAgICB7IG5hbWU6IFwicm93czpudW1iZXJcIiwgZGVmYXVsdDogNCB9LFxuICAgIHsgbmFtZTogXCJwbGFjZUhvbGRlclwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGxhY2VIb2xkZXJcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwidGV4dFVwZGF0ZU1vZGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcIm9uQmx1clwiLCBcIm9uVHlwaW5nXCJdLFxuICAgIH0sXG4gIF0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNvbW1lbnRcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnRNb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2NvbW1lbnQudHMiLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBTZXJpYWxpemVyLCBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbiB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7XG4gIElTdXJ2ZXlJbXBsLFxuICBJU3VydmV5RGF0YSxcbiAgSVN1cnZleSxcbiAgSVRleHRQcm9jZXNzb3IsXG4gIElQYW5lbCxcbiAgSUVsZW1lbnQsXG4gIFN1cnZleUVsZW1lbnQsXG4gIElDb25kaXRpb25SdW5uZXIsXG59IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFBhbmVsTW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuaW1wb3J0IHsgSGVscGVycywgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRRdWVzdGlvbkpTT04ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIGpzb246IGFueSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBTZXJpYWxpemVyLmFkZENsYXNzKFxuICAgICAgbmFtZSxcbiAgICAgIFtdLFxuICAgICAgZnVuY3Rpb24gKGpzb246IGFueSkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50Q29sbGVjdGlvbi5JbnN0YW5jZS5jcmVhdGVRdWVzdGlvbihcbiAgICAgICAgICAhIWpzb24gPyBqc29uLm5hbWUgOiBcIlwiLFxuICAgICAgICAgIHNlbGZcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBcInF1ZXN0aW9uXCJcbiAgICApO1xuICAgIHRoaXMub25Jbml0KCk7XG4gIH1cbiAgcHVibGljIG9uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuanNvbi5vbkluaXQpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25Jbml0KCk7XG4gIH1cbiAgcHVibGljIG9uQ3JlYXRlZChxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBpZiAoIXRoaXMuanNvbi5vbkNyZWF0ZWQpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25DcmVhdGVkKHF1ZXN0aW9uKTtcbiAgfVxuICBwdWJsaWMgb25Mb2FkZWQocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmpzb24ub25Mb2FkZWQpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25Mb2FkZWQocXVlc3Rpb24pO1xuICB9XG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyKHF1ZXN0aW9uOiBRdWVzdGlvbiwgaHRtbEVsZW1lbnQ6IGFueSkge1xuICAgIGlmICghdGhpcy5qc29uLm9uQWZ0ZXJSZW5kZXIpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25BZnRlclJlbmRlcihxdWVzdGlvbiwgaHRtbEVsZW1lbnQpO1xuICB9XG4gIHB1YmxpYyBvbkFmdGVyUmVuZGVyQ29udGVudEVsZW1lbnQoXG4gICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgIGVsZW1lbnQ6IFF1ZXN0aW9uLFxuICAgIGh0bWxFbGVtZW50OiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmpzb24ub25BZnRlclJlbmRlckNvbnRlbnRFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5qc29uLm9uQWZ0ZXJSZW5kZXJDb250ZW50RWxlbWVudChxdWVzdGlvbiwgZWxlbWVudCwgaHRtbEVsZW1lbnQpO1xuICB9XG4gIHB1YmxpYyBvblByb3BlcnR5Q2hhbmdlZChcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IGFueVxuICApIHtcbiAgICBpZiAoIXRoaXMuanNvbi5vblByb3BlcnR5Q2hhbmdlZCkgcmV0dXJuO1xuICAgIHRoaXMuanNvbi5vblByb3BlcnR5Q2hhbmdlZChxdWVzdGlvbiwgcHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIG9uSXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmpzb24ub25JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQpIHJldHVybjtcbiAgICB0aGlzLmpzb24ub25JdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQocXVlc3Rpb24sIHtcbiAgICAgIG9iajogaXRlbSxcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZSxcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQ29tcG9zaXRlKCkge1xuICAgIHJldHVybiAhIXRoaXMuanNvbi5lbGVtZW50c0pTT04gfHwgISF0aGlzLmpzb24uY3JlYXRlRWxlbWVudHM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbGxlY3Rpb24ge1xuICBwdWJsaWMgc3RhdGljIEluc3RhbmNlOiBDb21wb25lbnRDb2xsZWN0aW9uID0gbmV3IENvbXBvbmVudENvbGxlY3Rpb24oKTtcbiAgcHJpdmF0ZSBjdXN0b21RdWVzdGlvblZhbHVlczogQXJyYXk8Q29tcG9uZW50UXVlc3Rpb25KU09OPiA9IFtdO1xuICBwdWJsaWMgb25DcmVhdGVDb21wb3NpdGU6IChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbiAgKSA9PiBRdWVzdGlvbkNvbXBvc2l0ZU1vZGVsO1xuICBwdWJsaWMgb25DcmVhdGVDdXN0b206IChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbiAgKSA9PiBRdWVzdGlvbkN1c3RvbU1vZGVsO1xuICBwdWJsaWMgb25BZGRpbmdKc29uOiAobmFtZTogc3RyaW5nLCBpc0NvbXBvc2l0ZTogYm9vbGVhbikgPT4gdm9pZDtcbiAgcHVibGljIGFkZChqc29uOiBhbnkpIHtcbiAgICBpZiAoIWpzb24pIHJldHVybjtcbiAgICBsZXQgbmFtZSA9IGpzb24ubmFtZTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IFwiQXR0cmlidXRlIG5hbWUgaXMgbWlzc2VkXCI7XG4gICAgfVxuICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCEhdGhpcy5nZXRDdXN0b21RdWVzdGlvbkJ5TmFtZShuYW1lKSkge1xuICAgICAgdGhyb3cgKFxuICAgICAgICBcIlRoZXJlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBjdXN0b20gcXVlc3Rpb24gd2l0aCBuYW1lICdcIiArIG5hbWUgKyBcIidcIlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhU2VyaWFsaXplci5maW5kQ2xhc3MobmFtZSkpIHtcbiAgICAgIHRocm93IFwiVGhlcmUgaXMgYWxyZWFkeSBjbGFzcyB3aXRoIG5hbWUgJ1wiICsgbmFtZSArIFwiJ1wiO1xuICAgIH1cbiAgICB2YXIgY3VzdG9tUXVlc3Rpb24gPSBuZXcgQ29tcG9uZW50UXVlc3Rpb25KU09OKG5hbWUsIGpzb24pO1xuICAgIGlmICghIXRoaXMub25BZGRpbmdKc29uKVxuICAgICAgdGhpcy5vbkFkZGluZ0pzb24obmFtZSwgY3VzdG9tUXVlc3Rpb24uaXNDb21wb3NpdGUpO1xuICAgIHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXMucHVzaChjdXN0b21RdWVzdGlvbik7XG4gIH1cbiAgcHVibGljIGdldCBpdGVtcygpOiBBcnJheTxDb21wb25lbnRRdWVzdGlvbkpTT04+IHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21RdWVzdGlvblZhbHVlcztcbiAgfVxuICBwdWJsaWMgZ2V0Q3VzdG9tUXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogQ29tcG9uZW50UXVlc3Rpb25KU09OIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmN1c3RvbVF1ZXN0aW9uVmFsdWVzW2ldLm5hbWUgPT0gbmFtZSlcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VzdG9tUXVlc3Rpb25WYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIFNlcmlhbGl6ZXIucmVtb3ZlQ2xhc3ModGhpcy5jdXN0b21RdWVzdGlvblZhbHVlc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5jdXN0b21RdWVzdGlvblZhbHVlcyA9IFtdO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVRdWVzdGlvbihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbiAgKTogUXVlc3Rpb24ge1xuICAgIGlmICghIXF1ZXN0aW9uSlNPTi5pc0NvbXBvc2l0ZSlcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNvbXBvc2l0ZU1vZGVsKG5hbWUsIHF1ZXN0aW9uSlNPTik7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ3VzdG9tTW9kZWwobmFtZSwgcXVlc3Rpb25KU09OKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQ29tcG9zaXRlTW9kZWwoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uSlNPTjogQ29tcG9uZW50UXVlc3Rpb25KU09OXG4gICk6IFF1ZXN0aW9uQ29tcG9zaXRlTW9kZWwge1xuICAgIGlmICghIXRoaXMub25DcmVhdGVDb21wb3NpdGUpXG4gICAgICByZXR1cm4gdGhpcy5vbkNyZWF0ZUNvbXBvc2l0ZShuYW1lLCBxdWVzdGlvbkpTT04pO1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Db21wb3NpdGVNb2RlbChuYW1lLCBxdWVzdGlvbkpTT04pO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVDdXN0b21Nb2RlbChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25KU09OOiBDb21wb25lbnRRdWVzdGlvbkpTT05cbiAgKTogUXVlc3Rpb25DdXN0b21Nb2RlbCB7XG4gICAgaWYgKCEhdGhpcy5vbkNyZWF0ZUN1c3RvbSkgcmV0dXJuIHRoaXMub25DcmVhdGVDdXN0b20obmFtZSwgcXVlc3Rpb25KU09OKTtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uQ3VzdG9tTW9kZWwobmFtZSwgcXVlc3Rpb25KU09OKTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXVlc3Rpb25DdXN0b21Nb2RlbEJhc2UgZXh0ZW5kcyBRdWVzdGlvblxuICBpbXBsZW1lbnRzIElTdXJ2ZXlJbXBsLCBJU3VydmV5RGF0YSwgSVBhbmVsIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgY3VzdG9tUXVlc3Rpb246IENvbXBvbmVudFF1ZXN0aW9uSlNPTlxuICApIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzKHRoaXMpO1xuICAgIFN1cnZleUVsZW1lbnQuQ3JlYXRlRGlzYWJsZWREZXNpZ25FbGVtZW50cyA9IHRydWU7XG4gICAgdGhpcy5jcmVhdGVXcmFwcGVyKCk7XG4gICAgU3VydmV5RWxlbWVudC5DcmVhdGVEaXNhYmxlZERlc2lnbkVsZW1lbnRzID0gZmFsc2U7XG4gICAgaWYgKCEhdGhpcy5jdXN0b21RdWVzdGlvbikge1xuICAgICAgdGhpcy5jdXN0b21RdWVzdGlvbi5vbkNyZWF0ZWQodGhpcyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICEhdGhpcy5jdXN0b21RdWVzdGlvbiA/IHRoaXMuY3VzdG9tUXVlc3Rpb24ubmFtZSA6IFwiY3VzdG9tXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVdyYXBwZXIoKSB7fVxuICBwcm90ZWN0ZWQgb25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5vblByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgaWYgKCEhdGhpcy5jdXN0b21RdWVzdGlvbiAmJiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5jdXN0b21RdWVzdGlvbi5vblByb3BlcnR5Q2hhbmdlZCh0aGlzLCBuYW1lLCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBpdGVtVmFsdWVQcm9wZXJ0eUNoYW5nZWQoXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvbGRWYWx1ZTogYW55LFxuICAgIG5ld1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIuaXRlbVZhbHVlUHJvcGVydHlDaGFuZ2VkKGl0ZW0sIG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgaWYgKCEhdGhpcy5jdXN0b21RdWVzdGlvbiAmJiAhdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5jdXN0b21RdWVzdGlvbi5vbkl0ZW1WYWx1ZVByb3BlcnR5Q2hhbmdlZChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgaXRlbSxcbiAgICAgICAgaXRlbS5vd25lclByb3BlcnR5TmFtZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbmV3VmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBvbkZpcnN0UmVuZGVyaW5nKCkge1xuICAgIHZhciBlbCA9IHRoaXMuZ2V0RWxlbWVudCgpO1xuICAgIGlmICghIWVsKSB7XG4gICAgICBlbC5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgfVxuICAgIHN1cGVyLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgfVxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0RWxlbWVudCgpOiBTdXJ2ZXlFbGVtZW50O1xuICBwcm90ZWN0ZWQgaW5pdEVsZW1lbnQoZWw6IFN1cnZleUVsZW1lbnQpIHtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICBlbC5kaXNhYmxlRGVzaWduQWN0aW9ucyA9IHRydWU7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgdGhpcy5pbml0RWxlbWVudCh0aGlzLmdldEVsZW1lbnQoKSk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICBpZiAoISF0aGlzLmdldEVsZW1lbnQoKSkge1xuICAgICAgdGhpcy5nZXRFbGVtZW50KCkub25TdXJ2ZXlMb2FkKCk7XG4gICAgICB0aGlzLmN1c3RvbVF1ZXN0aW9uLm9uTG9hZGVkKHRoaXMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWw6IGFueSkge1xuICAgIC8vRG8gbm90aGluZ1xuICB9XG4gIHB1YmxpYyBhZnRlclJlbmRlcihlbDogYW55KSB7XG4gICAgc3VwZXIuYWZ0ZXJSZW5kZXIoZWwpO1xuICAgIGlmICghIXRoaXMuY3VzdG9tUXVlc3Rpb24pIHtcbiAgICAgIHRoaXMuY3VzdG9tUXVlc3Rpb24ub25BZnRlclJlbmRlcih0aGlzLCBlbCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnksIHVwZGF0ZUlzQW5zd2VyZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSwgdXBkYXRlSXNBbnN3ZXJlZCk7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldE5ld1ZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy51cGRhdGVFbGVtZW50Q3NzKCk7XG4gIH1cbiAgLy9JU3VydmV5SW1wbFxuICBnZVN1cnZleURhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXk7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3NvcjtcbiAgfVxuICAvL0lTdXJ2ZXlEYXRhXG4gIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgc2V0VmFsdWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgbG9jTm90aWZpY2F0aW9uOiBhbnksXG4gICAgYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWQ/OiBib29sZWFuXG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybjtcbiAgICB2YXIgbmV3TmFtZSA9IHRoaXMuY29udmVydERhdGFOYW1lKG5hbWUpO1xuICAgIHRoaXMuZGF0YS5zZXRWYWx1ZShcbiAgICAgIG5ld05hbWUsXG4gICAgICB0aGlzLmNvbnZlcnREYXRhVmFsdWUobmFtZSwgbmV3VmFsdWUpLFxuICAgICAgbG9jTm90aWZpY2F0aW9uLFxuICAgICAgYWxsb3dOb3RpZnlWYWx1ZUNoYW5nZWRcbiAgICApO1xuICAgIHRoaXMudXBkYXRlSXNBbnN3ZXJlZCgpO1xuICAgIHRoaXMudXBkYXRlRWxlbWVudENzcygpO1xuICB9XG4gIHByb3RlY3RlZCBjb252ZXJ0RGF0YU5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZU5hbWUoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY29udmVydERhdGFWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBuZXdWYWx1ZTtcbiAgfVxuICBnZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRWYXJpYWJsZShuYW1lKSA6IG51bGw7XG4gIH1cbiAgc2V0VmFyaWFibGUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybjtcbiAgICB0aGlzLmRhdGEuc2V0VmFyaWFibGUobmFtZSwgbmV3VmFsdWUpO1xuICB9XG4gIGdldENvbW1lbnQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0Q29tbWVudCh0aGlzLmdldFZhbHVlTmFtZSgpKSA6IFwiXCI7XG4gIH1cbiAgc2V0Q29tbWVudChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcsIGxvY05vdGlmaWNhdGlvbjogYW55KTogYW55IHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMuZGF0YS5zZXRDb21tZW50KHRoaXMuZ2V0VmFsdWVOYW1lKCksIG5ld1ZhbHVlLCBsb2NOb3RpZmljYXRpb24pO1xuICB9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSA6IHt9O1xuICB9XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldEZpbHRlcmVkVmFsdWVzKCkgOiB7fTtcbiAgfVxuICBnZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55IHtcbiAgICByZXR1cm4gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCkgOiB7fTtcbiAgfVxuICAvL0lQYW5lbFxuICBhZGRFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7fVxuICByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImxlZnRcIjtcbiAgfVxuICBnZXRRdWVzdGlvblN0YXJ0SW5kZXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFydEluZGV4KCk7XG4gIH1cbiAgZ2V0Q2hpbGRyZW5MYXlvdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicm93XCI7XG4gIH1cbiAgZWxlbWVudFdpZHRoQ2hhbmdlZChlbDogSUVsZW1lbnQpIHt9XG4gIGdldCBlbGVtZW50cygpOiBBcnJheTxJRWxlbWVudD4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpbmRleE9mKGVsOiBJRWxlbWVudCk6IG51bWJlciB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkN1c3RvbU1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DdXN0b21Nb2RlbEJhc2Uge1xuICBwcml2YXRlIHF1ZXN0aW9uV3JhcHBlcjogUXVlc3Rpb247XG4gIHB1YmxpYyBnZXRUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImN1c3RvbVwiO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVXcmFwcGVyKCkge1xuICAgIHRoaXMucXVlc3Rpb25XcmFwcGVyID0gdGhpcy5jcmVhdGVRdWVzdGlvbigpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRFbGVtZW50KCk6IFN1cnZleUVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRRdWVzdGlvbjtcbiAgfVxuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUsIHJlYzogYW55ID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jb250ZW50UXVlc3Rpb24pIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcmVzID0gdGhpcy5jb250ZW50UXVlc3Rpb24uaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgcmVjKTtcbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb250ZW50UXVlc3Rpb24uZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKHRoaXMuY29udGVudFF1ZXN0aW9uLmVycm9yc1tpXSk7XG4gICAgfVxuICAgIGlmICghcmVzKSB7XG4gICAgICByZXMgPSBzdXBlci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrLCByZWMpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUVsZW1lbnRDc3MoKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBmb2N1cyhvbkVycm9yOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRRdWVzdGlvbikge1xuICAgICAgdGhpcy5jb250ZW50UXVlc3Rpb24uZm9jdXMob25FcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmZvY3VzKG9uRXJyb3IpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGNvbnRlbnRRdWVzdGlvbigpOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25XcmFwcGVyO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVRdWVzdGlvbigpOiBRdWVzdGlvbiB7XG4gICAgdmFyIGpzb24gPSB0aGlzLmN1c3RvbVF1ZXN0aW9uLmpzb247XG4gICAgdmFyIHJlcyA9IG51bGw7XG4gICAgaWYgKCEhanNvbi5xdWVzdGlvbkpTT04pIHtcbiAgICAgIHZhciBxVHlwZSA9IGpzb24ucXVlc3Rpb25KU09OLnR5cGU7XG4gICAgICBpZiAoIXFUeXBlIHx8ICFTZXJpYWxpemVyLmZpbmRDbGFzcyhxVHlwZSkpXG4gICAgICAgIHRocm93IFwidHlwZSBhdHRyaWJ1dGUgaW4gcXVlc3Rpb25KU09OIGlzIGVtcHR5IG9yIGluY29ycmVjdFwiO1xuICAgICAgcmVzID0gPFF1ZXN0aW9uPlNlcmlhbGl6ZXIuY3JlYXRlQ2xhc3MocVR5cGUpO1xuICAgICAgdGhpcy5pbml0RWxlbWVudChyZXMpO1xuICAgICAgcmVzLmZyb21KU09OKGpzb24ucXVlc3Rpb25KU09OKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhanNvbi5jcmVhdGVRdWVzdGlvbikge1xuICAgICAgICByZXMgPSBqc29uLmNyZWF0ZVF1ZXN0aW9uKCk7XG4gICAgICAgIHRoaXMuaW5pdEVsZW1lbnQocmVzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhcmVzICYmICFyZXMubmFtZSkge1xuICAgICAgcmVzLm5hbWUgPSBcInF1ZXN0aW9uXCI7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICBpZiAoIXRoaXMuY29udGVudFF1ZXN0aW9uKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpICYmICF0aGlzLmNvbnRlbnRRdWVzdGlvbi5pc0VtcHR5KCkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmNvbnRlbnRRdWVzdGlvbi52YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIGlmICghIXRoaXMuY29udGVudFF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLmNvbnRlbnRRdWVzdGlvbi5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNvbnZlcnREYXRhTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb250ZW50UXVlc3Rpb24pIHJldHVybiBzdXBlci5jb252ZXJ0RGF0YU5hbWUobmFtZSk7XG4gICAgdmFyIG5ld05hbWUgPSBuYW1lLnJlcGxhY2UoXG4gICAgICB0aGlzLmNvbnRlbnRRdWVzdGlvbi5nZXRWYWx1ZU5hbWUoKSxcbiAgICAgIHRoaXMuZ2V0VmFsdWVOYW1lKClcbiAgICApO1xuICAgIHJldHVybiBuZXdOYW1lLmluZGV4T2YodGhpcy5nZXRWYWx1ZU5hbWUoKSkgPT0gMFxuICAgICAgPyBuZXdOYW1lXG4gICAgICA6IHN1cGVyLmNvbnZlcnREYXRhTmFtZShuYW1lKTtcbiAgfVxuICBwcm90ZWN0ZWQgY29udmVydERhdGFWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnREYXRhTmFtZShuYW1lKSA9PSBzdXBlci5jb252ZXJ0RGF0YU5hbWUobmFtZSlcbiAgICAgID8gdGhpcy5jb250ZW50UXVlc3Rpb24udmFsdWVcbiAgICAgIDogbmV3VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSwgdXBkYXRlSXNBbnN3ZXJlZDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlLCB1cGRhdGVJc0Fuc3dlcmVkKTtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRRdWVzdGlvbikge1xuICAgICAgdGhpcy5jb250ZW50UXVlc3Rpb24udmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cbiAgb25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLm9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRRdWVzdGlvbikge1xuICAgICAgdGhpcy5jb250ZW50UXVlc3Rpb24ub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaW5pdEVsZW1lbnQoZWw6IFN1cnZleUVsZW1lbnQpIHtcbiAgICBzdXBlci5pbml0RWxlbWVudChlbCk7XG4gICAgaWYgKCEhZWwpIHtcbiAgICAgICg8UXVlc3Rpb24+ZWwpLnBhcmVudCA9IHRoaXM7XG4gICAgICAoPFF1ZXN0aW9uPmVsKS5hZnRlclJlbmRlclF1ZXN0aW9uQ2FsbGJhY2sgPSAoXG4gICAgICAgIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgZWxlbWVudDogYW55XG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKCEhdGhpcy5jdXN0b21RdWVzdGlvbikge1xuICAgICAgICAgIHRoaXMuY3VzdG9tUXVlc3Rpb24ub25BZnRlclJlbmRlckNvbnRlbnRFbGVtZW50KFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICAgICAgZWxlbWVudFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVFbGVtZW50Q3NzQ29yZShjc3NDbGFzc2VzOiBhbnkpIHtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRRdWVzdGlvbikge1xuICAgICAgY3NzQ2xhc3NlcyA9IHRoaXMuY29udGVudFF1ZXN0aW9uLmNzc0NsYXNzZXM7XG4gICAgfVxuICAgIHN1cGVyLnVwZGF0ZUVsZW1lbnRDc3NDb3JlKGNzc0NsYXNzZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkNvbXBvc2l0ZU1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DdXN0b21Nb2RlbEJhc2Uge1xuICBwcml2YXRlIHBhbmVsV3JhcHBlcjogUGFuZWxNb2RlbDtcbiAgcHJvdGVjdGVkIGNyZWF0ZVdyYXBwZXIoKSB7XG4gICAgdGhpcy5wYW5lbFdyYXBwZXIgPSB0aGlzLmNyZWF0ZVBhbmVsKCk7XG4gIH1cbiAgcHVibGljIGdldFRlbXBsYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY29tcG9zaXRlXCI7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENzc1R5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb21wb3NpdGVcIjtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RWxlbWVudCgpOiBTdXJ2ZXlFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZWw7XG4gIH1cbiAgcHVibGljIGdldCBjb250ZW50UGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxXcmFwcGVyO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IHN1cGVyLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnRQYW5lbCkgcmV0dXJuIHJlcztcbiAgICByZXR1cm4gdGhpcy5jb250ZW50UGFuZWwuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgZmFsc2UsIHJlYykgfHwgcmVzO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVFbGVtZW50Q3NzKCkge1xuICAgIHN1cGVyLnVwZGF0ZUVsZW1lbnRDc3MoKTtcbiAgICBpZiAodGhpcy5jb250ZW50UGFuZWwpIHtcbiAgICAgIHRoaXMuY29udGVudFBhbmVsLnVwZGF0ZUVsZW1lbnRDc3MoKTtcbiAgICB9XG4gIH1cbiAgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCkge1xuICAgIHN1cGVyLmNsZWFyVmFsdWVJZkludmlzaWJsZSgpO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmNvbnRlbnRQYW5lbC5xdWVzdGlvbnM7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkgKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHZhciByZXMgPSA8UGFuZWxNb2RlbD5TZXJpYWxpemVyLmNyZWF0ZUNsYXNzKFwicGFuZWxcIik7XG4gICAgcmVzLnNob3dRdWVzdGlvbk51bWJlcnMgPSBcIm9mZlwiO1xuICAgIHZhciBqc29uID0gdGhpcy5jdXN0b21RdWVzdGlvbi5qc29uO1xuICAgIGlmICghIWpzb24uZWxlbWVudHNKU09OKSB7XG4gICAgICByZXMuZnJvbUpTT04oeyBlbGVtZW50czoganNvbi5lbGVtZW50c0pTT04gfSk7XG4gICAgfVxuICAgIGlmICghIWpzb24uY3JlYXRlRWxlbWVudHMpIHtcbiAgICAgIGpzb24uY3JlYXRlRWxlbWVudHMocmVzKTtcbiAgICB9XG4gICAgdGhpcy5pbml0RWxlbWVudChyZXMpO1xuICAgIHJlcy5yZWFkT25seSA9IHRoaXMuaXNSZWFkT25seTtcbiAgICB0aGlzLnNldEFmdGVyUmVuZGVyQ2FsbGJhY2tzKHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgaWYgKCEhdGhpcy5jb250ZW50UGFuZWwpIHtcbiAgICAgIHRoaXMuY29udGVudFBhbmVsLnJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgIH1cbiAgICBzdXBlci5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgaWYgKCEhdGhpcy5jb250ZW50UGFuZWwpIHtcbiAgICAgIHRoaXMuY29udGVudFBhbmVsLnJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgICAgdGhpcy5zZXRJc0NvbnRlbnRFbGVtZW50KHRoaXMuY29udGVudFBhbmVsKTtcbiAgICB9XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRJc0NvbnRlbnRFbGVtZW50KHBhbmVsOiBQYW5lbE1vZGVsKSB7XG4gICAgcGFuZWwuaXNDb250ZW50RWxlbWVudCA9IHRydWU7XG4gICAgdmFyIGVsZW1lbnRzID0gcGFuZWwuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGVsID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICB0aGlzLnNldElzQ29udGVudEVsZW1lbnQoPFBhbmVsTW9kZWw+ZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgKDxRdWVzdGlvbj5lbCkuaXNDb250ZW50RWxlbWVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgodmFsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHZhciByZXMgPSBzdXBlci5zZXRWaXNpYmxlSW5kZXgodmFsKTtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUgJiYgISF0aGlzLmNvbnRlbnRQYW5lbCkge1xuICAgICAgcmVzICs9IHRoaXMuY29udGVudFBhbmVsLnNldFZpc2libGVJbmRleCh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBzdXBlci5ydW5Db25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICBpZiAoISF0aGlzLmNvbnRlbnRQYW5lbCkge1xuICAgICAgdmFyIG9sZENvbXBvc2l0ZSA9IHZhbHVlcy5jb21wb3NpdGU7XG4gICAgICB2YWx1ZXMuY29tcG9zaXRlID0gdGhpcy5jb250ZW50UGFuZWwuZ2V0VmFsdWUoKTtcbiAgICAgIHRoaXMuY29udGVudFBhbmVsLnJ1bkNvbmRpdGlvbih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgICAgZGVsZXRlIHZhbHVlc1tcImNvbXBvc2l0ZVwiXTtcbiAgICAgIGlmICghIW9sZENvbXBvc2l0ZSkge1xuICAgICAgICB2YWx1ZXMuY29tcG9zaXRlID0gb2xkQ29tcG9zaXRlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIHJldHVybiAhIXZhbCA/IHZhbFtuYW1lXSA6IG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGNvbnZlcnREYXRhVmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogYW55IHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KG5ld1ZhbHVlKSkge1xuICAgICAgZGVsZXRlIHZhbFtuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsW25hbWVdID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSwgdXBkYXRlSXNBbnN3ZXJlZDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlLCB1cGRhdGVJc0Fuc3dlcmVkKTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5jb250ZW50UGFuZWwucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gcXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpO1xuICAgICAgcXVlc3Rpb25zW2ldLnZhbHVlID0gISFuZXdWYWx1ZSA/IG5ld1ZhbHVlW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2V0QWZ0ZXJSZW5kZXJDYWxsYmFja3MocGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICBpZiAoIXBhbmVsIHx8ICF0aGlzLmN1c3RvbVF1ZXN0aW9uKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHBhbmVsLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLmFmdGVyUmVuZGVyUXVlc3Rpb25DYWxsYmFjayA9IChcbiAgICAgICAgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBlbGVtZW50OiBhbnlcbiAgICAgICkgPT4ge1xuICAgICAgICB0aGlzLmN1c3RvbVF1ZXN0aW9uLm9uQWZ0ZXJSZW5kZXJDb250ZW50RWxlbWVudChcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fY3VzdG9tLnRzIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhbiBxdWVzdGlvbiB0aGF0IHJlbmRlcnMgZW1wdHkgXCJkaXZcIiB0YWcuIEl0IHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZvciBzb21lIGN1c3RvbSB3aWRnZXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkVtcHR5TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImVtcHR5XCI7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJlbXB0eVwiLFxuICBbXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkVtcHR5TW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9lbXB0eS50cyIsImltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yLCBFdmVudCB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFVwbG9hZGluZ0ZpbGVFcnJvciwgRXhjZWVkU2l6ZUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIGZpbGUgcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRmlsZU1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBwcml2YXRlIGlzVXBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgcXVlc3Rpb24gc3RhdGUgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBxdWVzdGlvbiBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5zdGF0ZSBuZXcgcXVlc3Rpb24gc3RhdGUgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgb25TdGF0ZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFF1ZXN0aW9uRmlsZU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBRdWVzdGlvbkZpbGVNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgcHVibGljIHByZXZpZXdWYWx1ZTogYW55W10gPSBbXTtcbiAgcHVibGljIGN1cnJlbnRTdGF0ZSA9IFwiZW1wdHlcIjtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZmlsZVwiO1xuICB9XG4gIHB1YmxpYyBjbGVhck9uRGVsZXRpbmdDb250YWluZXIoKSB7XG4gICAgdGhpcy5zdXJ2ZXkuY2xlYXJGaWxlcyh0aGlzLCB0aGlzLm5hbWUsIHRoaXMudmFsdWUsIG51bGwsICgpID0+IHt9KTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIHNob3cgdGhlIHByZXZpZXcgZm9yIHRoZSBpbWFnZSBmaWxlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1ByZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQcmV2aWV3XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1ByZXZpZXcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1ByZXZpZXdcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIGFsbG93IHNlbGVjdCBtdWx0aXBsZSBmaWxlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dNdWx0aXBsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dNdWx0aXBsZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd011bHRpcGxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93TXVsdGlwbGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGltYWdlIGhlaWdodC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VIZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VIZWlnaHRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUhlaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB3aWR0aC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQWNjZXB0ZWQgZmlsZSB0eXBlcy4gUGFzc2VkIHRvIHRoZSAnYWNjZXB0JyBhdHRyaWJ1dGUgb2YgdGhlIGZpbGUgaW5wdXQgdGFnLiBTZWUgaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS90YWdzL2F0dF9pbnB1dF9hY2NlcHQuYXNwIGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFjY2VwdGVkVHlwZXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWNjZXB0ZWRUeXBlc1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFjY2VwdGVkVHlwZXModmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhY2NlcHRlZFR5cGVzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBmYWxzZSBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc2VyaWFsaXplIGZpbGUgY29udGVudCBhcyB0ZXh0IGluIHRoZSBzdXJ2ZXkuZGF0YS5cbiAgICogSW4gdGhpcyBjYXNlLCB5b3UgaGF2ZSB0byB3cml0ZSB0aGUgY29kZSBvblVwbG9hZEZpbGVzIGV2ZW50IHRvIHN0b3JlIHRoZSBmaWxlIGNvbnRlbnQuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwub25VcGxvYWRGaWxlc1xuICAgKi9cbiAgcHVibGljIGdldCBzdG9yZURhdGFBc1RleHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0b3JlRGF0YUFzVGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0b3JlRGF0YUFzVGV4dCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdG9yZURhdGFBc1RleHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gd2FpdCB1bnRpbCBmaWxlcyB3aWxsIGJlIHVwbG9hZGVkIHRvIHlvdXIgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIGdldCB3YWl0Rm9yVXBsb2FkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3YWl0Rm9yVXBsb2FkXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdhaXRGb3JVcGxvYWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2FpdEZvclVwbG9hZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBpbWFnZXMgcHJldmlldy5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dJbWFnZXNQcmV2aWV3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd0ltYWdlc1ByZXZpZXdcIik7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0ltYWdlc1ByZXZpZXcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dJbWFnZXNQcmV2aWV3XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldHVwIHRoZSBtYXhpbXVtIGFsbG93ZWQgZmlsZSBzaXplLlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1heFNpemVcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhTaXplKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4U2l6ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXR1cCBjb25maXJtYXRpb24gdG8gcmVtb3ZlIGZpbGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5lZWRDb25maXJtUmVtb3ZlRmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmVlZENvbmZpcm1SZW1vdmVGaWxlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmVlZENvbmZpcm1SZW1vdmVGaWxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5lZWRDb25maXJtUmVtb3ZlRmlsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZlIGZpbGUgY29uZmlybWF0aW9uIG1lc3NhZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29uZmlybVJlbW92ZU1lc3NhZ2UoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcImNvbmZpcm1SZW1vdmVGaWxlXCIpXG4gICAgICBbXCJmb3JtYXRcIl0oZmlsZU5hbWUpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcmVtb3ZlIGFsbCBmaWxlcyBjb25maXJtYXRpb24gbWVzc2FnZS5cbiAgICovXG4gIGdldCBjb25maXJtUmVtb3ZlQWxsTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY29uZmlybVJlbW92ZUFsbEZpbGVzXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbm8gZmlsZSBjaG9zZW4gY2FwdGlvbiBmb3IgbW9kZXJuIHRoZW1lLlxuICAgKi9cbiAgZ2V0IG5vRmlsZUNob3NlbkNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm5vRmlsZUNob3NlblwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNob29zZSBmaWxlcyBidXR0b24gY2FwdGlvbiBmb3IgbW9kZXJuIHRoZW1lLlxuICAgKi9cbiAgZ2V0IGNob29zZUJ1dHRvbkNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob29zZUZpbGVDYXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY2xlYW4gZmlsZXMgYnV0dG9uIGNhcHRpb24uXG4gICAqL1xuICBnZXQgY2xlYW5CdXR0b25DYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjbGVhbkNhcHRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSByZW1vdmUgZmlsZSBidXR0b24gY2FwdGlvbi5cbiAgICovXG4gIGdldCByZW1vdmVGaWxlQ2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVtb3ZlRmlsZUNhcHRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCB0aXRsZSB2YWx1ZS5cbiAgICovXG4gIGdldCBpbnB1dFRpdGxlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNVcGxvYWRpbmcpIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibG9hZGluZ0ZpbGVcIik7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNob29zZUZpbGVcIik7XG4gICAgcmV0dXJuIFwiIFwiO1xuICB9XG4gIC8qKlxuICAgKiBDbGVhciB2YWx1ZSBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKi9cbiAgcHVibGljIGNsZWFyKGRvbmVDYWxsYmFjaz86ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLnN1cnZleS5jbGVhckZpbGVzKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIHRoaXMudmFsdWUsXG4gICAgICBudWxsLFxuICAgICAgKHN0YXR1cywgZGF0YSkgPT4ge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgICAhIWRvbmVDYWxsYmFjayAmJiBkb25lQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSBmaWxlIGl0ZW0gcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVGaWxlKGNvbnRlbnQ6IHsgbmFtZTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnN1cnZleS5jbGVhckZpbGVzKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMubmFtZSxcbiAgICAgIHRoaXMudmFsdWUsXG4gICAgICBjb250ZW50Lm5hbWUsXG4gICAgICAoc3RhdHVzLCBkYXRhKSA9PiB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBvbGRWYWx1ZS5maWx0ZXIoKGYpID0+IGYubmFtZSAhPT0gY29udGVudC5uYW1lKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBMb2FkIG11bHRpcGxlIGZpbGVzIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqIEBwYXJhbSBmaWxlc1xuICAgKi9cbiAgcHVibGljIGxvYWRGaWxlcyhmaWxlczogRmlsZVtdKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgIGlmICghdGhpcy5hbGxGaWxlc09rKGZpbGVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGVDaGFuZ2VkKFwibG9hZGluZ1wiKTtcblxuICAgIHZhciBsb2FkRmlsZXNQcm9jID0gKCkgPT4ge1xuICAgICAgdmFyIGNvbnRlbnQgPSA8QXJyYXk8YW55Pj5bXTtcbiAgICAgIGlmICh0aGlzLnN0b3JlRGF0YUFzVGV4dCkge1xuICAgICAgICBmaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgbGV0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LmNvbmNhdChbXG4gICAgICAgICAgICAgIHsgbmFtZTogZmlsZS5uYW1lLCB0eXBlOiBmaWxlLnR5cGUsIGNvbnRlbnQ6IGZpbGVSZWFkZXIucmVzdWx0IH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMudmFsdWUgPSAodGhpcy52YWx1ZSB8fCBbXSkuY29uY2F0KGNvbnRlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3VydmV5LnVwbG9hZEZpbGVzKHRoaXMsIHRoaXMubmFtZSwgZmlsZXMsIChzdGF0dXMsIGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoc3RhdHVzID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkKFwiZXJyb3JcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gKHRoaXMudmFsdWUgfHwgW10pLmNvbmNhdChcbiAgICAgICAgICAgICAgZGF0YS5tYXAoKHI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiByLmZpbGUubmFtZSxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHIuZmlsZS50eXBlLFxuICAgICAgICAgICAgICAgICAgY29udGVudDogci5jb250ZW50LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAodGhpcy5hbGxvd011bHRpcGxlKSB7XG4gICAgICBsb2FkRmlsZXNQcm9jKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xlYXIobG9hZEZpbGVzUHJvYyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjYW5QcmV2aWV3SW1hZ2UoZmlsZUl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFsbG93SW1hZ2VzUHJldmlldyAmJiAhIWZpbGVJdGVtICYmIHRoaXMuaXNGaWxlSW1hZ2UoZmlsZUl0ZW0pO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnksIHVwZGF0ZUlzQW5zd2VyZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSwgdXBkYXRlSXNBbnN3ZXJlZCk7XG4gICAgdGhpcy5wcmV2aWV3VmFsdWUgPSBbXTtcbiAgICB2YXIgc3RhdGUgPVxuICAgICAgKCFBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSAmJiAhIW5ld1ZhbHVlKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmIG5ld1ZhbHVlLmxlbmd0aCA+IDApXG4gICAgICAgID8gdGhpcy5zaG93UHJldmlld1xuICAgICAgICAgID8gXCJsb2FkaW5nXCJcbiAgICAgICAgICA6IFwibG9hZGVkXCJcbiAgICAgICAgOiBcImVtcHR5XCI7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQoc3RhdGUpO1xuICAgIGlmICghdGhpcy5zaG93UHJldmlldyB8fCAhbmV3VmFsdWUpIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShuZXdWYWx1ZSlcbiAgICAgID8gbmV3VmFsdWVcbiAgICAgIDogISFuZXdWYWx1ZVxuICAgICAgPyBbbmV3VmFsdWVdXG4gICAgICA6IFtdO1xuXG4gICAgaWYgKHRoaXMuc3RvcmVEYXRhQXNUZXh0KSB7XG4gICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSB2YWx1ZS5jb250ZW50IHx8IHZhbHVlO1xuICAgICAgICB0aGlzLnByZXZpZXdWYWx1ZSA9IHRoaXMucHJldmlld1ZhbHVlLmNvbmNhdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoc3RhdGUgPT09IFwibG9hZGluZ1wiKSB0aGlzLnN0YXRlQ2hhbmdlZChcImxvYWRlZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgIHZhciBjb250ZW50ID0gdmFsdWUuY29udGVudCB8fCB2YWx1ZTtcbiAgICAgICAgdGhpcy5zdXJ2ZXkuZG93bmxvYWRGaWxlKHRoaXMubmFtZSwgdmFsdWUsIChzdGF0dXMsIGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoc3RhdHVzID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgdGhpcy5wcmV2aWV3VmFsdWUgPSB0aGlzLnByZXZpZXdWYWx1ZS5jb25jYXQoW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGVudDogZGF0YSxcbiAgICAgICAgICAgICAgICBuYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXZpZXdWYWx1ZS5sZW5ndGggPT09IG5ld1ZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQoXCJsb2FkZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkKFwiZXJyb3JcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhcbiAgICBlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPixcbiAgICBpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzLCBpc09uVmFsdWVDaGFuZ2VkKTtcbiAgICBpZiAodGhpcy5pc1VwbG9hZGluZyAmJiB0aGlzLndhaXRGb3JVcGxvYWQpIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICBuZXcgVXBsb2FkaW5nRmlsZUVycm9yKFxuICAgICAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ1cGxvYWRpbmdGaWxlXCIpLFxuICAgICAgICAgIHRoaXNcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHN0YXRlQ2hhbmdlZChzdGF0ZTogc3RyaW5nKSB7XG4gICAgaWYgKHN0YXRlID09PSBcImxvYWRpbmdcIikge1xuICAgICAgdGhpcy5pc1VwbG9hZGluZyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gXCJsb2FkZWRcIikge1xuICAgICAgdGhpcy5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgdGhpcy5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZWQuZmlyZSh0aGlzLCB7IHN0YXRlOiBzdGF0ZSB9KTtcbiAgfVxuICBwcml2YXRlIGFsbEZpbGVzT2soZmlsZXM6IEZpbGVbXSk6IGJvb2xlYW4ge1xuICAgIHZhciBlcnJvckxlbmd0aCA9IHRoaXMuZXJyb3JzID8gdGhpcy5lcnJvcnMubGVuZ3RoIDogMDtcbiAgICAoZmlsZXMgfHwgW10pLmZvckVhY2goKGZpbGUpID0+IHtcbiAgICAgIGlmICh0aGlzLm1heFNpemUgPiAwICYmIGZpbGUuc2l6ZSA+IHRoaXMubWF4U2l6ZSkge1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBFeGNlZWRTaXplRXJyb3IodGhpcy5tYXhTaXplLCB0aGlzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGVycm9yTGVuZ3RoID09PSB0aGlzLmVycm9ycy5sZW5ndGg7XG4gIH1cbiAgcHJpdmF0ZSBpc0ZpbGVJbWFnZShmaWxlOiB7XG4gICAgY29udGVudDogc3RyaW5nO1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgdHlwZT86IHN0cmluZztcbiAgfSk6IGJvb2xlYW4ge1xuICAgIGlmICghZmlsZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGltYWdlUHJlZml4ID0gXCJkYXRhOmltYWdlXCI7XG4gICAgdmFyIHN1YlN0ciA9IGZpbGUuY29udGVudCAmJiBmaWxlLmNvbnRlbnQuc3Vic3RyKDAsIGltYWdlUHJlZml4Lmxlbmd0aCk7XG4gICAgc3ViU3RyID0gc3ViU3RyICYmIHN1YlN0ci50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciByZXN1bHQgPVxuICAgICAgc3ViU3RyID09PSBpbWFnZVByZWZpeCB8fFxuICAgICAgKCEhZmlsZS50eXBlICYmIGZpbGUudHlwZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJpbWFnZS9cIikgPT09IDApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuO1xuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWUsXG4gICAgfVxuICApIHtcbiAgICB2YXIgcXVlc3Rpb25QbGFpbkRhdGEgPSBzdXBlci5nZXRQbGFpbkRhdGEob3B0aW9ucyk7XG4gICAgaWYgKCEhcXVlc3Rpb25QbGFpbkRhdGEgJiYgIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICBxdWVzdGlvblBsYWluRGF0YS5pc05vZGUgPSBmYWxzZTtcbiAgICAgIHZhciB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpID8gdGhpcy52YWx1ZSA6IFt0aGlzLnZhbHVlXTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmRhdGEgPSB2YWx1ZXMubWFwKChkYXRhVmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogaW5kZXgsXG4gICAgICAgICAgdGl0bGU6IFwiRmlsZVwiLFxuICAgICAgICAgIHZhbHVlOiAoZGF0YVZhbHVlLmNvbnRlbnQgJiYgZGF0YVZhbHVlLmNvbnRlbnQpIHx8IGRhdGFWYWx1ZSxcbiAgICAgICAgICBkaXNwbGF5VmFsdWU6IChkYXRhVmFsdWUubmFtZSAmJiBkYXRhVmFsdWUubmFtZSkgfHwgZGF0YVZhbHVlLFxuICAgICAgICAgIGdldFN0cmluZzogKHZhbDogYW55KSA9PlxuICAgICAgICAgICAgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiA/IEpTT04uc3RyaW5naWZ5KHZhbCkgOiB2YWwsXG4gICAgICAgICAgaXNOb2RlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcXVlc3Rpb25QbGFpbkRhdGE7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImZpbGVcIixcbiAgW1xuICAgIHsgbmFtZTogXCJoYXNDb21tZW50OnN3aXRjaFwiLCBsYXlvdXQ6IFwicm93XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbW1lbnRUZXh0XCIsXG4gICAgICBkZXBlbmRzT246IFwiaGFzQ29tbWVudFwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIG9iai5oYXNDb21tZW50O1xuICAgICAgfSxcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb21tZW50VGV4dFwiLFxuICAgICAgbGF5b3V0OiBcInJvd1wiLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcInNob3dQcmV2aWV3OmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIFwiYWxsb3dNdWx0aXBsZTpib29sZWFuXCIsXG4gICAgeyBuYW1lOiBcImFsbG93SW1hZ2VzUHJldmlldzpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBcImltYWdlSGVpZ2h0XCIsXG4gICAgXCJpbWFnZVdpZHRoXCIsXG4gICAgXCJhY2NlcHRlZFR5cGVzXCIsXG4gICAgeyBuYW1lOiBcInN0b3JlRGF0YUFzVGV4dDpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICB7IG5hbWU6IFwid2FpdEZvclVwbG9hZDpib29sZWFuXCIsIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgXCJtYXhTaXplOm51bWJlclwiLFxuICAgIHsgbmFtZTogXCJkZWZhdWx0VmFsdWVcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiY29ycmVjdEFuc3dlclwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJ2YWxpZGF0b3JzXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcIm5lZWRDb25maXJtUmVtb3ZlRmlsZTpib29sZWFuXCIsIHZpc2libGU6IHRydWUsIGRlZmF1bHQ6IGZhbHNlIH0sXG4gIF0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRmlsZU1vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImZpbGVcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkZpbGVNb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2ZpbGUudHMiLCJpbXBvcnQgeyBRdWVzdGlvbk5vblZhbHVlIH0gZnJvbSBcIi4vcXVlc3Rpb25ub252YWx1ZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGh0bWwgcXVlc3Rpb24uIFVubGlrZSBvdGhlciBxdWVzdGlvbnMgaXQgZG9lc24ndCBoYXZlIHZhbHVlIGFuZCB0aXRsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uSHRtbE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25Ob25WYWx1ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgbG9jSHRtbCA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJodG1sXCIsIHRoaXMpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBsb2NIdG1sLm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24oc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICEhc2VsZi5zdXJ2ZXkgPyBzZWxmLnN1cnZleS5wcm9jZXNzSHRtbChzdHIpIDogc3RyO1xuICAgIH07XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJodG1sXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0NvbXBvc2l0ZVF1ZXN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaHRtbCB0byBkaXNwbGF5IGl0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGh0bWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJodG1sXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaHRtbCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiaHRtbFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NIdG1sKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImh0bWxcIik7XG4gIH1cbiAgcHVibGljIGdldCBwcm9jZXNzZWRIdG1sKCkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnByb2Nlc3NIdG1sKHRoaXMuaHRtbCkgOiB0aGlzLmh0bWw7XG4gIH1cbn1cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwiaHRtbFwiLFxuICBbeyBuYW1lOiBcImh0bWw6aHRtbFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jSHRtbFwiIH1dLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uSHRtbE1vZGVsKFwiXCIpO1xuICB9LFxuICBcIm5vbnZhbHVlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImh0bWxcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25IdG1sTW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9odG1sLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb25Ob25WYWx1ZSB9IGZyb20gXCIuL3F1ZXN0aW9ubm9udmFsdWVcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBpbWFnZSBxdWVzdGlvbi4gVGhpcyBxdWVzdGlvbiBoYXNuJ3QgYW55IGZ1bmN0aW9uYWxpdHkgYW5kIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHN1cnZleS5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uSW1hZ2VNb2RlbCBleHRlbmRzIFF1ZXN0aW9uTm9uVmFsdWUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImltYWdlTGlua1wiLCB0aGlzLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJpbWFnZVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDb21wb3NpdGVRdWVzdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBVUkwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlTGluaygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImltYWdlTGlua1wiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlTGluayh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiaW1hZ2VMaW5rXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0ltYWdlTGluaygpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJpbWFnZUxpbmtcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBoZWlnaHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlSGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlSGVpZ2h0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VIZWlnaHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZUhlaWdodFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2Ugd2lkdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZVdpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBmaXQgbW9kZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW1hZ2VGaXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VGaXRcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUZpdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImltYWdlRml0XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG1vZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbnRlbnRNb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbnRlbnRNb2RlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29udGVudE1vZGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb250ZW50TW9kZVwiLCB2YWwpO1xuICAgIGlmICh2YWwgPT09IFwidmlkZW9cIikge1xuICAgICAgdGhpcy5zaG93TGFiZWwgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcImltYWdlXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwiaW1hZ2VMaW5rXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NJbWFnZUxpbmtcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29udGVudE1vZGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiaW1hZ2VcIixcbiAgICAgIGNob2ljZXM6IFtcImltYWdlXCIsIFwidmlkZW9cIl0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImltYWdlRml0XCIsXG4gICAgICBkZWZhdWx0OiBcImNvbnRhaW5cIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJjb250YWluXCIsIFwiY292ZXJcIiwgXCJmaWxsXCJdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImltYWdlSGVpZ2h0Om51bWJlclwiLCBkZWZhdWx0OiAxNTAsIG1pblZhbHVlOiAwIH0sXG4gICAgeyBuYW1lOiBcImltYWdlV2lkdGg6bnVtYmVyXCIsIGRlZmF1bHQ6IDIwMCwgbWluVmFsdWU6IDAgfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25JbWFnZU1vZGVsKFwiXCIpO1xuICB9LFxuICBcIm5vbnZhbHVlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiaW1hZ2VcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkltYWdlTW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9pbWFnZS50cyIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuZXhwb3J0IGNsYXNzIEltYWdlSXRlbVZhbHVlIGV4dGVuZHMgSXRlbVZhbHVlIGltcGxlbWVudHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICB2YWx1ZTogYW55LFxuICAgIHRleHQ6IHN0cmluZyA9IG51bGwsXG4gICAgcHJvdGVjdGVkIHR5cGVOYW1lID0gXCJpbWFnZWl0ZW12YWx1ZVwiXG4gICkge1xuICAgIHN1cGVyKHZhbHVlLCB0ZXh0LCB0eXBlTmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImltYWdlTGlua1wiLCB0aGlzLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLnR5cGVOYW1lID8gdGhpcy50eXBlTmFtZSA6IFwiaXRlbXZhbHVlXCI7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSBvciB2aWRlbyBsaW5rIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZUxpbmsoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJpbWFnZUxpbmtcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZUxpbmsodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImltYWdlTGlua1wiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NJbWFnZUxpbmsoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiaW1hZ2VMaW5rXCIpO1xuICB9XG4gIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhIXRoaXMubG9jT3duZXIgPyB0aGlzLmxvY093bmVyLmdldExvY2FsZSgpIDogXCJcIjtcbiAgfVxuICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dCkgOiB0ZXh0O1xuICB9XG4gIGdldFByb2Nlc3NlZFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRQcm9jZXNzZWRUZXh0KHRleHQpIDogdGV4dDtcbiAgfVxufVxuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgc2VsZWN0IGltYWdlIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jb2xDb3VudCA9IDA7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJpbWFnZXBpY2tlclwiO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzU2luZ2xlSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJdGVtVmFsdWVUeXBlKCkge1xuICAgIHJldHVybiBcImltYWdlaXRlbXZhbHVlXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0NvbXBvc2l0ZVF1ZXN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBNdWx0aSBzZWxlY3Qgb3B0aW9uLiBJZiBzZXQgdG8gdHJ1ZSwgdGhlbiBhbGxvd3MgdG8gc2VsZWN0IG11bHRpcGxlIGltYWdlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgbXVsdGlTZWxlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm11bHRpU2VsZWN0XCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IG11bHRpU2VsZWN0KG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibXVsdGlTZWxlY3RcIiwgbmV3VmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgaXRlbSBpcyBjaGVja2VkXG4gICAqIEBwYXJhbSBpdGVtIGltYWdlIHBpY2tlciBpdGVtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgaXNJdGVtU2VsZWN0ZWQoaXRlbTogSXRlbVZhbHVlKTogYm9vbGVhbiB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRoaXMubXVsdGlTZWxlY3QpIHJldHVybiBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModmFsLCBpdGVtLnZhbHVlKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoSGVscGVycy5pc1R3b1ZhbHVlRXF1YWxzKHZhbFtpXSwgaXRlbS52YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGNsZWFySW5jb3JyZWN0VmFsdWVzKCkge1xuICAgIGlmICh0aGlzLm11bHRpU2VsZWN0KSB7XG4gICAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICAgIGlmICghdmFsKSByZXR1cm47XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsKSB8fCB2YWwubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdWYWx1ZSA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWxbaV0sIHRydWUpKSB7XG4gICAgICAgICAgbmV3VmFsdWUucHVzaCh2YWxbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09IHZhbC5sZW5ndGgpIHJldHVybjtcbiAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPT0gMCkge1xuICAgICAgICB0aGlzLmNsZWFyVmFsdWUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIuY2xlYXJJbmNvcnJlY3RWYWx1ZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBsYWJlbCB1bmRlciB0aGUgaW1hZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dMYWJlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0xhYmVsXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dMYWJlbChuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dMYWJlbFwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIGlmICghdGhpcy5pc0Rlc2lnbk1vZGUgJiYgdGhpcy5tdWx0aVNlbGVjdCkge1xuICAgICAgdGhpcy5jcmVhdGVOZXdBcnJheShcInJlbmRlcmVkVmFsdWVcIik7XG4gICAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwidmFsdWVcIik7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRWYWx1ZUNvcmUoKSB7XG4gICAgdmFyIHZhbHVlID0gc3VwZXIuZ2V0VmFsdWVDb3JlKCk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubXVsdGlTZWxlY3QpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHByaXZhdGUgY29udmVydFZhbFRvQXJyYXlGb3JNdWx0U2VsZWN0KHZhbDogYW55KTogYW55IHtcbiAgICBpZiAoIXRoaXMubXVsdGlTZWxlY3QpIHJldHVybiB2YWw7XG4gICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbCkgfHwgQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gdmFsO1xuICAgIHJldHVybiBbdmFsXTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVuZGVyZWRWYWx1ZUZyb21EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuY29udmVydFZhbFRvQXJyYXlGb3JNdWx0U2VsZWN0KHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlbmRyZWRWYWx1ZVRvRGF0YUNvcmUodmFsOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnRWYWxUb0FycmF5Rm9yTXVsdFNlbGVjdCh2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgaGVpZ2h0LlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZUhlaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZUhlaWdodFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlSGVpZ2h0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VIZWlnaHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGltYWdlIHdpZHRoLlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZVdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlV2lkdGhcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZVdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgZml0IG1vZGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGltYWdlRml0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlRml0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaW1hZ2VGaXQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpbWFnZUZpdFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBtb2RlLlxuICAgKi9cbiAgcHVibGljIGdldCBjb250ZW50TW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb250ZW50TW9kZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbnRlbnRNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29udGVudE1vZGVcIiwgdmFsKTtcbiAgICBpZiAodmFsID09PSBcInZpZGVvXCIpIHtcbiAgICAgIHRoaXMuc2hvd0xhYmVsID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgZ2V0SXRlbUNsYXNzKGl0ZW06IGFueSkge1xuICAgIHZhciBpdGVtQ2xhc3MgPVxuICAgICAgdGhpcy5jc3NDbGFzc2VzLml0ZW0gK1xuICAgICAgKHRoaXMuY29sQ291bnQgPT09IDBcbiAgICAgICAgPyBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSW5saW5lXG4gICAgICAgIDogXCIgc3YtcS1jb2wtXCIgKyB0aGlzLmNvbENvdW50KTtcbiAgICB2YXIgaXNDaGVja2VkID0gdGhpcy5pc0l0ZW1TZWxlY3RlZChpdGVtKTtcbiAgICB2YXIgaXNEaXNhYmxlZCA9IHRoaXMuaXNSZWFkT25seSB8fCAhaXRlbS5pc0VuYWJsZWQ7XG4gICAgdmFyIGFsbG93SG92ZXIgPSAhaXNDaGVja2VkICYmICFpc0Rpc2FibGVkO1xuICAgIGlmIChpc0NoZWNrZWQgJiYgISF0aGlzLmNzc0NsYXNzZXMuaXRlbUNoZWNrZWQpIHtcbiAgICAgIGl0ZW1DbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtQ2hlY2tlZDtcbiAgICB9XG4gICAgaWYgKGlzRGlzYWJsZWQgJiYgISF0aGlzLmNzc0NsYXNzZXMuaXRlbURpc2FibGVkKSB7XG4gICAgICBpdGVtQ2xhc3MgKz0gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuaXRlbURpc2FibGVkO1xuICAgIH1cbiAgICBpZiAoYWxsb3dIb3ZlciAmJiAhIXRoaXMuY3NzQ2xhc3Nlcy5pdGVtSG92ZXIpIHtcbiAgICAgIGl0ZW1DbGFzcyArPSBcIiBcIiArIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSG92ZXI7XG4gICAgfVxuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbiAgcHJvdGVjdGVkIGNvbnZlcnREZWZhdWx0VmFsdWUodmFsOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJpbWFnZWl0ZW12YWx1ZVwiLFxuICBbXSxcbiAgKHZhbHVlOiBhbnkpID0+IG5ldyBJbWFnZUl0ZW1WYWx1ZSh2YWx1ZSksXG4gIFwiaXRlbXZhbHVlXCJcbik7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KFwiaW1hZ2VpdGVtdmFsdWVcIiwge1xuICBuYW1lOiBcImltYWdlTGlua1wiLFxuICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jSW1hZ2VMaW5rXCIsXG59KTtcblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJpbWFnZXBpY2tlclwiLFxuICBbXG4gICAgeyBuYW1lOiBcImhhc090aGVyXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcIm90aGVyVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJvcHRpb25zQ2FwdGlvblwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJvdGhlckVycm9yVGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29udGVudE1vZGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiaW1hZ2VcIixcbiAgICAgIGNob2ljZXM6IFtcImltYWdlXCIsIFwidmlkZW9cIl0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImltYWdlRml0XCIsXG4gICAgICBkZWZhdWx0OiBcImNvbnRhaW5cIixcbiAgICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJjb250YWluXCIsIFwiY292ZXJcIiwgXCJmaWxsXCJdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImltYWdlSGVpZ2h0Om51bWJlclwiLCBkZWZhdWx0OiAxNTAsIG1pblZhbHVlOiAwIH0sXG4gICAgeyBuYW1lOiBcImltYWdlV2lkdGg6bnVtYmVyXCIsIGRlZmF1bHQ6IDIwMCwgbWluVmFsdWU6IDAgfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsKFwiXCIpO1xuICB9LFxuICBcImNoZWNrYm94YmFzZVwiXG4pO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eShcImltYWdlcGlja2VyXCIsIHtcbiAgbmFtZTogXCJzaG93TGFiZWw6Ym9vbGVhblwiLFxuICBkZWZhdWx0OiBmYWxzZSxcbn0pO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eShcImltYWdlcGlja2VyXCIsIHtcbiAgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIixcbiAgZGVmYXVsdDogMCxcbiAgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDVdLFxufSk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KFwiaW1hZ2VwaWNrZXJcIiwge1xuICBuYW1lOiBcIm11bHRpU2VsZWN0OmJvb2xlYW5cIixcbiAgZGVmYXVsdDogZmFsc2UsXG59KTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoXCJpbWFnZXBpY2tlclwiLCB7XG4gIG5hbWU6IFwiY2hvaWNlczppbWFnZWl0ZW12YWx1ZVtdXCIsXG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJpbWFnZXBpY2tlclwiLCAobmFtZSkgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwobmFtZSk7XG4gIC8vcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2ltYWdlcGlja2VyLnRzIiwiaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25NYXRyaXhCYXNlTW9kZWwgfSBmcm9tIFwiLi9tYXJ0aXhCYXNlXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IsIEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBSZXF1aXJlZEluQWxsUm93c0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcsIElMb2NhbGl6YWJsZU93bmVyIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gXCIuL3F1ZXN0aW9uX2Ryb3Bkb3duXCI7XG5pbXBvcnQgeyBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IHNldHRpbmdzIH0gZnJvbSBcIi4vc2V0dGluZ3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTWF0cml4RGF0YSB7XG4gIG9uTWF0cml4Um93Q2hhbmdlZChyb3c6IE1hdHJpeFJvd01vZGVsKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIE1hdHJpeFJvd01vZGVsIGV4dGVuZHMgQmFzZSB7XG4gIHByaXZhdGUgZGF0YTogSU1hdHJpeERhdGE7XG4gIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICBwdWJsaWMgY2VsbENsaWNrOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIHB1YmxpYyBmdWxsTmFtZTogc3RyaW5nLFxuICAgIGRhdGE6IElNYXRyaXhEYXRhLFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLml0ZW0gPSBpdGVtO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuY2VsbENsaWNrID0gKGNvbHVtbjogYW55KSA9PiB7XG4gICAgICB0aGlzLnZhbHVlID0gY29sdW1uLnZhbHVlO1xuICAgIH07XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInZhbHVlXCIsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRhdGEpIHRoaXMuZGF0YS5vbk1hdHJpeFJvd0NoYW5nZWQodGhpcyk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS52YWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtLnRleHQ7XG4gIH1cbiAgcHVibGljIGdldCBsb2NUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtLmxvY1RleHQ7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIiwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgcm93Q2xhc3NlcygpOiBzdHJpbmcge1xuICAgIHZhciBjc3NDbGFzc2VzID0gKDxhbnk+dGhpcy5kYXRhKS5jc3NDbGFzc2VzO1xuICAgIHZhciByb3dDbGFzcyA9ICEhY3NzQ2xhc3Nlcy5yb3cgPyBjc3NDbGFzc2VzLnJvdyA6IFwiXCI7XG4gICAgdmFyIHJvd0Vycm9yQ2xhc3MgPSAhIWNzc0NsYXNzZXMucm93RXJyb3IgPyBjc3NDbGFzc2VzLnJvd0Vycm9yIDogXCJcIjtcbiAgICB2YXIgaGFzRXJyb3IgPSAhISg8YW55PnRoaXMuZGF0YSkuZ2V0RXJyb3JCeVR5cGUoXCJyZXF1aXJlZGluYWxscm93c2Vycm9yXCIpO1xuXG4gICAgdmFyIGNsYXNzZXMgPSByb3dDbGFzcztcbiAgICBpZiAoISFyb3dFcnJvckNsYXNzICYmIGhhc0Vycm9yICYmIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpKSB7XG4gICAgICBpZiAoISFjbGFzc2VzKSBjbGFzc2VzICs9IFwiIFwiO1xuICAgICAgY2xhc3NlcyArPSByb3dFcnJvckNsYXNzO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NlcztcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNYXRyaXhDZWxsc093bmVyIGV4dGVuZHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBnZXRSb3dzKCk6IEFycmF5PGFueT47XG4gIGdldENvbHVtbnMoKTogQXJyYXk8YW55Pjtcbn1cblxuZXhwb3J0IGNsYXNzIE1hcnRyaXhDZWxscyB7XG4gIHByaXZhdGUgdmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBjZWxsc093bmVyOiBJTWF0cml4Q2VsbHNPd25lcikge31cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykubGVuZ3RoID09IDA7XG4gIH1cbiAgcHVibGljIHNldENlbGxUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSwgdmFsOiBzdHJpbmcpIHtcbiAgICByb3cgPSB0aGlzLmdldENlbGxSb3dDb2x1bW5WYWx1ZShyb3csIHRoaXMucm93cyk7XG4gICAgY29sdW1uID0gdGhpcy5nZXRDZWxsUm93Q29sdW1uVmFsdWUoY29sdW1uLCB0aGlzLmNvbHVtbnMpO1xuICAgIGlmICghcm93IHx8ICFjb2x1bW4pIHJldHVybjtcbiAgICBpZiAodmFsKSB7XG4gICAgICBpZiAoIXRoaXMudmFsdWVzW3Jvd10pIHRoaXMudmFsdWVzW3Jvd10gPSB7fTtcbiAgICAgIGlmICghdGhpcy52YWx1ZXNbcm93XVtjb2x1bW5dKVxuICAgICAgICB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl0gPSB0aGlzLmNyZWF0ZVN0cmluZygpO1xuICAgICAgdGhpcy52YWx1ZXNbcm93XVtjb2x1bW5dLnRleHQgPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlc1tyb3ddICYmIHRoaXMudmFsdWVzW3Jvd11bY29sdW1uXSkge1xuICAgICAgICB2YXIgbG9jID0gdGhpcy52YWx1ZXNbcm93XVtjb2x1bW5dO1xuICAgICAgICBsb2MudGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChsb2MuaXNFbXB0eSkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl07XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMudmFsdWVzW3Jvd10pLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52YWx1ZXNbcm93XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIHNldERlZmF1bHRDZWxsVGV4dChjb2x1bW46IGFueSwgdmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldENlbGxUZXh0KHNldHRpbmdzLm1hdHJpeERlZmF1bHRSb3dOYW1lLCBjb2x1bW4sIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldENlbGxMb2NUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByb3cgPSB0aGlzLmdldENlbGxSb3dDb2x1bW5WYWx1ZShyb3csIHRoaXMucm93cyk7XG4gICAgY29sdW1uID0gdGhpcy5nZXRDZWxsUm93Q29sdW1uVmFsdWUoY29sdW1uLCB0aGlzLmNvbHVtbnMpO1xuICAgIGlmICghcm93IHx8ICFjb2x1bW4pIHJldHVybiBudWxsO1xuICAgIGlmICghdGhpcy52YWx1ZXNbcm93XSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl0pIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnZhbHVlc1tyb3ddW2NvbHVtbl07XG4gIH1cbiAgcHVibGljIGdldERlZmF1bHRDZWxsTG9jVGV4dChjb2x1bW46IGFueSwgdmFsOiBzdHJpbmcpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2VsbExvY1RleHQoc2V0dGluZ3MubWF0cml4RGVmYXVsdFJvd05hbWUsIGNvbHVtbik7XG4gIH1cbiAgcHVibGljIGdldENlbGxEaXNwbGF5TG9jVGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgdmFyIGNlbGxUZXh0ID0gdGhpcy5nZXRDZWxsTG9jVGV4dChyb3csIGNvbHVtbik7XG4gICAgaWYgKGNlbGxUZXh0ICYmICFjZWxsVGV4dC5pc0VtcHR5KSByZXR1cm4gY2VsbFRleHQ7XG4gICAgY2VsbFRleHQgPSB0aGlzLmdldENlbGxMb2NUZXh0KHNldHRpbmdzLm1hdHJpeERlZmF1bHRSb3dOYW1lLCBjb2x1bW4pO1xuICAgIGlmIChjZWxsVGV4dCAmJiAhY2VsbFRleHQuaXNFbXB0eSkgcmV0dXJuIGNlbGxUZXh0O1xuICAgIGlmICh0eXBlb2YgY29sdW1uID09IFwibnVtYmVyXCIpIHtcbiAgICAgIGNvbHVtbiA9XG4gICAgICAgIGNvbHVtbiA+PSAwICYmIGNvbHVtbiA8IHRoaXMuY29sdW1ucy5sZW5ndGhcbiAgICAgICAgICA/IHRoaXMuY29sdW1uc1tjb2x1bW5dXG4gICAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5sb2NUZXh0KSByZXR1cm4gY29sdW1uLmxvY1RleHQ7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldENlbGxUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IHN0cmluZyB7XG4gICAgdmFyIGxvYyA9IHRoaXMuZ2V0Q2VsbExvY1RleHQocm93LCBjb2x1bW4pO1xuICAgIHJldHVybiBsb2MgPyBsb2MuY2FsY3VsYXRlZFRleHQgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXREZWZhdWx0Q2VsbFRleHQoY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmdldENlbGxMb2NUZXh0KHNldHRpbmdzLm1hdHJpeERlZmF1bHRSb3dOYW1lLCBjb2x1bW4pO1xuICAgIHJldHVybiBsb2MgPyBsb2MuY2FsY3VsYXRlZFRleHQgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsRGlzcGxheVRleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgbG9jID0gdGhpcy5nZXRDZWxsRGlzcGxheUxvY1RleHQocm93LCBjb2x1bW4pO1xuICAgIHJldHVybiBsb2MgPyBsb2MuY2FsY3VsYXRlZFRleHQgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgcm93cygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jZWxsc093bmVyID8gdGhpcy5jZWxsc093bmVyLmdldFJvd3MoKSA6IFtdO1xuICB9XG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jZWxsc093bmVyID8gdGhpcy5jZWxsc093bmVyLmdldENvbHVtbnMoKSA6IFtdO1xuICB9XG4gIHByaXZhdGUgZ2V0Q2VsbFJvd0NvbHVtblZhbHVlKHZhbDogYW55LCB2YWx1ZXM6IEFycmF5PGFueT4pOiBhbnkge1xuICAgIGlmICh0eXBlb2YgdmFsID09IFwibnVtYmVyXCIpIHtcbiAgICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+PSB2YWx1ZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhbCA9IHZhbHVlc1t2YWxdLnZhbHVlO1xuICAgIH1cbiAgICBpZiAodmFsLnZhbHVlKSByZXR1cm4gdmFsLnZhbHVlO1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHVibGljIGdldEpzb24oKTogYW55IHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgcmVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBmb3IgKHZhciByb3cgaW4gdGhpcy52YWx1ZXMpIHtcbiAgICAgIHZhciByZXNSb3c6IHsgW2luZGV4OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgICAgdmFyIHJvd1ZhbHVlcyA9IHRoaXMudmFsdWVzW3Jvd107XG4gICAgICBmb3IgKHZhciBjb2wgaW4gcm93VmFsdWVzKSB7XG4gICAgICAgIHJlc1Jvd1tjb2xdID0gcm93VmFsdWVzW2NvbF0uZ2V0SnNvbigpO1xuICAgICAgfVxuICAgICAgcmVzW3Jvd10gPSByZXNSb3c7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNldEpzb24odmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIGZvciAodmFyIHJvdyBpbiB2YWx1ZSkge1xuICAgICAgaWYgKHJvdyA9PSBcInBvc1wiKSBjb250aW51ZTtcbiAgICAgIHZhciByb3dWYWx1ZXMgPSB2YWx1ZVtyb3ddO1xuICAgICAgdGhpcy52YWx1ZXNbcm93XSA9IHt9O1xuICAgICAgZm9yICh2YXIgY29sIGluIHJvd1ZhbHVlcykge1xuICAgICAgICBpZiAoY29sID09IFwicG9zXCIpIGNvbnRpbnVlO1xuICAgICAgICB2YXIgbG9jID0gdGhpcy5jcmVhdGVTdHJpbmcoKTtcbiAgICAgICAgbG9jLnNldEpzb24ocm93VmFsdWVzW2NvbF0pO1xuICAgICAgICB0aGlzLnZhbHVlc1tyb3ddW2NvbF0gPSBsb2M7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVTdHJpbmcoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiBuZXcgTG9jYWxpemFibGVTdHJpbmcodGhpcy5jZWxsc093bmVyLCB0cnVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgc2ltcGxlIG1hdHJpeCBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4TW9kZWxcbiAgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeEJhc2VNb2RlbDxNYXRyaXhSb3dNb2RlbCwgSXRlbVZhbHVlPlxuICBpbXBsZW1lbnRzIElNYXRyaXhEYXRhLCBJTWF0cml4Q2VsbHNPd25lciB7XG4gIHByaXZhdGUgaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICBwcml2YXRlIGNlbGxzVmFsdWU6IE1hcnRyaXhDZWxscztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jZWxsc1ZhbHVlID0gbmV3IE1hcnRyaXhDZWxscyh0aGlzKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNvbHVtbnNcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5vbkNvbHVtbnNDaGFuZ2VkKCk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInJvd3NcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzZWxmLmZpbHRlckl0ZW1zKCkpIHtcbiAgICAgICAgc2VsZi5vblJvd3NDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImhpZGVJZlJvd3NFbXB0eVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLnVwZGF0ZVZpc2liaWxpdHlCYXNlZE9uUm93cygpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4XCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNTaW5nbGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIGlmIHlvdSB3YW50IGEgdXNlciB0byBhbnN3ZXIgYWxsIHJvd3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQWxsUm93UmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzQWxsUm93UmVxdWlyZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNBbGxSb3dSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc0FsbFJvd1JlcXVpcmVkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHJvdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzUm93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzLmxlbmd0aCA+IDA7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHJlbmRlciBpdGVtcyBpbiBhIHNwZWNpZmljIG9yZGVyOiBcInJhbmRvbVwiIG9yIFwiaW5pdGlhbFwiLiBEZWZhdWx0IGlzIFwiaW5pdGlhbFwiLlxuICAgKi9cbiAgcHVibGljIGdldCByb3dzT3JkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicm93c09yZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93c09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbCA9PSB0aGlzLnJvd3NPcmRlcikgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NPcmRlclwiLCB2YWwpO1xuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIGhpZGUgdGhlIHF1ZXN0aW9uIGlmIHRoZXJlIGlzIG5vIHZpc2libGUgcm93cyBpbiB0aGUgbWF0cml4LlxuICAgKi9cbiAgcHVibGljIGdldCBoaWRlSWZSb3dzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhpZGVJZlJvd3NFbXB0eVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBoaWRlSWZSb3dzRW1wdHkodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGlkZUlmUm93c0VtcHR5XCIsIHZhbCk7XG4gIH1cbiAgZ2V0Um93cygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yb3dzO1xuICB9XG4gIGdldENvbHVtbnMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUNvbHVtbnM7XG4gIH1cbiAgcHVibGljIGdldEl0ZW1DbGFzcyhyb3c6IGFueSwgY29sdW1uOiBhbnkpIHtcbiAgICB2YXIgaXNDaGVja2VkID0gcm93LnZhbHVlID09IGNvbHVtbi52YWx1ZTtcbiAgICB2YXIgaXNEaXNhYmxlZCA9IHRoaXMuaXNSZWFkT25seTtcbiAgICB2YXIgYWxsb3dIb3ZlciA9ICFpc0NoZWNrZWQgJiYgIWlzRGlzYWJsZWQ7XG4gICAgdmFyIGNlbGxEaXNhYmxlZENsYXNzID0gdGhpcy5oYXNDZWxsVGV4dFxuICAgICAgPyB0aGlzLmNzc0NsYXNzZXMuY2VsbFRleHREaXNhYmxlZFxuICAgICAgOiB0aGlzLmNzc0NsYXNzZXMuaXRlbURpc2FibGVkO1xuXG4gICAgdmFyIGNlbGxTZWxlY3RlZENsYXNzID0gdGhpcy5oYXNDZWxsVGV4dFxuICAgICAgPyB0aGlzLmNzc0NsYXNzZXMuY2VsbFRleHRTZWxlY3RlZFxuICAgICAgOiB0aGlzLmNzc0NsYXNzZXMuaXRlbUNoZWNrZWQ7XG5cbiAgICB2YXIgaXRlbUhvdmVyQ2xhc3MgPSAhdGhpcy5oYXNDZWxsVGV4dCA/IHRoaXMuY3NzQ2xhc3Nlcy5pdGVtSG92ZXIgOiBcIlwiO1xuXG4gICAgdmFyIGNlbGxDbGFzcyA9IHRoaXMuaGFzQ2VsbFRleHRcbiAgICAgID8gdGhpcy5jc3NDbGFzc2VzLmNlbGxUZXh0XG4gICAgICA6IHRoaXMuY3NzQ2xhc3Nlcy5sYWJlbDtcblxuICAgIGxldCBpdGVtQ2xhc3MgPVxuICAgICAgdGhpcy5oYXNDZWxsVGV4dCAmJiAhIXRoaXMuY3NzQ2xhc3Nlcy5jZWxsXG4gICAgICAgID8gdGhpcy5jc3NDbGFzc2VzLmNlbGwgKyBcIiBcIlxuICAgICAgICA6IFwiXCI7XG4gICAgaXRlbUNsYXNzICs9XG4gICAgICBjZWxsQ2xhc3MgK1xuICAgICAgKGlzQ2hlY2tlZCA/IFwiIFwiICsgY2VsbFNlbGVjdGVkQ2xhc3MgOiBcIlwiKSArXG4gICAgICAoaXNEaXNhYmxlZCA/IFwiIFwiICsgY2VsbERpc2FibGVkQ2xhc3MgOiBcIlwiKSArXG4gICAgICAoYWxsb3dIb3ZlciA/IFwiIFwiICsgaXRlbUhvdmVyQ2xhc3MgOiBcIlwiKTtcbiAgICByZXR1cm4gaXRlbUNsYXNzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFF1aXpRdWVzdGlvbkNvdW50KCkge1xuICAgIHZhciByZXMgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuY29ycmVjdEFuc3dlclt0aGlzLnJvd3NbaV0udmFsdWVdKSkgcmVzKys7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvcnJlY3RBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHZhciByZXMgPSAwO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLnJvd3NbaV0udmFsdWU7XG4gICAgICBpZiAoXG4gICAgICAgICFIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZVtyb3ddKSAmJlxuICAgICAgICBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHModGhpcy5jb3JyZWN0QW5zd2VyW3Jvd10sIHZhbHVlW3Jvd10pXG4gICAgICApXG4gICAgICAgIHJlcysrO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFZpc2libGVSb3dzKCk6IEFycmF5PE1hdHJpeFJvd01vZGVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxNYXRyaXhSb3dNb2RlbD4oKTtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgdmFyIHJvd3MgPSAhIXRoaXMuZmlsdGVyZWRSb3dzID8gdGhpcy5maWx0ZXJlZFJvd3MgOiB0aGlzLnJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gcm93c1tpXTtcbiAgICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eShyb3cudmFsdWUpKSBjb250aW51ZTtcbiAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICB0aGlzLmNyZWF0ZU1hdHJpeFJvdyhcbiAgICAgICAgICByb3csXG4gICAgICAgICAgdGhpcy5pZCArIFwiX1wiICsgcm93LnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzL2csIFwiX1wiKSxcbiAgICAgICAgICB2YWxbcm93LnZhbHVlXVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAwICYmICF0aGlzLmZpbHRlcmVkUm93cykge1xuICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgIHRoaXMuY3JlYXRlTWF0cml4Um93KFxuICAgICAgICAgIG5ldyBJdGVtVmFsdWUobnVsbCksXG4gICAgICAgICAgdGhpcy5uYW1lLnJlcGxhY2UoL1xccy9nLCBcIl9cIiksXG4gICAgICAgICAgdmFsXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgc29ydFZpc2libGVSb3dzKFxuICAgIGFycmF5OiBBcnJheTxNYXRyaXhSb3dNb2RlbD5cbiAgKTogQXJyYXk8TWF0cml4Um93TW9kZWw+IHtcbiAgICB2YXIgb3JkZXIgPSB0aGlzLnJvd3NPcmRlci50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChvcmRlciA9PT0gXCJyYW5kb21cIilcbiAgICAgIHJldHVybiBIZWxwZXJzLnJhbmRvbWl6ZUFycmF5PE1hdHJpeFJvd01vZGVsPihhcnJheSk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB0aGlzLnJvd3MgPSB0aGlzLnNvcnRWaXNpYmxlUm93cyh0aGlzLnJvd3MpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eUJhc2VkT25Sb3dzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHByb2Nlc3NSb3dzT25TZXQobmV3Um93czogQXJyYXk8YW55Pikge1xuICAgIHJldHVybiB0aGlzLnNvcnRWaXNpYmxlUm93cyhuZXdSb3dzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpc2libGUgcm93cyBhcyBtb2RlbCBvYmplY3RzLlxuICAgKiBAc2VlIHJvd3NWaXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVJvd3MoKTogQXJyYXk8TWF0cml4Um93TW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWaXNpYmxlUm93cygpO1xuICB9XG4gIHB1YmxpYyBnZXQgY2VsbHMoKTogTWFydHJpeENlbGxzIHtcbiAgICByZXR1cm4gdGhpcy5jZWxsc1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgY2VsbHModmFsdWU6IE1hcnRyaXhDZWxscykge1xuICAgIHRoaXMuY2VsbHMuc2V0SnNvbih2YWx1ZSAmJiB2YWx1ZS5nZXRKc29uID8gdmFsdWUuZ2V0SnNvbigpIDogbnVsbCk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNDZWxsVGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuY2VsbHMuaXNFbXB0eTtcbiAgfVxuICBwdWJsaWMgc2V0Q2VsbFRleHQocm93OiBhbnksIGNvbHVtbjogYW55LCB2YWw6IHN0cmluZykge1xuICAgIHRoaXMuY2VsbHMuc2V0Q2VsbFRleHQocm93LCBjb2x1bW4sIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldENlbGxUZXh0KHJvdzogYW55LCBjb2x1bW46IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbHMuZ2V0Q2VsbFRleHQocm93LCBjb2x1bW4pO1xuICB9XG4gIHB1YmxpYyBzZXREZWZhdWx0Q2VsbFRleHQoY29sdW1uOiBhbnksIHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5jZWxscy5zZXREZWZhdWx0Q2VsbFRleHQoY29sdW1uLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXREZWZhdWx0Q2VsbFRleHQoY29sdW1uOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNlbGxzLmdldERlZmF1bHRDZWxsVGV4dChjb2x1bW4pO1xuICB9XG4gIHB1YmxpYyBnZXRDZWxsRGlzcGxheVRleHQocm93OiBhbnksIGNvbHVtbjogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jZWxscy5nZXRDZWxsRGlzcGxheVRleHQocm93LCBjb2x1bW4pO1xuICB9XG4gIHByaXZhdGUgZW1wdHlMb2NhbGl6YWJsZVN0cmluZyA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyh0aGlzKTtcbiAgcHVibGljIGdldENlbGxEaXNwbGF5TG9jVGV4dChyb3c6IGFueSwgY29sdW1uOiBhbnkpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgdmFyIGxvYyA9IHRoaXMuY2VsbHMuZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHJvdywgY29sdW1uKTtcbiAgICByZXR1cm4gbG9jID8gbG9jIDogdGhpcy5lbXB0eUxvY2FsaXphYmxlU3RyaW5nO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0aGlzLmhhc1ZhbHVlc0luQWxsUm93cygpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKFxuICAgIGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+LFxuICAgIGlzT25WYWx1ZUNoYW5nZWQ6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMsIGlzT25WYWx1ZUNoYW5nZWQpO1xuICAgIGlmIChcbiAgICAgICghaXNPblZhbHVlQ2hhbmdlZCB8fCB0aGlzLmVycm9ycy5sZW5ndGggPiAwKSAmJlxuICAgICAgdGhpcy5oYXNFcnJvckluUm93cygpXG4gICAgKSB7XG4gICAgICBlcnJvcnMucHVzaChuZXcgUmVxdWlyZWRJbkFsbFJvd3NFcnJvcihudWxsLCB0aGlzKSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJblJvd3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzQWxsUm93UmVxdWlyZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXRoaXMuaGFzVmFsdWVzSW5BbGxSb3dzKCk7XG4gIH1cbiAgcHJpdmF0ZSBoYXNWYWx1ZXNJbkFsbFJvd3MoKTogYm9vbGVhbiB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKCFyb3dzKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShyb3dzW2ldLnZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXNBbnN3ZXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0SXNBbnN3ZXJlZCgpICYmIHRoaXMuaGFzVmFsdWVzSW5BbGxSb3dzKCk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVNYXRyaXhSb3coXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIGZ1bGxOYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuICApOiBNYXRyaXhSb3dNb2RlbCB7XG4gICAgdmFyIHJvdyA9IG5ldyBNYXRyaXhSb3dNb2RlbChpdGVtLCBmdWxsTmFtZSwgdGhpcywgdmFsdWUpO1xuICAgIHRoaXMub25NYXRyaXhSb3dDcmVhdGVkKHJvdyk7XG4gICAgcmV0dXJuIHJvdztcbiAgfVxuICBwcm90ZWN0ZWQgb25NYXRyaXhSb3dDcmVhdGVkKHJvdzogTWF0cml4Um93TW9kZWwpIHt9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlOiBhbnksIHVwZGF0ZUlzQW5zd2VyZWQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgc3VwZXIuc2V0UXVlc3Rpb25WYWx1ZShuZXdWYWx1ZSwgdGhpcy5pc1Jvd0NoYW5naW5nIHx8IHVwZGF0ZUlzQW5zd2VyZWQpO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyB8fCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aCA9PSAwKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHZhbCA9IHt9O1xuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoID09IDApIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbMF0udmFsdWUgPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXTtcbiAgICAgICAgdmFyIHJvd1ZhbCA9IHZhbFtyb3cubmFtZV07XG4gICAgICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eShyb3dWYWwpKSByb3dWYWwgPSBudWxsO1xuICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLnZhbHVlID0gcm93VmFsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUlzQW5zd2VyZWQoKTtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RGlzcGxheVZhbHVlQ29yZShrZXlzQXNUZXh0OiBib29sZWFuLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICB2YXIgcmVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgIHZhciBuZXdLZXkgPSBrZXlzQXNUZXh0XG4gICAgICAgID8gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMucm93cywga2V5KVxuICAgICAgICA6IGtleTtcbiAgICAgIGlmICghbmV3S2V5KSBuZXdLZXkgPSBrZXk7XG4gICAgICB2YXIgbmV3VmFsdWUgPSBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUodGhpcy5jb2x1bW5zLCB2YWx1ZVtrZXldKTtcbiAgICAgIGlmICghbmV3VmFsdWUpIG5ld1ZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgIHJlc1tuZXdLZXldID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldFBsYWluRGF0YShcbiAgICBvcHRpb25zOiB7XG4gICAgICBpbmNsdWRlRW1wdHk/OiBib29sZWFuO1xuICAgICAgY2FsY3VsYXRpb25zPzogQXJyYXk8e1xuICAgICAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH0gPSB7XG4gICAgICBpbmNsdWRlRW1wdHk6IHRydWUsXG4gICAgfVxuICApIHtcbiAgICB2YXIgcXVlc3Rpb25QbGFpbkRhdGEgPSBzdXBlci5nZXRQbGFpbkRhdGEob3B0aW9ucyk7XG4gICAgaWYgKCEhcXVlc3Rpb25QbGFpbkRhdGEpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLmNyZWF0ZVZhbHVlQ29weSgpO1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuaXNOb2RlID0gdHJ1ZTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmRhdGEgPSBPYmplY3Qua2V5cyh2YWx1ZXMgfHwge30pLm1hcCgocm93TmFtZSkgPT4ge1xuICAgICAgICB2YXIgcm93ID0gdGhpcy5yb3dzLmZpbHRlcihcbiAgICAgICAgICAocjogTWF0cml4Um93TW9kZWwpID0+IHIudmFsdWUgPT09IHJvd05hbWVcbiAgICAgICAgKVswXTtcbiAgICAgICAgdmFyIHJvd0RhdGFJdGVtID0gPGFueT57XG4gICAgICAgICAgbmFtZTogcm93TmFtZSxcbiAgICAgICAgICB0aXRsZTogISFyb3cgPyByb3cudGV4dCA6IFwicm93XCIsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlc1tyb3dOYW1lXSxcbiAgICAgICAgICBkaXNwbGF5VmFsdWU6IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZShcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMsXG4gICAgICAgICAgICB2YWx1ZXNbcm93TmFtZV1cbiAgICAgICAgICApLFxuICAgICAgICAgIGdldFN0cmluZzogKHZhbDogYW55KSA9PlxuICAgICAgICAgICAgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiA/IEpTT04uc3RyaW5naWZ5KHZhbCkgOiB2YWwsXG4gICAgICAgICAgaXNOb2RlOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUoXG4gICAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucyxcbiAgICAgICAgICB2YWx1ZXNbcm93TmFtZV1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhaXRlbSkge1xuICAgICAgICAgIChvcHRpb25zLmNhbGN1bGF0aW9ucyB8fCBbXSkuZm9yRWFjaCgoY2FsY3VsYXRpb24pID0+IHtcbiAgICAgICAgICAgIHJvd0RhdGFJdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV0gPVxuICAgICAgICAgICAgICBpdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd0RhdGFJdGVtO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBxdWVzdGlvblBsYWluRGF0YTtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLnJvd3NbaV07XG4gICAgICBpZiAoISFyb3cudmFsdWUpIHtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiB0aGlzLmdldFZhbHVlTmFtZSgpICsgXCIuXCIgKyByb3cudmFsdWUsXG4gICAgICAgICAgdGV4dDogdGhpcy5wcm9jZXNzZWRUaXRsZSArIFwiLlwiICsgcm93LmNhbGN1bGF0ZWRUZXh0LFxuICAgICAgICAgIHF1ZXN0aW9uOiB0aGlzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIGdldENvbmRpdGlvbkpzb24ob3BlcmF0b3I6IHN0cmluZyA9IG51bGwsIHBhdGg6IHN0cmluZyA9IG51bGwpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHN1cGVyLmdldENvbmRpdGlvbkpzb24oKTtcbiAgICB2YXIgcXVlc3Rpb24gPSBuZXcgUXVlc3Rpb25Ecm9wZG93bk1vZGVsKHBhdGgpO1xuICAgIHF1ZXN0aW9uLmNob2ljZXMgPSB0aGlzLmNvbHVtbnM7XG4gICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdChxdWVzdGlvbik7XG4gICAganNvbltcInR5cGVcIl0gPSBxdWVzdGlvbi5nZXRUeXBlKCk7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpIHtcbiAgICBzdXBlci5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICBpZiAodGhpcy5oYXNSb3dzKSB7XG4gICAgICB0aGlzLmNsZWFySW52aXNpYmxlVmFsdWVzSW5Sb3dzKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKHJvd3MubGVuZ3RoID4gMCAmJiB0aGlzLnZpc2libGVDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0SWQgKyBcIl9cIiArIHJvd3NbMF0ubmFtZSArIFwiX1wiICsgMDtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Sb3dzQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHlCYXNlZE9uUm93cygpO1xuICAgIHN1cGVyLm9uUm93c0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZVZpc2liaWxpdHlCYXNlZE9uUm93cygpIHtcbiAgICBpZiAodGhpcy5oaWRlSWZSb3dzRW1wdHkpIHtcbiAgICAgIHRoaXMudmlzaWJsZSA9XG4gICAgICAgIHRoaXMucm93cy5sZW5ndGggPiAwICYmXG4gICAgICAgICghdGhpcy5maWx0ZXJlZFJvd3MgfHwgdGhpcy5maWx0ZXJlZFJvd3MubGVuZ3RoID4gMCk7XG4gICAgfVxuICB9XG4gIC8vSU1hdHJpeERhdGFcbiAgb25NYXRyaXhSb3dDaGFuZ2VkKHJvdzogTWF0cml4Um93TW9kZWwpIHtcbiAgICBpZiAodGhpcy5pc1Jvd0NoYW5naW5nKSByZXR1cm47XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuaGFzUm93cykge1xuICAgICAgdGhpcy5zZXROZXdWYWx1ZShyb3cudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHt9O1xuICAgICAgfVxuICAgICAgbmV3VmFsdWVbcm93Lm5hbWVdID0gcm93LnZhbHVlO1xuICAgICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwibWF0cml4XCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbHVtbnM6aXRlbXZhbHVlW11cIixcbiAgICAgIGJhc2VWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9jb2x1bW5cIik7XG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzOml0ZW12YWx1ZVtdXCIsXG4gICAgICBiYXNlVmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJtYXRyaXhfcm93XCIpO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJjZWxsczpjZWxsc1wiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwiY2VsbHNcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicm93c09yZGVyXCIsXG4gICAgICBkZWZhdWx0OiBcImluaXRpYWxcIixcbiAgICAgIGNob2ljZXM6IFtcImluaXRpYWxcIiwgXCJyYW5kb21cIl0sXG4gICAgfSxcbiAgICBcImlzQWxsUm93UmVxdWlyZWQ6Ym9vbGVhblwiLFxuICAgIFwiaGlkZUlmUm93c0VtcHR5OmJvb2xlYW5cIixcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJtYXRyaXhiYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4XCIsIChuYW1lKSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uTWF0cml4TW9kZWwobmFtZSk7XG4gIHEucm93cyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Um93cztcbiAgcS5jb2x1bW5zID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fbWF0cml4LnRzIiwiaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gIElNYXRyaXhEcm9wZG93bkRhdGEsXG59IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeERyb3Bkb3duUm93TW9kZWwgZXh0ZW5kcyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSB7XG4gIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICBkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLFxuICAgIHZhbHVlOiBhbnlcbiAgKSB7XG4gICAgc3VwZXIoZGF0YSwgdmFsdWUpO1xuICAgIHRoaXMuaXRlbSA9IGl0ZW07XG4gICAgdGhpcy5idWlsZENlbGxzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0udGV4dDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0ubG9jVGV4dDtcbiAgfVxufVxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG1hdHJpeCBkcm9wZG93biBxdWVzdGlvbi4gWW91IG1heSB1c2UgYSBkcm9wZG93biwgY2hlY2tib3gsIHJhZGlvZ3JvdXAsIHRleHQgYW5kIGNvbW1lbnQgcXVlc3Rpb25zIGFzIGEgY2VsbCBlZGl0b3JzLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICBpbXBsZW1lbnRzIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInRvdGFsVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInJvd3NcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IG51bGw7XG4gICAgICBzZWxmLnJlc2V0UmVuZGVyZWRUYWJsZSgpO1xuICAgICAgc2VsZi5maWx0ZXJJdGVtcygpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25cIjtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gc2hvdyBpdCBvbiB0aGUgZmlyc3QgY29sdW1uIGZvciB0aGUgdG90YWwgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCB0b3RhbFRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidG90YWxUZXh0XCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdG90YWxUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0b3RhbFRleHRcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RvdGFsVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0b3RhbFRleHRcIik7XG4gIH1cbiAgcHVibGljIGdldEZvb3RlclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY1RvdGFsVGV4dDtcbiAgfVxuICAvKipcbiAgICogVGhlIGNvbHVtbiB3aWR0aCBmb3IgdGhlIGZpcnN0IGNvbHVtbiwgcm93IHRpdGxlIGNvbHVtbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgcm93VGl0bGVXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dUaXRsZVdpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93VGl0bGVXaWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd1RpdGxlV2lkdGhcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0Um93VGl0bGVXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJvd1RpdGxlV2lkdGg7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgaWYgKCF2YWx1ZXMpIHJldHVybiB2YWx1ZXM7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIHZhciByZXMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3dWYWx1ZSA9IHRoaXMucm93c1tpXS52YWx1ZTtcbiAgICAgIHZhciB2YWwgPSB2YWx1ZXNbcm93VmFsdWVdO1xuICAgICAgaWYgKCF2YWwpIGNvbnRpbnVlO1xuICAgICAgaWYgKGtleXNBc1RleHQpIHtcbiAgICAgICAgdmFyIGRpc3BsYXlSb3dWYWx1ZSA9IEl0ZW1WYWx1ZS5nZXRUZXh0T3JIdG1sQnlWYWx1ZShcbiAgICAgICAgICB0aGlzLnJvd3MsXG4gICAgICAgICAgcm93VmFsdWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhZGlzcGxheVJvd1ZhbHVlKSB7XG4gICAgICAgICAgcm93VmFsdWUgPSBkaXNwbGF5Um93VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICg8YW55PnJlcylbcm93VmFsdWVdID0gdGhpcy5nZXRSb3dEaXNwbGF5VmFsdWUocm93c1tpXSwgdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgdmFyIGhhc0NvbnRleHQgPSAhIWNvbnRleHQgPyB0aGlzLmNvbHVtbnMuaW5kZXhPZihjb250ZXh0KSA+IC0xIDogZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLnJvd3NbaV07XG4gICAgICBpZiAoIXJvdy52YWx1ZSkgY29udGludWU7XG4gICAgICB2YXIgcHJlZml4TmFtZSA9IHRoaXMuZ2V0VmFsdWVOYW1lKCkgKyBcIi5cIiArIHJvdy52YWx1ZSArIFwiLlwiO1xuICAgICAgdmFyIHByZWZpeFRpdGxlID0gdGhpcy5wcm9jZXNzZWRUaXRsZSArIFwiLlwiICsgcm93LmNhbGN1bGF0ZWRUZXh0ICsgXCIuXCI7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgY29sdW1uID0gdGhpcy5jb2x1bW5zW2pdO1xuICAgICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICAgIG5hbWU6IHByZWZpeE5hbWUgKyBjb2x1bW4ubmFtZSxcbiAgICAgICAgICB0ZXh0OiBwcmVmaXhUaXRsZSArIGNvbHVtbi5mdWxsVGl0bGUsXG4gICAgICAgICAgcXVlc3Rpb246IHRoaXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgICAgaWYgKGNvbHVtbiA9PSBjb250ZXh0KSBjb250aW51ZTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcInJvdy5cIiArIGNvbHVtbi5uYW1lLFxuICAgICAgICAgIHRleHQ6IFwicm93LlwiICsgY29sdW1uLmZ1bGxUaXRsZSxcbiAgICAgICAgICBxdWVzdGlvbjogdGhpcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgcmV0dXJuO1xuICAgIHZhciBuZXdWYWwgPSBudWxsO1xuICAgIHZhciBpc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgcm93cyA9ICEhdGhpcy5maWx0ZXJlZFJvd3MgPyB0aGlzLmZpbHRlcmVkUm93cyA6IHRoaXMucm93cztcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICBpZiAoSXRlbVZhbHVlLmdldEl0ZW1CeVZhbHVlKHJvd3MsIGtleSkpIHtcbiAgICAgICAgaWYgKG5ld1ZhbCA9PSBudWxsKSBuZXdWYWwgPSB7fTtcbiAgICAgICAgKDxhbnk+bmV3VmFsKVtrZXldID0gdmFsW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsO1xuICAgIH1cbiAgICBzdXBlci5jbGVhckluY29ycmVjdFZhbHVlcygpO1xuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgc3VwZXIuY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgdGhpcy5jbGVhckludmlzaWJsZVZhbHVlc0luUm93cygpO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbD4ge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbD4oKTtcbiAgICB2YXIgcm93cyA9ICEhdGhpcy5maWx0ZXJlZFJvd3MgPyB0aGlzLmZpbHRlcmVkUm93cyA6IHRoaXMucm93cztcbiAgICBpZiAoIXJvd3MgfHwgcm93cy5sZW5ndGggPT09IDApIHJldHVybiByZXN1bHQ7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwpIHZhbCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFyb3dzW2ldLnZhbHVlKSBjb250aW51ZTtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlTWF0cml4Um93KHJvd3NbaV0sIHZhbFtyb3dzW2ldLnZhbHVlXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVNYXRyaXhSb3coXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogTWF0cml4RHJvcGRvd25Sb3dNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXhEcm9wZG93blJvd01vZGVsKGl0ZW0udmFsdWUsIGl0ZW0sIHRoaXMsIHZhbHVlKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm1hdHJpeGRyb3Bkb3duXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcInJvd3M6aXRlbXZhbHVlW11cIixcbiAgICB9LFxuICAgIFwicm93c1Zpc2libGVJZjpjb25kaXRpb25cIixcbiAgICBcInJvd1RpdGxlV2lkdGhcIixcbiAgICB7IG5hbWU6IFwidG90YWxUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUb3RhbFRleHRcIiB9LFxuICBdLFxuICBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwibWF0cml4ZHJvcGRvd25iYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4ZHJvcGRvd25cIiwgKG5hbWUpID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIHEucm93cyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q29sdW1zO1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLmFkZERlZmF1bHRDb2x1bW5zKHEpO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duLnRzIiwiaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gIElNYXRyaXhEcm9wZG93bkRhdGEsXG4gIE1hdHJpeERyb3Bkb3duQ29sdW1uLFxufSBmcm9tIFwiLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgTWluUm93Q291bnRFcnJvciwgS2V5RHVwbGljYXRpb25FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBJQ29uZGl0aW9uT2JqZWN0IH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5pbXBvcnQgeyBjb25maXJtQWN0aW9uIH0gZnJvbSBcIi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeER5bmFtaWNSb3dNb2RlbCBleHRlbmRzIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIGluZGV4OiBudW1iZXIsIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGEsIHZhbHVlOiBhbnkpIHtcbiAgICBzdXBlcihkYXRhLCB2YWx1ZSk7XG4gICAgdGhpcy5idWlsZENlbGxzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJvd05hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG1hdHJpeCBkeW1hbmljIHF1ZXN0aW9uLiBZb3UgbWF5IHVzZSBhIGRyb3Bkb3duLCBjaGVja2JveCwgcmFkaW9ncm91cCwgdGV4dCBhbmQgY29tbWVudCBxdWVzdGlvbnMgYXMgYSBjZWxsIGVkaXRvcnMuXG4gKiBBbiBlbmQtdXNlciBtYXkgZHluYW1pY2FsbHkgYWRkL3JlbW92ZSByb3dzLCB1bmxpa2UgaW4gbWF0cml4IGRyb3Bkb3duIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlXG4gIGltcGxlbWVudHMgSU1hdHJpeERyb3Bkb3duRGF0YSB7XG4gIHByaXZhdGUgcm93Q291bnRlciA9IDA7XG4gIHByaXZhdGUgaW5pdGlhbFJvd0NvdW50OiBudW1iZXIgPSAyO1xuICBwcml2YXRlIHNldFJvd0NvdW50VmFsdWVGcm9tRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2b2lkICg8TG9jYWxpemFibGVTdHJpbmc+KFxuICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbmZpcm1EZWxldGVUZXh0XCIsIHRoaXMpXG4gICAgKSk7XG4gICAgdm9pZCAoPExvY2FsaXphYmxlU3RyaW5nPihcbiAgICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHRoaXMpXG4gICAgKSk7XG4gICAgdm9pZCAoPExvY2FsaXphYmxlU3RyaW5nPnRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJhZGRSb3dUZXh0XCIsIHRoaXMpKTtcbiAgICB2b2lkICg8TG9jYWxpemFibGVTdHJpbmc+KFxuICAgICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInJlbW92ZVJvd1RleHRcIiwgdGhpcylcbiAgICApKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm1hdHJpeGR5bmFtaWNcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUm93c0R5bmFtaWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBzaG93IGEgY29uZmlybWF0aW9uIGRpYWxvZyBvbiByZW1vdmluZyBhIHJvd1xuICAgKiBAc2VlIENvbmZpcm1EZWxldGVUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbmZpcm1EZWxldGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbmZpcm1EZWxldGVcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29uZmlybURlbGV0ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBhIGNvbHVtbiBuYW1lIGFuZCB0aGUgbGlicmFyeSBzaG93cyBkdXBsaWNhdGlvbiBlcnJvciwgaWYgdGhlcmUgYXJlIHNhbWUgdmFsdWVzIGluIGRpZmZlcmVudCByb3dzIGluIHRoZSBjb2x1bW4uXG4gICAqIEBzZWUga2V5RHVwbGljYXRpb25FcnJvclxuICAgKi9cbiAgcHVibGljIGdldCBrZXlOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImtleU5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBrZXlOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwia2V5TmFtZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBJZiBpdCBpcyBub3QgZW1wdHksIHRoZW4gdGhpcyB2YWx1ZSBpcyBzZXQgdG8gZXZlcnkgbmV3IHJvdywgaW5jbHVkaW5nIHJvd3MgY3JlYXRlZCBpbml0aWFsbHksIHVubGVzcyB0aGUgZGVmYXVsdFZhbHVlIGlzIG5vdCBlbXB0eVxuICAgKiBAc2VlIGRlZmF1bHRWYWx1ZVxuICAgKiBAc2VlIGRlZmF1bHRWYWx1ZUZyb21MYXN0Um93XG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRSb3dWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0Um93VmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0Um93VmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0Um93VmFsdWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUgdG8gY29weSB0aGUgdmFsdWUgaW50byBuZXcgYWRkZWQgcm93IGZyb20gdGhlIGxhc3Qgcm93LiBJZiBkZWZhdWx0Um93VmFsdWUgaXMgc2V0IGFuZCB0aGlzIHByb3BlcnR5IGVxdWFscyB0byB0cnVlLFxuICAgKiB0aGVuIHRoZSB2YWx1ZSBmb3IgbmV3IGFkZGVkIHJvdyBpcyBtZXJnaW5nLlxuICAgKiBAc2VlIGRlZmF1bHRWYWx1ZVxuICAgKiBAc2VlIGRlZmF1bHRSb3dWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWVGcm9tTGFzdFJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3dcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3codmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3dcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgaXNEZWZhdWx0VmFsdWVFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgc3VwZXIuaXNEZWZhdWx0VmFsdWVFbXB0eSgpICYmIHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFJvd1ZhbHVlKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRSb3dWYWx1ZSkgfHxcbiAgICAgICF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRWYWx1ZSlcbiAgICApIHtcbiAgICAgIHN1cGVyLnNldERlZmF1bHRWYWx1ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpIHx8IHRoaXMucm93Q291bnQgPT0gMCkgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZSA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3dDb3VudDsgaSsrKSB7XG4gICAgICBuZXdWYWx1ZS5wdXNoKHRoaXMuZGVmYXVsdFJvd1ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIG1hdHJpeC5cbiAgICogQHNlZSBtaW5Sb3dDb3VudFxuICAgKiBAc2VlIG1heFJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucm93Q291bnRWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGdldCByb3dDb3VudFZhbHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJvd0NvdW50XCIsIDIpO1xuICB9XG4gIHByaXZhdGUgc2V0IHJvd0NvdW50VmFsdWUodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dDb3VudFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMCB8fCB2YWwgPiBzZXR0aW5ncy5tYXRyaXhNYXhpbXVtUm93Q291bnQpIHJldHVybjtcbiAgICB0aGlzLnNldFJvd0NvdW50VmFsdWVGcm9tRGF0YSA9IGZhbHNlO1xuICAgIHZhciBwcmV2VmFsdWUgPSB0aGlzLnJvd0NvdW50VmFsdWU7XG4gICAgdGhpcy5yb3dDb3VudFZhbHVlID0gdmFsO1xuICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUubGVuZ3RoID4gdmFsKSB7XG4gICAgICB2YXIgcVZhbCA9IHRoaXMudmFsdWU7XG4gICAgICBxVmFsLnNwbGljZSh2YWwpO1xuICAgICAgdGhpcy52YWx1ZSA9IHFWYWw7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmluaXRpYWxSb3dDb3VudCA9IHZhbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3Muc3BsaWNlKHZhbCk7XG4gICAgICBmb3IgKHZhciBpID0gcHJldlZhbHVlOyBpIDwgdmFsOyBpKyspIHtcbiAgICAgICAgdmFyIG5ld1JvdyA9IHRoaXMuY3JlYXRlTWF0cml4Um93KG51bGwpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLnB1c2gobmV3Um93KTtcbiAgICAgICAgdGhpcy5vbk1hdHJpeFJvd0NyZWF0ZWQobmV3Um93KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHJvdyBjb3VudC4gQSB1c2VyIGNvdWxkIG5vdCBkZWxldGUgYSByb3cgaWYgdGhlIHJvd0NvdW50IGVxdWFscyB0byBtaW5Sb3dDb3VudFxuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqIEBzZWUgbWF4Um93Q291bnRcbiAgICogQHNlZSBhbGxvd0FkZFJvd3NcbiAgICovXG4gIHB1YmxpYyBnZXQgbWluUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWluUm93Q291bnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtaW5Sb3dDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAwKSB2YWwgPSAwO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pblJvd0NvdW50XCIsIHZhbCk7XG4gICAgaWYgKHZhbCA+IHRoaXMubWF4Um93Q291bnQpIHRoaXMubWF4Um93Q291bnQgPSB2YWw7XG4gICAgaWYgKHRoaXMucm93Q291bnQgPCB2YWwpIHRoaXMucm93Q291bnQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHJvdyBjb3VudC4gQSB1c2VyIGNvdWxkIG5vdCBhZGQgYSByb3cgaWYgdGhlIHJvd0NvdW50IGVxdWFscyB0byBtYXhSb3dDb3VudFxuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqIEBzZWUgbWluUm93Q291bnRcbiAgICogQHNlZSBhbGxvd0FkZFJvd3NcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4Um93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibWF4Um93Q291bnRcIiwgc2V0dGluZ3MubWF0cml4TWF4aW11bVJvd0NvdW50KTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFJvd0NvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8PSAwKSByZXR1cm47XG4gICAgaWYgKHZhbCA+IHNldHRpbmdzLm1hdHJpeE1heGltdW1Sb3dDb3VudClcbiAgICAgIHZhbCA9IHNldHRpbmdzLm1hdHJpeE1heGltdW1Sb3dDb3VudDtcbiAgICBpZiAodmFsID09IHRoaXMubWF4Um93Q291bnQpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhSb3dDb3VudFwiLCB2YWwpO1xuICAgIGlmICh2YWwgPCB0aGlzLm1pblJvd0NvdW50KSB0aGlzLm1pblJvd0NvdW50ID0gdmFsO1xuICAgIGlmICh0aGlzLnJvd0NvdW50ID4gdmFsKSB0aGlzLnJvd0NvdW50ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBkaXNhYmxlIGFiaWxpdHkgdG8gYWRkIG5ldyByb3dzLiBcIkFkZCBuZXcgUm93XCIgYnV0dG9uIGJlY29tZXMgaW52c2libGUgaW4gVUlcbiAgICogQHNlZSBjYW5BZGRSb3dcbiAgICogQHNlZSBhbGxvd1JlbW92ZVJvd3NcbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dBZGRSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd0FkZFJvd3NcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0FkZFJvd3ModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dBZGRSb3dzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGRpc2FibGUgYWJpbGl0eSB0byByZW1vdmUgcm93cy4gXCJSZW1vdmVcIiByb3cgYnV0dG9ucyBiZWNvbWUgaW52c2libGUgaW4gVUlcbiAgICogQHNlZSBjYW5SZW1vdmVSb3dzXG4gICAqIEBzZWUgYWxsb3dBZGRSb3dzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93UmVtb3ZlUm93cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dSZW1vdmVSb3dzXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dSZW1vdmVSb3dzKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93UmVtb3ZlUm93c1wiLCB2YWwpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikge1xuICAgICAgdGhpcy5yZXNldFJlbmRlcmVkVGFibGUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgYSBuZXcgcm93IGNhbiBiZSBhZGRlZC5cbiAgICogQHNlZSBhbGxvd0FkZFJvd3NcbiAgICogQHNlZSBtYXhSb3dDb3VudFxuICAgKiBAc2VlIGNhblJlbW92ZVJvd3NcbiAgICogQHNlZSByb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBjYW5BZGRSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWxsb3dBZGRSb3dzICYmICF0aGlzLmlzUmVhZE9ubHkgJiYgdGhpcy5yb3dDb3VudCA8IHRoaXMubWF4Um93Q291bnRcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIHJvdyBjYW4gYmUgcmVtb3ZlZC5cbiAgICogQHNlZSBtaW5Sb3dDb3VudFxuICAgKiBAc2VlIGNhbkFkZFJvd1xuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhblJlbW92ZVJvd3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWxsb3dSZW1vdmVSb3dzICYmXG4gICAgICAhdGhpcy5pc1JlYWRPbmx5ICYmXG4gICAgICB0aGlzLnJvd0NvdW50ID4gdGhpcy5taW5Sb3dDb3VudFxuICAgICk7XG4gIH1cbiAgcHVibGljIGNhblJlbW92ZVJvdyhyb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5Lm1hdHJpeEFsbG93UmVtb3ZlUm93KFxuICAgICAgdGhpcyxcbiAgICAgICg8TWF0cml4RHluYW1pY1Jvd01vZGVsPnJvdykuaW5kZXgsXG4gICAgICByb3dcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGFkZCBhIG5ldyByb3cuXG4gICAqL1xuICBwdWJsaWMgYWRkUm93KCkge1xuICAgIHZhciBvcHRpb25zID0geyBxdWVzdGlvbjogdGhpcywgY2FuQWRkUm93OiB0aGlzLmNhbkFkZFJvdyB9O1xuICAgIGlmICghIXRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS5tYXRyaXhCZWZvcmVSb3dBZGRlZChvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmNhbkFkZFJvdykgcmV0dXJuO1xuICAgIHRoaXMub25TdGFydFJvd0FkZGluZ1JlbW92aW5nKCk7XG4gICAgdGhpcy5hZGRSb3dDb3JlKCk7XG4gICAgdGhpcy5vbkVuZFJvd0FkZGluZygpO1xuICB9XG4gIHByb3RlY3RlZCBoYXNSb3dzQXNJdGVtcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBhZGRSb3dDb3JlKCkge1xuICAgIHZhciBwcmV2Um93Q291bnQgPSB0aGlzLnJvd0NvdW50O1xuICAgIHRoaXMucm93Q291bnQgPSB0aGlzLnJvd0NvdW50ICsgMTtcbiAgICB2YXIgZGVmYXVsdFZhbHVlID0gdGhpcy5nZXREZWZhdWx0Um93VmFsdWUodHJ1ZSk7XG4gICAgdmFyIG5ld1ZhbHVlID0gbnVsbDtcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSgpO1xuICAgICAgaWYgKG5ld1ZhbHVlLmxlbmd0aCA9PSB0aGlzLnJvd0NvdW50KSB7XG4gICAgICAgIG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDFdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24oXG4gICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCksXG4gICAgICAgIHRoaXMuZ2V0RGF0YUZpbHRlcmVkUHJvcGVydGllcygpXG4gICAgICApO1xuICAgICAgdmFyIHJvdyA9IHRoaXMudmlzaWJsZVJvd3NbdGhpcy5yb3dDb3VudCAtIDFdO1xuICAgICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eShyb3cudmFsdWUpKSB7XG4gICAgICAgIGlmICghbmV3VmFsdWUpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgIUhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyhuZXdWYWx1ZVtuZXdWYWx1ZS5sZW5ndGggLSAxXSwgcm93LnZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICBuZXdWYWx1ZVtuZXdWYWx1ZS5sZW5ndGggLSAxXSA9IHJvdy52YWx1ZTtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICBpZiAocHJldlJvd0NvdW50ICsgMSA9PSB0aGlzLnJvd0NvdW50KSB7XG4gICAgICAgIHRoaXMuc3VydmV5Lm1hdHJpeFJvd0FkZGVkKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdGhpcy52aXNpYmxlUm93c1t0aGlzLnZpc2libGVSb3dzLmxlbmd0aCAtIDFdXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldERlZmF1bHRSb3dWYWx1ZShpc1Jvd0FkZGVkOiBib29sZWFuKTogYW55IHtcbiAgICB2YXIgcmVzID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSB0aGlzLmNvbHVtbnNbaV0udGVtcGxhdGVRdWVzdGlvbjtcbiAgICAgIGlmICghIXEgJiYgIXRoaXMuaXNWYWx1ZUVtcHR5KHEuZ2V0RGVmYXVsdFZhbHVlKCkpKSB7XG4gICAgICAgIHJlcyA9IHJlcyB8fCB7fTtcbiAgICAgICAgKDxhbnk+cmVzKVt0aGlzLmNvbHVtbnNbaV0ubmFtZV0gPSBxLmdldERlZmF1bHRWYWx1ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFJvd1ZhbHVlKSkge1xuICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuZGVmYXVsdFJvd1ZhbHVlKSB7XG4gICAgICAgIHJlcyA9IHJlcyB8fCB7fTtcbiAgICAgICAgKDxhbnk+cmVzKVtrZXldID0gdGhpcy5kZWZhdWx0Um93VmFsdWVba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUm93QWRkZWQgJiYgdGhpcy5kZWZhdWx0VmFsdWVGcm9tTGFzdFJvdykge1xuICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICBpZiAoISF2YWwgJiYgQXJyYXkuaXNBcnJheSh2YWwpICYmIHZhbC5sZW5ndGggPj0gdGhpcy5yb3dDb3VudCAtIDEpIHtcbiAgICAgICAgdmFyIHJvd1ZhbHVlID0gdmFsW3RoaXMucm93Q291bnQgLSAyXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHJvd1ZhbHVlKSB7XG4gICAgICAgICAgcmVzID0gcmVzIHx8IHt9O1xuICAgICAgICAgICg8YW55PnJlcylba2V5XSA9IHJvd1ZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlcyBhIHJvdyBieSBpdCdzIGluZGV4LiBJZiBjb25maXJtRGVsZXRlIGlzIHRydWUsIHNob3cgYSBjb25maXJtYXRpb24gZGlhbG9nXG4gICAqIEBwYXJhbSBpbmRleCBhIHJvdyBpbmRleCwgZnJvbSAwIHRvIHJvd0NvdW50IC0gMVxuICAgKiBAc2VlIHJlbW92ZVJvd1xuICAgKiBAc2VlIGNvbmZpcm1EZWxldGVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVSb3dVSSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKCEhdmFsdWUgJiYgISF2YWx1ZS5yb3dOYW1lKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLnZpc2libGVSb3dzLmluZGV4T2YodmFsdWUpO1xuICAgICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgICAgdmFsdWUgPSBpbmRleDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNSZXF1aXJlQ29uZmlybU9uUm93RGVsZXRlKHZhbHVlKSB8fFxuICAgICAgY29uZmlybUFjdGlvbih0aGlzLmNvbmZpcm1EZWxldGVUZXh0KVxuICAgICkge1xuICAgICAgdGhpcy5yZW1vdmVSb3codmFsdWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgaXNSZXF1aXJlQ29uZmlybU9uUm93RGVsZXRlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29uZmlybURlbGV0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5yb3dDb3VudCkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChpbmRleCA+PSB2YWx1ZS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHZhbHVlW2luZGV4XSk7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSByb3cgYnkgaXQncyBpbmRleC5cbiAgICogQHBhcmFtIGluZGV4IGEgcm93IGluZGV4LCBmcm9tIDAgdG8gcm93Q291bnQgLSAxXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUm93KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVtb3ZlUm93cykgcmV0dXJuO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5yb3dDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMub25TdGFydFJvd0FkZGluZ1JlbW92aW5nKCk7XG4gICAgdGhpcy5yZW1vdmVSb3dDb3JlKGluZGV4KTtcbiAgICB0aGlzLm9uRW5kUm93UmVtb3ZpbmcoaW5kZXgpO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUm93Q29yZShpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1xuICAgICAgICA/IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaW5kZXhdXG4gICAgICAgIDogbnVsbDtcbiAgICAgIHRoaXMuc3VydmV5Lm1hdHJpeFJvd1JlbW92ZWQodGhpcywgaW5kZXgsIHJvdyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzICYmIGluZGV4IDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgdGhpcy5yb3dDb3VudFZhbHVlLS07XG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIHZhciB2YWwgPSBbXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmIGluZGV4IDwgdGhpcy52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFsID0gdGhpcy5jcmVhdGVWYWx1ZUNvcHkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbCA9IHRoaXMuY3JlYXRlTmV3VmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHZhbC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdmFsID0gdGhpcy5kZWxldGVSb3dWYWx1ZSh2YWwsIG51bGwpO1xuICAgICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gICAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0IHNob3dpbmcgaW4gdGhlIGNvbmZpcm1hdGlvbiBkZWxldGUgZGlhbG9nIG9uIHJlbW92aW5nIGEgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCBjb25maXJtRGVsZXRlVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY29uZmlybURlbGV0ZVwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBjb25maXJtRGVsZXRlVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29uZmlybURlbGV0ZVRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jQ29uZmlybURlbGV0ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb25maXJtRGVsZXRlVGV4dFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZHVwbGljYXRpb24gdmFsdWUgZXJyb3IgdGV4dC4gU2V0IGl0IHRvIHNob3cgdGhlIHRleHQgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQuXG4gICAqIEBzZWUga2V5TmFtZVxuICAgKi9cbiAgcHVibGljIGdldCBrZXlEdXBsaWNhdGlvbkVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5RHVwbGljYXRpb25FcnJvcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwia2V5RHVwbGljYXRpb25FcnJvclwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NLZXlEdXBsaWNhdGlvbkVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFkZCByb3cgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFkZFJvd1RleHQoKSB7XG4gICAgdmFyIGRlZmF1bHRMb2NOYW1lID0gdGhpcy5pc0NvbHVtbkxheW91dEhvcml6b250YWwgPyBcImFkZFJvd1wiIDogXCJhZGRDb2x1bW5cIjtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImFkZFJvd1RleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoZGVmYXVsdExvY05hbWUpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFkZFJvd1RleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImFkZFJvd1RleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jQWRkUm93VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImFkZFJvd1RleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlICdBZGQgUm93JyBidXR0b24gaXMgc2hvd24gb24gYm90dG9tIGlmIGNvbHVtbkxheW91dCBpcyBob3Jpem9udGFsIGFuZCBvbiB0b3AgaWYgY29sdW1uTGF5b3V0IGlzIHZlcnRpY2FsLiA8YnIvPlxuICAgKiBZb3UgbWF5IHNldCBpdCB0byBcInRvcFwiLCBcImJvdHRvbVwiIG9yIFwidG9wQm90dG9tXCIgKHRvIHNob3cgb24gdG9wIGFuZCBib3R0b20pLlxuICAgKiBAc2VlIGNvbHVtbkxheW91dFxuICAgKi9cbiAgcHVibGljIGdldCBhZGRSb3dMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhZGRSb3dMb2NhdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFkZFJvd0xvY2F0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWRkUm93TG9jYXRpb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQWRkUm93T25Ub3AoKSB7XG4gICAgaWYgKCF0aGlzLmNhbkFkZFJvdykgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmFkZFJvd0xvY2F0aW9uID09PSBcImRlZmF1bHRcIilcbiAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxheW91dCA9PT0gXCJ2ZXJ0aWNhbFwiO1xuICAgIHJldHVybiB0aGlzLmFkZFJvd0xvY2F0aW9uICE9PSBcImJvdHRvbVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNBZGRSb3dPbkJvdHRvbSgpIHtcbiAgICBpZiAoIXRoaXMuY2FuQWRkUm93KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMuYWRkUm93TG9jYXRpb24gPT09IFwiZGVmYXVsdFwiKVxuICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGF5b3V0ID09PSBcImhvcml6b250YWxcIjtcbiAgICByZXR1cm4gdGhpcy5hZGRSb3dMb2NhdGlvbiAhPT0gXCJ0b3BcIjtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHJlbW92ZSByb3cgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlbW92ZVJvd1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJyZW1vdmVSb3dUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVtb3ZlUm93XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlbW92ZVJvd1RleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInJlbW92ZVJvd1RleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUmVtb3ZlUm93VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInJlbW92ZVJvd1RleHRcIik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgaWYgKCF2YWx1ZXMgfHwgIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgcmV0dXJuIHZhbHVlcztcbiAgICB2YXIgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aCAmJiBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsID0gdmFsdWVzW2ldO1xuICAgICAgaWYgKCF2YWwpIGNvbnRpbnVlO1xuICAgICAgdmFsdWVzW2ldID0gdGhpcy5nZXRSb3dEaXNwbGF5VmFsdWUocm93c1tpXSwgdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgdmFyIGhhc0NvbnRleHQgPSAhIWNvbnRleHQgPyB0aGlzLmNvbHVtbnMuaW5kZXhPZihjb250ZXh0KSA+IC0xIDogZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaV07XG4gICAgICB0aGlzLmFkZENvbHVtbkludG9hZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KG9iamVjdHMsIDAsIGNvbHVtbik7XG4gICAgICBpZiAoaGFzQ29udGV4dCAmJiBjb2x1bW4gIT0gY29udGV4dCkge1xuICAgICAgICB0aGlzLmFkZENvbHVtbkludG9hZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KG9iamVjdHMsIC0xLCBjb2x1bW4pO1xuICAgICAgfVxuICAgICAgZm9yIChcbiAgICAgICAgdmFyIGogPSAxO1xuICAgICAgICBqIDwgTWF0aC5taW4oc2V0dGluZ3MubWF0cml4TWF4Um93Q291bnRJbkNvbmRpdGlvbiwgdGhpcy5yb3dDb3VudCk7XG4gICAgICAgIGorK1xuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWRkQ29sdW1uSW50b2FkZENvbmRpdGlvbk9iamVjdHNCeUNvbnRleHQob2JqZWN0cywgaiwgY29sdW1uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRDb2x1bW5JbnRvYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW5cbiAgKSB7XG4gICAgdmFyIHJvd05hbWUgPSByb3dJbmRleCA+IC0xID8gXCJbXCIgKyByb3dJbmRleC50b1N0cmluZygpICsgXCJdLlwiIDogXCJyb3cuXCI7XG4gICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgIG5hbWU6XG4gICAgICAgIChyb3dJbmRleCA+IC0xID8gdGhpcy5nZXRWYWx1ZU5hbWUoKSArIHJvd05hbWUgOiByb3dOYW1lKSArIGNvbHVtbi5uYW1lLFxuICAgICAgdGV4dDpcbiAgICAgICAgKHJvd0luZGV4ID4gLTEgPyB0aGlzLnByb2Nlc3NlZFRpdGxlICsgcm93TmFtZSA6IHJvd05hbWUpICtcbiAgICAgICAgY29sdW1uLmZ1bGxUaXRsZSxcbiAgICAgIHF1ZXN0aW9uOiB0aGlzLFxuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBoYXNSb3dUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhcbiAgICBlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPixcbiAgICBpc09uVmFsdWVDaGFuZ2VkOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzLCBpc09uVmFsdWVDaGFuZ2VkKTtcbiAgICBpZiAoIWlzT25WYWx1ZUNoYW5nZWQgJiYgdGhpcy5oYXNFcnJvckluUm93cygpKSB7XG4gICAgICBlcnJvcnMucHVzaChuZXcgTWluUm93Q291bnRFcnJvcih0aGlzLm1pblJvd0NvdW50LCB0aGlzKSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgdmFyIHByZXZWYWx1ZSA9IHN1cGVyLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgdmFyIGlzRHVwbGljYXRlZCA9IHRoaXMuaXNWYWx1ZUR1cGxpY2F0ZWQoKTtcbiAgICByZXR1cm4gaXNEdXBsaWNhdGVkIHx8IHByZXZWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9ySW5Sb3dzKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1pblJvd0NvdW50IDw9IDAgfHwgIXRoaXMuaXNSZXF1aXJlZCB8fCAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBzZXRSb3dDb3VudCA9IDA7XG4gICAgZm9yIChcbiAgICAgIHZhciByb3dJbmRleCA9IDA7XG4gICAgICByb3dJbmRleCA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoO1xuICAgICAgcm93SW5kZXgrK1xuICAgICkge1xuICAgICAgdmFyIHJvdyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3Nbcm93SW5kZXhdO1xuICAgICAgaWYgKCFyb3cuaXNFbXB0eSkgc2V0Um93Q291bnQrKztcbiAgICB9XG4gICAgcmV0dXJuIHNldFJvd0NvdW50IDwgdGhpcy5taW5Sb3dDb3VudDtcbiAgfVxuICBwcml2YXRlIGlzVmFsdWVEdXBsaWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5rZXlOYW1lIHx8ICF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKHRoaXMua2V5TmFtZSk7XG4gICAgaWYgKCFjb2x1bW4pIHJldHVybiBmYWxzZTtcbiAgICB2YXIga2V5VmFsdWVzID0gPEFycmF5PGFueT4+W107XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzID1cbiAgICAgICAgdGhpcy5pc1ZhbHVlRHVwbGljYXRlZEluUm93KFxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0sXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIGtleVZhbHVlc1xuICAgICAgICApIHx8IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGlzVmFsdWVEdXBsaWNhdGVkSW5Sb3coXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uLFxuICAgIGtleVZhbHVlczogQXJyYXk8YW55PlxuICApOiBib29sZWFuIHtcbiAgICB2YXIgcXVlc3Rpb24gPSByb3cuZ2V0UXVlc3Rpb25CeUNvbHVtbihjb2x1bW4pO1xuICAgIGlmICghcXVlc3Rpb24gfHwgcXVlc3Rpb24uaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbHVlID0gcXVlc3Rpb24udmFsdWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBrZXlWYWx1ZXNbaV0pIHtcbiAgICAgICAgcXVlc3Rpb24uYWRkRXJyb3IoXG4gICAgICAgICAgbmV3IEtleUR1cGxpY2F0aW9uRXJyb3IodGhpcy5rZXlEdXBsaWNhdGlvbkVycm9yLCB0aGlzKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAga2V5VmFsdWVzLnB1c2godmFsdWUpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVSb3dzKCk6IEFycmF5PE1hdHJpeER5bmFtaWNSb3dNb2RlbD4ge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4RHluYW1pY1Jvd01vZGVsPigpO1xuICAgIGlmICh0aGlzLnJvd0NvdW50ID09PSAwKSByZXR1cm4gcmVzdWx0O1xuICAgIHZhciB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd0NvdW50OyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlTWF0cml4Um93KHRoaXMuZ2V0Um93VmFsdWVCeUluZGV4KHZhbCwgaSkpKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmdldERlZmF1bHRSb3dWYWx1ZShmYWxzZSkpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVNYXRyaXhSb3codmFsdWU6IGFueSk6IE1hdHJpeER5bmFtaWNSb3dNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXhEeW5hbWljUm93TW9kZWwodGhpcy5yb3dDb3VudGVyKyssIHRoaXMsIHZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CZWZvcmVWYWx1ZUNoYW5nZWQodmFsOiBhbnkpIHtcbiAgICBpZiAoIXZhbCB8fCAhQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm47XG4gICAgdmFyIG5ld1Jvd0NvdW50ID0gdmFsLmxlbmd0aDtcbiAgICBpZiAobmV3Um93Q291bnQgPT0gdGhpcy5yb3dDb3VudCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5zZXRSb3dDb3VudFZhbHVlRnJvbURhdGEgJiYgbmV3Um93Q291bnQgPCB0aGlzLmluaXRpYWxSb3dDb3VudClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnNldFJvd0NvdW50VmFsdWVGcm9tRGF0YSA9IHRydWU7XG4gICAgdGhpcy5yb3dDb3VudFZhbHVlID0gbmV3Um93Q291bnQ7XG4gICAgaWYgKHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSBudWxsO1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgICB0aGlzLm9uUm93c0NoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1ZhbHVlKCk6IGFueSB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgaWYgKCFyZXN1bHQgfHwgIUFycmF5LmlzQXJyYXkocmVzdWx0KSkgcmVzdWx0ID0gW107XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPiB0aGlzLnJvd0NvdW50KSByZXN1bHQuc3BsaWNlKHRoaXMucm93Q291bnQpO1xuICAgIHZhciByb3dWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFJvd1ZhbHVlKGZhbHNlKTtcbiAgICByb3dWYWx1ZSA9IHJvd1ZhbHVlIHx8IHt9O1xuICAgIGZvciAodmFyIGkgPSByZXN1bHQubGVuZ3RoOyBpIDwgdGhpcy5yb3dDb3VudDsgaSsrKSB7XG4gICAgICByZXN1bHQucHVzaChIZWxwZXJzLmdldFVuYmluZFZhbHVlKHJvd1ZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGRlbGV0ZVJvd1ZhbHVlKFxuICAgIG5ld1ZhbHVlOiBhbnksXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICApOiBhbnkge1xuICAgIHZhciBpc0VtcHR5ID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5ld1ZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pc09iamVjdChuZXdWYWx1ZVtpXSkgJiYgT2JqZWN0LmtleXMobmV3VmFsdWVbaV0pLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaXNFbXB0eSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzRW1wdHkgPyBudWxsIDogbmV3VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGdldFJvd1ZhbHVlQnlJbmRleChxdWVzdGlvblZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgcXVlc3Rpb25WYWx1ZS5sZW5ndGhcbiAgICAgID8gcXVlc3Rpb25WYWx1ZVtpbmRleF1cbiAgICAgIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Um93VmFsdWVDb3JlKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcXVlc3Rpb25WYWx1ZTogYW55LFxuICAgIGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4ge307XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0Um93VmFsdWVCeUluZGV4KFxuICAgICAgcXVlc3Rpb25WYWx1ZSxcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MuaW5kZXhPZihyb3cpXG4gICAgKTtcbiAgICBpZiAoIXJlcyAmJiBjcmVhdGUpIHJlcyA9IHt9O1xuICAgIHJldHVybiByZXM7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtYXRyaXhkeW5hbWljXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwicm93c1Zpc2libGVJZjpjb25kaXRpb25cIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6IFwiYWxsb3dBZGRSb3dzOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJhbGxvd1JlbW92ZVJvd3M6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcInJvd0NvdW50Om51bWJlclwiLCBkZWZhdWx0OiAyLCBtaW5WYWx1ZTogMCwgaXNCaW5kYWJsZTogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJtaW5Sb3dDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogMCwgbWluVmFsdWU6IDAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1heFJvd0NvdW50Om51bWJlclwiLFxuICAgICAgZGVmYXVsdDogc2V0dGluZ3MubWF0cml4TWF4aW11bVJvd0NvdW50LFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImtleU5hbWVcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0tleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICB9LFxuICAgIFwiZGVmYXVsdFJvd1ZhbHVlOnJvd3ZhbHVlXCIsXG4gICAgXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFJvdzpib29sZWFuXCIsXG4gICAgeyBuYW1lOiBcImNvbmZpcm1EZWxldGU6Ym9vbGVhblwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgICAgZGVwZW5kc09uOiBcImNvbmZpcm1EZWxldGVcIixcbiAgICAgIHZpc2libGVJZjogZnVuY3Rpb24gKG9iajogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhb2JqIHx8IG9iai5jb25maXJtRGVsZXRlO1xuICAgICAgfSxcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NDb25maXJtRGVsZXRlVGV4dFwiLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJhZGRSb3dMb2NhdGlvblwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwidG9wQm90dG9tXCJdLFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImFkZFJvd1RleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0FkZFJvd1RleHRcIiB9LFxuICAgIHsgbmFtZTogXCJyZW1vdmVSb3dUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZW1vdmVSb3dUZXh0XCIgfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwibWF0cml4ZHJvcGRvd25iYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4ZHluYW1pY1wiLCAobmFtZSkgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbChuYW1lKTtcbiAgcS5jaG9pY2VzID0gWzEsIDIsIDMsIDQsIDVdO1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLmFkZERlZmF1bHRDb2x1bW5zKHEpO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWMudHMiLCJpbXBvcnQge1xuICBCYXNlLFxuICBJU3VydmV5RGF0YSxcbiAgSVN1cnZleUltcGwsXG4gIElTdXJ2ZXksXG4gIElQYW5lbCxcbiAgSUVsZW1lbnQsXG4gIFN1cnZleUVsZW1lbnQsXG4gIElUZXh0UHJvY2Vzc29yLFxuICBJUHJvZ3Jlc3NJbmZvLFxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBTdXJ2ZXlWYWxpZGF0b3IsIElWYWxpZGF0b3JPd25lciB9IGZyb20gXCIuL3ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb24sIElDb25kaXRpb25PYmplY3QgfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi9xdWVzdGlvbl90ZXh0XCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBTZXJpYWxpemVyIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEFuc3dlclJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU11bHRpcGxlVGV4dERhdGEgZXh0ZW5kcyBJTG9jYWxpemFibGVPd25lciwgSVBhbmVsIHtcbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXk7XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3I7XG4gIGdldEFsbFZhbHVlcygpOiBhbnk7XG4gIGdldE11bHRpcGxlVGV4dFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgc2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55O1xuICBnZXRJdGVtRGVmYXVsdFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgZ2V0SXNSZXF1aXJlZFRleHQoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVUZXh0SXRlbU1vZGVsXG4gIGV4dGVuZHMgQmFzZVxuICBpbXBsZW1lbnRzIElWYWxpZGF0b3JPd25lciwgSVN1cnZleURhdGEsIElTdXJ2ZXlJbXBsIHtcbiAgcHJpdmF0ZSBlZGl0b3JWYWx1ZTogUXVlc3Rpb25UZXh0TW9kZWw7XG4gIHByaXZhdGUgZGF0YTogSU11bHRpcGxlVGV4dERhdGE7XG5cbiAgdmFsdWVDaGFuZ2VkQ2FsbGJhY2s6IChuZXdWYWx1ZTogYW55KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKG5hbWU6IGFueSA9IG51bGwsIHRpdGxlOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVkaXRvclZhbHVlID0gdGhpcy5jcmVhdGVFZGl0b3IobmFtZSk7XG4gICAgdGhpcy5lZGl0b3IucXVlc3Rpb25UaXRsZVRlbXBsYXRlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9O1xuICAgIHRoaXMuZWRpdG9yLnRpdGxlTG9jYXRpb24gPSBcImxlZnRcIjtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtdWx0aXBsZXRleHRpdGVtXCI7XG4gIH1cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5pZDtcbiAgfVxuICAvKipcbiAgICogVGhlIGl0ZW0gbmFtZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5uYW1lO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZWRpdG9yLm5hbWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbiB7XG4gICAgcmV0dXJuIDxRdWVzdGlvbj4oPGFueT50aGlzLmRhdGEpO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yKCk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlRWRpdG9yKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dE1vZGVsKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBhZGRVc2VkTG9jYWxlcyhsb2NhbGVzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgc3VwZXIuYWRkVXNlZExvY2FsZXMobG9jYWxlcyk7XG4gICAgdGhpcy5lZGl0b3IuYWRkVXNlZExvY2FsZXMobG9jYWxlcyk7XG4gIH1cbiAgcHVibGljIGxvY1N0cnNDaGFuZ2VkKCkge1xuICAgIHN1cGVyLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgdGhpcy5lZGl0b3IubG9jU3Ryc0NoYW5nZWQoKTtcbiAgfVxuICBzZXREYXRhKGRhdGE6IElNdWx0aXBsZVRleHREYXRhKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICBpZiAoISFkYXRhKSB7XG4gICAgICB0aGlzLmVkaXRvci5kZWZhdWx0VmFsdWUgPSBkYXRhLmdldEl0ZW1EZWZhdWx0VmFsdWUodGhpcy5uYW1lKTtcbiAgICAgIHRoaXMuZWRpdG9yLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgICB0aGlzLmVkaXRvci5wYXJlbnQgPSBkYXRhO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gbWFrZSB0aGUgaXRlbSBhIHJlcXVpcmVkLiBJZiBhIHVzZXIgZG9lc24ndCBmaWxsIHRoZSBpdGVtIHRoZW4gYSB2YWxpZGF0aW9uIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5pc1JlcXVpcmVkO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVkaXRvci5pc1JlcXVpcmVkID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmlucHV0VHlwZTtcbiAgfVxuICBwdWJsaWMgc2V0IGlucHV0VHlwZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZWRpdG9yLmlucHV0VHlwZSA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogSXRlbSB0aXRsZS4gSWYgaXQgaXMgZW1wdHksIHRoZSBpdGVtIG5hbWUgaXMgcmVuZGVyZWQgYXMgdGl0bGUuIFRoaXMgcHJvcGVydHkgc3VwcG9ydHMgbWFya2Rvd24uXG4gICAqIEBzZWUgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3IudGl0bGUgPSB2YWw7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NUaXRsZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dCBvciBodG1sIGZvciByZW5kZXJpbmcgdGhlIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBmdWxsVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuZnVsbFRpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0ZXh0IGxlbmd0aC4gSWYgaXQgaXMgLTEsIGRlZmF1bCB2YWx1ZSwgdGhlbiB0aGUgc3VydmV5IG1heFRleHRMZW5ndGggcHJvcGVydHkgd2lsbCBiZSB1c2VkLlxuICAgKiBJZiBpdCBpcyAwLCB0aGVuIHRoZSB2YWx1ZSBpcyB1bmxpbWl0ZWRcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tYXhUZXh0TGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5tYXhMZW5ndGg7XG4gIH1cbiAgcHVibGljIHNldCBtYXhMZW5ndGgodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLmVkaXRvci5tYXhMZW5ndGggPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldE1heExlbmd0aCgpOiBhbnkge1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xuICAgIHJldHVybiBIZWxwZXJzLmdldE1heExlbmd0aChcbiAgICAgIHRoaXMubWF4TGVuZ3RoLFxuICAgICAgc3VydmV5ID8gc3VydmV5Lm1heFRleHRMZW5ndGggOiAtMVxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBwbGFjZSBob2xkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBsYWNlSG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnBsYWNlSG9sZGVyO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5wbGFjZUhvbGRlciA9IHZhbDtcbiAgfVxuICBnZXQgbG9jUGxhY2VIb2xkZXIoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NQbGFjZUhvbGRlcjtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1c3RvbSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBvbiByZXF1aXJlZCBlcnJvci4gVXNlIHRoaXMgcHJvcGVydHksIGlmIHlvdSBkbyBub3Qgd2FudCB0byBzaG93IHRoZSBkZWZhdWx0IHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlcXVpcmVkRXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLnJlcXVpcmVkRXJyb3JUZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5yZXF1aXJlZEVycm9yVGV4dCA9IHZhbDtcbiAgfVxuICBnZXQgbG9jUmVxdWlyZWRFcnJvclRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NSZXF1aXJlZEVycm9yVGV4dDtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcXVlc3Rpb24gdmFsaWRhdG9ycy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+IHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IudmFsaWRhdG9ycztcbiAgfVxuICBwdWJsaWMgc2V0IHZhbGlkYXRvcnModmFsOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+KSB7XG4gICAgdGhpcy5lZGl0b3IudmFsaWRhdG9ycyA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsaWRhdG9ycygpOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+IHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0b3JzO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaXRlbSB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRNdWx0aXBsZVRleHRWYWx1ZSh0aGlzLm5hbWUpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5kYXRhICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRNdWx0aXBsZVRleHRWYWx1ZSh0aGlzLm5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGlzRW1wdHkoKSB7XG4gICAgcmV0dXJuIEhlbHBlcnMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpO1xuICB9XG4gIHB1YmxpYyBvblZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMudmFsdWVDaGFuZ2VkQ2FsbGJhY2spIHRoaXMudmFsdWVDaGFuZ2VkQ2FsbGJhY2sobmV3VmFsdWUpO1xuICB9XG4gIC8vSVN1cnZleUltcGxcbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRTdXJ2ZXkoKSA6IG51bGw7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRUZXh0UHJvY2Vzc29yKCkgOiBudWxsO1xuICB9XG4gIC8vSVN1cnZleURhdGFcbiAgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lKTtcbiAgfVxuICBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLmRhdGEuc2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBnZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgc2V0VmFyaWFibGUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7fVxuICBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgc2V0Q29tbWVudChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpIHt9XG4gIGdldEFsbFZhbHVlcygpOiBhbnkge1xuICAgIGlmICh0aGlzLmRhdGEpIHJldHVybiB0aGlzLmRhdGEuZ2V0QWxsVmFsdWVzKCk7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgZ2V0RmlsdGVyZWRWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgfVxuICBnZXRGaWx0ZXJlZFByb3BlcnRpZXMoKTogYW55IHtcbiAgICByZXR1cm4geyBzdXJ2ZXk6IHRoaXMuZ2V0U3VydmV5KCkgfTtcbiAgfVxuICAvL0lWYWxpZGF0b3JPd25lclxuICBnZXRWYWxpZGF0b3JUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRpdGxlO1xuICB9XG4gIGdldCB2YWxpZGF0ZWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIHNldCB2YWxpZGF0ZWRWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gIH1cbiAgZ2V0RGF0YUZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRWYWx1ZXMoKTtcbiAgfVxuICBnZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRQcm9wZXJ0aWVzKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIG11bHRpcGxlIHRleHQgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsXG4gIGV4dGVuZHMgUXVlc3Rpb25cbiAgaW1wbGVtZW50cyBJTXVsdGlwbGVUZXh0RGF0YSwgSVBhbmVsIHtcbiAgY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5jcmVhdGVOZXdBcnJheShcIml0ZW1zXCIsIGZ1bmN0aW9uIChpdGVtOiBhbnkpIHtcbiAgICAgIGl0ZW0uc2V0RGF0YShzZWxmKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiaXRlbXNcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5maXJlQ2FsbGJhY2soc2VsZi5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNvbENvdW50XCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibXVsdGlwbGV0ZXh0XCI7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLml0ZW1zW2ldLnNldERhdGEodGhpcyk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBoYXNTaW5nbGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHRoaXMuZWRpdG9yc09uU3VydmV5TG9hZCgpO1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSwgdXBkYXRlSXNBbnN3ZXJlZDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBzdXBlci5zZXRRdWVzdGlvblZhbHVlKG5ld1ZhbHVlLCB1cGRhdGVJc0Fuc3dlcmVkKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gdGhpcy5pdGVtc1tpXTtcbiAgICAgIGlmIChpdGVtLmVkaXRvcikgaXRlbS5lZGl0b3IudXBkYXRlVmFsdWVGcm9tU3VydmV5KGl0ZW0udmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUlzQW5zd2VyZWQoKTtcbiAgfVxuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIub25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgICAgaWYgKGl0ZW0uZWRpdG9yKSBpdGVtLmVkaXRvci5vblN1cnZleVZhbHVlQ2hhbmdlZChpdGVtLnZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBlZGl0b3JzT25TdXJ2ZXlMb2FkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgICAgaWYgKGl0ZW0uZWRpdG9yKSB7XG4gICAgICAgICg8YW55Pml0ZW0pLmVkaXRvci5vblN1cnZleUxvYWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGlucHV0IGl0ZW1zLlxuICAgKi9cbiAgcHVibGljIGdldCBpdGVtcygpOiBBcnJheTxNdWx0aXBsZVRleHRJdGVtTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbXNcIik7XG4gIH1cbiAgcHVibGljIHNldCBpdGVtcyh2YWw6IEFycmF5PE11bHRpcGxlVGV4dEl0ZW1Nb2RlbD4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpdGVtc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgdGV4dCBpdGVtLlxuICAgKiBAcGFyYW0gbmFtZSBhIGl0ZW0gbmFtZVxuICAgKiBAcGFyYW0gdGl0bGUgYSBpdGVtIHRpdGxlIChvcHRpb25hbClcbiAgICovXG4gIHB1YmxpYyBhZGRJdGVtKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyA9IG51bGwpOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwge1xuICAgIHZhciBpdGVtID0gdGhpcy5jcmVhdGVUZXh0SXRlbShuYW1lLCB0aXRsZSk7XG4gICAgdGhpcy5pdGVtcy5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBpdGVtO1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtQnlOYW1lKG5hbWU6IHN0cmluZyk6IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpXS5uYW1lID09IG5hbWUpIHJldHVybiB0aGlzLml0ZW1zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG4gICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICBuYW1lOiB0aGlzLmdldFZhbHVlTmFtZSgpICsgXCIuXCIgKyBpdGVtLm5hbWUsXG4gICAgICAgIHRleHQ6IHRoaXMucHJvY2Vzc2VkVGl0bGUgKyBcIi5cIiArIGl0ZW0uZnVsbFRpdGxlLFxuICAgICAgICBxdWVzdGlvbjogdGhpcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvcjogc3RyaW5nID0gbnVsbCwgcGF0aDogc3RyaW5nID0gbnVsbCk6IGFueSB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gc3VwZXIuZ2V0Q29uZGl0aW9uSnNvbigpO1xuICAgIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtQnlOYW1lKHBhdGgpO1xuICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdChpdGVtKTtcbiAgICBqc29uW1widHlwZVwiXSA9IFwidGV4dFwiO1xuICAgIHJldHVybiBqc29uO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLml0ZW1zW2ldLmlzRW1wdHkoKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zLiBJdGVtcyBhcmUgcmVuZHJlZCBpbiBvbmUgbGluZSBpZiB0aGUgdmFsdWUgaXMgMC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29sQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb2xDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAxIHx8IHZhbCA+IDUpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb2xDb3VudFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCB0ZXh0IGlucHV0IHNpemUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGl0ZW1TaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIml0ZW1TaXplXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXRlbVNpemUodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpdGVtU2l6ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJlbmRlcmVkIHJvd3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93cygpOiBBcnJheTxhbnk+IHtcbiAgICB2YXIgY29sQ291bnQgPSB0aGlzLmNvbENvdW50O1xuICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXM7XG4gICAgdmFyIHJvd3MgPSBbXTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpbmRleCA9PSAwKSB7XG4gICAgICAgIHJvd3MucHVzaChbXSk7XG4gICAgICB9XG4gICAgICByb3dzW3Jvd3MubGVuZ3RoIC0gMV0ucHVzaChpdGVtc1tpXSk7XG4gICAgICBpbmRleCsrO1xuICAgICAgaWYgKGluZGV4ID49IGNvbENvdW50KSB7XG4gICAgICAgIGluZGV4ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cbiAgcHJpdmF0ZSBpc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgdGhpcy5vbkl0ZW1WYWx1ZUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlVGV4dEl0ZW0obmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW1Nb2RlbChuYW1lLCB0aXRsZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXRlbVZhbHVlQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtVmFsdWUgPSBudWxsO1xuICAgICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy5pdGVtc1tpXS5uYW1lIGluIHRoaXMudmFsdWUpIHtcbiAgICAgICAgaXRlbVZhbHVlID0gdGhpcy52YWx1ZVt0aGlzLml0ZW1zW2ldLm5hbWVdO1xuICAgICAgfVxuICAgICAgdGhpcy5pdGVtc1tpXS5vblZhbHVlQ2hhbmdlZChpdGVtVmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SXNSdW5uaW5nVmFsaWRhdG9ycygpOiBib29sZWFuIHtcbiAgICBpZiAoc3VwZXIuZ2V0SXNSdW5uaW5nVmFsaWRhdG9ycygpKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLml0ZW1zW2ldLmVkaXRvci5pc1J1bm5pbmdWYWxpZGF0b3JzKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBoYXNFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuID0gdHJ1ZSwgcmVjOiBhbnkgPSBudWxsKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5lZGl0b3Iub25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMgPSAoXG4gICAgICAgIGhhc0Vycm9yczogYm9vbGVhblxuICAgICAgKSA9PiB7XG4gICAgICAgIHRoaXMucmFpc2VPbkNvbXBsZXRlZEFzeW5jVmFsaWRhdG9ycygpO1xuICAgICAgfTtcbiAgICAgIGlmIChcbiAgICAgICAgISFyZWMgJiZcbiAgICAgICAgcmVjLmlzT25WYWx1ZUNoYW5nZWQgPT09IHRydWUgJiZcbiAgICAgICAgdGhpcy5pdGVtc1tpXS5lZGl0b3IuaXNFbXB0eSgpXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgcmVzID0gdGhpcy5pdGVtc1tpXS5lZGl0b3IuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgcmVjKSB8fCByZXM7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCByZXM7XG4gIH1cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHZhciByZXN1bHQgPSBzdXBlci5nZXRBbGxFcnJvcnMoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlcnJvcnMgPSB0aGlzLml0ZW1zW2ldLmVkaXRvci5nZXRBbGxFcnJvcnMoKTtcbiAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChlcnJvcnMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHB1YmxpYyBjbGVhckVycm9ycygpIHtcbiAgICBzdXBlci5jbGVhckVycm9ycygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5lZGl0b3IuY2xlYXJFcnJvcnMoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldENvbnRhaW5zRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBzdXBlci5nZXRDb250YWluc0Vycm9ycygpO1xuICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXRlbXNbaV0uZWRpdG9yLmNvbnRhaW5zRXJyb3JzKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRJc0Fuc3dlcmVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghc3VwZXIuZ2V0SXNBbnN3ZXJlZCgpKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWRpdG9yID0gdGhpcy5pdGVtc1tpXS5lZGl0b3I7XG4gICAgICBpZiAoZWRpdG9yLmlzVmlzaWJsZSAmJiAhZWRpdG9yLmlzQW5zd2VyZWQpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldFByb2dyZXNzSW5mbygpOiBJUHJvZ3Jlc3NJbmZvIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVsZW1lbnRzLnB1c2godGhpcy5pdGVtc1tpXS5lZGl0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gU3VydmV5RWxlbWVudC5nZXRQcm9ncmVzc0luZm9CeUVsZW1lbnRzKGVsZW1lbnRzLCB0aGlzLmlzUmVxdWlyZWQpO1xuICB9XG4gIC8vSU11bHRpcGxlVGV4dERhdGFcbiAgZ2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVtuYW1lXTtcbiAgfVxuICBzZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZyA9IHRydWU7XG4gICAgdmFyIG5ld1ZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIW5ld1ZhbHVlKSB7XG4gICAgICBuZXdWYWx1ZSA9IHt9O1xuICAgIH1cbiAgICBuZXdWYWx1ZVtuYW1lXSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgIHRoaXMuaXNNdWx0aXBsZUl0ZW1WYWx1ZUNoYW5naW5nID0gZmFsc2U7XG4gIH1cbiAgZ2V0SXRlbURlZmF1bHRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZGVmYXVsdFZhbHVlID8gdGhpcy5kZWZhdWx0VmFsdWVbbmFtZV0gOiBudWxsO1xuICB9XG4gIGdldFN1cnZleSgpOiBJU3VydmV5IHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXk7XG4gIH1cbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3NvciB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByb2Nlc3NvcjtcbiAgfVxuICBnZXRBbGxWYWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRBbGxWYWx1ZXMoKSA6IG51bGw7XG4gIH1cbiAgZ2V0SXNSZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHQgOiBcIlwiO1xuICB9XG4gIC8vSVBhbmVsXG4gIGFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIpIHt9XG4gIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibGVmdFwiO1xuICB9XG4gIGdldFF1ZXN0aW9uU3RhcnRJbmRleCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFN0YXJ0SW5kZXgoKTtcbiAgfVxuICBnZXRDaGlsZHJlbkxheW91dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJyb3dcIjtcbiAgfVxuICBlbGVtZW50V2lkdGhDaGFuZ2VkKGVsOiBJRWxlbWVudCkge31cbiAgZ2V0IGVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGluZGV4T2YoZWw6IElFbGVtZW50KTogbnVtYmVyIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cblxuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJtdWx0aXBsZXRleHRpdGVtXCIsXG4gIFtcbiAgICBcIm5hbWVcIixcbiAgICBcImlzUmVxdWlyZWQ6Ym9vbGVhblwiLFxuICAgIHsgbmFtZTogXCJwbGFjZUhvbGRlclwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGxhY2VIb2xkZXJcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiaW5wdXRUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcInRleHRcIixcbiAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgXCJjb2xvclwiLFxuICAgICAgICBcImRhdGVcIixcbiAgICAgICAgXCJkYXRldGltZVwiLFxuICAgICAgICBcImRhdGV0aW1lLWxvY2FsXCIsXG4gICAgICAgIFwiZW1haWxcIixcbiAgICAgICAgXCJtb250aFwiLFxuICAgICAgICBcIm51bWJlclwiLFxuICAgICAgICBcInBhc3N3b3JkXCIsXG4gICAgICAgIFwicmFuZ2VcIixcbiAgICAgICAgXCJ0ZWxcIixcbiAgICAgICAgXCJ0ZXh0XCIsXG4gICAgICAgIFwidGltZVwiLFxuICAgICAgICBcInVybFwiLFxuICAgICAgICBcIndlZWtcIixcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidGl0bGVcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7IG5hbWU6IFwibWF4TGVuZ3RoOm51bWJlclwiLCBkZWZhdWx0OiAtMSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmVxdWlyZWRFcnJvclRleHQ6dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1JlcXVpcmVkRXJyb3JUZXh0XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInZhbGlkYXRvcnM6dmFsaWRhdG9yc1wiLFxuICAgICAgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl2YWxpZGF0b3JcIixcbiAgICAgIGNsYXNzTmFtZVBhcnQ6IFwidmFsaWRhdG9yXCIsXG4gICAgfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgTXVsdGlwbGVUZXh0SXRlbU1vZGVsKFwiXCIpO1xuICB9XG4pO1xuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcIm11bHRpcGxldGV4dFwiLFxuICBbXG4gICAgeyBuYW1lOiBcIiFpdGVtczp0ZXh0aXRlbXNcIiwgY2xhc3NOYW1lOiBcIm11bHRpcGxldGV4dGl0ZW1cIiB9LFxuICAgIHsgbmFtZTogXCJpdGVtU2l6ZTpudW1iZXJcIiwgZGVmYXVsdDogMjUsIG1pblZhbHVlOiAwIH0sXG4gICAgeyBuYW1lOiBcImNvbENvdW50Om51bWJlclwiLCBkZWZhdWx0OiAxLCBjaG9pY2VzOiBbMSwgMiwgMywgNCwgNV0gfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm11bHRpcGxldGV4dFwiLCAobmFtZSkgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsKG5hbWUpO1xuICBxLmFkZEl0ZW0oXCJ0ZXh0MVwiKTtcbiAgcS5hZGRJdGVtKFwidGV4dDJcIik7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fbXVsdGlwbGV0ZXh0LnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgSUVsZW1lbnQsXG4gIElRdWVzdGlvbixcbiAgQmFzZSxcbiAgSVBhbmVsLFxuICBTdXJ2ZXlFcnJvcixcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlJbXBsLFxuICBJVGV4dFByb2Nlc3NvcixcbiAgSVByb2dyZXNzSW5mbyxcbiAgU3VydmV5RWxlbWVudCxcbn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgVGV4dFByZVByb2Nlc3NvciwgVGV4dFByZVByb2Nlc3NvclZhbHVlIH0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiwgSUNvbmRpdGlvbk9iamVjdCB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsIH0gZnJvbSBcIi4vcGFuZWxcIjtcbmltcG9ydCB7IEpzb25PYmplY3QsIFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IEtleUR1cGxpY2F0aW9uRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuaW1wb3J0IHsgUGFuZWwgfSBmcm9tIFwiLi9rbm9ja291dC9rb3BhZ2VcIjtcbmltcG9ydCB7IGNvbmZpcm1BY3Rpb24gfSBmcm9tIFwiLi91dGlscy91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEge1xuICBnZXRJdGVtSW5kZXgoaXRlbTogSVN1cnZleURhdGEpOiBudW1iZXI7XG4gIGdldFBhbmVsSXRlbURhdGEoaXRlbTogSVN1cnZleURhdGEpOiBhbnk7XG4gIHNldFBhbmVsSXRlbURhdGEoaXRlbTogSVN1cnZleURhdGEsIG5hbWU6IHN0cmluZywgdmFsOiBhbnkpOiBhbnk7XG4gIGdldFNoYXJlZFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgcGFuZWxJbmRleDogbnVtYmVyKTogUXVlc3Rpb247XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xuICBnZXRSb290RGF0YSgpOiBJU3VydmV5RGF0YTtcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbVxuICBpbXBsZW1lbnRzIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCwgSVRleHRQcm9jZXNzb3Ige1xuICBwdWJsaWMgc3RhdGljIEl0ZW1WYXJpYWJsZU5hbWUgPSBcInBhbmVsXCI7XG4gIHB1YmxpYyBzdGF0aWMgSW5kZXhWYXJpYWJsZU5hbWUgPSBcInBhbmVsSW5kZXhcIjtcbiAgcHJpdmF0ZSBwYW5lbFZhbHVlOiBQYW5lbE1vZGVsO1xuICBwcml2YXRlIGRhdGE6IElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGE7XG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjogVGV4dFByZVByb2Nlc3NvcjtcbiAgY29uc3RydWN0b3IoZGF0YTogSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSwgcGFuZWw6IFBhbmVsTW9kZWwpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucGFuZWxWYWx1ZSA9IHBhbmVsO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3Nvci5vblByb2Nlc3MgPSBmdW5jdGlvbiAoXG4gICAgICB0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZVxuICAgICkge1xuICAgICAgc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlKTtcbiAgICB9O1xuICAgIHRoaXMuc2V0U3VydmV5SW1wbCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgcGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCgpIHtcbiAgICB0aGlzLnBhbmVsLnNldFN1cnZleUltcGwodGhpcyk7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0QWxsVmFsdWVzKCk7XG4gICAgcmV0dXJuIHZhbHVlc1tuYW1lXTtcbiAgfVxuICBwdWJsaWMgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5kYXRhLnNldFBhbmVsSXRlbURhdGEodGhpcywgbmFtZSwgbmV3VmFsdWUpO1xuICB9XG4gIGdldFZhcmlhYmxlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHt9XG4gIHB1YmxpYyBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWUobmFtZSArIHNldHRpbmdzLmNvbW1lbnRQcmVmaXgpO1xuICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzZXRDb21tZW50KG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZywgbG9jTm90aWZpY2F0aW9uOiBhbnkpIHtcbiAgICB0aGlzLnNldFZhbHVlKG5hbWUgKyBzZXR0aW5ncy5jb21tZW50UHJlZml4LCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZXRQYW5lbEl0ZW1EYXRhKHRoaXMpO1xuICB9XG4gIGdldEZpbHRlcmVkVmFsdWVzKCk6IGFueSB7XG4gICAgdmFyIHZhbHVlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIHZhciBzdXJ2ZXlWYWx1ZXMgPVxuICAgICAgISF0aGlzLmRhdGEgJiYgISF0aGlzLmRhdGEuZ2V0Um9vdERhdGEoKVxuICAgICAgICA/IHRoaXMuZGF0YS5nZXRSb290RGF0YSgpLmdldEZpbHRlcmVkVmFsdWVzKClcbiAgICAgICAgOiB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3VydmV5VmFsdWVzKSB7XG4gICAgICB2YWx1ZXNba2V5XSA9IHN1cnZleVZhbHVlc1trZXldO1xuICAgIH1cbiAgICB2YWx1ZXNbUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWVdID0gdGhpcy5nZXRBbGxWYWx1ZXMoKTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIGdldEZpbHRlcmVkUHJvcGVydGllcygpOiBhbnkge1xuICAgIGlmICghIXRoaXMuZGF0YSAmJiAhIXRoaXMuZGF0YS5nZXRSb290RGF0YSgpKVxuICAgICAgcmV0dXJuIHRoaXMuZGF0YS5nZXRSb290RGF0YSgpLmdldEZpbHRlcmVkUHJvcGVydGllcygpO1xuICAgIHJldHVybiB7IHN1cnZleTogdGhpcy5nZXRTdXJ2ZXkoKSB9O1xuICB9XG4gIGdlU3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0U3VydmV5KCkgOiBudWxsO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8vSVRleHRQcm9jZXNzb3JcbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpIHtcbiAgICBpZiAoIXRleHRWYWx1ZSkgcmV0dXJuO1xuICAgIHZhciBwYW5lbEluZGV4ID0gISF0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0SXRlbUluZGV4KHRoaXMpIDogLTE7XG4gICAgaWYgKHRleHRWYWx1ZS5uYW1lID09IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JbmRleFZhcmlhYmxlTmFtZSkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHBhbmVsSW5kZXggKyAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZmlyc3ROYW1lID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldEZpcnN0TmFtZSh0ZXh0VmFsdWUubmFtZSk7XG4gICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gZmlyc3ROYW1lID09IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JdGVtVmFyaWFibGVOYW1lO1xuICAgIHRleHRWYWx1ZS5jYW5Qcm9jZXNzID0gdGV4dFZhbHVlLmlzRXhpc3RzO1xuICAgIGlmICghdGV4dFZhbHVlLmNhblByb2Nlc3MpIHJldHVybjtcbiAgICAvL25hbWUgc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHBhbmVsXG4gICAgdGV4dFZhbHVlLm5hbWUgPSB0ZXh0VmFsdWUubmFtZS5yZXBsYWNlKFxuICAgICAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWUgKyBcIi5cIixcbiAgICAgIFwiXCJcbiAgICApO1xuICAgIHZhciBmaXJzdE5hbWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0Rmlyc3ROYW1lKHRleHRWYWx1ZS5uYW1lKTtcbiAgICB2YXIgcXVlc3Rpb24gPSA8UXVlc3Rpb24+dGhpcy5wYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKGZpcnN0TmFtZSk7XG4gICAgaWYgKCFxdWVzdGlvbiAmJiBwYW5lbEluZGV4ID4gLTEpIHtcbiAgICAgIHF1ZXN0aW9uID0gdGhpcy5kYXRhLmdldFNoYXJlZFF1ZXN0aW9uRnJvbUFycmF5KGZpcnN0TmFtZSwgcGFuZWxJbmRleCk7XG4gICAgfVxuICAgIHZhciB2YWx1ZXMgPSB7fTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgICg8YW55PnZhbHVlcylbZmlyc3ROYW1lXSA9IHRleHRWYWx1ZS5yZXR1cm5EaXNwbGF5VmFsdWVcbiAgICAgICAgPyBxdWVzdGlvbi5kaXNwbGF5VmFsdWVcbiAgICAgICAgOiBxdWVzdGlvbi52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFsbFZhbHVlcyA9IHRoaXMuZ2V0QWxsVmFsdWVzKCk7XG4gICAgICBpZiAoYWxsVmFsdWVzKSB7XG4gICAgICAgICg8YW55PnZhbHVlcylbZmlyc3ROYW1lXSA9IGFsbFZhbHVlc1tmaXJzdE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICB0ZXh0VmFsdWUudmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0VmFsdWUodGV4dFZhbHVlLm5hbWUsIHZhbHVlcyk7XG4gIH1cbiAgcHJvY2Vzc1RleHQodGV4dDogc3RyaW5nLCByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHRleHQgPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2Vzcyh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xuICAgIHJldHVybiBzdXJ2ZXkgPyBzdXJ2ZXkucHJvY2Vzc1RleHQodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKSA6IHRleHQ7XG4gIH1cbiAgcHJvY2Vzc1RleHRFeCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IGFueSB7XG4gICAgdGV4dCA9IHRoaXMucHJvY2Vzc1RleHQodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKTtcbiAgICB2YXIgaGFzQWxsVmFsdWVzT25MYXN0UnVuID0gdGhpcy50ZXh0UHJlUHJvY2Vzc29yLmhhc0FsbFZhbHVlc09uTGFzdFJ1bjtcbiAgICB2YXIgcmVzID0geyBoYXNBbGxWYWx1ZXNPbkxhc3RSdW46IHRydWUsIHRleHQ6IHRleHQgfTtcbiAgICBpZiAodGhpcy5nZXRTdXJ2ZXkoKSkge1xuICAgICAgcmVzID0gdGhpcy5nZXRTdXJ2ZXkoKS5wcm9jZXNzVGV4dEV4KHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSwgZmFsc2UpO1xuICAgIH1cbiAgICByZXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuID1cbiAgICAgIHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gJiYgaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHJldHVybiByZXM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljVGVtcGxhdGVTdXJ2ZXlJbXBsIGltcGxlbWVudHMgSVN1cnZleUltcGwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGF0YTogSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSkge31cbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZXRTdXJ2ZXkoKTtcbiAgfVxuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgcGFuZWwgZHltYW5pYyBxdWVzdGlvbi4gWW91IHNldHVwIHRoZSB0ZW1wbGF0ZSBwYW5lbCwgYnV0IGFkZGluZyBlbGVtZW50cyAoYW55IHF1ZXN0aW9uIG9yIGEgcGFuZWwpIGFuZCBhc3NpZ24gYSB0ZXh0IHRvIGl0J3MgdGl0bGUsIGFuZCB0aGlzIHBhbmVsIHdpbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIG9uIGNyZWF0aW5nIGR5bmFtaWMgcGFuZWxzLiBUaGUgbnVtYmVyIG9mIHBhbmVscyBpcyBkZWZpbmVkIGJ5IHBhbmVsQ291bnQgcHJvcGVydHkuXG4gKiBBbiBlbmQtdXNlciBtYXkgZHluYW1pY2FsbHkgYWRkL3JlbW92ZSBwYW5lbHMsIHVubGVzcyB5b3UgZm9yYmlkZGVuIHRoaXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsXG4gIGV4dGVuZHMgUXVlc3Rpb25cbiAgaW1wbGVtZW50cyBJUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhIHtcbiAgcHJpdmF0ZSB0ZW1wbGF0ZVZhbHVlOiBQYW5lbE1vZGVsO1xuICBwcml2YXRlIGxvYWRpbmdQYW5lbENvdW50OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIGlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHk6IGJvb2xlYW47XG4gIHByaXZhdGUgY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgcHJpdmF0ZSBjdXJyZW50SW5kZXhWYWx1ZTogbnVtYmVyID0gLTE7XG5cbiAgcmVuZGVyTW9kZUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgcGFuZWxDb3VudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicGFuZWxzXCIpO1xuICAgIHRoaXMudGVtcGxhdGVWYWx1ZSA9IHRoaXMuY3JlYXRlQW5kU2V0dXBOZXdQYW5lbE9iamVjdCgpO1xuICAgIHRoaXMudGVtcGxhdGUucmVuZGVyV2lkdGggPSBcIjEwMCVcIjtcbiAgICB0aGlzLnRlbXBsYXRlLnNlbGVjdGVkRWxlbWVudEluRGVzaWduID0gdGhpcztcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRlbXBsYXRlLmFkZEVsZW1lbnRDYWxsYmFjayA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBzZWxmLmFkZE9uUHJvcGVydHlDaGFuZ2VkQ2FsbGJhY2soZWxlbWVudCk7XG4gICAgICBzZWxmLnJlYnVpbGRQYW5lbHMoKTtcbiAgICB9O1xuICAgIHRoaXMudGVtcGxhdGUucmVtb3ZlRWxlbWVudENhbGxiYWNrID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHNlbGYucmVidWlsZFBhbmVscygpO1xuICAgIH07XG5cbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsQWRkVGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxSZW1vdmVUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbFByZXZUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbE5leHRUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJwYW5lbHNTdGF0ZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLnNldFBhbmVsc1N0YXRlKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldCBoYXNTaW5nbGVJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgdGhpcy5zZXRUZW1wbGF0ZVBhbmVsU3VydmV5SW1wbCgpO1xuICAgIHRoaXMuc2V0UGFuZWxzU3VydmV5SW1wbCgpO1xuICB9XG4gIHByaXZhdGUgYXNzaWduT25Qcm9wZXJ0eUNoYW5nZWRUb1RlbXBsYXRlKCkge1xuICAgIHZhciBlbGVtZW50cyA9IHRoaXMudGVtcGxhdGUuZWxlbWVudHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5hZGRPblByb3BlcnR5Q2hhbmdlZENhbGxiYWNrKGVsZW1lbnRzW2ldKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRPblByb3BlcnR5Q2hhbmdlZENhbGxiYWNrKGVsZW1lbnQ6IElFbGVtZW50KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICBzZWxmLm9uVGVtcGxhdGVFbGVtZW50UHJvcGVydHlDaGFuZ2VkKGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH0pO1xuICAgIGlmIChlbGVtZW50LmlzUGFuZWwpIHtcbiAgICAgICg8UGFuZWxNb2RlbD4oPGFueT5lbGVtZW50KSkuYWRkRWxlbWVudENhbGxiYWNrID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgc2VsZi5hZGRPblByb3BlcnR5Q2hhbmdlZENhbGxiYWNrKGVsZW1lbnQpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBvblRlbXBsYXRlRWxlbWVudFByb3BlcnR5Q2hhbmdlZChlbGVtZW50OiBhbnksIG9wdGlvbnM6IGFueSkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8IHRoaXMuaXNEZXNpZ25Nb2RlIHx8IHRoaXMucGFuZWxzLmxlbmd0aCA9PSAwKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0eSA9IFNlcmlhbGl6ZXIuZmluZFByb3BlcnR5KGVsZW1lbnQuZ2V0VHlwZSgpLCBvcHRpb25zLm5hbWUpO1xuICAgIGlmICghcHJvcGVydHkpIHJldHVybjtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5wYW5lbHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHBhbmVsc1tpXS5nZXRRdWVzdGlvbkJ5TmFtZShlbGVtZW50Lm5hbWUpO1xuICAgICAgaWYgKCEhcXVlc3Rpb24gJiYgKDxhbnk+cXVlc3Rpb24pW29wdGlvbnMubmFtZV0gIT09IG9wdGlvbnMubmV3VmFsdWUpIHtcbiAgICAgICAgKDxhbnk+cXVlc3Rpb24pW29wdGlvbnMubmFtZV0gPSBvcHRpb25zLm5ld1ZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhbmVsZHluYW1pY1wiO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNDb21wb3NpdGVRdWVzdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgY2xlYXJPbkRlbGV0aW5nQ29udGFpbmVyKCkge1xuICAgIHRoaXMucGFuZWxzLmZvckVhY2goKHBhbmVsKSA9PiB7XG4gICAgICBwYW5lbC5jbGVhck9uRGVsZXRpbmdDb250YWluZXIoKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQWxsb3dUaXRsZUxlZnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUucmVtb3ZlRWxlbWVudChlbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgUGFuZWwuIFRoaXMgcGFuZWwgaXMgdXNlZCBhcyBhIHRlbXBsYXRlIG9uIGNyZWF0aWduIGR5bmFtaWMgcGFuZWxzXG4gICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICogQHNlZSB0ZW1wbGF0ZVRpdGxlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRQYW5lbCgpOiBJUGFuZWwge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgUGFuZWwgZWxlbWVudHMsIHF1ZXN0aW9ucyBhbmQgcGFuZWxzLlxuICAgKiBAc2VlICB0ZW1wbGF0ZUVsZW1lbnRzXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHRlbXBsYXRlRWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5lbGVtZW50cztcbiAgfVxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIFBhbmVsIHRpdGxlIHByb3BlcnR5LlxuICAgKiBAc2VlICB0ZW1wbGF0ZUVsZW1lbnRzXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHRlbXBsYXRlVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRlbXBsYXRlVGl0bGUobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGUudGl0bGUgPSBuZXdWYWx1ZTtcbiAgfVxuICBnZXQgbG9jVGVtcGxhdGVUaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUubG9jVGl0bGU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbCBkZXNjcmlwdGlvbiBwcm9wZXJ0eS5cbiAgICogQHNlZSAgdGVtcGxhdGVFbGVtZW50c1xuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHRlbXBsYXRlVGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGVEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmRlc2NyaXB0aW9uO1xuICB9XG4gIHB1YmxpYyBzZXQgdGVtcGxhdGVEZXNjcmlwdGlvbihuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5kZXNjcmlwdGlvbiA9IG5ld1ZhbHVlO1xuICB9XG4gIGdldCBsb2NUZW1wbGF0ZURlc2NyaXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5sb2NEZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgaXRlbXMoKTogQXJyYXk8SVN1cnZleURhdGE+IHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2godGhpcy5wYW5lbHNbaV0uZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBhcnJheSBvZiBkeW5hbWljIHBhbmVscyBjcmVhdGVkIGJhc2VkIG9uIHBhbmVsIHRlbXBsYXRlXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVscygpOiBBcnJheTxQYW5lbE1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhbmVsc1wiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGluZGV4IG9mIGN1cnJlbnQgYWN0aXZlIGR5bmFtaWNhbCBwYW5lbCB3aGVuIHRoZSByZW5kZXJNb2RlIGlzIG5vdCBcImxpc3RcIi4gSWYgdGhlcmUgaXMgbm8gZHltYW1pYyBwYW5lbCAocGFuZWxDb3VudCA9IDApIG9yIHJlbmRlck1vZGUgZXF1YWxzIFwibGlzdFwiIGl0IHJldHVybnMgLTEsIG90aGVyd2lzZSBpdCByZXR1cm5zIGEgdmFsdWUgZnJvbSAwIHRvIHBhbmVsQ291bnQgLSAxLlxuICAgKiBAc2VlIGN1cnJlbnRQYW5lbFxuICAgKiBAc2VlIHBhbmVsc1xuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRJbmRleCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmlzUmVuZGVyTW9kZUxpc3QpIHJldHVybiAtMTtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiAwO1xuICAgIGlmICh0aGlzLmN1cnJlbnRJbmRleFZhbHVlIDwgMCAmJiB0aGlzLnBhbmVsQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleFZhbHVlID0gMDtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4VmFsdWUgPj0gdGhpcy5wYW5lbENvdW50KSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleFZhbHVlID0gdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEluZGV4VmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjdXJyZW50SW5kZXgodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50SW5kZXhWYWx1ZSAhPT0gdmFsKSB7XG4gICAgICBpZiAodmFsID49IHRoaXMucGFuZWxDb3VudCkgdmFsID0gdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4VmFsdWUgPSB2YWw7XG4gICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmN1cnJlbnRJbmRleENoYW5nZWRDYWxsYmFjayk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBhY3RpdmUgZHluYW1pY2FsIHBhbmVsIHdoZW4gdGhlIHJlbmRlck1vZGUgaXMgbm90IFwibGlzdFwiLiBJZiB0aGVyZSBpcyBubyBkeW1hbWljIHBhbmVsIChwYW5lbENvdW50ID0gMCkgb3IgcmVuZGVyTW9kZSBlcXVhbHMgXCJsaXN0XCIgaXQgcmV0dXJucyBudWxsLlxuICAgKiBAc2VlIGN1cnJlbkluZGV4XG4gICAqIEBzZWUgcGFuZWxzXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHZhciBpbmRleCA9IHRoaXMuY3VycmVudEluZGV4O1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5wYW5lbHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5wYW5lbHNbaW5kZXhdO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSwgdG8gc2hvdyBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgb24gcmVtb3ZpbmcgYSBwYW5lbFxuICAgKiBAc2VlIENvbmZpcm1EZWxldGVUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbmZpcm1EZWxldGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbmZpcm1EZWxldGVcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29uZmlybURlbGV0ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBhIHF1ZXN0aW9uIG5hbWUgdXNlZCBpbiB0aGUgdGVtcGxhdGUgcGFuZWwgYW5kIHRoZSBsaWJyYXJ5IHNob3dzIGR1cGxpY2F0aW9uIGVycm9yLCBpZiB0aGVyZSBhcmUgc2FtZSB2YWx1ZXMgaW4gZGlmZmVyZW50IHBhbmVscyBvZiB0aGlzIHF1ZXN0aW9uLlxuICAgKiBAc2VlIGtleUR1cGxpY2F0aW9uRXJyb3JcbiAgICovXG4gIHB1YmxpYyBnZXQga2V5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJrZXlOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5TmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImtleU5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQgc2hvd2luZyBpbiB0aGUgY29uZmlybWF0aW9uIGRlbGV0ZSBkaWFsb2cgb24gcmVtb3ZpbmcgYSBwYW5lbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZmlybURlbGV0ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNvbmZpcm1EZWxldGVcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgY29uZmlybURlbGV0ZVRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbmZpcm1EZWxldGVUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0NvbmZpcm1EZWxldGVUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbmZpcm1EZWxldGVUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZHVwbGljYXRpb24gdmFsdWUgZXJyb3IgdGV4dC4gU2V0IGl0IHRvIHNob3cgdGhlIHRleHQgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQuXG4gICAqIEBzZWUga2V5TmFtZVxuICAgKi9cbiAgcHVibGljIGdldCBrZXlEdXBsaWNhdGlvbkVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5RHVwbGljYXRpb25FcnJvcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwia2V5RHVwbGljYXRpb25FcnJvclwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NLZXlEdXBsaWNhdGlvbkVycm9yKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBwcmV2aW91cyBidXR0b24gdGV4dC4gUHJldmlvdXMgYnV0dG9uIHNob3dzIHRoZSBwcmV2aW91cyBwYW5lbCwgY2hhbmdlIHRoZSBjdXJyZW50UGFuZWwsIHdoZW4gdGhlIHJlbmRlck1vZGUgZG9lc24ndCBlcXVhbCB0byBcImxpc3RcIi5cbiAgICogQHNlZSBjdXJyZW50UGFuZWxcbiAgICogQHNlZSBjdXJyZW50SW5kZXhcbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsUHJldlRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhbmVsUHJldlRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwYWdlUHJldlRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxQcmV2VGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxQcmV2VGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NQYW5lbFByZXZUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsUHJldlRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBuZXh0IGJ1dHRvbiB0ZXh0LiBOZXh0IGJ1dHRvbiBzaG93cyB0aGUgbmV4dCBwYW5lbCwgY2hhbmdlIHRoZSBjdXJyZW50UGFuZWwsIHdoZW4gdGhlIHJlbmRlck1vZGUgZG9lc24ndCBlcXVhbCB0byBcImxpc3RcIi5cbiAgICogQHNlZSBjdXJyZW50UGFuZWxcbiAgICogQHNlZSBjdXJyZW50SW5kZXhcbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsTmV4dFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhbmVsTmV4dFRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwYWdlTmV4dFRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxOZXh0VGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxOZXh0VGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NQYW5lbE5leHRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsTmV4dFRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhZGQgcGFuZWwgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsQWRkVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhbmVsQWRkVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImFkZFBhbmVsXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsQWRkVGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbEFkZFRleHRcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBsb2NQYW5lbEFkZFRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxBZGRUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgcmVtb3ZlIHBhbmVsIGJ1dHRvbiB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbFJlbW92ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYW5lbFJlbW92ZVRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZW1vdmVQYW5lbFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbFJlbW92ZVRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsUmVtb3ZlVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NQYW5lbFJlbW92ZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxSZW1vdmVUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcmVuZGVyTW9kZSBlcXVhbHMgdG8gXCJwcm9ncmVzc1RvcFwiIG9yIFwicHJvZ3Jlc3NUb3BCb3R0b21cIlxuICAgKi9cbiAgcHVibGljIGdldCBpc1Byb2dyZXNzVG9wU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZW5kZXJNb2RlID09IFwicHJvZ3Jlc3NUb3BcIiB8fCB0aGlzLnJlbmRlck1vZGUgPT0gXCJwcm9ncmVzc1RvcEJvdHRvbVwiXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHJlbmRlck1vZGUgZXF1YWxzIHRvIFwicHJvZ3Jlc3NCb3R0b21cIiBvciBcInByb2dyZXNzVG9wQm90dG9tXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNQcm9ncmVzc0JvdHRvbVNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucmVuZGVyTW9kZSA9PSBcInByb2dyZXNzQm90dG9tXCIgfHxcbiAgICAgIHRoaXMucmVuZGVyTW9kZSA9PSBcInByb2dyZXNzVG9wQm90dG9tXCJcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiBjdXJyZW50SW5kZXggaXMgbW9yZSB0aGFuIDAuXG4gICAqIEBzZWUgY3VycmVuSW5kZXhcbiAgICogQHNlZSBjdXJyZW5QYW5lbFxuICAgKi9cbiAgcHVibGljIGdldCBpc1ByZXZCdXR0b25TaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbmRleCA+IDA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIGN1cnJlbnRJbmRleCBpcyBtb3JlIHRoYW4gb3IgZXF1YWwgMCBhbmQgbGVzcyB0aGFuIHBhbmVsQ291bnQgLSAxLlxuICAgKiBAc2VlIGN1cnJlbkluZGV4XG4gICAqIEBzZWUgY3VycmVuUGFuZWxcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTmV4dEJ1dHRvblNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEluZGV4ID49IDAgJiYgdGhpcy5jdXJyZW50SW5kZXggPCB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiBzaG93UmFuZ2VJblByb2dyZXNzIGVxdWFscyB0byB0cnVlLCByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIgYW5kIHBhbmVsQ291bnQgaXMgPj0gMi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSYW5nZVNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc2hvd1JhbmdlSW5Qcm9ncmVzcyAmJiB0aGlzLmN1cnJlbnRJbmRleCA+PSAwICYmIHRoaXMucGFuZWxDb3VudCA+IDFcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIGluY2x1ZGVIaWRkZW4gPyBbdGhpcy50ZW1wbGF0ZV0gOiB0aGlzLnRlbXBsYXRlRWxlbWVudHM7XG4gIH1cbiAgcHJpdmF0ZSBpc0FkZGluZ05ld1BhbmVsczogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGFkZGluZ05ld1BhbmVsc1ZhbHVlOiBhbnk7XG4gIHByaXZhdGUgaXNOZXdQYW5lbHNWYWx1ZUNoYW5nZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgcHJlcGFyZVZhbHVlRm9yUGFuZWxDcmVhdGluZygpIHtcbiAgICB0aGlzLmFkZGluZ05ld1BhbmVsc1ZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB0aGlzLmlzQWRkaW5nTmV3UGFuZWxzID0gdHJ1ZTtcbiAgICB0aGlzLmlzTmV3UGFuZWxzVmFsdWVDaGFuZ2VkID0gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBzZXRWYWx1ZUFmdGVyUGFuZWxzQ3JlYXRpbmcoKSB7XG4gICAgdGhpcy5pc0FkZGluZ05ld1BhbmVscyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmlzTmV3UGFuZWxzVmFsdWVDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkgPSB0cnVlO1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuYWRkaW5nTmV3UGFuZWxzVmFsdWU7XG4gICAgICB0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldFZhbHVlQ29yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc0FkZGluZ05ld1BhbmVsc1xuICAgICAgPyB0aGlzLmFkZGluZ05ld1BhbmVsc1ZhbHVlXG4gICAgICA6IHN1cGVyLmdldFZhbHVlQ29yZSgpO1xuICB9XG4gIHByb3RlY3RlZCBzZXRWYWx1ZUNvcmUobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmlzQWRkaW5nTmV3UGFuZWxzKSB7XG4gICAgICB0aGlzLmlzTmV3UGFuZWxzVmFsdWVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuYWRkaW5nTmV3UGFuZWxzVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIuc2V0VmFsdWVDb3JlKG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGdldC9zZXQgdGhlIG51bWJlciBvZiBkeW5hbWljIHBhbmVscy5cbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIG1pblBhbmVsQ291bnRcbiAgICogQHNlZSBtYXhQYW5lbENvdW50XG4gICAqIEBzZWUgYWRkUGFuZWxcbiAgICogQHNlZSByZW1vdmVQYW5lbFxuICAgKiBAc2VlIHJlbW92ZVBhbmVsVUlcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8IHRoaXMuaXNEZXNpZ25Nb2RlXG4gICAgICA/IHRoaXMubG9hZGluZ1BhbmVsQ291bnRcbiAgICAgIDogdGhpcy5wYW5lbHMubGVuZ3RoO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAwKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHwgdGhpcy5pc0Rlc2lnbk1vZGUpIHtcbiAgICAgIHRoaXMubG9hZGluZ1BhbmVsQ291bnQgPSB2YWw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWwgPT0gdGhpcy5wYW5lbHMubGVuZ3RoIHx8IHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVCaW5kaW5ncyhcInBhbmVsQ291bnRcIiwgdmFsKTtcbiAgICB0aGlzLnByZXBhcmVWYWx1ZUZvclBhbmVsQ3JlYXRpbmcoKTtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5wYW5lbENvdW50OyBpIDwgdmFsOyBpKyspIHtcbiAgICAgIHZhciBwYW5lbCA9IHRoaXMuY3JlYXRlTmV3UGFuZWwoKTtcbiAgICAgIHRoaXMucGFuZWxzLnB1c2gocGFuZWwpO1xuICAgICAgaWYgKHRoaXMucmVuZGVyTW9kZSA9PSBcImxpc3RcIiAmJiB0aGlzLnBhbmVsc1N0YXRlICE9IFwiZGVmYXVsdFwiKSB7XG4gICAgICAgIGlmICh0aGlzLnBhbmVsc1N0YXRlID09PSBcImV4cGFuZFwiKSB7XG4gICAgICAgICAgcGFuZWwuZXhwYW5kKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCEhcGFuZWwudGl0bGUpIHtcbiAgICAgICAgICAgIHBhbmVsLmNvbGxhcHNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWwgPCB0aGlzLnBhbmVsQ291bnQpIHRoaXMucGFuZWxzLnNwbGljZSh2YWwsIHRoaXMucGFuZWxDb3VudCAtIHZhbCk7XG4gICAgdGhpcy5zZXRWYWx1ZUFmdGVyUGFuZWxzQ3JlYXRpbmcoKTtcbiAgICB0aGlzLnNldFZhbHVlQmFzZWRPblBhbmVsQ291bnQoKTtcbiAgICB0aGlzLnJlUnVuQ29uZGl0aW9uKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gYWxsb3cgdGhlIGVuZC11c2VyIHRvIGNvbGxhcHNlL2V4cGFuZCB0aGUgcGFuZWxzLiBJdCB3b3JrcyBvbmx5IGlmIHRoZSByZW5kZXJNb2RlIHByb3BlcnR5IGVxdWFscyB0byBcImxpc3RcIiBhbmQgdGVtcGxhdGVUaXRsZSBwcm9wZXJ0eSBpcyBub3QgZW1wdHkuIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBhdmFpbGFibGU6XG4gICAqIDxici8+IGRlZmF1bHQgLSB0aGUgZGVmYXVsdCB2YWx1ZS4gVXNlciBjYW4ndCBjb2xsYXBzZS9leHBhbmQgcGFuZWxzXG4gICAqIDxici8+IGV4cGFuZGVkIC0gVXNlciBjYW4gY29sbGFwc2UvZXhwYW5kIHBhbmVscyBhbmQgYWxsIHBhbmVscyBhcmUgZXhwYW5kZWQgYnkgZGVmYXVsdFxuICAgKiA8YnIvPiBjb2xsYXBzZWQgLSBVc2VyIGNhbiBjb2xsYXBzZS9leHBhbmQgcGFuZWxzIGFuZCBhbGwgcGFuZWxzIGFyZSBjb2xsYXBzZWQgYnkgZGVmYXVsdFxuICAgKiA8YnIvPiBmaXJzdEV4cGFuZGVkIC0gVXNlciBjYW4gY29sbGFwc2UvZXhwYW5kIHBhbmVscy4gVGhlIGZpcnN0IHBhbmVsIGlzIGV4cGFuZGVkIGFuZCBvdGhlcnMgYXJlIGNvbGxhcHNlZFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICogQHNlZSB0ZW1wbGF0ZVRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsc1N0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhbmVsc1N0YXRlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxzU3RhdGUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJwYW5lbHNTdGF0ZVwiLCB2YWwpO1xuICB9XG4gIHByaXZhdGUgc2V0VGVtcGxhdGVQYW5lbFN1cnZleUltcGwoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZS5zZXRTdXJ2ZXlJbXBsKFxuICAgICAgdGhpcy5pc0Rlc2lnbk1vZGVcbiAgICAgICAgPyB0aGlzLnN1cnZleUltcGxcbiAgICAgICAgOiBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNUZW1wbGF0ZVN1cnZleUltcGwodGhpcylcbiAgICApO1xuICB9XG4gIHByaXZhdGUgc2V0UGFuZWxzU3VydmV5SW1wbCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFuZWwgPSB0aGlzLnBhbmVsc1tpXTtcbiAgICAgIGlmIChwYW5lbCA9PSB0aGlzLnRlbXBsYXRlKSBjb250aW51ZTtcbiAgICAgIHBhbmVsLnNldFN1cnZleUltcGwoPFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbT5wYW5lbC5kYXRhKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZXRQYW5lbHNTdGF0ZSgpIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUgfHwgdGhpcy5yZW5kZXJNb2RlICE9IFwibGlzdFwiIHx8ICF0aGlzLnRlbXBsYXRlVGl0bGUpXG4gICAgICByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN0YXRlID0gdGhpcy5wYW5lbHNTdGF0ZTtcbiAgICAgIGlmIChzdGF0ZSA9PT0gXCJmaXJzdEV4cGFuZGVkXCIpIHtcbiAgICAgICAgc3RhdGUgPSBpID09PSAwID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIjtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFuZWxzW2ldLnN0YXRlID0gc3RhdGU7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc2V0VmFsdWVCYXNlZE9uUGFuZWxDb3VudCgpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsdWUgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB2YWx1ZSA9IFtdO1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gdGhpcy5wYW5lbENvdW50KSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IHZhbHVlLmxlbmd0aDsgaSA8IHRoaXMucGFuZWxDb3VudDsgaSsrKSB2YWx1ZS5wdXNoKHt9KTtcbiAgICBpZiAodmFsdWUubGVuZ3RoID4gdGhpcy5wYW5lbENvdW50KSB7XG4gICAgICB2YWx1ZS5zcGxpY2UodGhpcy5wYW5lbENvdW50LCB2YWx1ZS5sZW5ndGggLSB0aGlzLnBhbmVsQ291bnQpO1xuICAgIH1cbiAgICB0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkgPSB0cnVlO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkgPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1pbmltdW0gcGFuZWwgY291bnQuIEEgdXNlciBjb3VsZCBub3QgZGVsZXRlIGEgcGFuZWwgaWYgdGhlIHBhbmVsQ291bnQgZXF1YWxzIHRvIG1pblBhbmVsQ291bnRcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgbWF4UGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBtaW5QYW5lbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pblBhbmVsQ291bnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtaW5QYW5lbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDApIHZhbCA9IDA7XG4gICAgaWYgKHZhbCA9PSB0aGlzLm1pblBhbmVsQ291bnQpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5QYW5lbENvdW50XCIsIHZhbCk7XG4gICAgaWYgKHZhbCA+IHRoaXMubWF4UGFuZWxDb3VudCkgdGhpcy5tYXhQYW5lbENvdW50ID0gdmFsO1xuICAgIGlmICh0aGlzLnBhbmVsQ291bnQgPCB2YWwpIHRoaXMucGFuZWxDb3VudCA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gcGFuZWwgY291bnQuIEEgdXNlciBjb3VsZCBub3QgYWRkIGEgcGFuZWwgaWYgdGhlIHBhbmVsQ291bnQgZXF1YWxzIHRvIG1heFBhbmVsQ291bnRcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgbWluUGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBtYXhQYW5lbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgIFwibWF4UGFuZWxDb3VudFwiLFxuICAgICAgc2V0dGluZ3MucGFuZWxNYXhpbXVtUGFuZWxDb3VudFxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhQYW5lbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8PSAwKSByZXR1cm47XG4gICAgaWYgKHZhbCA+IHNldHRpbmdzLnBhbmVsTWF4aW11bVBhbmVsQ291bnQpXG4gICAgICB2YWwgPSBzZXR0aW5ncy5wYW5lbE1heGltdW1QYW5lbENvdW50O1xuICAgIGlmICh2YWwgPT0gdGhpcy5tYXhQYW5lbENvdW50KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibWF4UGFuZWxDb3VudFwiLCB2YWwpO1xuICAgIGlmICh2YWwgPCB0aGlzLm1pblBhbmVsQ291bnQpIHRoaXMubWluUGFuZWxDb3VudCA9IHZhbDtcbiAgICBpZiAodGhpcy5wYW5lbENvdW50ID4gdmFsKSB0aGlzLnBhbmVsQ291bnQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGhpZGUgdGhlICdBZGQgTmV3JyBidXR0b25cbiAgICogQHNlZSBhbGxvd1JlbW92ZVBhbmVsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFsbG93QWRkUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImFsbG93QWRkUGFuZWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBhbGxvd0FkZFBhbmVsKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImFsbG93QWRkUGFuZWxcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgdG8gaGlkZSB0aGUgJ1JlbW92ZScgYnV0dG9uXG4gICAqIEBzZWUgYWxsb3dBZGRQYW5lbFxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd1JlbW92ZVBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd1JlbW92ZVBhbmVsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dSZW1vdmVQYW5lbCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd1JlbW92ZVBhbmVsXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IGRpZmZlcmVudCBmcm9tIFwiZGVmYXVsdFwiIHRvIHNldCB0aGUgc3BlY2lmaWMgcXVlc3Rpb24gdGl0bGUgbG9jYXRpb24gZm9yIHRoZSB0ZW1wbGF0ZSBxdWVzdGlvbnMuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqIEBzZWUgUGFuZWxNb2RlbEJhc2UucXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRlbXBsYXRlVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0ZW1wbGF0ZVRpdGxlTG9jYXRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCB0ZW1wbGF0ZVRpdGxlTG9jYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRlbXBsYXRlVGl0bGVMb2NhdGlvblwiLCB2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gc2hvdy9oaWRlIHRoZSBudW1iZXJzIGluIHRpdGxlcyBpbiBxdWVzdGlvbnMgaW5zaWRlIGEgZHluYW1pYyBwYW5lbC5cbiAgICogQnkgZGVmYXVsdCB0aGUgdmFsdWUgaXMgXCJvZmZcIi4gWW91IG1heSBzZXQgaXQgdG8gXCJvblBhbmVsXCIgYW5kIHRoZSBmaXJzdCBxdWVzdGlvbiBpbnNpZGUgYSBkeW5hbWljIHBhbmVsIHdpbGwgc3RhcnQgd2l0aCAxIG9yIFwib25TdXJ2ZXlcIiB0byBpbmNsdWRlIG5lc3RlZCBxdWVzdGlvbnMgaW4gZHltYW1pYyBwYW5lbHMgaW50byBnbG9iYWwgc3VydmV5IHF1ZXN0aW9uIG51bWJlcmluZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1F1ZXN0aW9uTnVtYmVycygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1F1ZXN0aW9uTnVtYmVycyh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIiwgdmFsKTtcbiAgICBpZiAoIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24gJiYgdGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uVmlzaWJpbGl0eUNoYW5nZWQodGhpcywgdGhpcy52aXNpYmxlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNob3dzIHRoZSByYW5nZSBmcm9tIDEgdG8gcGFuZWxDb3VudCB3aGVuIHJlbmRlck1vZGUgZG9lc24ndCBlcXVhbCB0byBcImxpc3RcIi4gU2V0IHRvIGZhbHNlIHRvIGhpZGUgdGhpcyBlbGVtZW50LlxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dSYW5nZUluUHJvZ3Jlc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dSYW5nZUluUHJvZ3Jlc3NcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UmFuZ2VJblByb2dyZXNzKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dSYW5nZUluUHJvZ3Jlc3NcIiwgdmFsKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmN1cnJlbnRJbmRleENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIHByb3BlcnR5IGVxdWFscyB0byBcImxpc3RcIiBhbmQgYWxsIGR5bmFtaWMgcGFuZWxzIGFyZSByZW5kZXJlZCBvbmUgYnkgb25lIG9uIHRoZSBwYWdlLiBZb3UgbWF5IGNoYW5nZSBpdCB0bzogXCJwcm9ncmVzc1RvcFwiLCBcInByb2dyZXNzQm90dG9tXCIgb3IgXCJwcm9ncmVzc1RvcEJvdHRvbVwiIHRvIHJlbmRlciBvbmx5IG9uZSBkeW5hbWljIHBhbmVsIGF0IG9uY2UuIFRoZSBwcm9ncmVzcyBhbmQgbmF2aWdhdGlvbiBlbGVtZW50cyBjYW4gYmUgcmVuZHJlZCBvbiB0b3AsIGJvdHRvbSBvciBib3RoLlxuICAgKi9cbiAgcHVibGljIGdldCByZW5kZXJNb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlbmRlck1vZGVcIik7XG4gIH1cbiAgcHVibGljIHNldCByZW5kZXJNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyTW9kZVwiLCB2YWwpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucmVuZGVyTW9kZUNoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHJlbmRlck1vZGUgZXF1YWxzIHRvIFwibGlzdFwiLlxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSZW5kZXJNb2RlTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJNb2RlID09IFwibGlzdFwiO1xuICB9XG4gIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmlzVmlzaWJsZSkgcmV0dXJuIDA7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvblN1cnZleVwiID8gdmFsdWUgOiAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb3VudGVyID0gdGhpcy5zZXRQYW5lbFZpc2libGVJbmRleChcbiAgICAgICAgdGhpcy5wYW5lbHNbaV0sXG4gICAgICAgIHN0YXJ0SW5kZXgsXG4gICAgICAgIHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPSBcIm9mZlwiXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyA9PSBcIm9uU3VydmV5XCIpIHtcbiAgICAgICAgc3RhcnRJbmRleCArPSBjb3VudGVyO1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci5zZXRWaXNpYmxlSW5kZXgodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzICE9IFwib25TdXJ2ZXlcIiA/IHZhbHVlIDogLTEpO1xuICAgIHJldHVybiB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgIT0gXCJvblN1cnZleVwiID8gMSA6IHN0YXJ0SW5kZXggLSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIHNldFBhbmVsVmlzaWJsZUluZGV4KFxuICAgIHBhbmVsOiBQYW5lbE1vZGVsLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc2hvd0luZGV4OiBib29sZWFuXG4gICk6IG51bWJlciB7XG4gICAgaWYgKCFzaG93SW5kZXgpIHtcbiAgICAgIHBhbmVsLnNldFZpc2libGVJbmRleCgtMSk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHBhbmVsLnNldFZpc2libGVJbmRleChpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gYW4gZW5kIHVzZXIgbWF5IGFkZCBhIG5ldyBwYW5lbC4gVGhlIHF1ZXN0aW9uIGlzIG5vdCByZWFkIG9ubHkgYW5kIHBhbmVsQ291bnQgbGVzcyB0aGFuIG1heFBhbmVsQ291bnRcbiAgICogQHNlZSBpc1JlYWRPbmx5XG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIG1heFBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgY2FuQWRkUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFsbG93QWRkUGFuZWwgJiZcbiAgICAgICF0aGlzLmlzUmVhZE9ubHkgJiZcbiAgICAgIHRoaXMucGFuZWxDb3VudCA8IHRoaXMubWF4UGFuZWxDb3VudFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIGFuIGVuZCB1c2VyIG1heSByZW1vdmUgYSBwYW5lbC4gVGhlIHF1ZXN0aW9uIGlzIG5vdCByZWFkIG9ubHkgYW5kIHBhbmVsQ291bnQgaXMgbW9yZSB0aGFuIG1pblBhbmVsQ291bnRcbiAgICogQHNlZSBpc1JlYWRPbmx5XG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIG1pblBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgY2FuUmVtb3ZlUGFuZWwoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFsbG93UmVtb3ZlUGFuZWwgJiZcbiAgICAgICF0aGlzLmlzUmVhZE9ubHkgJiZcbiAgICAgIHRoaXMucGFuZWxDb3VudCA+IHRoaXMubWluUGFuZWxDb3VudFxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHJlYnVpbGRQYW5lbHMoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB0aGlzLnByZXBhcmVWYWx1ZUZvclBhbmVsQ3JlYXRpbmcoKTtcbiAgICB2YXIgcGFuZWxzID0gW107XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtKHRoaXMsIHRoaXMudGVtcGxhdGUpO1xuICAgICAgcGFuZWxzLnB1c2godGhpcy50ZW1wbGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbENvdW50OyBpKyspIHtcbiAgICAgICAgcGFuZWxzLnB1c2godGhpcy5jcmVhdGVOZXdQYW5lbCgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wYW5lbHMuc3BsaWNlKDAsIHRoaXMucGFuZWxzLmxlbmd0aCwgLi4ucGFuZWxzKTtcbiAgICB0aGlzLnNldFZhbHVlQWZ0ZXJQYW5lbHNDcmVhdGluZygpO1xuICAgIHRoaXMuc2V0UGFuZWxzU3RhdGUoKTtcbiAgICB0aGlzLnJlUnVuQ29uZGl0aW9uKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogSWYgaXQgaXMgbm90IGVtcHR5LCB0aGVuIHRoaXMgdmFsdWUgaXMgc2V0IHRvIGV2ZXJ5IG5ldyBwYW5lbCwgaW5jbHVkaW5nIHBhbmVscyBjcmVhdGVkIGluaXRpYWxseSwgdW5sZXNzIHRoZSBkZWZhdWx0VmFsdWUgaXMgbm90IGVtcHR5XG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlXG4gICAqIEBzZWUgZGVmYXVsdFZhbHVlRnJvbUxhc3RSb3dcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFBhbmVsVmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFBhbmVsVmFsdWVcIik7XG4gIH1cbiAgcHVibGljIHNldCBkZWZhdWx0UGFuZWxWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRQYW5lbFZhbHVlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIHRvIGNvcHkgdGhlIHZhbHVlIGludG8gbmV3IGFkZGVkIHBhbmVsIGZyb20gdGhlIGxhc3QgcGFuZWwuIElmIGRlZmF1bHRQYW5lbFZhbHVlIGlzIHNldCBhbmQgdGhpcyBwcm9wZXJ0eSBlcXVhbHMgdG8gdHJ1ZSxcbiAgICogdGhlbiB0aGUgdmFsdWUgZm9yIG5ldyBhZGRlZCBwYW5lbCBpcyBtZXJnaW5nLlxuICAgKiBAc2VlIGRlZmF1bHRWYWx1ZVxuICAgKiBAc2VlIGRlZmF1bHRQYW5lbFZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWxcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVmYXVsdFZhbHVlRnJvbUxhc3RQYW5lbCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJkZWZhdWx0VmFsdWVGcm9tTGFzdFBhbmVsXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGlzRGVmYXVsdFZhbHVlRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHN1cGVyLmlzRGVmYXVsdFZhbHVlRW1wdHkoKSAmJiB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRQYW5lbFZhbHVlKSB8fFxuICAgICAgIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFZhbHVlKVxuICAgICkge1xuICAgICAgc3VwZXIuc2V0RGVmYXVsdFZhbHVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0VtcHR5KCkgfHwgdGhpcy5wYW5lbENvdW50ID09IDApIHJldHVybjtcbiAgICB2YXIgbmV3VmFsdWUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxDb3VudDsgaSsrKSB7XG4gICAgICBuZXdWYWx1ZS5wdXNoKHRoaXMuZGVmYXVsdFBhbmVsVmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWwgfHwgIUFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5pc1Jvd0VtcHR5KHZhbFtpXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGdldFByb2dyZXNzSW5mbygpOiBJUHJvZ3Jlc3NJbmZvIHtcbiAgICByZXR1cm4gU3VydmV5RWxlbWVudC5nZXRQcm9ncmVzc0luZm9CeUVsZW1lbnRzKFxuICAgICAgdGhpcy5wYW5lbHMsXG4gICAgICB0aGlzLmlzUmVxdWlyZWRcbiAgICApO1xuICB9XG4gIHByaXZhdGUgaXNSb3dFbXB0eSh2YWw6IGFueSkge1xuICAgIGZvciAodmFyIHByb3AgaW4gdmFsKSB7XG4gICAgICBpZiAodmFsLmhhc093blByb3BlcnR5KHByb3ApKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBkeW5hbWljIHBhbmVsIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSBQYW5lbC4gSXQgY2hlY2tzIGlmIGNhbkFkZFBhbmVsIHJldHVybnMgdHJ1ZSBhbmQgdGhlbiBjYWxscyBhZGRQYW5lbCBtZXRob2QuXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcGFuZWxzXG4gICAqIEBzZWUgY2FuQWRkUGFuZWxcbiAgICovXG4gIHB1YmxpYyBhZGRQYW5lbFVJKCk6IFBhbmVsTW9kZWwge1xuICAgIGlmICghdGhpcy5jYW5BZGRQYW5lbCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG5ld1BhbmVsID0gdGhpcy5hZGRQYW5lbCgpO1xuICAgIGlmICh0aGlzLnJlbmRlck1vZGUgPT09IFwibGlzdFwiICYmIHRoaXMucGFuZWxzU3RhdGUgIT09IFwiZGVmYXVsdFwiKSB7XG4gICAgICBuZXdQYW5lbC5leHBhbmQoKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BhbmVsO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgZHluYW1pYyBwYW5lbCBiYXNlZCBvbiB0aGUgdGVtcGxhdGUgUGFuZWwuXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcGFuZWxzXG4gICAqL1xuICBwdWJsaWMgYWRkUGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgdGhpcy5wYW5lbENvdW50Kys7XG4gICAgaWYgKCF0aGlzLmlzUmVuZGVyTW9kZUxpc3QpIHtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5wYW5lbENvdW50IC0gMTtcbiAgICB9XG4gICAgdmFyIG5ld1ZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB2YXIgaGFzTW9kaWZpZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMuZGVmYXVsdFBhbmVsVmFsdWUpKSB7XG4gICAgICBpZiAoXG4gICAgICAgICEhbmV3VmFsdWUgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkgJiZcbiAgICAgICAgbmV3VmFsdWUubGVuZ3RoID09IHRoaXMucGFuZWxDb3VudFxuICAgICAgKSB7XG4gICAgICAgIGhhc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb3B5VmFsdWUobmV3VmFsdWVbbmV3VmFsdWUubGVuZ3RoIC0gMV0sIHRoaXMuZGVmYXVsdFBhbmVsVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLmRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWwgJiZcbiAgICAgICEhbmV3VmFsdWUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmXG4gICAgICBuZXdWYWx1ZS5sZW5ndGggPiAxICYmXG4gICAgICBuZXdWYWx1ZS5sZW5ndGggPT0gdGhpcy5wYW5lbENvdW50XG4gICAgKSB7XG4gICAgICBoYXNNb2RpZmllZCA9IHRydWU7XG4gICAgICB0aGlzLmNvcHlWYWx1ZShcbiAgICAgICAgbmV3VmFsdWVbbmV3VmFsdWUubGVuZ3RoIC0gMV0sXG4gICAgICAgIG5ld1ZhbHVlW25ld1ZhbHVlLmxlbmd0aCAtIDJdXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaGFzTW9kaWZpZWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5keW5hbWljUGFuZWxBZGRlZCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5wYW5lbHNbdGhpcy5wYW5lbENvdW50IC0gMV07XG4gIH1cbiAgcHJpdmF0ZSBjb3B5VmFsdWUoc3JjOiBhbnksIGRlc3Q6IGFueSkge1xuICAgIGZvciAodmFyIGtleSBpbiBkZXN0KSB7XG4gICAgICBzcmNba2V5XSA9IGRlc3Rba2V5XTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgcmVtb3ZlUGFuZWwgZnVuY3Rpb24uIERvIG5vdGhpbmcgaXMgY2FuUmVtb3ZlUGFuZWwgcmV0dXJucyBmYWxzZS4gSWYgY29uZmlybURlbGV0ZSBzZXQgdG8gdHJ1ZSwgaXQgc2hvd3MgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgZmlyc3QuXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHBhbmVsIG9yIHBhbmVsIGluZGV4XG4gICAqIEBzZWUgcmVtb3ZlUGFuZWxcbiAgICogQHNlZSBjb25maXJtRGVsZXRlXG4gICAqIEBzZWUgY29uZmlybURlbGV0ZVRleHRcbiAgICogQHNlZSBjYW5SZW1vdmVQYW5lbFxuICAgKlxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhbmVsVUkodmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5jYW5SZW1vdmVQYW5lbCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jb25maXJtRGVsZXRlIHx8IGNvbmZpcm1BY3Rpb24odGhpcy5jb25maXJtRGVsZXRlVGV4dCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlUGFuZWwodmFsdWUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogR29lcyB0byB0aGUgbmV4dCBwYW5lbCBpbiB0aGUgUGFuZWxEeW5hbWljXG4gICAqXG4gICAqL1xuICBwdWJsaWMgZ29Ub05leHRQYW5lbCgpIHtcbiAgICBpZiAodGhpcy5yZW5kZXJNb2RlICE9PSBcImxpc3RcIiAmJiB0aGlzLmN1cnJlbnRQYW5lbC5oYXNFcnJvcnMoKSkgcmV0dXJuO1xuICAgIHRoaXMuY3VycmVudEluZGV4Kys7XG4gIH1cbiAgLyoqXG4gICAqIEdvZXMgdG8gdGhlIHByZXZpb3VzIHBhbmVsIGluIHRoZSBQYW5lbER5bmFtaWNcbiAgICpcbiAgICovXG4gIHB1YmxpYyBnb1RvUHJldlBhbmVsKCkge1xuICAgIHRoaXMuY3VycmVudEluZGV4LS07XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBkeW5hbWljIHBhbmVsIGZyb20gdGhlIHBhbmVscyBhcnJheS5cbiAgICogQHBhcmFtIHZhbHVlIGEgcGFuZWwgb3IgcGFuZWwgaW5kZXhcbiAgICogQHNlZSBwYW5lbHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhbmVsKHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmdldFBhbmVsSW5kZXgodmFsdWUpO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5wYW5lbENvdW50KSByZXR1cm47XG4gICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbHNbaW5kZXhdO1xuICAgIHRoaXMucGFuZWxzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy51cGRhdGVCaW5kaW5ncyhcInBhbmVsQ291bnRcIiwgdGhpcy5wYW5lbENvdW50KTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsdWUgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGluZGV4ID49IHZhbHVlLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IHRydWU7XG4gICAgdmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LmR5bmFtaWNQYW5lbFJlbW92ZWQodGhpcywgaW5kZXgsIHBhbmVsKTtcbiAgICB0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkgPSBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGdldFBhbmVsSW5kZXgodmFsOiBhbnkpOiBudW1iZXIge1xuICAgIGlmIChIZWxwZXJzLmlzTnVtYmVyKHZhbCkpIHJldHVybiB2YWw7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5wYW5lbHNbaV0gPT09IHZhbCB8fCBpdGVtc1tpXSA9PT0gdmFsKSByZXR1cm4gaTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHB1YmxpYyBsb2NTdHJzQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5sb2NTdHJzQ2hhbmdlZCgpO1xuICAgIHZhciBwYW5lbHMgPSB0aGlzLnBhbmVscztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgcGFuZWxzW2ldLmxvY1N0cnNDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjbGVhckluY29ycmVjdFZhbHVlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNsZWFySW5jb3JyZWN0VmFsdWVzSW5QYW5lbChpKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNsZWFyRXJyb3JzKCkge1xuICAgIHN1cGVyLmNsZWFyRXJyb3JzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbHNbaV0uY2xlYXJFcnJvcnMoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldFF1ZXN0aW9uRnJvbUFycmF5KG5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IElRdWVzdGlvbiB7XG4gICAgaWYgKGluZGV4ID49IHRoaXMucGFuZWxDb3VudCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxzW2luZGV4XS5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgfVxuICBwcml2YXRlIGNsZWFySW5jb3JyZWN0VmFsdWVzSW5QYW5lbChpbmRleDogbnVtYmVyKSB7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5wYW5lbHNbaW5kZXhdO1xuICAgIHBhbmVsLmNsZWFySW5jb3JyZWN0VmFsdWVzKCk7XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgdmFyIHZhbHVlcyA9ICEhdmFsICYmIGluZGV4IDwgdmFsLmxlbmd0aCA/IHZhbFtpbmRleF0gOiBudWxsO1xuICAgIGlmICghdmFsdWVzKSByZXR1cm47XG4gICAgdmFyIGlzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZXMpIHtcbiAgICAgIGlmKHRoaXMuZ2V0U2hhcmVkUXVlc3Rpb25Gcm9tQXJyYXkoa2V5LCBpbmRleCkpIGNvbnRpbnVlO1xuICAgICAgdmFyIHEgPSBwYW5lbC5nZXRRdWVzdGlvbkJ5TmFtZShrZXkpO1xuICAgICAgaWYoISFxKSBjb250aW51ZTtcbiAgICAgIGlmKGtleS5pbmRleE9mKHNldHRpbmdzLmNvbW1lbnRQcmVmaXgpID09IGtleS5sZW5ndGggLSBzZXR0aW5ncy5jb21tZW50UHJlZml4Lmxlbmd0aCkge1xuICAgICAgICBxID0gcGFuZWwuZ2V0UXVlc3Rpb25CeU5hbWUoa2V5LnN1YnN0cigwLCBrZXkuaW5kZXhPZihzZXR0aW5ncy5jb21tZW50UHJlZml4KSkpO1xuICAgICAgICBpZighIXEpIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGVsZXRlIHZhbHVlc1trZXldO1xuICAgICAgaXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzQ2hhbmdlZCkge1xuICAgICAgdmFsW2luZGV4XSA9IHZhbHVlcztcbiAgICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRTaGFyZWRRdWVzdGlvbkZyb21BcnJheShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFuZWxJbmRleDogbnVtYmVyXG4gICk6IFF1ZXN0aW9uIHtcbiAgICByZXR1cm4gISF0aGlzLnN1cnZleSAmJiAhIXRoaXMudmFsdWVOYW1lXG4gICAgICA/IDxRdWVzdGlvbj4oXG4gICAgICAgICAgdGhpcy5zdXJ2ZXkuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZUZyb21BcnJheShcbiAgICAgICAgICAgIHRoaXMudmFsdWVOYW1lLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHBhbmVsSW5kZXhcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgYWRkQ29uZGl0aW9uT2JqZWN0c0J5Q29udGV4dChcbiAgICBvYmplY3RzOiBBcnJheTxJQ29uZGl0aW9uT2JqZWN0PixcbiAgICBjb250ZXh0OiBhbnlcbiAgKSB7XG4gICAgdmFyIGhhc0NvbnRleHQgPSAhIWNvbnRleHRcbiAgICAgID8gdGhpcy50ZW1wbGF0ZS5xdWVzdGlvbnMuaW5kZXhPZihjb250ZXh0KSA+IC0xXG4gICAgICA6IGZhbHNlO1xuICAgIHZhciBwcmVmaXhOYW1lID0gdGhpcy5nZXRWYWx1ZU5hbWUoKSArIFwiWzBdLlwiO1xuICAgIHZhciBwcmVmaXhUZXh0ID0gdGhpcy5wcm9jZXNzZWRUaXRsZSArIFwiWzBdLlwiO1xuICAgIHZhciBwYW5lbE9ianMgPSBuZXcgQXJyYXk8SUNvbmRpdGlvbk9iamVjdD4oKTtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy50ZW1wbGF0ZS5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5hZGRDb25kaXRpb25PYmplY3RzQnlDb250ZXh0KHBhbmVsT2JqcywgY29udGV4dCk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxPYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goe1xuICAgICAgICBuYW1lOiBwcmVmaXhOYW1lICsgcGFuZWxPYmpzW2ldLm5hbWUsXG4gICAgICAgIHRleHQ6IHByZWZpeFRleHQgKyBwYW5lbE9ianNbaV0udGV4dCxcbiAgICAgICAgcXVlc3Rpb246IHBhbmVsT2Jqc1tpXS5xdWVzdGlvbixcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaGFzQ29udGV4dCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbE9ianMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhbmVsT2Jqc1tpXS5xdWVzdGlvbiA9PSBjb250ZXh0KSBjb250aW51ZTtcbiAgICAgICAgb2JqZWN0cy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBcInBhbmVsLlwiICsgcGFuZWxPYmpzW2ldLm5hbWUsXG4gICAgICAgICAgdGV4dDogXCJwYW5lbC5cIiArIHBhbmVsT2Jqc1tpXS50ZXh0LFxuICAgICAgICAgIHF1ZXN0aW9uOiBwYW5lbE9ianNbaV0ucXVlc3Rpb24sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvcjogc3RyaW5nID0gbnVsbCwgcGF0aDogc3RyaW5nID0gbnVsbCk6IGFueSB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gc3VwZXIuZ2V0Q29uZGl0aW9uSnNvbihvcGVyYXRvciwgcGF0aCk7XG4gICAgdmFyIHF1ZXN0aW9uTmFtZSA9IHBhdGg7XG4gICAgdmFyIHBvcyA9IHBhdGguaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKHBvcyA+IC0xKSB7XG4gICAgICBxdWVzdGlvbk5hbWUgPSBwYXRoLnN1YnN0cigwLCBwb3MpO1xuICAgICAgcGF0aCA9IHBhdGguc3Vic3RyKHBvcyArIDEpO1xuICAgIH1cbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLnRlbXBsYXRlLmdldFF1ZXN0aW9uQnlOYW1lKHF1ZXN0aW9uTmFtZSk7XG4gICAgaWYgKCFxdWVzdGlvbikgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHF1ZXN0aW9uLmdldENvbmRpdGlvbkpzb24ob3BlcmF0b3IsIHBhdGgpO1xuICB9XG4gIHByb3RlY3RlZCBvblJlYWRPbmx5Q2hhbmdlZCgpIHtcbiAgICB2YXIgcmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHk7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZWFkT25seSA9IHJlYWRPbmx5O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFuZWxzW2ldLnJlYWRPbmx5ID0gcmVhZE9ubHk7XG4gICAgfVxuICAgIHN1cGVyLm9uUmVhZE9ubHlDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgIHRoaXMudGVtcGxhdGUub25TdXJ2ZXlMb2FkKCk7XG4gICAgaWYgKHRoaXMubG9hZGluZ1BhbmVsQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLnBhbmVsQ291bnQgPSB0aGlzLmxvYWRpbmdQYW5lbENvdW50O1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHtcbiAgICAgIHRoaXMucmVidWlsZFBhbmVscygpO1xuICAgIH1cbiAgICB0aGlzLnNldFBhbmVsc1N1cnZleUltcGwoKTtcbiAgICB0aGlzLnNldFBhbmVsc1N0YXRlKCk7XG4gICAgdGhpcy5hc3NpZ25PblByb3BlcnR5Q2hhbmdlZFRvVGVtcGxhdGUoKTtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgfVxuICBwdWJsaWMgb25GaXJzdFJlbmRlcmluZygpIHtcbiAgICB0aGlzLnRlbXBsYXRlLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhbmVsc1tpXS5vbkZpcnN0UmVuZGVyaW5nKCk7XG4gICAgfVxuICAgIHN1cGVyLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5ydW5QYW5lbHNDb25kaXRpb24odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBwcml2YXRlIHJlUnVuQ29uZGl0aW9uKCkge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm47XG4gICAgdGhpcy5ydW5Db25kaXRpb24oXG4gICAgICB0aGlzLmdldERhdGFGaWx0ZXJlZFZhbHVlcygpLFxuICAgICAgdGhpcy5nZXREYXRhRmlsdGVyZWRQcm9wZXJ0aWVzKClcbiAgICApO1xuICB9XG4gIHByb3RlY3RlZCBydW5QYW5lbHNDb25kaXRpb24oXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICB2YXIgY2FjaGVkVmFsdWVzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBpZiAodmFsdWVzICYmIHZhbHVlcyBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZXMpKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhbmVsVmFsdWVzID0gdGhpcy5nZXRQYW5lbEl0ZW1EYXRhKHRoaXMucGFuZWxzW2ldLmRhdGEpO1xuICAgICAgLy9TaG91bGQgYmUgdW5pcXVlIGZvciBldmVyeSBwYW5lbCBkdWUgYXN5bmMgZXhwcmVzc2lvbiBzdXBwb3J0XG4gICAgICB2YXIgbmV3VmFsdWVzID0gSGVscGVycy5jcmVhdGVDb3B5KGNhY2hlZFZhbHVlcyk7XG4gICAgICBuZXdWYWx1ZXNbXG4gICAgICAgIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JdGVtVmFyaWFibGVOYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgIF0gPSBwYW5lbFZhbHVlcztcbiAgICAgIG5ld1ZhbHVlc1tRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSW5kZXhWYXJpYWJsZU5hbWUudG9Mb3dlckNhc2UoKV0gPSBpO1xuICAgICAgdGhpcy5wYW5lbHNbaV0ucnVuQ29uZGl0aW9uKG5ld1ZhbHVlcywgcHJvcGVydGllcyk7XG4gICAgfVxuICB9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFuZWxzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgICAgdGhpcy5wYW5lbHNbaV0ub25BbnlWYWx1ZUNoYW5nZWQoXG4gICAgICAgIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbS5JdGVtVmFyaWFibGVOYW1lXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGhhc0tleXNEdXBsaWNhdGVkKGZpcmVDYWxsYmFjazogYm9vbGVhbiwgcmVjOiBhbnkgPSBudWxsKSB7XG4gICAgdmFyIGtleVZhbHVlczogQXJyYXk8YW55PiA9IFtdO1xuICAgIHZhciByZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzID1cbiAgICAgICAgdGhpcy5pc1ZhbHVlRHVwbGljYXRlZCh0aGlzLnBhbmVsc1tpXSwga2V5VmFsdWVzLCByZWMsIGZpcmVDYWxsYmFjaykgfHxcbiAgICAgICAgcmVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlUGFuZWxzQ29udGFpbnNFcnJvcnMoKSB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5jaGFuZ2luZ1ZhbHVlUXVlc3Rpb247XG4gICAgdmFyIHBhcmVudCA9IDxQYW5lbD5xdWVzdGlvbi5wYXJlbnQ7XG4gICAgd2hpbGUgKCEhcGFyZW50KSB7XG4gICAgICBwYXJlbnQudXBkYXRlQ29udGFpbnNFcnJvcnMoKTtcbiAgICAgIHBhcmVudCA9IDxQYW5lbD5wYXJlbnQucGFyZW50O1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNvbnRhaW5zRXJyb3JzKCk7XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLCByZWM6IGFueSA9IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5KSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIGlmICghIXRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5jaGFuZ2luZ1ZhbHVlUXVlc3Rpb24uaGFzRXJyb3JzKGZpcmVDYWxsYmFjaywgcmVjKTtcbiAgICAgIHJlcyA9IHRoaXMuaGFzS2V5c0R1cGxpY2F0ZWQoZmlyZUNhbGxiYWNrLCByZWMpIHx8IHJlcztcbiAgICAgIHRoaXMudXBkYXRlUGFuZWxzQ29udGFpbnNFcnJvcnMoKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlcnJvc0luUGFuZWxzID0gdGhpcy5oYXNFcnJvckluUGFuZWxzKGZpcmVDYWxsYmFjaywgcmVjKTtcbiAgICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCBlcnJvc0luUGFuZWxzO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Q29udGFpbnNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IHN1cGVyLmdldENvbnRhaW5zRXJyb3JzKCk7XG4gICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5wYW5lbHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwYW5lbHNbaV0uY29udGFpbnNFcnJvcnMpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzQW5zd2VyZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdXBlci5nZXRJc0Fuc3dlcmVkKCkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5wYW5lbHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2aXNpYmxlUXVlc3Rpb25zID0gPEFycmF5PGFueT4+W107XG4gICAgICBwYW5lbHNbaV0uYWRkUXVlc3Rpb25zVG9MaXN0KHZpc2libGVRdWVzdGlvbnMsIHRydWUpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2aXNpYmxlUXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICghdmlzaWJsZVF1ZXN0aW9uc1tqXS5pc0Fuc3dlcmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBjbGVhclZhbHVlSWZJbnZpc2libGUoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucGFuZWxzW2ldLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHF1ZXN0aW9uc1tqXS5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIuY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElzUnVubmluZ1ZhbGlkYXRvcnMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHN1cGVyLmdldElzUnVubmluZ1ZhbGlkYXRvcnMoKSkgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucGFuZWxzW2ldLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChxdWVzdGlvbnNbal0uaXNSdW5uaW5nVmFsaWRhdG9ycykgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHJlc3VsdCA9IHN1cGVyLmdldEFsbEVycm9ycygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhbmVsc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgZXJyb3JzID0gcXVlc3Rpb25zW2pdLmdldEFsbEVycm9ycygpO1xuICAgICAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChlcnJvcnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZUNvcmUoa2V5c0FzVGV4dDogYm9vbGVhbiwgdmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuY3JlYXRlVmFsdWVDb3B5KCk7XG4gICAgaWYgKCF2YWx1ZXMgfHwgIUFycmF5LmlzQXJyYXkodmFsdWVzKSkgcmV0dXJuIHZhbHVlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aCAmJiBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsID0gdmFsdWVzW2ldO1xuICAgICAgaWYgKCF2YWwpIGNvbnRpbnVlO1xuICAgICAgdmFsdWVzW2ldID0gdGhpcy5nZXRQYW5lbERpc3BsYXlWYWx1ZShpLCB2YWwsIGtleXNBc1RleHQpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYW5lbERpc3BsYXlWYWx1ZShcbiAgICBwYW5lbEluZGV4OiBudW1iZXIsXG4gICAgdmFsOiBhbnksXG4gICAga2V5c0FzVGV4dDogYm9vbGVhblxuICApOiBhbnkge1xuICAgIGlmICghdmFsKSByZXR1cm4gdmFsO1xuICAgIHZhciBwYW5lbCA9IHRoaXMucGFuZWxzW3BhbmVsSW5kZXhdO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWwpIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHBhbmVsLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoa2V5KTtcbiAgICAgIGlmICghcXVlc3Rpb24pIHtcbiAgICAgICAgcXVlc3Rpb24gPSB0aGlzLmdldFNoYXJlZFF1ZXN0aW9uRnJvbUFycmF5KGtleSwgcGFuZWxJbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAoISFxdWVzdGlvbikge1xuICAgICAgICB2YWxba2V5XSA9IHF1ZXN0aW9uLmdldERpc3BsYXlWYWx1ZShrZXlzQXNUZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9ySW5QYW5lbHMoZmlyZUNhbGxiYWNrOiBib29sZWFuLCByZWM6IGFueSk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICB2YXIgcGFuZWxzID0gdGhpcy5wYW5lbHM7XG4gICAgdmFyIGtleVZhbHVlczogQXJyYXk8YW55PiA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnNldE9uQ29tcGxldGVBc3luY0luUGFuZWwocGFuZWxzW2ldKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwbmxFcnJvciA9IHBhbmVsc1tpXS5oYXNFcnJvcnMoXG4gICAgICAgIGZpcmVDYWxsYmFjayxcbiAgICAgICAgISFyZWMgJiYgcmVjLmZvY3VzZU9uRmlyc3RFcnJvcixcbiAgICAgICAgcmVjXG4gICAgICApO1xuICAgICAgcG5sRXJyb3IgPSB0aGlzLmlzVmFsdWVEdXBsaWNhdGVkKHBhbmVsc1tpXSwga2V5VmFsdWVzLCByZWMpIHx8IHBubEVycm9yO1xuICAgICAgaWYgKCF0aGlzLmlzUmVuZGVyTW9kZUxpc3QgJiYgcG5sRXJyb3IgJiYgIXJlcykge1xuICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IGk7XG4gICAgICB9XG4gICAgICByZXMgPSBwbmxFcnJvciB8fCByZXM7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJpdmF0ZSBzZXRPbkNvbXBsZXRlQXN5bmNJblBhbmVsKHBhbmVsOiBQYW5lbE1vZGVsKSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHBhbmVsLnF1ZXN0aW9ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVlc3Rpb25zW2ldLm9uQ29tcGxldGVkQXN5bmNWYWxpZGF0b3JzID0gKGhhc0Vycm9yczogYm9vbGVhbikgPT4ge1xuICAgICAgICB0aGlzLnJhaXNlT25Db21wbGV0ZWRBc3luY1ZhbGlkYXRvcnMoKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNWYWx1ZUR1cGxpY2F0ZWQoXG4gICAgcGFuZWw6IFBhbmVsTW9kZWwsXG4gICAga2V5VmFsdWVzOiBBcnJheTxhbnk+LFxuICAgIHJlYzogYW55LFxuICAgIGZpcmVDYWxsYmFjaz86IGJvb2xlYW5cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmtleU5hbWUpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcXVlc3Rpb24gPSA8UXVlc3Rpb24+cGFuZWwuZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZSh0aGlzLmtleU5hbWUpO1xuICAgIGlmICghcXVlc3Rpb24gfHwgcXVlc3Rpb24uaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHZhbHVlID0gcXVlc3Rpb24udmFsdWU7XG4gICAgaWYgKFxuICAgICAgISF0aGlzLmNoYW5naW5nVmFsdWVRdWVzdGlvbiAmJlxuICAgICAgcXVlc3Rpb24gIT0gdGhpcy5jaGFuZ2luZ1ZhbHVlUXVlc3Rpb25cbiAgICApIHtcbiAgICAgIHF1ZXN0aW9uLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2ssIHJlYyk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsdWUgPT0ga2V5VmFsdWVzW2ldKSB7XG4gICAgICAgIHF1ZXN0aW9uLmFkZEVycm9yKFxuICAgICAgICAgIG5ldyBLZXlEdXBsaWNhdGlvbkVycm9yKHRoaXMua2V5RHVwbGljYXRpb25FcnJvciwgdGhpcylcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhcmVjICYmICFyZWMuZmlyc3RFcnJvclF1ZXN0aW9uKSB7XG4gICAgICAgICAgcmVjLmZpcnN0RXJyb3JRdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBrZXlWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgcGFuZWwgPSB0aGlzLmNyZWF0ZUFuZFNldHVwTmV3UGFuZWxPYmplY3QoKTtcbiAgICB2YXIganNvbiA9IHRoaXMudGVtcGxhdGUudG9KU09OKCk7XG4gICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBwYW5lbCk7XG4gICAgcGFuZWwucmVuZGVyV2lkdGggPSBcIjEwMCVcIjtcbiAgICBwYW5lbC51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSh0aGlzLCBwYW5lbCk7XG4gICAgcGFuZWwub25GaXJzdFJlbmRlcmluZygpO1xuICAgIHJldHVybiBwYW5lbDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlQW5kU2V0dXBOZXdQYW5lbE9iamVjdCgpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgcGFuZWwgPSB0aGlzLmNyZWF0ZU5ld1BhbmVsT2JqZWN0KCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHBhbmVsLm9uR2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0VGVtcGxhdGVRdWVzdGlvblRpdGxlTG9jYXRpb24oKTtcbiAgICB9O1xuICAgIHJldHVybiBwYW5lbDtcbiAgfVxuICBwcml2YXRlIGdldFRlbXBsYXRlUXVlc3Rpb25UaXRsZUxvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVGl0bGVMb2NhdGlvbiAhPSBcImRlZmF1bHRcIlxuICAgICAgPyB0aGlzLnRlbXBsYXRlVGl0bGVMb2NhdGlvblxuICAgICAgOiB0aGlzLmdldFRpdGxlTG9jYXRpb25Db3JlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhbmVsT2JqZWN0KCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbCgpO1xuICB9XG4gIHByaXZhdGUgc2V0UGFuZWxDb3VudEJhc2VkT25WYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5IHx8IHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgdmFyIG5ld1BhbmVsQ291bnQgPSB2YWwgJiYgQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLmxlbmd0aCA6IDA7XG4gICAgaWYgKG5ld1BhbmVsQ291bnQgPT0gMCAmJiB0aGlzLmxvYWRpbmdQYW5lbENvdW50ID4gMCkge1xuICAgICAgbmV3UGFuZWxDb3VudCA9IHRoaXMubG9hZGluZ1BhbmVsQ291bnQ7XG4gICAgfVxuICAgIHRoaXMucGFuZWxDb3VudCA9IG5ld1BhbmVsQ291bnQ7XG4gIH1cbiAgcHVibGljIHNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLnNldFF1ZXN0aW9uVmFsdWUobmV3VmFsdWUsIGZhbHNlKTtcbiAgICB0aGlzLnNldFBhbmVsQ291bnRCYXNlZE9uVmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhbmVsVXBkYXRlVmFsdWVGcm9tU3VydmV5KHRoaXMucGFuZWxzW2ldKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVJc0Fuc3dlcmVkKCk7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5vblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYW5lbFN1cnZleVZhbHVlQ2hhbmdlZCh0aGlzLnBhbmVsc1tpXSk7XG4gICAgfVxuICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldFZhbHVlQmFzZWRPblBhbmVsQ291bnQoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBwYW5lbFVwZGF0ZVZhbHVlRnJvbVN1cnZleShwYW5lbDogUGFuZWxNb2RlbCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSBwYW5lbC5xdWVzdGlvbnM7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0UGFuZWxJdGVtRGF0YShwYW5lbC5kYXRhKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBxLnVwZGF0ZVZhbHVlRnJvbVN1cnZleSh2YWx1ZXNbcS5nZXRWYWx1ZU5hbWUoKV0pO1xuICAgICAgcS51cGRhdGVDb21tZW50RnJvbVN1cnZleShcbiAgICAgICAgdmFsdWVzW3EuZ2V0VmFsdWVOYW1lKCkgKyBzZXR0aW5ncy5jb21tZW50UHJlZml4XVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBwYW5lbFN1cnZleVZhbHVlQ2hhbmdlZChwYW5lbDogUGFuZWxNb2RlbCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSBwYW5lbC5xdWVzdGlvbnM7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZ2V0UGFuZWxJdGVtRGF0YShwYW5lbC5kYXRhKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBxLm9uU3VydmV5VmFsdWVDaGFuZ2VkKHZhbHVlc1txLmdldFZhbHVlTmFtZSgpXSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvblNldERhdGEoKSB7XG4gICAgc3VwZXIub25TZXREYXRhKCk7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLnNldFRlbXBsYXRlUGFuZWxTdXJ2ZXlJbXBsKCk7XG4gICAgICB0aGlzLnJlYnVpbGRQYW5lbHMoKTtcbiAgICB9XG4gIH1cbiAgLy9JUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhXG4gIGdldEl0ZW1JbmRleChpdGVtOiBJU3VydmV5RGF0YSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgfVxuICBnZXRQYW5lbEl0ZW1EYXRhKGl0ZW06IElTdXJ2ZXlEYXRhKTogYW55IHtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zO1xuICAgIHZhciBpbmRleCA9IGl0ZW1zLmluZGV4T2YoaXRlbSk7XG4gICAgdmFyIHFWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKGluZGV4IDwgMCAmJiBBcnJheS5pc0FycmF5KHFWYWx1ZSkgJiYgcVZhbHVlLmxlbmd0aCA+IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgaW5kZXggPSBpdGVtcy5sZW5ndGg7XG4gICAgfVxuICAgIGlmIChpbmRleCA8IDApIHJldHVybiB7fTtcbiAgICBpZiAoIXFWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShxVmFsdWUpIHx8IHFWYWx1ZS5sZW5ndGggPD0gaW5kZXgpIHJldHVybiB7fTtcbiAgICByZXR1cm4gcVZhbHVlW2luZGV4XTtcbiAgfVxuICBzZXRQYW5lbEl0ZW1EYXRhKGl0ZW06IElTdXJ2ZXlEYXRhLCBuYW1lOiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICB2YXIgaW5kZXggPSBpdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gaXRlbXMubGVuZ3RoO1xuICAgIHZhciBxVmFsdWUgPSBIZWxwZXJzLmdldFVuYmluZFZhbHVlKHRoaXMudmFsdWUpO1xuICAgIGlmICghcVZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHFWYWx1ZSkpIHtcbiAgICAgIHFWYWx1ZSA9IFtdO1xuICAgIH1cbiAgICBpZiAocVZhbHVlLmxlbmd0aCA8PSBpbmRleCkge1xuICAgICAgZm9yICh2YXIgaSA9IHFWYWx1ZS5sZW5ndGg7IGkgPD0gaW5kZXg7IGkrKykge1xuICAgICAgICBxVmFsdWUucHVzaCh7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcVZhbHVlW2luZGV4XSkgcVZhbHVlW2luZGV4XSA9IHt9O1xuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkge1xuICAgICAgcVZhbHVlW2luZGV4XVtuYW1lXSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHFWYWx1ZVtpbmRleF1bbmFtZV07XG4gICAgfVxuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5wYW5lbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNoYW5naW5nVmFsdWVRdWVzdGlvbiA9IHRoaXMucGFuZWxzW2luZGV4XS5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKFxuICAgICAgICBuYW1lXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gcVZhbHVlO1xuICAgIHRoaXMuY2hhbmdpbmdWYWx1ZVF1ZXN0aW9uID0gbnVsbDtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBxdWVzdGlvbjogdGhpcyxcbiAgICAgICAgcGFuZWw6ICg8UXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtPml0ZW0pLnBhbmVsLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBpdGVtSW5kZXg6IGluZGV4LFxuICAgICAgICBpdGVtVmFsdWU6IHFWYWx1ZVtpbmRleF0sXG4gICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICB9O1xuICAgICAgdGhpcy5zdXJ2ZXkuZHluYW1pY1BhbmVsSXRlbVZhbHVlQ2hhbmdlZCh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleTtcbiAgfVxuICBnZXRSb290RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YTtcbiAgfVxuICBwdWJsaWMgZ2V0UGxhaW5EYXRhKFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGluY2x1ZGVFbXB0eT86IGJvb2xlYW47XG4gICAgICBjYWxjdWxhdGlvbnM/OiBBcnJheTx7XG4gICAgICAgIHByb3BlcnR5TmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgfSA9IHtcbiAgICAgIGluY2x1ZGVFbXB0eTogdHJ1ZSxcbiAgICB9XG4gICkge1xuICAgIHZhciBxdWVzdGlvblBsYWluRGF0YSA9IHN1cGVyLmdldFBsYWluRGF0YShvcHRpb25zKTtcbiAgICBpZiAoISFxdWVzdGlvblBsYWluRGF0YSkge1xuICAgICAgcXVlc3Rpb25QbGFpbkRhdGEuaXNOb2RlID0gdHJ1ZTtcbiAgICAgIHF1ZXN0aW9uUGxhaW5EYXRhLmRhdGEgPSB0aGlzLnBhbmVscy5tYXAoXG4gICAgICAgIChwYW5lbDogUGFuZWxNb2RlbCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHZhciBwYW5lbERhdGFJdGVtID0gPGFueT57XG4gICAgICAgICAgICBuYW1lOiBwYW5lbC5uYW1lIHx8IGluZGV4LFxuICAgICAgICAgICAgdGl0bGU6IHBhbmVsLnRpdGxlIHx8IFwiUGFuZWxcIixcbiAgICAgICAgICAgIHZhbHVlOiBwYW5lbC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgZGlzcGxheVZhbHVlOiBwYW5lbC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgZ2V0U3RyaW5nOiAodmFsOiBhbnkpID0+XG4gICAgICAgICAgICAgIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeSh2YWwpIDogdmFsLFxuICAgICAgICAgICAgaXNOb2RlOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogcGFuZWwucXVlc3Rpb25zXG4gICAgICAgICAgICAgIC5tYXAoKHF1ZXN0aW9uOiBRdWVzdGlvbikgPT4gcXVlc3Rpb24uZ2V0UGxhaW5EYXRhKG9wdGlvbnMpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChkOiBhbnkpID0+ICEhZCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICAob3B0aW9ucy5jYWxjdWxhdGlvbnMgfHwgW10pLmZvckVhY2goKGNhbGN1bGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBwYW5lbERhdGFJdGVtW2NhbGN1bGF0aW9uLnByb3BlcnR5TmFtZV0gPSAoPGFueT5wYW5lbClbXG4gICAgICAgICAgICAgIGNhbGN1bGF0aW9uLnByb3BlcnR5TmFtZVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcGFuZWxEYXRhSXRlbTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9uUGxhaW5EYXRhO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVFbGVtZW50Q3NzKCkge1xuICAgIHN1cGVyLnVwZGF0ZUVsZW1lbnRDc3MoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFuZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLnBhbmVsc1tpXTtcbiAgICAgIGVsLnVwZGF0ZUVsZW1lbnRDc3MoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBwcm9ncmVzc1RleHQoKTogc3RyaW5nIHtcbiAgICB2YXIgcmFuZ2VNYXggPSB0aGlzLnBhbmVsQ291bnQ7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcInBhbmVsRHluYW1pY1Byb2dyZXNzVGV4dFwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMuY3VycmVudEluZGV4ICsgMSwgcmFuZ2VNYXgpO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicGFuZWxkeW5hbWljXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcInRlbXBsYXRlRWxlbWVudHNcIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJxdWVzdGlvbnNcIixcbiAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgaXNMaWdodFNlcmlhbGl6YWJsZTogZmFsc2UsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidGVtcGxhdGVUaXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZW1wbGF0ZVRpdGxlXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRlbXBsYXRlRGVzY3JpcHRpb246dGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RlbXBsYXRlRGVzY3JpcHRpb25cIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJhbGxvd0FkZFBhbmVsOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJhbGxvd1JlbW92ZVBhbmVsOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGFuZWxDb3VudDpudW1iZXJcIixcbiAgICAgIGlzQmluZGFibGU6IHRydWUsXG4gICAgICBkZWZhdWx0OiAwLFxuICAgICAgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJtaW5QYW5lbENvdW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBtaW5WYWx1ZTogMCB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4UGFuZWxDb3VudDpudW1iZXJcIixcbiAgICAgIGRlZmF1bHQ6IHNldHRpbmdzLnBhbmVsTWF4aW11bVBhbmVsQ291bnQsXG4gICAgfSxcbiAgICBcImRlZmF1bHRQYW5lbFZhbHVlOnBhbmVsdmFsdWVcIixcbiAgICBcImRlZmF1bHRWYWx1ZUZyb21MYXN0UGFuZWw6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGFuZWxzU3RhdGVcIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcImNvbGxhcHNlZFwiLCBcImV4cGFuZGVkXCIsIFwiZmlyc3RFeHBhbmRlZFwiXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJrZXlOYW1lXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImtleUR1cGxpY2F0aW9uRXJyb3JcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NLZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiY29uZmlybURlbGV0ZTpib29sZWFuXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29uZmlybURlbGV0ZVRleHRcIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJwYW5lbEFkZFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsQWRkVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsUmVtb3ZlVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFuZWxSZW1vdmVUZXh0XCIgfSxcbiAgICB7IG5hbWU6IFwicGFuZWxQcmV2VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFuZWxQcmV2VGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsTmV4dFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsTmV4dFRleHRcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLFxuICAgICAgZGVmYXVsdDogXCJvZmZcIixcbiAgICAgIGNob2ljZXM6IFtcIm9mZlwiLCBcIm9uUGFuZWxcIiwgXCJvblN1cnZleVwiXSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJzaG93UmFuZ2VJblByb2dyZXNzOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmVuZGVyTW9kZVwiLFxuICAgICAgZGVmYXVsdDogXCJsaXN0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJsaXN0XCIsIFwicHJvZ3Jlc3NUb3BcIiwgXCJwcm9ncmVzc0JvdHRvbVwiLCBcInByb2dyZXNzVG9wQm90dG9tXCJdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ0ZW1wbGF0ZVRpdGxlTG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIl0sXG4gICAgfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJwYW5lbGR5bmFtaWNcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHJhZGlvZ3JvdXAgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmFkaW9ncm91cFwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJZCArIFwiXzBcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkSXRlbSgpOiBJdGVtVmFsdWUge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLnZpc2libGVDaG9pY2VzLCB0aGlzLnZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogU2hvdyBcImNsZWFyIGJ1dHRvblwiIGZsYWcuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0NsZWFyQnV0dG9uXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dDbGVhckJ1dHRvbih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93Q2xlYXJCdXR0b25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNhblNob3dDbGVhckJ1dHRvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93Q2xlYXJCdXR0b24gJiYgIXRoaXMuaXNSZWFkT25seTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNsZWFyQnV0dG9uQ2FwdGlvbigpIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNsZWFyQ2FwdGlvblwiKTtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBnZXRJdGVtQ2xhc3MoaXRlbTogYW55KSB7XG4gICAgdmFyIGl0ZW1DbGFzcyA9IHRoaXMuY3NzQ2xhc3Nlcy5pdGVtO1xuICAgIHZhciBpc0Rpc2FibGVkID0gdGhpcy5pc1JlYWRPbmx5IHx8ICFpdGVtLmlzRW5hYmxlZDtcbiAgICB2YXIgaXNDaGVja2VkID1cbiAgICAgIGl0ZW0udmFsdWUgPT09IHRoaXMudmFsdWUgfHxcbiAgICAgICh0aGlzLmlzT3RoZXJTZWxlY3RlZCAmJiB0aGlzLm90aGVySXRlbS52YWx1ZSA9PT0gaXRlbS52YWx1ZSk7XG4gICAgdmFyIGFsbG93SG92ZXIgPSAhaXNEaXNhYmxlZCAmJiAhaXNDaGVja2VkO1xuICAgIGlmICghdGhpcy5oYXNDb2x1bW5zKSB7XG4gICAgICBpdGVtQ2xhc3MgKz1cbiAgICAgICAgdGhpcy5jb2xDb3VudCA9PT0gMFxuICAgICAgICAgID8gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuaXRlbUlubGluZVxuICAgICAgICAgIDogXCIgc3YtcS1jb2wtXCIgKyB0aGlzLmNvbENvdW50O1xuICAgIH1cbiAgICBpZiAoaXNEaXNhYmxlZCAmJiAhIXRoaXMuY3NzQ2xhc3Nlcy5pdGVtRGlzYWJsZWQpXG4gICAgICBpdGVtQ2xhc3MgKz0gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuaXRlbURpc2FibGVkO1xuICAgIGlmIChpc0NoZWNrZWQgJiYgISF0aGlzLmNzc0NsYXNzZXMuaXRlbUNoZWNrZWQpXG4gICAgICBpdGVtQ2xhc3MgKz0gXCIgXCIgKyB0aGlzLmNzc0NsYXNzZXMuaXRlbUNoZWNrZWQ7XG4gICAgaWYgKGFsbG93SG92ZXIgJiYgISF0aGlzLmNzc0NsYXNzZXMuaXRlbUhvdmVyKVxuICAgICAgaXRlbUNsYXNzICs9IFwiIFwiICsgdGhpcy5jc3NDbGFzc2VzLml0ZW1Ib3ZlcjtcbiAgICByZXR1cm4gaXRlbUNsYXNzO1xuICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwicmFkaW9ncm91cFwiLFxuICBbeyBuYW1lOiBcInNob3dDbGVhckJ1dHRvbjpib29sZWFuXCIsIGRlZmF1bHQ6IGZhbHNlIH1dLFxuICBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJjaGVja2JveGJhc2VcIlxuKTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJyYWRpb2dyb3VwXCIsIChuYW1lKSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fcmFkaW9ncm91cC50cyIsImltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgU2VyaWFsaXplciB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgc2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgcmF0aW5nIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYXRpbmdNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwicmF0ZXNcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJyYXRlc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLnJhdGVWYWx1ZXNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKGZ1bmN0aW9uIChzZW5kZXI6IGFueSwgb3B0aW9uczogYW55KSB7XG4gICAgICBpZiAoXG4gICAgICAgIG9wdGlvbnMubmFtZSA9PSBcInJhdGVNaW5cIiB8fFxuICAgICAgICBvcHRpb25zLm5hbWUgPT0gXCJyYXRlTWF4XCIgfHxcbiAgICAgICAgb3B0aW9ucy5uYW1lID09IFwicmF0ZVN0ZXBcIlxuICAgICAgKSB7XG4gICAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYucmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgbG9jTWluUmF0ZURlc2NyaXB0aW9uVmFsdWUgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFxuICAgICAgXCJtaW5SYXRlRGVzY3JpcHRpb25cIixcbiAgICAgIHRoaXMsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICB2YXIgbG9jTWF4UmF0ZURlc2NyaXB0aW9uVmFsdWUgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFxuICAgICAgXCJtYXhSYXRlRGVzY3JpcHRpb25cIixcbiAgICAgIHRoaXMsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBsb2NNaW5SYXRlRGVzY3JpcHRpb25WYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dCA/IHRleHQgKyBcIiBcIiA6IHRleHQ7XG4gICAgfTtcbiAgICBsb2NNYXhSYXRlRGVzY3JpcHRpb25WYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dCA/IFwiIFwiICsgdGV4dCA6IHRleHQ7XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHJhdGUgaXRlbXMuIEV2ZXJ5IGl0ZW0gaGFzIHZhbHVlIGFuZCB0ZXh0LiBJZiB0ZXh0IGlzIGVtcHR5LCB0aGUgdmFsdWUgaXMgcmVuZGVyZWQuIFRoZSBpdGVtIHRleHQgc3VwcG9ydHMgbWFya2Rvd24uIElmIGl0IGlzIGVtcHR5IHRoZSBhcnJheSBpcyBnZW5lcmF0ZWQgYnkgdXNpbmcgcmF0ZU1pbiwgcmF0ZU1heCBhbmQgcmF0ZVN0ZXAgcHJvcGVydGllcy5cbiAgICogQHNlZSByYXRlTWluXG4gICAqIEBzZWUgcmF0ZU1heFxuICAgKiBAc2VlIHJhdGVTdGVwXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJhdGVWYWx1ZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVzXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmF0ZVZhbHVlcyh2YWw6IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyYXRlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgcmF0ZSB2YWx1ZXMgaWYgcmF0ZVZhbHVlcyBhcnJheSBpcyBlbXB0eS4gSXQgaXMgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSByYXRpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuXG4gICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgKiBAc2VlIHJhdGVNYXhcbiAgICogQHNlZSByYXRlU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCByYXRlTWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVNaW5cIik7XG4gIH1cbiAgcHVibGljIHNldCByYXRlTWluKHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHZhbCA+IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZVN0ZXApXG4gICAgICB2YWwgPSB0aGlzLnJhdGVNYXggLSB0aGlzLnJhdGVTdGVwO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVNaW5cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBsYXN0IHZhbHVlIGluIHRoZSByYXRpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuXG4gICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCByYXRlTWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVNYXhcIik7XG4gIH1cbiAgcHVibGljIHNldCByYXRlTWF4KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHZhbCA8IHRoaXMucmF0ZU1pbiArIHRoaXMucmF0ZVN0ZXApXG4gICAgICB2YWwgPSB0aGlzLnJhdGVNaW4gKyB0aGlzLnJhdGVTdGVwO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVNYXhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBzdGVwIHZhbHVlLiBUaGUgbnVtYmVyIG9mIHJhdGUgdmFsdWVzIGFyZSAocmF0ZU1heCAtIHJhdGVNaW4pIC8gcmF0ZVN0ZXAuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuXG4gICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlTWF4XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJhdGVTdGVwKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVTdGVwXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmF0ZVN0ZXAodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDw9IDApIHZhbCA9IDE7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uICYmIHZhbCA+IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZU1pbilcbiAgICAgIHZhbCA9IHRoaXMucmF0ZU1heCAtIHRoaXMucmF0ZU1pbjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyYXRlU3RlcFwiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREaXNwbGF5VmFsdWVDb3JlKGtleXNBc1RleHQ6IGJvb2xlYW4sIHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHZhciByZXMgPSBJdGVtVmFsdWUuZ2V0VGV4dE9ySHRtbEJ5VmFsdWUodGhpcy52aXNpYmxlUmF0ZVZhbHVlcywgdmFsdWUpO1xuICAgIHJldHVybiAhIXJlcyA/IHJlcyA6IHZhbHVlO1xuICB9XG4gIGdldCB2aXNpYmxlUmF0ZVZhbHVlcygpOiBJdGVtVmFsdWVbXSB7XG4gICAgaWYgKHRoaXMucmF0ZVZhbHVlcy5sZW5ndGggPiAwKSByZXR1cm4gdGhpcy5yYXRlVmFsdWVzO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLnJhdGVNaW47XG4gICAgdmFyIHN0ZXAgPSB0aGlzLnJhdGVTdGVwO1xuICAgIHdoaWxlIChcbiAgICAgIHZhbHVlIDw9IHRoaXMucmF0ZU1heCAmJlxuICAgICAgcmVzLmxlbmd0aCA8IHNldHRpbmdzLnJhdGluZ01heGltdW1SYXRlVmFsdWVDb3VudFxuICAgICkge1xuICAgICAgcmVzLnB1c2gobmV3IEl0ZW1WYWx1ZSh2YWx1ZSkpO1xuICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZSh2YWx1ZSArIHN0ZXAsIHN0ZXApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgY29ycmVjdFZhbHVlKHZhbHVlOiBudW1iZXIsIHN0ZXA6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmIChNYXRoLnJvdW5kKHZhbHVlKSA9PSB2YWx1ZSkgcmV0dXJuIHZhbHVlO1xuICAgIHZhciBmciA9IDA7XG4gICAgd2hpbGUgKE1hdGgucm91bmQoc3RlcCkgIT0gc3RlcCkge1xuICAgICAgc3RlcCAqPSAxMDtcbiAgICAgIGZyKys7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlLnRvRml4ZWQoZnIpKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJhdGluZ1wiO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0Q29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydE90aGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgbWluaW11bSAoZmlyc3QpIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pblJhdGVEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1pblJhdGVEZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pblJhdGVEZXNjcmlwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibWluUmF0ZURlc2NyaXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY01pblJhdGVEZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJtaW5SYXRlRGVzY3JpcHRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiBtYXhpbXVtIChsYXN0KSBpdGVtLlxuICAgKi9cbiAgcHVibGljIGdldCBtYXhSYXRlRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtYXhSYXRlRGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBtYXhSYXRlRGVzY3JpcHRpb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1heFJhdGVEZXNjcmlwdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NNYXhSYXRlRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwibWF4UmF0ZURlc2NyaXB0aW9uXCIpO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZVRvRGF0YSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMucmF0ZVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgaXRlbSA9IEl0ZW1WYWx1ZS5nZXRJdGVtQnlWYWx1ZSh0aGlzLnJhdGVWYWx1ZXMsIHZhbCk7XG4gICAgICByZXR1cm4gISFpdGVtID8gaXRlbS52YWx1ZSA6IHZhbDtcbiAgICB9XG4gICAgcmV0dXJuICFpc05hTih2YWwpID8gcGFyc2VGbG9hdCh2YWwpIDogdmFsO1xuICB9XG59XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInJhdGluZ1wiLFxuICBbXG4gICAgeyBuYW1lOiBcImhhc0NvbW1lbnQ6c3dpdGNoXCIsIGxheW91dDogXCJyb3dcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY29tbWVudFRleHRcIixcbiAgICAgIGRlcGVuZHNPbjogXCJoYXNDb21tZW50XCIsXG4gICAgICB2aXNpYmxlSWY6IGZ1bmN0aW9uIChvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc0NvbW1lbnQ7XG4gICAgICB9LFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbW1lbnRUZXh0XCIsXG4gICAgICBsYXlvdXQ6IFwicm93XCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInJhdGVWYWx1ZXM6aXRlbXZhbHVlW11cIixcbiAgICB9LFxuICAgIHsgbmFtZTogXCJyYXRlTWluOm51bWJlclwiLCBkZWZhdWx0OiAxIH0sXG4gICAgeyBuYW1lOiBcInJhdGVNYXg6bnVtYmVyXCIsIGRlZmF1bHQ6IDUgfSxcbiAgICB7IG5hbWU6IFwicmF0ZVN0ZXA6bnVtYmVyXCIsIGRlZmF1bHQ6IDEsIG1pblZhbHVlOiAwLjEgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIm1pblJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgYWx0ZXJuYXRpdmVOYW1lOiBcIm1pbmludW1SYXRlRGVzY3JpcHRpb25cIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NNaW5SYXRlRGVzY3JpcHRpb25cIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwibWF4aW11bVJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY01heFJhdGVEZXNjcmlwdGlvblwiLFxuICAgIH0sXG4gIF0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUmF0aW5nTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmF0aW5nXCIsIChuYW1lKSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25SYXRpbmdNb2RlbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX3JhdGluZy50cyIsImltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgU2lnbmF0dXJlUGFkIGZyb20gXCJzaWduYXR1cmVfcGFkXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcblxudmFyIGRlZmF1bHRXaWR0aCA9IDMwMDtcbnZhciBkZWZhdWx0SGVpZ2h0ID0gMjAwO1xuXG5mdW5jdGlvbiByZXNpemVDYW52YXMoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCkge1xuICB2YXIgY29udGV4dDogYW55ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgdmFyIGRldmljZVBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICB2YXIgYmFja2luZ1N0b3JlUmF0aW8gPVxuICAgIGNvbnRleHQud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGNvbnRleHQubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGNvbnRleHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgY29udGV4dC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGNvbnRleHQuYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIDE7XG5cbiAgdmFyIHJhdGlvID0gZGV2aWNlUGl4ZWxSYXRpbyAvIGJhY2tpbmdTdG9yZVJhdGlvO1xuXG4gIHZhciBvbGRXaWR0aCA9IGNhbnZhcy53aWR0aDtcbiAgdmFyIG9sZEhlaWdodCA9IGNhbnZhcy5oZWlnaHQ7XG5cbiAgY2FudmFzLndpZHRoID0gb2xkV2lkdGggKiByYXRpbztcbiAgY2FudmFzLmhlaWdodCA9IG9sZEhlaWdodCAqIHJhdGlvO1xuXG4gIGNhbnZhcy5zdHlsZS53aWR0aCA9IG9sZFdpZHRoICsgXCJweFwiO1xuICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gb2xkSGVpZ2h0ICsgXCJweFwiO1xuXG4gIGNvbnRleHQuc2NhbGUocmF0aW8sIHJhdGlvKTtcbn1cblxuLyoqXG4gKiBBIE1vZGVsIGZvciBzaWduYXR1cmUgcGFkIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHJvdGVjdGVkIGdldENzc1Jvb3QoY3NzQ2xhc3NlczogYW55KTogc3RyaW5nIHtcbiAgICB2YXIgY2xhc3NlcyA9IHN1cGVyLmdldENzc1Jvb3QoY3NzQ2xhc3Nlcyk7XG4gICAgaWYgKFwiXCIgKyB0aGlzLndpZHRoID09PSBcIjMwMFwiKSB7XG4gICAgICBjbGFzc2VzICs9IFwiIFwiICsgY3NzQ2xhc3Nlcy5zbWFsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlVmFsdWUoKSB7XG4gICAgaWYgKHRoaXMuc2lnbmF0dXJlUGFkKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuc2lnbmF0dXJlUGFkLnRvRGF0YVVSTCh0aGlzLmRhdGFGb3JtYXQpO1xuICAgICAgdGhpcy52YWx1ZSA9IGRhdGE7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic2lnbmF0dXJlcGFkXCI7XG4gIH1cbiAgcHVibGljIGFmdGVyUmVuZGVyUXVlc3Rpb25FbGVtZW50KGVsOiBhbnkpIHtcbiAgICBpZiAoISFlbCkge1xuICAgICAgdGhpcy5pbml0U2lnbmF0dXJlUGFkKGVsKTtcbiAgICB9XG4gICAgc3VwZXIuYWZ0ZXJSZW5kZXJRdWVzdGlvbkVsZW1lbnQoZWwpO1xuICB9XG4gIHB1YmxpYyBiZWZvcmVEZXN0cm95UXVlc3Rpb25FbGVtZW50KGVsOiBhbnkpIHtcbiAgICBpZiAoISFlbCkge1xuICAgICAgdGhpcy5kZXN0cm95U2lnbmF0dXJlUGFkKGVsKTtcbiAgICB9XG4gIH1cblxuICBpbml0U2lnbmF0dXJlUGFkKGVsOiBIVE1MRWxlbWVudCkge1xuICAgIHZhciBjYW52YXM6IGFueSA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY2FudmFzXCIpWzBdO1xuICAgIHZhciBidXR0b25FbCA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYnV0dG9uXCIpWzBdO1xuICAgIHZhciBzaWduYXR1cmVQYWQgPSBuZXcgU2lnbmF0dXJlUGFkKGNhbnZhcywgeyBiYWNrZ3JvdW5kQ29sb3I6IFwiI2ZmZmZmZlwiIH0pO1xuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkpIHtcbiAgICAgIHNpZ25hdHVyZVBhZC5vZmYoKTtcbiAgICB9XG5cbiAgICBidXR0b25FbC5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9O1xuXG4gICAgdGhpcy5yZWFkT25seUNoYW5nZWRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5hbGxvd0NsZWFyIHx8IHRoaXMuaXNSZWFkT25seSkge1xuICAgICAgICBzaWduYXR1cmVQYWQub2ZmKCk7XG4gICAgICAgIGJ1dHRvbkVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ25hdHVyZVBhZC5vbigpO1xuICAgICAgICBidXR0b25FbC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzaWduYXR1cmVQYWQucGVuQ29sb3IgPSB0aGlzLnBlbkNvbG9yO1xuICAgIHNpZ25hdHVyZVBhZC5vbkJlZ2luID0gKCkgPT4ge1xuICAgICAgY2FudmFzLmZvY3VzKCk7XG4gICAgfTtcbiAgICBzaWduYXR1cmVQYWQub25FbmQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKCk7XG4gICAgfTtcbiAgICB2YXIgdXBkYXRlVmFsdWVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLnZhbHVlO1xuICAgICAgY2FudmFzLndpZHRoID0gdGhpcy53aWR0aCB8fCBkZWZhdWx0V2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgfHwgZGVmYXVsdEhlaWdodDtcbiAgICAgIHJlc2l6ZUNhbnZhcyhjYW52YXMpO1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHNpZ25hdHVyZVBhZC5jbGVhcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2lnbmF0dXJlUGFkLmZyb21EYXRhVVJMKGRhdGEpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy52YWx1ZUNoYW5nZWRDYWxsYmFjayA9IHVwZGF0ZVZhbHVlSGFuZGxlcjtcbiAgICB1cGRhdGVWYWx1ZUhhbmRsZXIoKTtcbiAgICB0aGlzLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zaWduYXR1cmVQYWQgPSBzaWduYXR1cmVQYWQ7XG4gICAgdmFyIHByb3BlcnR5Q2hhbmdlZEhhbmRsZXIgPSAoc2VuZGVyOiBhbnksIG9wdGlvbnM6IGFueSkgPT4ge1xuICAgICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gXCJ3aWR0aFwiIHx8IG9wdGlvbnMubmFtZSA9PT0gXCJoZWlnaHRcIikge1xuICAgICAgICB1cGRhdGVWYWx1ZUhhbmRsZXIoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKHByb3BlcnR5Q2hhbmdlZEhhbmRsZXIpO1xuICAgIHRoaXMuc2lnbmF0dXJlUGFkLnByb3BlcnR5Q2hhbmdlZEhhbmRsZXIgPSBwcm9wZXJ0eUNoYW5nZWRIYW5kbGVyO1xuICB9XG4gIGRlc3Ryb3lTaWduYXR1cmVQYWQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuc2lnbmF0dXJlUGFkKSB7XG4gICAgICB0aGlzLm9uUHJvcGVydHlDaGFuZ2VkLnJlbW92ZSh0aGlzLnNpZ25hdHVyZVBhZC5wcm9wZXJ0eUNoYW5nZWRIYW5kbGVyKTtcbiAgICAgIHRoaXMuc2lnbmF0dXJlUGFkLm9mZigpO1xuICAgIH1cbiAgICB0aGlzLnJlYWRPbmx5Q2hhbmdlZENhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLnNpZ25hdHVyZVBhZCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVXNlIGl0IHRvIHNldCB0aGUgc3BlY2lmaWMgZGF0YUZvcm1hdCBmb3IgdGhlIHNpZ25hdHVyZSBwYWQgaW1hZ2UgZGF0YS5cbiAgICogZm9ybWF0czogXCJcIiAoZGVmYXVsdCkgLSBwbmcsIFwiaW1hZ2UvanBlZ1wiIC0ganBlZywgXCJpbWFnZS9zdmcreG1sXCIgLSBzdmdcbiAgICovXG4gIHB1YmxpYyBnZXQgZGF0YUZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJkYXRhRm9ybWF0XCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGF0YUZvcm1hdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRhdGFGb3JtYXRcIiwgdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gc2V0IHRoZSBzcGVjaWZpYyB3aWR0aCBmb3IgdGhlIHNpZ25hdHVyZSBwYWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIsIDMwMCk7XG4gIH1cbiAgcHVibGljIHNldCB3aWR0aCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBzZXQgdGhlIHNwZWNpZmljIGhlaWdodCBmb3IgdGhlIHNpZ25hdHVyZSBwYWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJoZWlnaHRcIiwgMjAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhlaWdodCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhlaWdodFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gY2xlYXIgY29udGVudCBvZiB0aGUgc2lnbmF0dXJlIHBhZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dDbGVhcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dDbGVhclwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93Q2xlYXIodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dDbGVhclwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gc2V0IHBlbiBjb2xvciBmb3IgdGhlIHNpZ25hdHVyZSBwYWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBlbkNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBlbkNvbG9yXCIsIFwiIzFhYjM5NFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBlbkNvbG9yKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGVuQ29sb3JcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNsZWFyIHNpZ25hdHVyZSBidXR0b24gY2FwdGlvbi5cbiAgICovXG4gIGdldCBjbGVhckJ1dHRvbkNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNsZWFyQ2FwdGlvblwiKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInNpZ25hdHVyZXBhZFwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJ3aWR0aDpudW1iZXJcIixcbiAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgIGRlZmF1bHQ6IDMwMCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiaGVpZ2h0Om51bWJlclwiLFxuICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgZGVmYXVsdDogMjAwLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJhbGxvd0NsZWFyOmJvb2xlYW5cIixcbiAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBlbkNvbG9yOmNvbG9yXCIsXG4gICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICBkZWZhdWx0OiBcIiMxYWIzOTRcIixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZGF0YUZvcm1hdFwiLFxuICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgZGVmYXVsdDogXCJcIixcbiAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgeyB2YWx1ZTogXCJcIiwgdGV4dDogXCJQTkdcIiB9LFxuICAgICAgICB7IHZhbHVlOiBcImltYWdlL2pwZWdcIiwgdGV4dDogXCJKUEVHXCIgfSxcbiAgICAgICAgeyB2YWx1ZTogXCJpbWFnZS9zdmcreG1sXCIsIHRleHQ6IFwiU1ZHXCIgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiZGVmYXVsdFZhbHVlXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcImNvcnJlY3RBbnN3ZXJcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJzaWduYXR1cmVwYWRcIiwgKG5hbWUpID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fc2lnbmF0dXJlcGFkLnRzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkVsZW1lbnRCYXNlIH0gZnJvbSBcIi4vcmVhY3RxdWVzdGlvbmVsZW1lbnRcIjtcblxuZXhwb3J0IGNsYXNzIFN1cnZleUN1c3RvbVdpZGdldCBleHRlbmRzIFN1cnZleVF1ZXN0aW9uRWxlbWVudEJhc2Uge1xuICBwcml2YXRlIHdpZGdldFJlZjogUmVhY3QuUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50PjtcbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLndpZGdldFJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICB9XG4gIHByaXZhdGUgX2FmdGVyUmVuZGVyKCkge1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXQpIHtcbiAgICAgIGxldCBlbCA9IHRoaXMud2lkZ2V0UmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoISFlbCkge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXQuYWZ0ZXJSZW5kZXIodGhpcy5xdWVzdGlvbkJhc2UsIGVsKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0RGF0YS5pc05lZWRSZW5kZXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgc3VwZXIuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICBpZiAodGhpcy5xdWVzdGlvbkJhc2UpIHtcbiAgICAgIHRoaXMuX2FmdGVyUmVuZGVyKCk7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IGFueSwgcHJldlN0YXRlOiBhbnkpIHtcbiAgICBzdXBlci5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpO1xuICAgIHZhciBpc0RlZmF1bHRSZW5kZXIgPVxuICAgICAgISF0aGlzLnF1ZXN0aW9uQmFzZS5jdXN0b21XaWRnZXQgJiZcbiAgICAgIHRoaXMucXVlc3Rpb25CYXNlLmN1c3RvbVdpZGdldC5pc0RlZmF1bHRSZW5kZXI7XG4gICAgaWYgKHRoaXMucXVlc3Rpb25CYXNlICYmICFpc0RlZmF1bHRSZW5kZXIpIHtcbiAgICAgIHRoaXMuX2FmdGVyUmVuZGVyKCk7XG4gICAgfVxuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHN1cGVyLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgaWYgKHRoaXMucXVlc3Rpb25CYXNlLmN1c3RvbVdpZGdldCkge1xuICAgICAgbGV0IGVsID0gdGhpcy53aWRnZXRSZWYuY3VycmVudDtcbiAgICAgIGlmICghIWVsKSB7XG4gICAgICAgIHRoaXMucXVlc3Rpb25CYXNlLmN1c3RvbVdpZGdldC53aWxsVW5tb3VudCh0aGlzLnF1ZXN0aW9uQmFzZSwgZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY2FuUmVuZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5jYW5SZW5kZXIoKSAmJiB0aGlzLnF1ZXN0aW9uQmFzZS52aXNpYmxlO1xuICB9XG4gIHByb3RlY3RlZCByZW5kZXJFbGVtZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICBsZXQgY3VzdG9tV2lkZ2V0ID0gdGhpcy5xdWVzdGlvbkJhc2UuY3VzdG9tV2lkZ2V0O1xuXG4gICAgaWYgKGN1c3RvbVdpZGdldC5pc0RlZmF1bHRSZW5kZXIpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgcmVmPXt0aGlzLndpZGdldFJlZn0+XG4gICAgICAgICAge3RoaXMuY3JlYXRvci5jcmVhdGVRdWVzdGlvbkVsZW1lbnQodGhpcy5xdWVzdGlvbkJhc2UpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHdpZGdldCA9IG51bGw7XG4gICAgaWYgKGN1c3RvbVdpZGdldC53aWRnZXRKc29uLnJlbmRlcikge1xuICAgICAgd2lkZ2V0ID0gY3VzdG9tV2lkZ2V0LndpZGdldEpzb24ucmVuZGVyKHRoaXMucXVlc3Rpb25CYXNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGN1c3RvbVdpZGdldC5odG1sVGVtcGxhdGUpIHtcbiAgICAgICAgbGV0IGh0bWxWYWx1ZSA9IHsgX19odG1sOiBjdXN0b21XaWRnZXQuaHRtbFRlbXBsYXRlIH07XG4gICAgICAgIHJldHVybiA8ZGl2IHJlZj17dGhpcy53aWRnZXRSZWZ9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXtodG1sVmFsdWV9IC8+O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gPGRpdiByZWY9e3RoaXMud2lkZ2V0UmVmfT57d2lkZ2V0fTwvZGl2PjtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3JlYWN0L2N1c3RvbS13aWRnZXQudHN4IiwiaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IFNlcmlhbGl6ZXIgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIsIEV4cHJlc3Npb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBPcGVyYW5kTWFrZXIgfSBmcm9tIFwiLi9leHByZXNzaW9ucy9leHByZXNzaW9uc1wiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQgeyBzZXR0aW5ncyB9IGZyb20gXCIuL3NldHRpbmdzXCI7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciBhbGwgdHJpZ2dlcnMuXG4gKiBBIHRyaWdnZXIgY2FsbHMgYSBtZXRob2Qgd2hlbiB0aGUgZXhwcmVzc2lvbiBjaGFuZ2UgdGhlIHJlc3VsdDogZnJvbSBmYWxzZSB0byB0cnVlIG9yIGZyb20gdHJ1ZSB0byBmYWxzZS5cbiAqIFBsZWFzZSBub3RlLCBpdCBydW5zIG9ubHkgb25lIGNoYW5naW5nIHRoZSBleHByZXNzaW9uIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyaWdnZXIgZXh0ZW5kcyBCYXNlIHtcbiAgc3RhdGljIG9wZXJhdG9yc1ZhbHVlOiBIYXNoVGFibGU8RnVuY3Rpb24+ID0gbnVsbDtcbiAgc3RhdGljIGdldCBvcGVyYXRvcnMoKSB7XG4gICAgaWYgKFRyaWdnZXIub3BlcmF0b3JzVmFsdWUgIT0gbnVsbCkgcmV0dXJuIFRyaWdnZXIub3BlcmF0b3JzVmFsdWU7XG4gICAgVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZSA9IHtcbiAgICAgIGVtcHR5OiBmdW5jdGlvbiAodmFsdWU6IGFueSwgZXhwZWN0ZWRWYWx1ZTogYW55KSB7XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgICB9LFxuICAgICAgbm90ZW1wdHk6IGZ1bmN0aW9uICh2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhdmFsdWU7XG4gICAgICB9LFxuICAgICAgZXF1YWw6IGZ1bmN0aW9uICh2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgbm90ZXF1YWw6IGZ1bmN0aW9uICh2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgY29udGFpbnM6IGZ1bmN0aW9uICh2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlW1wiaW5kZXhPZlwiXSAmJiB2YWx1ZS5pbmRleE9mKGV4cGVjdGVkVmFsdWUpID4gLTE7XG4gICAgICB9LFxuICAgICAgbm90Y29udGFpbnM6IGZ1bmN0aW9uICh2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAhdmFsdWUgfHwgIXZhbHVlW1wiaW5kZXhPZlwiXSB8fCB2YWx1ZS5pbmRleE9mKGV4cGVjdGVkVmFsdWUpID09IC0xXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgZ3JlYXRlcjogZnVuY3Rpb24gKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPiBleHBlY3RlZFZhbHVlO1xuICAgICAgfSxcbiAgICAgIGxlc3M6IGZ1bmN0aW9uICh2YWx1ZTogYW55LCBleHBlY3RlZFZhbHVlOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIDwgZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBncmVhdGVyb3JlcXVhbDogZnVuY3Rpb24gKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPj0gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBsZXNzb3JlcXVhbDogZnVuY3Rpb24gKHZhbHVlOiBhbnksIGV4cGVjdGVkVmFsdWU6IGFueSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPD0gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gVHJpZ2dlci5vcGVyYXRvcnNWYWx1ZTtcbiAgfVxuICBwcml2YXRlIGNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyO1xuICBwcml2YXRlIHVzZWROYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgcHJpdmF0ZSBoYXNGdW5jdGlvbjogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnVzZWROYW1lcyA9IFtdO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgICBbXCJvcGVyYXRvclwiLCBcInZhbHVlXCIsIFwibmFtZVwiXSxcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5vbGRQcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImV4cHJlc3Npb25cIiwgZnVuY3Rpb24gKCkge1xuICAgICAgc2VsZi5vbkV4cHJlc3Npb25DaGFuZ2VkKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ0cmlnZ2VyYmFzZVwiO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSB0aGlzLmdldFR5cGUoKS5yZXBsYWNlKFwidHJpZ2dlclwiLCBcIlwiKTtcbiAgICB2YXIgZXhwID0gISF0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24gOiB0aGlzLmJ1aWxkRXhwcmVzc2lvbigpO1xuICAgIGlmIChleHApIHtcbiAgICAgIHJlcyArPSBcIiwgXCIgKyBleHA7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBvcGVyYXRvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJvcGVyYXRvclwiLCBcImVxdWFsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgb3BlcmF0b3IodmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdmFsdWUpIHJldHVybjtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFUcmlnZ2VyLm9wZXJhdG9yc1t2YWx1ZV0pIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJvcGVyYXRvclwiLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZVwiLCBudWxsKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJuYW1lXCIsIHZhbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZXhwcmVzc2lvblwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGNoZWNrRXhwcmVzc2lvbihcbiAgICBrZXlzOiBhbnksXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGxcbiAgKSB7XG4gICAgaWYgKCF0aGlzLmlzQ2hlY2tSZXF1aXJlZChrZXlzKSkgcmV0dXJuO1xuICAgIGlmICghIXRoaXMuY29uZGl0aW9uUnVubmVyKSB7XG4gICAgICB0aGlzLnBlcmZvcm0odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNoZWNrKHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgdHJpZ2dlclJlc3VsdCA9IFRyaWdnZXIub3BlcmF0b3JzW3RoaXMub3BlcmF0b3JdKHZhbHVlLCB0aGlzLnZhbHVlKTtcbiAgICBpZiAodHJpZ2dlclJlc3VsdCkge1xuICAgICAgdGhpcy5vblN1Y2Nlc3Moe30sIG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uRmFpbHVyZSgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHBlcmZvcm0odmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lci5vblJ1bkNvbXBsZXRlID0gKHJlczogYm9vbGVhbikgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyUmVzdWx0KHJlcywgdmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9O1xuICAgIHRoaXMuY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgdHJpZ2dlclJlc3VsdChcbiAgICByZXM6IGJvb2xlYW4sXG4gICAgdmFsdWVzOiBIYXNoVGFibGU8YW55PixcbiAgICBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55PlxuICApIHtcbiAgICBpZiAocmVzKSB7XG4gICAgICB0aGlzLm9uU3VjY2Vzcyh2YWx1ZXMsIHByb3BlcnRpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uRmFpbHVyZSgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7fVxuICBwcm90ZWN0ZWQgb25GYWlsdXJlKCkge31cbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIHRoaXMub2xkUHJvcGVydGllc0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIG9sZFByb3BlcnRpZXNDaGFuZ2VkKCkge1xuICAgIHRoaXMub25FeHByZXNzaW9uQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgb25FeHByZXNzaW9uQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnVzZWROYW1lcyA9IFtdO1xuICAgIHRoaXMuaGFzRnVuY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmNvbmRpdGlvblJ1bm5lciA9IG51bGw7XG4gIH1cbiAgcHVibGljIGJ1aWxkRXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5uYW1lKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoSGVscGVycy5pc1ZhbHVlRW1wdHkodGhpcy52YWx1ZSkgJiYgdGhpcy5pc1JlcXVpcmVWYWx1ZSkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIChcbiAgICAgIFwie1wiICtcbiAgICAgIHRoaXMubmFtZSArXG4gICAgICBcIn0gXCIgK1xuICAgICAgdGhpcy5vcGVyYXRvciArXG4gICAgICBcIiBcIiArXG4gICAgICBPcGVyYW5kTWFrZXIudG9PcGVyYW5kU3RyaW5nKHRoaXMudmFsdWUpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGlzQ2hlY2tSZXF1aXJlZChrZXlzOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoIWtleXMpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLmJ1aWxkVXNlZE5hbWVzKCk7XG4gICAgaWYgKHRoaXMuaGFzRnVuY3Rpb24gPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy51c2VkTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChrZXlzLmhhc093blByb3BlcnR5KHRoaXMudXNlZE5hbWVzW2ldKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGJ1aWxkVXNlZE5hbWVzKCkge1xuICAgIGlmICghIXRoaXMuY29uZGl0aW9uUnVubmVyKSByZXR1cm47XG4gICAgdmFyIGV4cHJlc3Npb24gPSB0aGlzLmV4cHJlc3Npb247XG4gICAgaWYgKCFleHByZXNzaW9uKSB7XG4gICAgICBleHByZXNzaW9uID0gdGhpcy5idWlsZEV4cHJlc3Npb24oKTtcbiAgICB9XG4gICAgaWYgKCFleHByZXNzaW9uKSByZXR1cm47XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIgPSBuZXcgQ29uZGl0aW9uUnVubmVyKGV4cHJlc3Npb24pO1xuICAgIHRoaXMuaGFzRnVuY3Rpb24gPSB0aGlzLmNvbmRpdGlvblJ1bm5lci5oYXNGdW5jdGlvbigpO1xuICAgIHRoaXMudXNlZE5hbWVzID0gdGhpcy5jb25kaXRpb25SdW5uZXIuZ2V0VmFyaWFibGVzKCk7XG4gICAgdmFyIHByb2Nlc3NWYWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudXNlZE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnVzZWROYW1lc1tpXSA9IHByb2Nlc3NWYWx1ZS5nZXRGaXJzdE5hbWUodGhpcy51c2VkTmFtZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldCBpc1JlcXVpcmVWYWx1ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvciAhPT0gXCJlbXB0eVwiICYmIHRoaXMub3BlcmF0b3IgIT0gXCJub3RlbXB0eVwiO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleVRyaWdnZXJPd25lciB7XG4gIGdldE9iamVjdHMocGFnZXM6IHN0cmluZ1tdLCBxdWVzdGlvbnM6IHN0cmluZ1tdKTogYW55W107XG4gIHNldENvbXBsZXRlZCgpOiBhbnk7XG4gIHNldFRyaWdnZXJWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGlzVmFyaWFibGU6IGJvb2xlYW4pOiBhbnk7XG4gIGNvcHlUcmlnZ2VyVmFsdWUobmFtZTogc3RyaW5nLCBmcm9tTmFtZTogc3RyaW5nKTogYW55O1xuICBmb2N1c1F1ZXN0aW9uKG5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogSXQgZXh0ZW5kcyB0aGUgVHJpZ2dlciBiYXNlIGNsYXNzIGFuZCBhZGQgcHJvcGVydGllcyByZXF1aXJlZCBmb3IgU3VydmV5SlMgY2xhc3Nlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXIgZXh0ZW5kcyBUcmlnZ2VyIHtcbiAgcHJvdGVjdGVkIG93bmVyVmFsdWU6IElTdXJ2ZXlUcmlnZ2VyT3duZXIgPSBudWxsO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXQgb3duZXIoKTogSVN1cnZleVRyaWdnZXJPd25lciB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0T3duZXIob3duZXI6IElTdXJ2ZXlUcmlnZ2VyT3duZXIpIHtcbiAgICB0aGlzLm93bmVyVmFsdWUgPSBvd25lcjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzT25OZXh0UGFnZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogSWYgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIGl0IG1ha2VzIHF1ZXN0aW9ucy9wYWdlcyB2aXNpYmxlLlxuICogT2h0ZXJ3aXNlIGl0IG1ha2VzIHRoZW0gaW52aXNpYmxlLlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlclZpc2libGUgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgcHVibGljIHBhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgcXVlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidmlzaWJsZXRyaWdnZXJcIjtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgdGhpcy5vblRyaWdnZXIodGhpcy5vbkl0ZW1TdWNjZXNzKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25GYWlsdXJlKCkge1xuICAgIHRoaXMub25UcmlnZ2VyKHRoaXMub25JdGVtRmFpbHVyZSk7XG4gIH1cbiAgcHJpdmF0ZSBvblRyaWdnZXIoZnVuYzogRnVuY3Rpb24pIHtcbiAgICBpZiAoIXRoaXMub3duZXIpIHJldHVybjtcbiAgICB2YXIgb2JqZWN0cyA9IHRoaXMub3duZXIuZ2V0T2JqZWN0cyh0aGlzLnBhZ2VzLCB0aGlzLnF1ZXN0aW9ucyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmdW5jKG9iamVjdHNbaV0pO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25JdGVtU3VjY2VzcyhpdGVtOiBhbnkpIHtcbiAgICBpdGVtLnZpc2libGUgPSB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBvbkl0ZW1GYWlsdXJlKGl0ZW06IGFueSkge1xuICAgIGl0ZW0udmlzaWJsZSA9IGZhbHNlO1xuICB9XG59XG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCBpdCBjb21wbGV0ZXMgdGhlIHN1cnZleS5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJDb21wbGV0ZSBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY29tcGxldGV0cmlnZ2VyXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc09uTmV4dFBhZ2UoKSB7XG4gICAgcmV0dXJuICFzZXR0aW5ncy5leGVjdXRlQ29tcGxldGVUcmlnZ2VyT25WYWx1ZUNoYW5nZWQ7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICh0aGlzLm93bmVyKSB0aGlzLm93bmVyLnNldENvbXBsZXRlZCgpO1xuICB9XG59XG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCB0aGUgdmFsdWUgZnJvbSBwcm9wZXJ0eSAqKnNldFZhbHVlKiogd2lsbCBiZSBzZXQgdG8gKipzZXRUb05hbWUqKlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlclNldFZhbHVlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJzZXR2YWx1ZXRyaWdnZXJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IHNldFRvTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzZXRUb05hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBzZXRUb05hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzZXRUb05hbWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHNldFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNldFZhbHVlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2V0VmFsdWUodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzZXRWYWx1ZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNWYXJpYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNWYXJpYWJsZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc1ZhcmlhYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzVmFyaWFibGVcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKHZhbHVlczogSGFzaFRhYmxlPGFueT4sIHByb3BlcnRpZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLnNldFRvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHRoaXMub3duZXIuc2V0VHJpZ2dlclZhbHVlKHRoaXMuc2V0VG9OYW1lLCB0aGlzLnNldFZhbHVlLCB0aGlzLmlzVmFyaWFibGUpO1xuICB9XG59XG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCB0aGUgc3VydmV5IGdvIHRvIHF1ZXN0aW9uICoqZ290b05hbWUqKiBhbmQgZm9jdXMgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyU2tpcCBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic2tpcHRyaWdnZXJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGdvdG9OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImdvdG9OYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZ290b05hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJnb3RvTmFtZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNPbk5leHRQYWdlKCkge1xuICAgIHJldHVybiAhc2V0dGluZ3MuZXhlY3V0ZVNraXBUcmlnZ2VyT25WYWx1ZUNoYW5nZWQ7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghdGhpcy5nb3RvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHRoaXMub3duZXIuZm9jdXNRdWVzdGlvbih0aGlzLmdvdG9OYW1lKTtcbiAgfVxufVxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlICoqcnVuRXhwcmVzc2lvbioqIHdpbGwgYmUgcnVuLiBJZiAqKnNldFRvTmFtZSoqIHByb3BlcnR5IGlzIG5vdCBlbXB0eSB0aGVuIHRoZSByZXN1bHQgb2YgKipydW5FeHByZXNzaW9uKiogd2lsbCBiZSBzZXQgdG8gaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUcmlnZ2VyUnVuRXhwcmVzc2lvbiBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicnVuZXhwcmVzc2lvbnRyaWdnZXJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IHNldFRvTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzZXRUb05hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBzZXRUb05hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzZXRUb05hbWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHJ1bkV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicnVuRXhwcmVzc2lvblwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJ1bkV4cHJlc3Npb24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJydW5FeHByZXNzaW9uXCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2Vzcyh2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+LCBwcm9wZXJ0aWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghdGhpcy5vd25lciB8fCAhdGhpcy5ydW5FeHByZXNzaW9uKSByZXR1cm47XG4gICAgdmFyIGV4cHJlc3Npb24gPSBuZXcgRXhwcmVzc2lvblJ1bm5lcih0aGlzLnJ1bkV4cHJlc3Npb24pO1xuICAgIGlmIChleHByZXNzaW9uLmNhblJ1bikge1xuICAgICAgZXhwcmVzc2lvbi5vblJ1bkNvbXBsZXRlID0gKHJlcykgPT4ge1xuICAgICAgICB0aGlzLm9uQ29tcGxldGVSdW5FeHByZXNzaW9uKHJlcyk7XG4gICAgICB9O1xuICAgICAgZXhwcmVzc2lvbi5ydW4odmFsdWVzLCBwcm9wZXJ0aWVzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBvbkNvbXBsZXRlUnVuRXhwcmVzc2lvbihuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLnNldFRvTmFtZSB8fCBuZXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLm93bmVyLnNldFRyaWdnZXJWYWx1ZSh0aGlzLnNldFRvTmFtZSwgbmV3VmFsdWUsIGZhbHNlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJZiBleHByZXNzaW9uIHJldHVybnMgdHJ1ZSwgdGhlIHZhbHVlIGZyb20gcXVlc3Rpb24gKipmcm9tTmFtZSoqIHdpbGwgYmUgc2V0IGludG8gKipzZXRUb05hbWUqKi5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJDb3B5VmFsdWUgZXh0ZW5kcyBTdXJ2ZXlUcmlnZ2VyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHNldFRvTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzZXRUb05hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBzZXRUb05hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzZXRUb05hbWVcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGZyb21OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImZyb21OYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZnJvbU5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJmcm9tTmFtZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY29weXZhbHVldHJpZ2dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3ModmFsdWVzOiBIYXNoVGFibGU8YW55PiwgcHJvcGVydGllczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAoIXRoaXMuc2V0VG9OYW1lIHx8ICF0aGlzLm93bmVyKSByZXR1cm47XG4gICAgdGhpcy5vd25lci5jb3B5VHJpZ2dlclZhbHVlKHRoaXMuc2V0VG9OYW1lLCB0aGlzLmZyb21OYW1lKTtcbiAgfVxufVxuXG5TZXJpYWxpemVyLmFkZENsYXNzKFwidHJpZ2dlclwiLCBbXG4gIHsgbmFtZTogXCJvcGVyYXRvclwiLCBkZWZhdWx0OiBcImVxdWFsXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIHsgbmFtZTogXCJ2YWx1ZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICBcImV4cHJlc3Npb246Y29uZGl0aW9uXCIsXG5dKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwic3VydmV5dHJpZ2dlclwiLFxuICBbeyBuYW1lOiBcIm5hbWVcIiwgdmlzaWJsZTogZmFsc2UgfV0sXG4gIG51bGwsXG4gIFwidHJpZ2dlclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJ2aXNpYmxldHJpZ2dlclwiLFxuICBbXCJwYWdlczpwYWdlc1wiLCBcInF1ZXN0aW9uczpxdWVzdGlvbnNcIl0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJWaXNpYmxlKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJjb21wbGV0ZXRyaWdnZXJcIixcbiAgW10sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJDb21wbGV0ZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblNlcmlhbGl6ZXIuYWRkQ2xhc3MoXG4gIFwic2V0dmFsdWV0cmlnZ2VyXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwiIXNldFRvTmFtZTpxdWVzdGlvbnZhbHVlXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInNldFZhbHVlOnRyaWdnZXJ2YWx1ZVwiLFxuICAgICAgZGVwZW5kc09uOiBcInNldFRvTmFtZVwiLFxuICAgICAgdmlzaWJsZUlmOiBmdW5jdGlvbiAob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuICEhb2JqICYmICEhb2JqW1wic2V0VG9OYW1lXCJdO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHsgbmFtZTogXCJpc1ZhcmlhYmxlOmJvb2xlYW5cIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgXSxcbiAgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgU3VydmV5VHJpZ2dlclNldFZhbHVlKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJjb3B5dmFsdWV0cmlnZ2VyXCIsXG4gIFt7IG5hbWU6IFwiIXNldFRvTmFtZTpxdWVzdGlvbnZhbHVlXCIgfSwgeyBuYW1lOiBcIiFmcm9tTmFtZTpxdWVzdGlvbnZhbHVlXCIgfV0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJDb3B5VmFsdWUoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl0cmlnZ2VyXCJcbik7XG5TZXJpYWxpemVyLmFkZENsYXNzKFxuICBcInNraXB0cmlnZ2VyXCIsXG4gIFt7IG5hbWU6IFwiIWdvdG9OYW1lOnF1ZXN0aW9uXCIgfV0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJTa2lwKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuU2VyaWFsaXplci5hZGRDbGFzcyhcbiAgXCJydW5leHByZXNzaW9udHJpZ2dlclwiLFxuICBbeyBuYW1lOiBcInNldFRvTmFtZTpxdWVzdGlvbnZhbHVlXCIgfSwgXCJydW5FeHByZXNzaW9uOmV4cHJlc3Npb25cIl0sXG4gIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJSdW5FeHByZXNzaW9uKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3RyaWdnZXIudHMiLCIvLyBtb2RlbFxuZXhwb3J0ICogZnJvbSBcIi4vY2h1bmtzL21vZGVsXCI7XG5cbi8vIGxvY2FsaXphdGlvblxuaW1wb3J0IFwiLi9jaHVua3MvbG9jYWxpemF0aW9uXCI7XG5cbi8vIGhlbHBlcnNcbmV4cG9ydCAqIGZyb20gXCIuL2NodW5rcy9oZWxwZXJzXCI7XG5cbi8vIGNzcyBzdGFuZGFyZFxuZXhwb3J0IHsgZGVmYXVsdFN0YW5kYXJkQ3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbi8vIGNzcyBib290c3RyYXBcbmV4cG9ydCB7IGRlZmF1bHRCb290c3RyYXBDc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Nib290c3RyYXBcIjtcbi8vIGNzcyBib290c3RyYXAgKyBtYXRlcmlhbFxuZXhwb3J0IHsgZGVmYXVsdEJvb3RzdHJhcE1hdGVyaWFsQ3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwbWF0ZXJpYWxcIjtcbmV4cG9ydCB7IG1vZGVybkNzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc21vZGVyblwiO1xuXG4vLyByZWFjdFxuZXhwb3J0IHsgU3VydmV5IH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0U3VydmV5XCI7XG5pbXBvcnQgeyBSZWFjdFN1cnZleU1vZGVsLCBSZWFjdFdpbmRvd01vZGVsIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0c3VydmV5bW9kZWxcIjtcbmV4cG9ydCB7IFJlYWN0U3VydmV5TW9kZWwgYXMgTW9kZWwgfTtcbmV4cG9ydCB7IFJlYWN0V2luZG93TW9kZWwgYXMgV2luZG93TW9kZWwgfTtcbmV4cG9ydCB7IFN1cnZleU5hdmlnYXRpb25CYXNlIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0U3VydmV5TmF2aWdhdGlvbkJhc2VcIjtcbmV4cG9ydCB7IFN1cnZleVRpbWVyUGFuZWwgfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3R0aW1lcnBhbmVsXCI7XG5leHBvcnQgeyBTdXJ2ZXlOYXZpZ2F0aW9uIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0U3VydmV5TmF2aWdhdGlvblwiO1xuZXhwb3J0IHsgU3VydmV5UGFnZSB9IGZyb20gXCIuLi9yZWFjdC9wYWdlXCI7XG5leHBvcnQgeyBTdXJ2ZXlSb3cgfSBmcm9tIFwiLi4vcmVhY3Qvcm93XCI7XG5leHBvcnQgeyBTdXJ2ZXlQYW5lbCB9IGZyb20gXCIuLi9yZWFjdC9wYW5lbFwiO1xuZXhwb3J0IHsgU3VydmV5Rmxvd1BhbmVsIH0gZnJvbSBcIi4uL3JlYWN0L2Zsb3ctcGFuZWxcIjtcbmV4cG9ydCB7XG4gIFN1cnZleVF1ZXN0aW9uLFxuICBTdXJ2ZXlFbGVtZW50RXJyb3JzLFxuICBTdXJ2ZXlRdWVzdGlvbkFuZEVycm9yc0NlbGwsXG59IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uXCI7XG5leHBvcnQge1xuICBTdXJ2ZXlFbGVtZW50QmFzZSxcbiAgU3VydmV5UXVlc3Rpb25FbGVtZW50QmFzZSxcbn0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25lbGVtZW50XCI7XG5leHBvcnQge1xuICBTdXJ2ZXlRdWVzdGlvbkNvbW1lbnRJdGVtLFxuICBTdXJ2ZXlRdWVzdGlvbkNvbW1lbnQsXG59IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uY29tbWVudFwiO1xuZXhwb3J0IHtcbiAgU3VydmV5UXVlc3Rpb25DaGVja2JveCxcbiAgU3VydmV5UXVlc3Rpb25DaGVja2JveEl0ZW0sXG59IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uY2hlY2tib3hcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uRHJvcGRvd24gfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbmRyb3Bkb3duXCI7XG5leHBvcnQge1xuICBTdXJ2ZXlRdWVzdGlvbk1hdHJpeCxcbiAgU3VydmV5UXVlc3Rpb25NYXRyaXhSb3csXG59IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9ubWF0cml4XCI7XG5leHBvcnQgeyBTdXJ2ZXlRdWVzdGlvbkh0bWwgfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbmh0bWxcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uRmlsZSB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZmlsZVwiO1xuZXhwb3J0IHsgU3VydmV5UXVlc3Rpb25NdWx0aXBsZVRleHQgfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbm11bHRpcGxldGV4dFwiO1xuZXhwb3J0IHsgU3VydmV5UXVlc3Rpb25SYWRpb2dyb3VwIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25yYWRpb2dyb3VwXCI7XG5leHBvcnQgeyBTdXJ2ZXlRdWVzdGlvblRleHQgfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbnRleHRcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uQm9vbGVhbiB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uYm9vbGVhblwiO1xuZXhwb3J0IHsgU3VydmV5UXVlc3Rpb25FbXB0eSB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZW1wdHlcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd25DZWxsIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uTWF0cml4RHJvcGRvd24gfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbm1hdHJpeGRyb3Bkb3duXCI7XG5leHBvcnQgeyBTdXJ2ZXlRdWVzdGlvbk1hdHJpeER5bmFtaWMgfSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbm1hdHJpeGR5bmFtaWNcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uUGFuZWxEeW5hbWljIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25wYW5lbGR5bmFtaWNcIjtcbmV4cG9ydCB7IFN1cnZleVByb2dyZXNzIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0U3VydmV5UHJvZ3Jlc3NcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uUmF0aW5nIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cXVlc3Rpb25yYXRpbmdcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZXhwcmVzc2lvblwiO1xuZXhwb3J0IHsgU3VydmV5V2luZG93IH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0U3VydmV5V2luZG93XCI7XG5leHBvcnQgeyBSZWFjdFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9yZWFjdC9yZWFjdHF1ZXN0aW9uZmFjdG9yeVwiO1xuZXhwb3J0IHsgUmVhY3RFbGVtZW50RmFjdG9yeSB9IGZyb20gXCIuLi9yZWFjdC9lbGVtZW50LWZhY3RvcnlcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uSW1hZ2VQaWNrZXIgfSBmcm9tIFwiLi4vcmVhY3QvaW1hZ2VwaWNrZXJcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uSW1hZ2UgfSBmcm9tIFwiLi4vcmVhY3QvaW1hZ2VcIjtcbmV4cG9ydCB7IFN1cnZleVF1ZXN0aW9uU2lnbmF0dXJlUGFkIH0gZnJvbSBcIi4uL3JlYWN0L3NpZ25hdHVyZXBhZFwiO1xuZXhwb3J0IHtcbiAgU3VydmV5UXVlc3Rpb25DdXN0b20sXG4gIFN1cnZleVF1ZXN0aW9uQ29tcG9zaXRlLFxufSBmcm9tIFwiLi4vcmVhY3QvcmVhY3RxdWVzdGlvbmN1c3RvbVwiO1xuXG4vL1Byb3BlcnR5IEdyaWRcbi8vZXhwb3J0IHsgUHJvcGVydHlHcmlkIH0gZnJvbSBcIi4uL3JlYWN0L3JlYWN0cHJvcGVydHlncmlkXCI7XG5cbi8vVW5jb21tZW50IHRvIGluY2x1ZGUgdGhlIFwiZGF0ZVwiIHF1ZXN0aW9uIHR5cGUuXG4vL2V4cG9ydCB7ZGVmYXVsdCBhcyBTdXJ2ZXlRdWVzdGlvbkRhdGV9IGZyb20gXCIuLi9wbHVnaW5zL3JlYWN0L3JlYWN0cXVlc3Rpb25kYXRlXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9yZWFjdC50cyJdLCJzb3VyY2VSb290IjoiIn0=