(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("jquery"));
else if(typeof define === 'function' && define.amd)
define("Survey", ["jquery"], factory);
else if(typeof exports === 'object')
exports["Survey"] = factory(require("jquery"));
else
root["Survey"] = factory(root["jQuery"]);
})(this, function(__WEBPACK_EXTERNAL_MODULE_58__) {
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 = 133);
/******/ })
/************************************************************************/
/******/ ([
/* 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; });
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;
};
/***/ }),
/* 1 */
/***/ (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__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return JsonObjectProperty; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return CustomPropertiesCollection; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return JsonMetadataClass; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return JsonMetadata; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return JsonError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return JsonUnknownPropertyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return JsonMissingTypeErrorBase; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return JsonMissingTypeError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return JsonIncorrectTypeError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return JsonRequiredPropertyError; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return JsonObject; });
var JsonObjectProperty = /** @class */ (function () {
function JsonObjectProperty(name, isRequired) {
if (isRequired === void 0) { isRequired = false; }
this.name = name;
this.typeValue = null;
this.choicesValue = null;
this.isRequiredValue = false;
this.readOnlyValue = null;
this.visibleValue = null;
this.isLocalizableValue = null;
this.choicesfunc = null;
this.isSerializable = true;
this.className = null;
this.alternativeName = null;
this.classNamePart = null;
this.baseClassName = null;
this.defaultValue = null;
this.serializationProperty = null;
this.onGetValue = null;
this.onSetValue = null;
this.isRequiredValue = isRequired;
}
Object.defineProperty(JsonObjectProperty.prototype, "type", {
get: function () {
return this.typeValue ? this.typeValue : "string";
},
set: function (value) {
this.typeValue = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "isRequired", {
get: function () {
return this.isRequiredValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JsonObjectProperty.prototype, "hasToUseGetValue", {
get: function () {
return this.onGetValue || this.serializationProperty;
},
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 || 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)
return obj[this.serializationProperty].getJson();
return obj[this.name];
};
JsonObjectProperty.prototype.getPropertyValue = function (obj) {
if (this.isLocalizable)
return obj[this.serializationProperty].text;
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].setJson(value);
else {
if (value && typeof value === "string") {
if (this.type == "number") {
value = parseInt(value);
}
if (this.type == "boolean") {
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) {
return this.classNamePart && className.indexOf(this.classNamePart) < 0
? className + this.classNamePart
: className;
};
Object.defineProperty(JsonObjectProperty.prototype, "choices", {
get: function () {
return this.getChoices(null);
},
enumerable: true,
configurable: true
});
JsonObjectProperty.prototype.getChoices = function (obj) {
if (this.choicesValue != null)
return this.choicesValue;
if (this.choicesfunc != null)
return this.choicesfunc(obj);
return null;
};
JsonObjectProperty.prototype.setChoices = function (value, valueFunc) {
this.choicesValue = value;
this.choicesfunc = valueFunc;
};
Object.defineProperty(JsonObjectProperty.prototype, "readOnly", {
get: function () {
return this.readOnlyValue != null ? this.readOnlyValue : false;
},
set: function (val) {
this.readOnlyValue = val;
},
enumerable: true,
configurable: 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
});
JsonObjectProperty.prototype.mergeWith = function (prop) {
var valuesNames = JsonObjectProperty.mergableValues;
for (var i = 0; i < valuesNames.length; i++) {
this.mergeValue(prop, valuesNames[i]);
}
};
JsonObjectProperty.prototype.mergeValue = function (prop, valueName) {
if (this[valueName] == null && prop[valueName] != null) {
this[valueName] = prop[valueName];
}
};
JsonObjectProperty.mergableValues = [
"typeValue",
"choicesValue",
"readOnlyValue",
"visibleValue",
"isSerializable",
"isLocalizableValue",
"className",
"alternativeName",
"classNamePart",
"baseClassName",
"defaultValue",
"serializationProperty",
"onGetValue",
"onSetValue"
];
return JsonObjectProperty;
}());
var CustomPropertiesCollection = /** @class */ (function () {
function CustomPropertiesCollection() {
}
CustomPropertiesCollection.addProperty = function (className, property) {
var props = CustomPropertiesCollection.properties;
if (!props[className]) {
props[className] = [];
}
props[className].push(property);
};
CustomPropertiesCollection.removeProperty = function (className, propertyName) {
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) {
CustomPropertiesCollection.parentClasses[className] = parentClassName;
};
CustomPropertiesCollection.getProperties = function (className) {
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 desc = {
get: function () {
return obj.getPropertyValue(prop.name, prop.defaultValue);
},
set: function (v) {
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;
this.requiredProperties = null;
if (parentName) {
CustomPropertiesCollection.addClass(name, 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);
propertyName = this.getPropertyName(propertyName);
var prop = new JsonObjectProperty(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 (propInfo.visible === false) {
prop.visible = false;
}
if (propInfo.isRequired) {
this.makePropertyRequired(prop.name);
}
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.onGetValue) {
prop.onGetValue = propInfo.onGetValue;
}
if (propInfo.onSetValue) {
prop.onSetValue = propInfo.onSetValue;
}
if (propInfo.isLocalizable) {
propInfo.serializationProperty = "loc" + propInfo.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;
}
}
return prop;
};
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);
this.makePropertyRequired(propertyName);
return propertyName;
};
JsonMetadataClass.prototype.makePropertyRequired = function (propertyName) {
if (!this.requiredProperties) {
this.requiredProperties = new Array();
}
this.requiredProperties.push(propertyName);
};
JsonMetadataClass.requiredSymbol = "!";
JsonMetadataClass.typeSymbol = ":";
return JsonMetadataClass;
}());
var JsonMetadata = /** @class */ (function () {
function JsonMetadata() {
this.classes = {};
this.childrenClasses = {};
this.classProperties = {};
this.classRequiredProperties = {};
}
JsonMetadata.prototype.addClass = function (name, properties, creator, parentName) {
if (creator === void 0) { creator = null; }
if (parentName === void 0) { parentName = null; }
var metaDataClass = new JsonMetadataClass(name, properties, creator, parentName);
this.classes[name] = metaDataClass;
if (parentName) {
var children = this.childrenClasses[parentName];
if (!children) {
this.childrenClasses[parentName] = [];
}
this.childrenClasses[parentName].push(metaDataClass);
}
return metaDataClass;
};
JsonMetadata.prototype.overrideClassCreatore = function (name, creator) {
var metaDataClass = this.findClass(name);
if (metaDataClass) {
metaDataClass.creator = creator;
}
};
JsonMetadata.prototype.getProperties = function (className) {
var properties = this.classProperties[className];
if (!properties) {
properties = new Array();
this.fillProperties(className, properties);
this.classProperties[className] = properties;
}
return properties;
};
JsonMetadata.prototype.getDynamicProperties = function (obj) {
if (obj.getDynamicProperties && obj.getDynamicType) {
var names = obj.getDynamicProperties();
return JsonObject.metaData.findProperties(obj.getDynamicType(), names);
}
return [];
};
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.push(props[i]);
}
var dynamicProps = this.getDynamicProperties(obj);
if (dynamicProps && dynamicProps.length > 0) {
for (var i = 0; i < dynamicProps.length; i++) {
res.push(dynamicProps[i]);
}
}
return res;
};
JsonMetadata.prototype.findProperty = function (className, propertyName) {
return this.findPropertyCore(this.getProperties(className), propertyName);
};
JsonMetadata.prototype.findProperties = function (className, propertyNames) {
var result = [];
var properties = this.getProperties(className);
for (var i = 0; i < propertyNames.length; i++) {
var prop = this.findPropertyCore(properties, propertyNames[i]);
if (prop) {
result.push(prop);
}
}
return result;
};
JsonMetadata.prototype.findPropertyCore = function (properties, propertyName) {
for (var i = 0; i < properties.length; i++) {
if (properties[i].name == propertyName)
return properties[i];
}
return null;
};
JsonMetadata.prototype.createClass = function (name) {
var metaDataClass = this.findClass(name);
if (!metaDataClass)
return null;
if (metaDataClass.creator)
return metaDataClass.creator();
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);
}
return null;
};
JsonMetadata.prototype.createCustomType = function (name, creator) {
var res = creator();
res.customTypeName = name;
res.customTemplateName = res.getTemplate
? res.getTemplate()
: res.getType();
res.getType = function () {
return res.customTypeName;
};
res.getTemplate = function () {
return res.customTemplateName;
};
CustomPropertiesCollection.createProperties(res);
return res;
};
JsonMetadata.prototype.getChildrenClasses = function (name, canBeCreated) {
if (canBeCreated === void 0) { canBeCreated = false; }
var result = [];
this.fillChildrenClasses(name, canBeCreated, result);
return result;
};
JsonMetadata.prototype.getRequiredProperties = function (name) {
var properties = this.classRequiredProperties[name];
if (!properties) {
properties = new Array();
this.fillRequiredProperties(name, properties);
this.classRequiredProperties[name] = properties;
}
return properties;
};
JsonMetadata.prototype.addProperties = function (className, propertiesInfos) {
var metaDataClass = this.findClass(className);
for (var i = 0; i < propertiesInfos.length; i++) {
this.addCustomPropertyCore(metaDataClass, propertiesInfos[i]);
}
};
JsonMetadata.prototype.addProperty = function (className, propertyInfo) {
this.addCustomPropertyCore(this.findClass(className), propertyInfo);
};
JsonMetadata.prototype.addCustomPropertyCore = function (metaDataClass, propertyInfo) {
if (!metaDataClass)
return;
var property = metaDataClass.createProperty(propertyInfo);
if (property) {
this.addPropertyToClass(metaDataClass, property);
this.emptyClassPropertiesHash(metaDataClass);
CustomPropertiesCollection.addProperty(metaDataClass.name, 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(className, 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);
if (metaDataClass.requiredProperties) {
index = metaDataClass.requiredProperties.indexOf(property.name);
if (index >= 0) {
metaDataClass.requiredProperties.splice(index, 1);
}
}
};
JsonMetadata.prototype.emptyClassPropertiesHash = function (metaDataClass) {
this.classProperties[metaDataClass.name] = null;
var childClasses = this.getChildrenClasses(metaDataClass.name);
for (var i = 0; i < childClasses.length; i++) {
this.classProperties[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) {
return this.classes[name];
};
JsonMetadata.prototype.fillProperties = function (name, list) {
var metaDataClass = this.findClass(name);
if (!metaDataClass)
return;
if (metaDataClass.parentName) {
this.fillProperties(metaDataClass.parentName, list);
}
for (var i = 0; i < metaDataClass.properties.length; i++) {
this.addPropertyCore(metaDataClass.properties[i], list, list.length);
}
};
JsonMetadata.prototype.addPropertyCore = function (property, list, endIndex) {
var index = -1;
for (var i = 0; i < endIndex; i++) {
if (list[i].name == property.name) {
index = i;
break;
}
}
if (index < 0) {
list.push(property);
}
else {
property.mergeWith(list[index]);
list[index] = property;
}
};
JsonMetadata.prototype.fillRequiredProperties = function (name, list) {
var metaDataClass = this.findClass(name);
if (!metaDataClass)
return;
if (metaDataClass.requiredProperties) {
Array.prototype.push.apply(list, metaDataClass.requiredProperties);
}
if (metaDataClass.parentName) {
this.fillRequiredProperties(metaDataClass.parentName, list);
}
};
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_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_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_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_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_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();
}
Object.defineProperty(JsonObject, "metaData", {
get: function () {
return JsonObject.metaDataValue;
},
enumerable: true,
configurable: true
});
JsonObject.prototype.toJsonObject = function (obj) {
return this.toJsonObjectCore(obj, null);
};
JsonObject.prototype.toObject = function (jsonObj, obj) {
if (!jsonObj)
return;
var properties = null;
if (obj.getType) {
properties = JsonObject.metaData.getProperties(obj.getType());
}
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) {
this.addNewError(new JsonUnknownPropertyError(key.toString(), obj.getType()), jsonObj);
continue;
}
this.valueToObj(jsonObj[key], obj, key, property);
}
if (obj.endLoadingFromJson) {
obj.endLoadingFromJson();
}
};
JsonObject.prototype.toJsonObjectCore = function (obj, property) {
if (!obj.getType)
return obj;
var result = {};
if (property != null && !property.className) {
result[JsonObject.typePropertyName] = property.getObjType(obj.getType());
}
this.propertiesToJson(obj, JsonObject.metaData.getProperties(obj.getType()), result);
this.propertiesToJson(obj, this.getDynamicProperties(obj), result);
return result;
};
JsonObject.prototype.getDynamicProperties = function (obj) {
if (obj.getDynamicProperties && obj.getDynamicType) {
var names = obj.getDynamicProperties();
return JsonObject.metaData.findProperties(obj.getDynamicType(), names);
}
return [];
};
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) {
for (var i = 0; i < properties.length; i++) {
this.valueToJson(obj, json, properties[i]);
}
};
JsonObject.prototype.valueToJson = function (obj, result, property) {
if (property.isSerializable === false)
return;
var value = property.getValue(obj);
if (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));
}
value = arrValue.length > 0 ? arrValue : null;
}
else {
value = this.toJsonObjectCore(value, property);
}
if (!property.isDefaultValue(value)) {
result[property.name] = value;
}
};
JsonObject.prototype.valueToObj = function (value, obj, key, property) {
if (value == null)
return;
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.toObject(value, newObj.newObj);
value = newObj.newObj;
}
if (!newObj.error) {
if (property != null) {
property.setValue(obj, value, this);
}
else {
obj[property.name] = value;
}
}
};
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)
: 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) {
var requiredProperties = JsonObject.metaData.getRequiredProperties(className);
if (requiredProperties) {
for (var i = 0; i < requiredProperties.length; i++) {
if (!value[requiredProperties[i]]) {
error = new JsonRequiredPropertyError(requiredProperties[i], className);
break;
}
}
}
}
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.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);
if (!obj[key])
obj[key] = [];
for (var i = 0; i < value.length; i++) {
var newValue = this.createNewObj(value[i], property);
if (newValue.newObj) {
obj[key].push(newValue.newObj);
this.toObject(value[i], newValue.newObj);
}
else {
if (!newValue.error) {
obj[key].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;
}());
/***/ }),
/* 2 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* 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 = {
currentLocale: "",
defaultLocale: "en",
locales: {},
supportedLocales: [],
getString: function (strName) {
var loc = this.currentLocale
? this.locales[this.currentLocale]
: this.locales[this.defaultLocale];
if (!loc || !loc[strName])
loc = this.locales[this.defaultLocale];
return loc[strName];
},
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 = {
pagePrevText: "Previous",
pageNextText: "Next",
completeText: "Complete",
startSurveyText: "Start",
otherItemText: "Other (describe)",
progressText: "Page {0} of {1}",
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: "Survey is loading...",
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.",
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.",
confirmDelete: "Do you want to delete the record?",
keyDuplicationError: "This value should be unique.",
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"
};
surveyLocalization.locales["en"] = surveyStrings;
/***/ }),
/* 3 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __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.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.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;
}());
/***/ }),
/* 4 */
/***/ (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__(18);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helpers__ = __webpack_require__(9);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return Base; });
/* 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__, "b", function() { return Event; });
/**
* The base class for SurveyJS objects.
*/
var Base = /** @class */ (function () {
function Base() {
this.propertyHash = {};
this.localizableStrings = {};
this.arraysInfo = {};
this.onPropChangeFunctions = [];
this.isLoadingFromJsonValue = false;
this.onPropertyChanged = new Event();
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["b" /* CustomPropertiesCollection */].createProperties(this);
}
/**
* 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);
};
/**
* Returns the type of the object as a string as it represents in the json.
*/
Base.prototype.getType = function () {
return "base";
};
/**
* 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.isLoadingFromJsonValue;
},
enumerable: true,
configurable: true
});
Base.prototype.startLoadingFromJson = function () {
this.isLoadingFromJsonValue = true;
};
Base.prototype.endLoadingFromJson = function () {
this.isLoadingFromJsonValue = false;
};
Base.prototype.onLocaleChanged = function () {
for (var key in this.arraysInfo) {
var item = this.arraysInfo[key];
if (item && item.isItemValues) {
var arr = this.getPropertyValue(key);
if (arr)
__WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].NotifyArrayOnLocaleChanged(arr);
}
}
for (var key in this.localizableStrings) {
var item = this.getLocalizableString(key);
if (item)
item.onChanged();
}
};
/**
* 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.propertyHash[name];
if (this.IsPropertyEmpty(res) && defaultValue != null)
return defaultValue;
return res;
};
Base.prototype.setPropertyValueCore = function (propertiesHash, name, val) {
if (this.setPropertyValueCoreHandler)
this.setPropertyValueCoreHandler(propertiesHash, name, val);
else
propertiesHash[name] = val;
};
/**
* set property value
* @param name property name
* @param val new property value
*/
Base.prototype.setPropertyValue = function (name, val) {
var oldValue = this.propertyHash[name];
if (oldValue && Array.isArray(oldValue)) {
if (this.isTwoValueEquals(oldValue, val))
return;
var arrayInfo = this.arraysInfo[name];
this.setArray(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.propertyValueChanged = function (name, oldValue, newValue) {
if (this.isLoadingFromJson)
return;
this.onPropertyChanged.fire(this, {
name: name,
oldValue: oldValue,
newValue: newValue
});
for (var i = 0; i < this.onPropChangeFunctions.length; i++) {
if (this.onPropChangeFunctions[i].name == name)
this.onPropChangeFunctions[i].func();
}
};
/**
* 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 witht the same key, it will be overwritten.
*/
Base.prototype.registerFunctionOnPropertyValueChanged = function (name, func, key) {
if (key === void 0) { key = null; }
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 witht 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; }
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);
this.localizableStrings[name] = locStr;
return locStr;
};
Base.prototype.getLocalizableString = function (name) {
return this.localizableStrings[name];
};
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.createItemValues = function (name) {
var self = this;
var result = this.createNewArray(name, function (item) {
item.locOwner = self;
});
this.arraysInfo[name].isItemValues = true;
return result;
};
Base.prototype.createNewArray = function (name, onPush, onRemove) {
if (onPush === void 0) { onPush = null; }
if (onRemove === void 0) { onRemove = null; }
var newArray = new Array();
this.setPropertyValueCore(this.propertyHash, name, newArray);
this.arraysInfo[name] = { onPush: onPush, isItemValues: false };
var self = this;
newArray.push = function (value) {
var result = Array.prototype.push.call(newArray, value);
if (onPush)
onPush(value);
self.propertyValueChanged(name, newArray, newArray);
return result;
};
newArray.pop = function () {
var result = Array.prototype.pop.call(newArray);
if (onRemove)
onRemove(result);
self.propertyValueChanged(name, newArray, newArray);
return result;
};
newArray.splice = function (start, deleteCount) {
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 = Array.prototype.splice).call.apply(_a, [newArray,
start,
deleteCount].concat(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);
}
}
self.propertyValueChanged(name, newArray, newArray);
return result;
var _a;
};
return newArray;
};
Base.prototype.setArray = function (src, dest, isItemValues, onPush) {
src.length = 0;
if (!dest)
return;
for (var i = 0; i < dest.length; i++) {
if (isItemValues) {
var item = dest[i];
item = new __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */](null);
item.setData(dest[i]);
Array.prototype.push.call(src, item);
}
else {
Array.prototype.push.call(src, dest[i]);
}
if (onPush)
onPush(src[i]);
}
};
Base.prototype.isTwoValueEquals = function (x, y) {
return __WEBPACK_IMPORTED_MODULE_2__helpers__["a" /* Helpers */].isTwoValueEquals(x, y);
};
Base.commentPrefix = "-Comment";
return Base;
}());
var SurveyError = /** @class */ (function () {
function SurveyError() {
}
SurveyError.prototype.getText = function () {
throw new Error("This method is abstract");
};
return SurveyError;
}());
var SurveyElement = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyElement, _super);
function SurveyElement(name) {
var _this = _super.call(this) || this;
_this.name = name;
_this.selectedElementInDesignValue = _this;
_this.errorsValue = [];
return _this;
}
SurveyElement.ScrollElementToTop = function (elementId) {
if (!elementId)
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) {
if (!elements || !elements.length)
return;
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)
return false;
var el = document.getElementById(elementId);
if (el) {
el.focus();
return true;
}
return false;
};
SurveyElement.setVisibleIndex = function (questions, index, showIndex) {
var startIndex = index;
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
if (!showIndex || !q.visible || !q.hasTitle) {
q.setVisibleIndex(-1);
}
else {
index += q.setVisibleIndex(index);
}
}
return index - startIndex;
};
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 () {
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, "isLoadingFromJson", {
get: function () {
if (this.survey)
return this.survey.isLoadingFromJson;
return this.isLoadingFromJsonValue;
},
enumerable: true,
configurable: true
});
Object.defineProperty(SurveyElement.prototype, "errors", {
/**
* The list of errors. It is created by callig hasErrors functions
* @see hasErrors
*/
get: function () {
return this.errorsValue;
},
set: function (val) {
this.errorsValue = val;
},
enumerable: true,
configurable: true
});
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.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
if (!this.survey) {
this.onSurveyLoad();
}
};
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.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.prototype.copyCssClasses = function (dest, source) {
if (!source)
return;
if (typeof source === "string" || source instanceof String) {
dest["root"] = source;
}
else {
for (var key in source) {
dest[key] = source[key];
}
}
};
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++) {
var callResult = this.callbacks[i](sender, options);
}
};
Event.prototype.add = function (func) {
if (this.callbacks == null) {
this.callbacks = new Array();
}
this.callbacks.push(func);
};
Event.prototype.remove = function (func) {
if (this.callbacks == null)
return;
var index = this.callbacks.indexOf(func, 0);
if (index != undefined) {
this.callbacks.splice(index, 1);
}
};
return Event;
}());
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
* Knockout JavaScript library v3.4.0
* (c) Steven Sanderson - http://knockoutjs.com/
* License: MIT (http://www.opensource.org/licenses/mit-license.php)
*/
(function(){
var DEBUG=true;
(function(undefined){
// (0, eval)('this') is a robust way of getting a reference to the global object
// For details, see http://stackoverflow.com/questions/14119988/return-this-0-evalthis/14120023#14120023
var window = this || (0, eval)('this'),
document = window['document'],
navigator = window['navigator'],
jQueryInstance = window["jQuery"],
JSON = window["JSON"];
(function(factory) {
// Support three module loading scenarios
if (true) {
// [1] AMD anonymous module
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [exports, __webpack_require__], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
} else if (typeof exports === 'object' && typeof module === 'object') {
// [2] CommonJS/Node.js
factory(module['exports'] || exports); // module.exports is for Node.js
} else {
// [3] No module loader (plain ";
};
SurveyTemplateText.prototype.replaceText = function (replaceText, id, questionType) {
if (questionType === void 0) { questionType = null; }
var posId = this.getId(id, questionType);
var pos = this.text.indexOf(posId);
if (pos < 0) {
this.addText(replaceText, id, questionType);
return;
}
pos = this.text.indexOf(">", pos);
if (pos < 0)
return;
var startPos = pos + 1;
var endString = "";
pos = this.text.indexOf(endString, startPos);
if (pos < 0)
return;
this.text =
this.text.substr(0, startPos) + replaceText + this.text.substr(pos);
};
SurveyTemplateText.prototype.getId = function (id, questionType) {
var result = 'id="survey-' + id;
if (questionType) {
result += "-" + questionType;
}
return result + '"';
};
Object.defineProperty(SurveyTemplateText.prototype, "text", {
get: function () {
return koTemplate;
},
set: function (value) {
koTemplate = value;
},
enumerable: true,
configurable: true
});
return SurveyTemplateText;
}());
/***/ }),
/* 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__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(7);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionBooleanModel; });
/**
* A Model for a boolean question.
*/
var QuestionBooleanModel = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionBooleanModel, _super);
function QuestionBooleanModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("label", _this, true);
return _this;
}
QuestionBooleanModel.prototype.getType = function () {
return "boolean";
};
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 this.showTitle;
},
enumerable: true,
configurable: true
});
QuestionBooleanModel.prototype.supportGoNextPageAutomatic = function () {
return 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.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", "indeterminate");
},
set: function (val) {
this.setPropertyValue("defaultValue", val);
this.updateValueWithDefaults();
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "label", {
/**
* The checkbox label. If it is empty and showTitle is false then title is rendered
* @see showTitle
* @see title
*/
get: function () {
return this.getLocalizableStringText("label");
},
set: function (val) {
this.setLocalizableStringText("label", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "locLabel", {
get: function () {
return this.getLocalizableString("label");
},
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, "showTitle", {
/**
* Set this property to true to show the question title. It is hidden by default.
*/
get: function () {
return this.getPropertyValue("showTitle");
},
set: function (val) {
this.setPropertyValue("showTitle", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "valueTrue", {
/**
* Set this property, if you want to have a different value from true when check is set.
*/
get: function () {
return this.getPropertyValue("valueTrue");
},
set: function (val) {
this.setPropertyValue("valueTrue", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionBooleanModel.prototype, "valueFalse", {
/**
* Set this property, if you want to have a different value from false when check is unset.
*/
get: function () {
return this.getPropertyValue("valueFalse");
},
set: function (val) {
this.setPropertyValue("valueFalse", val);
},
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;
};
return QuestionBooleanModel;
}(__WEBPACK_IMPORTED_MODULE_3__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("boolean", [
{
name: "defaultValue:dropdown",
alternativeName: "booleanDefaultValue",
default: "indeterminate",
choices: ["indeterminate", "false", "true"]
},
{ name: "label:text", serializationProperty: "locLabel" },
"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);
});
/***/ }),
/* 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__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(20);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__helpers__ = __webpack_require__(9);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCheckboxModel; });
/**
* A Model for a checkbox question
*/
var QuestionCheckboxModel = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionCheckboxModel, _super);
function QuestionCheckboxModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
return _this;
}
Object.defineProperty(QuestionCheckboxModel.prototype, "displayValue", {
get: function () {
if (this.isEmpty())
return "";
var items = this.visibleChoices;
var values = this.value;
var str = "";
for (var i = 0; i < values.length; i++) {
var valStr = this.getDisplayValue(items, values[i]);
if (valStr) {
if (str)
str += ", ";
str += valStr;
}
}
return str;
},
enumerable: true,
configurable: true
});
QuestionCheckboxModel.prototype.isAnswerCorrect = function () {
return __WEBPACK_IMPORTED_MODULE_4__helpers__["a" /* Helpers */].isArrayContainsEqual(this.value, this.correctAnswer);
};
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 [val];
return _super.prototype.valueFromData.call(this, val);
};
QuestionCheckboxModel.prototype.valueFromDataCore = function (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.valueToDataCore = function (val) {
if (!val || !val.length)
return val;
for (var i = 0; i < val.length; i++) {
if (val[i] == this.otherItem.value) {
if (this.getComment()) {
var newVal = val.slice();
newVal[i] = this.getComment();
return newVal;
}
}
}
return val;
};
QuestionCheckboxModel.prototype.getType = function () {
return "checkbox";
};
return QuestionCheckboxModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("checkbox", [], 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;
});
/***/ }),
/* 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__question__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCommentModel; });
/**
* A Model for a comment question
*/
var QuestionCommentModel = /** @class */ (function (_super) {
__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;
}
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", 4);
},
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", 50);
},
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 === "";
};
return QuestionCommentModel;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("comment", [
{ name: "cols:number", default: 50 },
{ name: "rows:number", default: 4 },
{ name: "placeHolder", serializationProperty: "locPlaceHolder" }
], function () {
return new QuestionCommentModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("comment", function (name) {
return new QuestionCommentModel(name);
});
/***/ }),
/* 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__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(20);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionDropdownModel; });
/**
* A Model for a dropdown question
*/
var QuestionDropdownModel = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionDropdownModel, _super);
function QuestionDropdownModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("optionsCaption", _this);
return _this;
}
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";
};
QuestionDropdownModel.prototype.supportGoNextPageAutomatic = function () {
return true;
};
return QuestionDropdownModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["b" /* QuestionSelectBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("dropdown", [{ name: "optionsCaption", serializationProperty: "locOptionsCaption" }], 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;
});
/***/ }),
/* 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__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(7);
/* 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_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" /* JsonObject */].metaData.addClass("empty", [], function () {
return new QuestionEmptyModel("");
}, "question");
/***/ }),
/* 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__question__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditions__ = __webpack_require__(12);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionExpressionModel; });
/**
* A Model for expression question. It is a read-only question. It calculates value based on epxression property.
*/
var QuestionExpressionModel = /** @class */ (function (_super) {
__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_4__conditions__["a" /* ExpressionRunner */](self.expression);
}
});
return _this;
}
QuestionExpressionModel.prototype.getType = function () {
return "expression";
};
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.runCondition = function (values) {
_super.prototype.runCondition.call(this, values);
if (!this.expression || this.expressionIsRunning)
return;
this.expressionIsRunning = true;
if (!this.expressionRunner)
this.expressionRunner = new __WEBPACK_IMPORTED_MODULE_4__conditions__["a" /* ExpressionRunner */](this.expression);
this.value = this.expressionRunner.run(values);
this.expressionIsRunning = false;
};
Object.defineProperty(QuestionExpressionModel.prototype, "displayValue", {
get: function () {
var val = this.isValueEmpty(this.value) ? this.defaultValue : this.value;
if (this.isValueEmpty(val))
return "";
var str = this.getValueAsStr(val);
if (!this.format)
return str;
return this.format["format"](str);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "displayStyle", {
/**
* You may set this property to "decimal", "currency" or "percent". 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", "none");
},
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", "USD");
},
set: function (val) {
if (getCurrecyCodes().indexOf(val) < 0)
return;
this.setPropertyValue("currency", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionExpressionModel.prototype, "useGrouping", {
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 != "none" &&
!isNaN(parseFloat(val)) &&
isFinite(val)) {
var locale = this.getLocale();
if (!locale)
locale = "en";
var options = {
style: this.displayStyle,
currency: this.currency,
useGrouping: this.useGrouping
};
return val.toLocaleString(locale, options);
}
return val.toString();
};
return QuestionExpressionModel;
}(__WEBPACK_IMPORTED_MODULE_1__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",
"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",
"ZAR",
"ZMW",
"ZWL"
];
}
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("expression", [
"expression:expression",
{ name: "format", serializationProperty: "locFormat" },
{
name: "displayStyle",
default: "decimal",
choices: ["none", "decimal", "currency", "percent"]
},
{
name: "currency",
choices: function () {
return getCurrecyCodes();
},
default: "USD"
},
{ name: "useGrouping:boolean", default: true },
{ name: "commentText", visible: false },
{ name: "enableIf", visible: false },
{ name: "isRequired", visible: false },
{ name: "readOnly", visible: false },
{ name: "requiredErrorText", visible: false },
{ name: "validators", visible: false }
], function () {
return new QuestionExpressionModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("expression", function (name) {
return new QuestionExpressionModel(name);
});
/***/ }),
/* 44 */
/***/ (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__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__error__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__surveyStrings__ = __webpack_require__(2);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionFileModel; });
/**
* A Model for a file question
*/
var QuestionFileModel = /** @class */ (function (_super) {
__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;
_this.previewValue = [];
return _this;
}
QuestionFileModel.prototype.getType = function () {
return "file";
};
Object.defineProperty(QuestionFileModel.prototype, "showPreview", {
/**
* Set it to true, to show the preview for the image files.
*/
get: function () {
return this.getPropertyValue("showPreview", false);
},
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, "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 onUploadFile event to store the file content.
* @see SurveyModel.onUploadFile
*/
get: function () {
return this.getPropertyValue("storeDataAsText", true);
},
set: function (val) {
this.setPropertyValue("storeDataAsText", 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, "cleanButtonCaption", {
/**
* The clean files value button caption.
*/
get: function () {
return __WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("cleanCaption");
},
enumerable: true,
configurable: true
});
/**
* Clear value programmatically.
*/
QuestionFileModel.prototype.clear = function () {
this.value = undefined;
this.previewValue = [];
this.fireCallback(this.previewValueLoadedCallback);
};
/**
* Load file programmatically.
* @param file
*/
QuestionFileModel.prototype.loadFile = function (file) {
this.loadFiles([file]);
};
/**
* Load multiple files programmatically.
* @param files
*/
QuestionFileModel.prototype.loadFiles = function (files) {
var _this = this;
if (this.survey &&
!files.every(function (file) {
return _this.survey.uploadFile(_this.name, file, _this.storeDataAsText, function (status) { return (_this.isUploading = status === "uploading"); });
})) {
return;
}
this.setFilesValue(files);
};
QuestionFileModel.prototype.setFileValue = function (file) {
this.setFilesValue([file]);
};
QuestionFileModel.prototype.setFilesValue = function (files) {
var _this = this;
if (!FileReader) {
return;
}
if (!this.showPreview && !this.storeDataAsText) {
return;
}
if (files.every(function (file) { return _this.checkFileForErrors(file); })) {
return;
}
this.previewValue = [];
files.forEach(function (file) {
var fileReader = new FileReader();
fileReader.onload = function (e) {
if (_this.storeDataAsText) {
_this.value = (_this.value || []).concat([fileReader.result]);
}
if (_this.showPreview && _this.isFileImage(file)) {
_this.previewValue = _this.previewValue.concat([fileReader.result]);
_this.fireCallback(_this.previewValueLoadedCallback);
}
};
fileReader.readAsDataURL(file);
});
};
QuestionFileModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.isUploading) {
errors.push(new __WEBPACK_IMPORTED_MODULE_4__error__["c" /* CustomError */](__WEBPACK_IMPORTED_MODULE_5__surveyStrings__["a" /* surveyLocalization */].getString("uploadingFile")));
}
};
QuestionFileModel.prototype.checkFileForErrors = function (file) {
var errorLength = this.errors ? this.errors.length : 0;
this.errors = [];
if (this.maxSize > 0 && file.size > this.maxSize) {
this.errors.push(new __WEBPACK_IMPORTED_MODULE_4__error__["e" /* ExceedSizeError */](this.maxSize));
}
if (errorLength != this.errors.length || this.errors.length > 0) {
this.fireCallback(this.errorsChangedCallback);
}
return this.errors.length > 0;
};
QuestionFileModel.prototype.isFileImage = function (file) {
if (!file || !file.type)
return;
var str = file.type.toLowerCase();
return str.indexOf("image") == 0;
};
return QuestionFileModel;
}(__WEBPACK_IMPORTED_MODULE_1__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("file", [
"showPreview:boolean",
"allowMultiple:boolean",
"imageHeight",
"imageWidth",
{ name: "storeDataAsText:boolean", default: true },
"maxSize:number"
], function () {
return new QuestionFileModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("file", function (name) {
return new QuestionFileModel(name);
});
/***/ }),
/* 45 */
/***/ (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__questionbase__ = __webpack_require__(27);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* 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_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionHtmlModel, _super);
function QuestionHtmlModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.createLocalizableString("html", _this);
return _this;
}
QuestionHtmlModel.prototype.getType = function () {
return "html";
};
Object.defineProperty(QuestionHtmlModel.prototype, "html", {
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__questionbase__["a" /* QuestionBase */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("html", [{ name: "html:html", serializationProperty: "locHtml" }], function () {
return new QuestionHtmlModel("");
}, "questionbase");
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("html", function (name) {
return new QuestionHtmlModel(name);
});
/***/ }),
/* 46 */
/***/ (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__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrixModel; });
var MatrixRowModel = /** @class */ (function () {
function MatrixRowModel(item, fullName, data, value) {
this.fullName = fullName;
this.item = item;
this.data = data;
this.rowValue = value;
}
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.rowValue;
},
set: function (newValue) {
this.rowValue = newValue;
if (this.data)
this.data.onMatrixRowChanged(this);
this.onValueChanged();
},
enumerable: true,
configurable: true
});
MatrixRowModel.prototype.onValueChanged = function () { };
return MatrixRowModel;
}());
/**
* A Model for a simple matrix question.
*/
var QuestionMatrixModel = /** @class */ (function (_super) {
__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.columnsValue = _this.createItemValues("columns");
_this.rowsValue = _this.createItemValues("rows");
return _this;
}
QuestionMatrixModel.prototype.getType = function () {
return "matrix";
};
Object.defineProperty(QuestionMatrixModel.prototype, "isAllowTitleLeft", {
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.rowsValue.length > 0;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "columns", {
/**
* The list of columns. A column has a value and an optional text
*/
get: function () {
return this.columnsValue;
},
set: function (newValue) {
this.setPropertyValue("columns", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "rows", {
/**
* The list of rows. A row has a value and an optional text
*/
get: function () {
return this.rowsValue;
},
set: function (newValue) {
this.setPropertyValue("rows", newValue);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixModel.prototype, "visibleRows", {
/**
* Returns the list of rows as model objects.
*/
get: function () {
var result = new Array();
var val = this.value;
if (!val)
val = {};
for (var i = 0; i < this.rows.length; i++) {
if (!this.rows[i].value)
continue;
result.push(this.createMatrixRow(this.rows[i], this.name + "_" + this.rows[i].value.toString(), val[this.rows[i].value]));
}
if (result.length == 0) {
result.push(this.createMatrixRow(new __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */](null), this.name, val));
}
this.generatedVisibleRows = result;
return result;
},
enumerable: true,
configurable: true
});
QuestionMatrixModel.prototype.supportGoNextPageAutomatic = function () {
return this.hasValuesInAllRows();
};
QuestionMatrixModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.hasErrorInRows()) {
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["c" /* CustomError */](__WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("requiredInAllRowsError")));
}
};
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++) {
var val = rows[i].value;
if (!val)
return false;
}
return true;
};
QuestionMatrixModel.prototype.createMatrixRow = function (item, fullName, value) {
return new MatrixRowModel(item, fullName, this, value);
};
QuestionMatrixModel.prototype.onValueChanged = function () {
if (this.isRowChanging ||
!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] ? val[row.name] : null;
this.generatedVisibleRows[i].value = rowVal;
}
}
this.isRowChanging = false;
};
Object.defineProperty(QuestionMatrixModel.prototype, "displayValue", {
get: function () {
var values = this.value;
if (!values)
return values;
for (var key in values) {
values[key] = __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getTextOrHtmlByValue(this.columns, values[key]);
}
return values;
},
enumerable: true,
configurable: true
});
//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_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* JsonObject */].metaData.addClass("matrix", [
{
name: "columns:itemvalues",
onGetValue: function (obj) {
return __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getData(obj.columns);
},
onSetValue: function (obj, value) {
obj.columns = value;
}
},
{
name: "rows:itemvalues",
onGetValue: function (obj) {
return __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getData(obj.rows);
},
onSetValue: function (obj, value) {
obj.rows = value;
}
},
"isAllRowRequired:boolean"
], function () {
return new QuestionMatrixModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrix", function (name) {
var q = new QuestionMatrixModel(name);
q.rows = __WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].DefaultRows;
q.columns = __WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].DefaultColums;
return q;
});
/***/ }),
/* 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__question_matrixdropdownbase__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return MatrixDropdownRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionMatrixDropdownModel; });
var MatrixDropdownRowModel = /** @class */ (function (_super) {
__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();
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__["b" /* 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_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixDropdownModel, _super);
function QuestionMatrixDropdownModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.rowsValue = _this.createItemValues("rows");
var self = _this;
_this.registerFunctionOnPropertyValueChanged("rows", function () {
self.generatedVisibleRows = null;
});
return _this;
}
QuestionMatrixDropdownModel.prototype.getType = function () {
return "matrixdropdown";
};
Object.defineProperty(QuestionMatrixDropdownModel.prototype, "displayValue", {
get: function () {
var values = this.value;
if (!values)
return values;
var rows = this.visibleRows;
for (var i = 0; i < rows.length; i++) {
var rowValue = this.rows[i].value;
var val = values[rowValue];
if (!val)
continue;
values[rowValue] = this.getRowDisplayValue(rows[i], val);
}
return values;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDropdownModel.prototype, "rows", {
/**
* The list of rows. A row has a value and an optional text
*/
get: function () {
return this.rowsValue;
},
set: function (val) {
this.setPropertyValue("rows", val);
},
enumerable: true,
configurable: true
});
QuestionMatrixDropdownModel.prototype.generateRows = function () {
var result = new Array();
if (!this.rows || this.rows.length === 0)
return result;
var val = this.value;
if (!val)
val = {};
for (var i = 0; i < this.rows.length; i++) {
if (!this.rows[i].value)
continue;
result.push(this.createMatrixRow(this.rows[i], val[this.rows[i].value]));
}
return result;
};
QuestionMatrixDropdownModel.prototype.createMatrixRow = function (item, value) {
var row = new MatrixDropdownRowModel(item.value, item, this, value);
this.onMatrixRowCreated(row);
return row;
};
return QuestionMatrixDropdownModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["a" /* QuestionMatrixDropdownModelBase */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("matrixdropdown", [
{
name: "rows:itemvalues",
onGetValue: function (obj) {
return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a" /* ItemValue */].getData(obj.rows);
},
onSetValue: function (obj, value) {
obj.rows = value;
}
}
], 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__["a" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q);
return q;
});
/***/ }),
/* 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__question_matrixdropdownbase__ = __webpack_require__(15);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__error__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return MatrixDynamicRowModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionMatrixDynamicModel; });
var MatrixDynamicRowModel = /** @class */ (function (_super) {
__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();
return _this;
}
Object.defineProperty(MatrixDynamicRowModel.prototype, "rowName", {
get: function () {
return this.id;
},
enumerable: true,
configurable: true
});
return MatrixDynamicRowModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["b" /* 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_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.rowCountValue = 2;
_this.createLocalizableString("confirmDeleteText", _this);
_this.createLocalizableString("keyDuplicationError", _this);
_this.createLocalizableString("addRowText", _this);
_this.createLocalizableString("removeRowText", _this);
return _this;
}
QuestionMatrixDynamicModel.prototype.getType = function () {
return "matrixdynamic";
};
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, "rowCount", {
/**
* The number of rows in the matrix.
* @see minRowCount
* @see maxRowCount
*/
get: function () {
return this.rowCountValue;
},
set: function (val) {
if (val < 0 || val > QuestionMatrixDynamicModel.MaxRowCount)
return;
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)
return;
if (this.generatedVisibleRows) {
this.generatedVisibleRows.splice(val);
for (var i = prevValue; i < val; i++) {
this.generatedVisibleRows.push(this.createMatrixRow(null));
}
}
this.fireCallback(this.rowCountChangedCallback);
},
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
*/
get: function () {
return this.getPropertyValue("minRowCount", 0);
},
set: function (val) {
if (val < 0)
val = 0;
if (val == this.minRowCount || val > this.maxRowCount)
return;
this.setPropertyValue("minRowCount", 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
*/
get: function () {
return this.getPropertyValue("maxRowCount", QuestionMatrixDynamicModel.MaxRowCount);
},
set: function (val) {
if (val <= 0)
return;
if (val > QuestionMatrixDynamicModel.MaxRowCount)
val = QuestionMatrixDynamicModel.MaxRowCount;
if (val == this.maxRowCount || val < this.minRowCount)
return;
this.setPropertyValue("maxRowCount", val);
if (this.rowCount > val)
this.rowCount = val;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canAddRow", {
/**
* Returns true, if a new row can be added.
* @see maxRowCount
* @see canRemoveRow
* @see rowCount
*/
get: function () {
return this.rowCount < this.maxRowCount;
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "canRemoveRow", {
/**
* Returns true, if a row can be removed.
* @see minRowCount
* @see canAddRow
* @see rowCount
*/
get: function () {
return this.rowCount > this.minRowCount;
},
enumerable: true,
configurable: true
});
/**
* Creates and add a new row.
*/
QuestionMatrixDynamicModel.prototype.addRow = function () {
if (!this.canAddRow)
return;
var prevRowCount = this.rowCount;
this.rowCount = this.rowCount + 1;
if (this.data) {
this.runCellsCondition(this.data.getAllValues());
}
if (this.survey) {
if (prevRowCount + 1 == this.rowCount)
this.survey.matrixRowAdded(this);
}
};
/**
* 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 (!this.confirmDelete || confirm(this.confirmDeleteText)) {
this.removeRow(value);
}
};
/**
* Removes a row by it's index.
* @param index a row index, from 0 to rowCount - 1
*/
QuestionMatrixDynamicModel.prototype.removeRow = function (index) {
if (!this.canRemoveRow)
return;
if (index < 0 || index >= this.rowCount)
return;
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);
}
if (this.value) {
var val = this.createNewValue(this.value);
val.splice(index, 1);
val = this.deleteRowValue(val, null);
this.value = val;
}
this.rowCountValue--;
this.fireCallback(this.rowCountChangedCallback);
};
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 () {
return this.getLocalizableStringText("addRowText", __WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */].getString("addRow"));
},
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, "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
});
Object.defineProperty(QuestionMatrixDynamicModel.prototype, "displayValue", {
get: function () {
var values = this.value;
if (!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;
},
enumerable: true,
configurable: true
});
QuestionMatrixDynamicModel.prototype.supportGoNextPageAutomatic = function () {
return false;
};
QuestionMatrixDynamicModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
if (this.hasErrorInRows()) {
errors.push(new __WEBPACK_IMPORTED_MODULE_5__error__["c" /* CustomError */](__WEBPACK_IMPORTED_MODULE_4__surveyStrings__["a" /* surveyLocalization */]
.getString("minRowCountError")["format"](this.minRowCount)));
}
};
QuestionMatrixDynamicModel.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) { fireCallback = true; }
var prevValue = _super.prototype.hasErrors.call(this, fireCallback);
return this.isValueDuplicated() || prevValue;
};
QuestionMatrixDynamicModel.prototype.hasErrorInRows = function () {
if (this.minRowCount <= 0 || !this.generatedVisibleRows)
return false;
var res = 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.getColumnName(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__["c" /* CustomError */](this.keyDuplicationError));
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(this.value);
for (var i = 0; i < this.rowCount; i++) {
result.push(this.createMatrixRow(this.getRowValueByIndex(val, i)));
}
return result;
};
QuestionMatrixDynamicModel.prototype.createMatrixRow = function (value) {
var row = new MatrixDynamicRowModel(this.rowCounter++, this, value);
this.onMatrixRowCreated(row);
return row;
};
QuestionMatrixDynamicModel.prototype.onBeforeValueChanged = function (val) {
var newRowCount = val && Array.isArray(val) ? val.length : 0;
if (newRowCount <= this.rowCount)
return;
this.rowCountValue = newRowCount;
if (this.generatedVisibleRows) {
this.generatedVisibleRows = null;
this.generatedVisibleRows = this.visibleRows;
}
};
QuestionMatrixDynamicModel.prototype.createNewValue = function (curValue) {
var result = curValue;
if (!result)
result = [];
var r = [];
if (result.length > this.rowCount)
result.splice(this.rowCount - 1);
for (var i = result.length; i < this.rowCount; i++) {
result.push({});
}
return result;
};
QuestionMatrixDynamicModel.prototype.deleteRowValue = function (newValue, row) {
var isEmpty = true;
for (var i = 0; i < newValue.length; i++) {
if (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 {};
return this.getRowValueByIndex(questionValue, this.generatedVisibleRows.indexOf(row));
};
QuestionMatrixDynamicModel.MaxRowCount = 100;
return QuestionMatrixDynamicModel;
}(__WEBPACK_IMPORTED_MODULE_1__question_matrixdropdownbase__["a" /* QuestionMatrixDropdownModelBase */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("matrixdynamic", [
{ name: "rowCount:number", default: 2 },
{ name: "minRowCount:number", default: 0 },
{
name: "maxRowCount:number",
default: QuestionMatrixDynamicModel.MaxRowCount
},
{ name: "keyName" },
{
name: "keyDuplicationError",
serializationProperty: "locKeyDuplicationError"
},
{ name: "confirmDelete:boolean" },
{
name: "confirmDeleteText",
serializationProperty: "locConfirmDeleteText"
},
{ 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__["a" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q);
return q;
});
/***/ }),
/* 49 */
/***/ (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__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__validator__ = __webpack_require__(28);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question_text__ = __webpack_require__(26);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__error__ = __webpack_require__(8);
/* 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_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.validators = new Array();
_this.editorValue = _this.createEditor(name);
_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, "editor", {
get: function () {
return this.editorValue;
},
enumerable: true,
configurable: true
});
MultipleTextItemModel.prototype.createEditor = function (name) {
return new __WEBPACK_IMPORTED_MODULE_4__question_text__["a" /* QuestionTextModel */](name);
};
MultipleTextItemModel.prototype.setData = function (data) {
this.data = data;
if (data) {
this.editor.setSurveyImpl(this);
}
};
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, "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, "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.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.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;
};
//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
});
return MultipleTextItemModel;
}(__WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */]));
/**
* A Model for a multiple text question.
*/
var QuestionMultipleTextModel = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMultipleTextModel, _super);
function QuestionMultipleTextModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.itemsValues = new Array();
_this.isMultipleItemValueChanging = false;
var self = _this;
_this.itemsValues = _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
});
QuestionMultipleTextModel.prototype.endLoadingFromJson = function () {
_super.prototype.endLoadingFromJson.call(this);
this.fireCallback(this.colCountChangedCallback);
};
Object.defineProperty(QuestionMultipleTextModel.prototype, "items", {
/**
* The list of input items.
*/
get: function () {
return this.itemsValues;
},
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.onLocaleChanged = function () {
_super.prototype.onLocaleChanged.call(this);
for (var i = 0; i < this.items.length; i++) {
this.items[i].onLocaleChanged();
}
};
QuestionMultipleTextModel.prototype.supportGoNextPageAutomatic = function () {
for (var i = 0; i < this.items.length; i++) {
if (!this.items[i].value)
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", 1);
},
set: function (val) {
if (val < 1 || val > 4)
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", 25);
},
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.runValidators = function () {
var error = _super.prototype.runValidators.call(this);
if (error != null)
return error;
for (var i = 0; i < this.items.length; i++) {
error = new __WEBPACK_IMPORTED_MODULE_2__validator__["a" /* ValidatorRunner */]().run(this.items[i]);
if (error != null)
return error;
}
return null;
};
QuestionMultipleTextModel.prototype.onCheckForErrors = function (errors) {
_super.prototype.onCheckForErrors.call(this, errors);
for (var i = 0; i < this.items.length; i++) {
var item = this.items[i];
if (item.isRequired && !item.value) {
errors.push(new __WEBPACK_IMPORTED_MODULE_7__error__["a" /* AnswerRequiredError */]());
}
}
};
//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.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 : "";
};
return QuestionMultipleTextModel;
}(__WEBPACK_IMPORTED_MODULE_3__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_5__jsonobject__["a" /* JsonObject */].metaData.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: "validators:validators",
baseClassName: "surveyvalidator",
classNamePart: "validator"
}
], function () {
return new MultipleTextItemModel("");
});
__WEBPACK_IMPORTED_MODULE_5__jsonobject__["a" /* JsonObject */].metaData.addClass("multipletext", [
{ name: "!items:textitems", className: "multipletextitem" },
{ name: "itemSize:number", default: 25 },
{ name: "colCount:number", default: 1, choices: [1, 2, 3, 4] }
], function () {
return new QuestionMultipleTextModel("");
}, "question");
__WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("multipletext", function (name) {
var q = new QuestionMultipleTextModel(name);
q.addItem("text1");
q.addItem("text2");
return q;
});
/***/ }),
/* 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__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__surveyStrings__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__textPreProcessor__ = __webpack_require__(16);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__ = __webpack_require__(13);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__question__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__panel__ = __webpack_require__(19);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__error__ = __webpack_require__(8);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionPanelDynamicItem; });
/* 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_3__textPreProcessor__["a" /* TextPreProcessor */]();
this.textPreProcessor.onProcess = function (textValue) {
self.getProcessedTextValue(textValue);
};
this.panel.setSurveyImpl(this);
this.panel.updateCustomWidgets();
}
Object.defineProperty(QuestionPanelDynamicItem.prototype, "panel", {
get: function () {
return this.panelValue;
},
enumerable: true,
configurable: true
});
QuestionPanelDynamicItem.prototype.runCondition = function (values) {
this.panel.runCondition(values);
};
QuestionPanelDynamicItem.prototype.getValue = function (name) {
var values = this.data.getPanelItemData(this);
return values[name];
};
QuestionPanelDynamicItem.prototype.setValue = function (name, newValue) {
this.data.setPanelItemData(this, name, newValue);
};
QuestionPanelDynamicItem.prototype.getComment = function (name) {
var result = this.getValue(name + __WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */].commentPrefix);
return result ? result : "";
};
QuestionPanelDynamicItem.prototype.setComment = function (name, newValue) {
this.setValue(name + __WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */].commentPrefix, newValue);
};
QuestionPanelDynamicItem.prototype.onSurveyValueChanged = function () {
var questions = this.panel.questions;
var values = this.data.getPanelItemData(this);
for (var i = 0; i < questions.length; i++) {
var q = questions[i];
q.onSurveyValueChanged(values[q.getValueName()]);
}
};
QuestionPanelDynamicItem.prototype.setVisibleIndex = function (index, showIndex) {
return __WEBPACK_IMPORTED_MODULE_1__base__["a" /* SurveyElement */].setVisibleIndex(this.panel.questions, index, showIndex);
};
QuestionPanelDynamicItem.prototype.getAllValues = function () {
return this.data.getPanelItemData(this);
};
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.name == QuestionPanelDynamicItem.IndexVariableName) {
textValue.isExists = true;
textValue.value = this.data.getItemIndex(this) + 1;
return;
}
var firstName = new __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(textValue.name);
textValue.isExists = firstName == QuestionPanelDynamicItem.ItemVariableName;
if (!textValue)
return;
//name should start with the panel
textValue.name = textValue.name.replace(QuestionPanelDynamicItem.ItemVariableName + ".", "");
var firstName = new __WEBPACK_IMPORTED_MODULE_4__conditionProcessValue__["a" /* ProcessValue */]().getFirstName(textValue.name);
var question = this.panel.getQuestionByValueName(firstName);
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_4__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) {
text = this.processText(text, true);
var hasAllValuesOnLastRun = this.textPreProcessor.hasAllValuesOnLastRun;
var res = { hasAllValuesOnLastRun: true, text: text };
if (this.getSurvey()) {
res = this.getSurvey().processTextEx(text);
}
res.hasAllValuesOnLastRun =
res.hasAllValuesOnLastRun && hasAllValuesOnLastRun;
return res;
};
QuestionPanelDynamicItem.prototype.onAnyValueChanged = function (name) {
this.panel.onAnyValueChanged(name);
this.panel.onAnyValueChanged(QuestionPanelDynamicItem.ItemVariableName);
};
QuestionPanelDynamicItem.ItemVariableName = "panel";
QuestionPanelDynamicItem.IndexVariableName = "panelIndex";
return QuestionPanelDynamicItem;
}());
/**
* 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_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionPanelDynamicModel, _super);
function QuestionPanelDynamicModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.itemsValue = new Array();
_this.loadingPanelCount = 0;
_this.currentIndexValue = -1;
_this.templateValue = _this.createAndSetupNewPanelObject();
_this.template.renderWidth = "100%";
_this.template.selectedElementInDesign = _this;
var self = _this;
_this.oldTemplateRowsChangedCallback = _this.template.rowsChangedCallback;
_this.template.rowsChangedCallback = function () {
self.templateOnRowsChanged();
if (self.oldTemplateRowsChangedCallback)
self.oldTemplateRowsChangedCallback();
};
_this.createLocalizableString("confirmDeleteText", _this);
_this.createLocalizableString("keyDuplicationError", _this);
_this.createLocalizableString("panelAddText", _this);
_this.createLocalizableString("panelRemoveText", _this);
_this.createLocalizableString("panelPrevText", _this);
_this.createLocalizableString("panelNextText", _this);
return _this;
}
QuestionPanelDynamicModel.prototype.setSurveyImpl = function (value) {
_super.prototype.setSurveyImpl.call(this, value);
this.template.setSurveyImpl(this.surveyImpl);
};
QuestionPanelDynamicModel.prototype.templateOnRowsChanged = function () {
if (this.isLoadingFromJson)
return;
this.rebuildPanels();
};
QuestionPanelDynamicModel.prototype.getType = function () {
return "paneldynamic";
};
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
});
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 () {
return this.itemsValue;
},
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 () {
var res = [];
for (var i = 0; i < this.items.length; i++) {
res.push(this.items[i].panel);
}
return res;
},
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.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 (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_2__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_2__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_2__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_2__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_2__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_2__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 then 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;
};
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.items.length;
},
set: function (val) {
if (val < 0)
return;
if (this.isLoadingFromJson || this.isDesignMode) {
this.loadingPanelCount = val;
return;
}
if (val == this.items.length || this.isDesignMode)
return;
for (var i = this.panelCount; i < val; i++) {
this.items.push(this.createNewItem());
}
if (val < this.panelCount)
this.items.splice(val, this.panelCount - val);
this.setValueBasedOnPanelCount();
this.reRunCondition();
this.fireCallback(this.panelCountChangedCallback);
},
enumerable: true,
configurable: true
});
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.value = value;
};
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 || val > this.maxPanelCount)
return;
this.setPropertyValue("minPanelCount", 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", QuestionPanelDynamicModel.MaxPanelCount);
},
set: function (val) {
if (val <= 0)
return;
if (val > QuestionPanelDynamicModel.MaxPanelCount)
val = QuestionPanelDynamicModel.MaxPanelCount;
if (val == this.maxPanelCount || val < this.minPanelCount)
return;
this.setPropertyValue("maxPanelCount", 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", true);
},
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", true);
},
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", "default");
},
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", "off");
},
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", "list");
},
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) {
var startIndex = this.showQuestionNumbers == "onSurvey" ? value : 0;
for (var i = 0; i < this.items.length; i++) {
var counter = this.items[i].setVisibleIndex(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;
};
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 items = new Array();
if (this.isDesignMode) {
items.push(new QuestionPanelDynamicItem(this, this.template));
if (this.oldTemplateRowsChangedCallback) {
this.oldTemplateRowsChangedCallback();
}
this.rebuildTemplateRowsInElements(this.template.elements);
}
else {
for (var i = 0; i < this.panelCount; i++) {
items.push(this.createNewItem());
}
}
this.itemsValue = items;
this.reRunCondition();
this.fireCallback(this.panelCountChangedCallback);
};
QuestionPanelDynamicModel.prototype.rebuildTemplateRowsInElements = function (elements) {
for (var i = 0; i < elements.length; i++) {
if (!elements[i].isPanel)
continue;
var panel = elements[i];
if (panel.rowsChangedCallback)
panel.rowsChangedCallback();
this.rebuildTemplateRowsInElements(panel.elements);
}
};
/**
* 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;
return this.addPanel();
};
/**
* 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;
}
if (this.survey)
this.survey.dynamicPanelAdded(this);
return this.items[this.panelCount - 1].panel;
};
/**
* 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 || confirm(this.confirmDeleteText)) {
this.removePanel(value);
}
};
/**
* 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;
this.items.splice(index, 1);
var value = this.value;
if (!value || !Array.isArray(value) || index >= value.length)
return;
value.splice(index, 1);
this.value = value;
this.fireCallback(this.panelCountChangedCallback);
if (this.survey)
this.survey.dynamicPanelRemoved(this, index);
};
QuestionPanelDynamicModel.prototype.getPanelIndex = function (val) {
if (!isNaN(parseFloat(val)) && isFinite(val))
return val;
for (var i = 0; i < this.items.length; i++) {
if (this.items[i] === val || this.items[i].panel === val)
return i;
}
return -1;
};
QuestionPanelDynamicModel.prototype.onSurveyLoad = function () {
if (this.loadingPanelCount > 0) {
this.panelCount = this.loadingPanelCount;
}
if (this.isDesignMode) {
this.rebuildPanels();
}
_super.prototype.onSurveyLoad.call(this);
};
QuestionPanelDynamicModel.prototype.runCondition = function (values) {
_super.prototype.runCondition.call(this, values);
this.runPanelsCondition(values);
};
QuestionPanelDynamicModel.prototype.reRunCondition = function () {
if (!this.data)
return;
this.runCondition(this.data.getAllValues());
};
QuestionPanelDynamicModel.prototype.runPanelsCondition = function (values) {
var newValues = {};
if (values && values instanceof Object) {
newValues = JSON.parse(JSON.stringify(values));
}
for (var i = 0; i < this.items.length; i++) {
newValues[QuestionPanelDynamicItem.ItemVariableName] = this.getPanelItemData(this.items[i]);
newValues[QuestionPanelDynamicItem.IndexVariableName] = i;
this.items[i].runCondition(newValues);
}
};
QuestionPanelDynamicModel.prototype.onAnyValueChanged = function (name) {
_super.prototype.onAnyValueChanged.call(this, name);
for (var i = 0; i < this.items.length; i++) {
this.items[i].onAnyValueChanged(name);
}
};
QuestionPanelDynamicModel.prototype.hasErrors = function (fireCallback) {
if (fireCallback === void 0) { fireCallback = true; }
var errosInPanels = this.hasErrorInPanels(fireCallback);
return _super.prototype.hasErrors.call(this, fireCallback) || errosInPanels;
};
QuestionPanelDynamicModel.prototype.clearValueIfInvisible = function () {
_super.prototype.clearValueIfInvisible.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++) {
questions[j].clearValueIfInvisible();
}
}
};
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.hasErrorInPanels = function (fireCallback) {
var res = false;
var panels = this.panels;
var keyValues = [];
for (var i = 0; i < panels.length; i++) {
var pnlError = panels[i].hasErrors(fireCallback);
pnlError = this.isValueDuplicated(panels[i], keyValues) || pnlError;
if (!this.isRenderModeList && pnlError && !res) {
this.currentIndex = i;
}
res = pnlError || res;
}
return res;
};
QuestionPanelDynamicModel.prototype.isValueDuplicated = function (panel, keyValues) {
if (!this.keyName)
return false;
var question = panel.getQuestionByValueName(this.keyName);
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_9__error__["c" /* CustomError */](this.keyDuplicationError));
return true;
}
}
keyValues.push(value);
return false;
};
QuestionPanelDynamicModel.prototype.createNewItem = function () {
return new QuestionPanelDynamicItem(this, this.createNewPanel());
};
QuestionPanelDynamicModel.prototype.createNewPanel = function () {
var panel = this.createAndSetupNewPanelObject();
var jObj = new __WEBPACK_IMPORTED_MODULE_7__jsonobject__["a" /* JsonObject */]();
var json = jObj.toJsonObject(this.template);
jObj.toObject(json, panel);
panel.renderWidth = "100%";
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_6__panel__["a" /* PanelModel */]();
};
QuestionPanelDynamicModel.prototype.onValueChanged = function () {
if (this.isValueChangingInternally)
return;
var val = this.value;
var newPanelCount = val && Array.isArray(val) ? val.length : 0;
if (newPanelCount <= this.panelCount)
return;
this.panelCount = newPanelCount;
};
QuestionPanelDynamicModel.prototype.onSurveyValueChanged = function (newValue) {
_super.prototype.onSurveyValueChanged.call(this, newValue);
for (var i = 0; i < this.items.length; i++) {
this.items[i].onSurveyValueChanged();
}
};
QuestionPanelDynamicModel.prototype.onSetData = function () {
_super.prototype.onSetData.call(this);
if (this.isDesignMode) {
this.template.setSurveyImpl(this.surveyImpl);
if (!this.isLoadingFromJson) {
this.rebuildPanels();
}
}
};
//IQuestionPanelDynamicData
QuestionPanelDynamicModel.prototype.getItemIndex = function (item) {
return this.items.indexOf(item);
};
QuestionPanelDynamicModel.prototype.getPanelItemData = function (item) {
var index = this.items.indexOf(item);
var qValue = this.value;
if (index < 0 &&
Array.isArray(qValue) &&
qValue.length > this.items.length) {
index = qValue.length - 1;
}
if (index < 0)
return {};
if (!qValue || !Array.isArray(qValue) || qValue.length <= index)
return {};
return qValue[index];
};
QuestionPanelDynamicModel.prototype.setPanelItemData = function (item, name, val) {
var index = this.items.indexOf(item);
if (index < 0)
index = this.items.length;
var qValue = 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];
}
this.isValueChangingInternally = true;
this.value = qValue;
this.isValueChangingInternally = false;
};
QuestionPanelDynamicModel.prototype.getSurvey = function () {
return this.survey;
};
QuestionPanelDynamicModel.MaxPanelCount = 100;
return QuestionPanelDynamicModel;
}(__WEBPACK_IMPORTED_MODULE_5__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_7__jsonobject__["a" /* JsonObject */].metaData.addClass("paneldynamic", [
{ name: "templateElements", alternativeName: "questions", visible: false },
{ name: "templateTitle:text", serializationProperty: "locTemplateTitle" },
{
name: "templateDescription:text",
serializationProperty: "locTemplateDescription"
},
{ name: "allowAddPanel:boolean", default: true },
{ name: "allowRemovePanel:boolean", default: true },
{
name: "panelCount:number",
default: 0,
choices: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
},
{ name: "minPanelCount:number", default: 0 },
{
name: "maxPanelCount:number",
default: QuestionPanelDynamicModel.MaxPanelCount
},
{ 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", 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_8__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("paneldynamic", function (name) {
return new QuestionPanelDynamicModel(name);
});
/***/ }),
/* 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__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_baseselect__ = __webpack_require__(20);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRadiogroupModel; });
/**
* A Model for a radiogroup question.
*/
var QuestionRadiogroupModel = /** @class */ (function (_super) {
__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.supportGoNextPageAutomatic = function () {
return true;
};
return QuestionRadiogroupModel;
}(__WEBPACK_IMPORTED_MODULE_3__question_baseselect__["a" /* QuestionCheckboxBase */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.addClass("radiogroup", [], 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;
});
/***/ }),
/* 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__itemvalue__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question__ = __webpack_require__(7);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRatingModel; });
/**
* A Model for a rating question.
*/
var QuestionRatingModel = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionRatingModel, _super);
function QuestionRatingModel(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
_this.rates = _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.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", 1);
},
set: function (val) {
if (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", 5);
},
set: function (val) {
if (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", 1);
},
set: function (val) {
if (val <= 0)
val = 1;
if (val > this.rateMax - this.rateMin)
val = this.rateMax - this.rateMin;
this.setPropertyValue("rateStep", val);
},
enumerable: true,
configurable: true
});
Object.defineProperty(QuestionRatingModel.prototype, "visibleRateValues", {
get: function () {
if (this.rateValues.length > 0)
return this.rateValues;
var res = [];
var value = this.rateMin;
while (value <= this.rateMax &&
res.length < QuestionRatingModel.MaximumRateValueCount) {
res.push(new __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */](value));
value += this.rateStep;
}
return res;
},
enumerable: true,
configurable: true
});
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.MaximumRateValueCount = 20;
return QuestionRatingModel;
}(__WEBPACK_IMPORTED_MODULE_2__question__["a" /* Question */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* JsonObject */].metaData.addClass("rating", [
"hasComment:boolean",
{
name: "rateValues:itemvalues",
onGetValue: function (obj) {
return __WEBPACK_IMPORTED_MODULE_1__itemvalue__["a" /* ItemValue */].getData(obj.rateValues);
},
onSetValue: function (obj, value) {
obj.rateValues = value;
}
},
{ name: "rateMin:number", default: 1 },
{ name: "rateMax:number", default: 5 },
{ name: "rateStep:number", default: 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);
});
/***/ }),
/* 53 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return StylesManager; });
var StylesManager = /** @class */ (function () {
function StylesManager() {
this.sheet = null;
this.sheet = StylesManager.findSheet(StylesManager.SurveyJSStylesSheetId);
if (!this.sheet) {
this.sheet = StylesManager.createSheet(StylesManager.SurveyJSStylesSheetId);
this.initializeStyles(this.sheet);
}
}
StylesManager.findSheet = function (styleSheetId) {
for (var i = 0; i < document.styleSheets.length; i++) {
if (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 sheet = StylesManager.findSheet(themeName + themeSelector);
if (!sheet) {
sheet = StylesManager.createSheet(themeName + themeSelector);
var theme_1 = StylesManager.ThemeColors[themeName] ||
StylesManager.ThemeColors["default"];
Object.keys(StylesManager.ThemeCss).forEach(function (selector) {
var cssRuleText = StylesManager.ThemeCss[selector];
Object.keys(theme_1).forEach(function (colorVariableName) {
return (cssRuleText = cssRuleText.replace(new RegExp("\\" + colorVariableName, "g"), theme_1[colorVariableName]));
});
sheet.insertRule(themeSelector + selector + " { " + cssRuleText + " }", 0);
});
}
};
StylesManager.prototype.initializeStyles = function (sheet) {
Object.keys(StylesManager.Styles).forEach(function (selector) {
return sheet.insertRule(selector + " { " + StylesManager.Styles[selector] + " }", 0);
});
};
StylesManager.SurveyJSStylesSheetId = "surveyjs";
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_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_bootstrapmaterial_css .sv_q_radiogroup_control_label": "display: inline; position: static;",
".sv_qstn": "display: inline-block; vertical-align: top;",
".progress": "width: 60%;",
".progress-bar": "width: auto; margin-left: 2px; margin-right: 2px;",
".sv_p_container": "display: inline-block; vertical-align: top;",
".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 label.sv_q_m_label": "position: absolute; margin: 0;",
".sv_q_mt_item_value": "float: left;",
".sv_qstn.sv_qstn_left": "margin-top: 0.75em;",
".sv_qstn .title-left": "float: left; margin-right: 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": "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_qstn fieldset": "border: none; margin: 0; padding: 0;",
"fieldset.form-inline": "display: inline-block;",
".sv_qstn .sv_q_file_placeholder": "display:none",
".sv_p_title": "cursor: pointer; padding-left: 1em; padding-bottom: 0.3em;",
".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_q_file > input[type=file], .sv_q_file > button": "display: inline-block;",
".sv_q_file_preview": "display: inline-block;",
".sv_q_file_remove_button": "line-height: normal;"
};
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"
},
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"
},
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"
},
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"
},
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"
},
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"
},
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"
}
};
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; border-color: $border-color; background-color: $inputs-background-color;",
".sv_default_css .sv_q_text_root": "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; 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; border-color: $border-color; 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 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;"
};
return StylesManager;
}());
/***/ }),
/* 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__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__survey__ = __webpack_require__(17);
/* 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_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyWindowModel, _super);
function SurveyWindowModel(jsonObj, initialModel) {
if (initialModel === void 0) { initialModel = null; }
var _this = _super.call(this) || this;
_this.isExpandedValue = false;
if (initialModel) {
_this.surveyValue = initialModel;
}
else {
_this.surveyValue = _this.createSurvey(jsonObj);
}
_this.surveyValue.showTitle = false;
if ("undefined" !== typeof document) {
_this.windowElement = document.createElement("div");
}
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.isShowingValue;
},
set: function (val) {
if (this.isShowing == val)
return;
this.isShowingValue = 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.isExpandedValue;
},
set: function (val) {
if (val)
this.expand();
else
this.collapse();
},
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) {
if (this.isExpandedValue == value)
return;
this.isExpandedValue = value;
if (this.expandedChangedCallback)
this.expandedChangedCallback();
};
SurveyWindowModel.surveyElementName = "windowSurveyJS";
return SurveyWindowModel;
}(__WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */]));
/***/ }),
/* 55 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base__ = __webpack_require__(4);
/* unused harmony export surveyTimerFunctions */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SurveyTimer; });
var surveyTimerFunctions = {
setInterval: function (func) {
return window.setInterval(func, 1000);
},
clearInterval: function (timerId) {
window.clearInterval(timerId);
}
};
var SurveyTimer = /** @class */ (function () {
function SurveyTimer() {
this.listenerCounter = 0;
this.timerId = -1;
this.onTimer = new __WEBPACK_IMPORTED_MODULE_0__base__["b" /* 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) {
if (func === void 0) { func = null; }
if (func) {
this.onTimer.add(func);
}
if (this.timerId < 0) {
var self = this;
this.timerId = surveyTimerFunctions.setInterval(function () {
self.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.clearInterval(this.timerId);
this.timerId = -1;
}
};
SurveyTimer.prototype.doTimer = function () {
if (this.timerId < 0)
return;
this.onTimer.fire(this, {});
};
SurveyTimer.instanceValue = null;
return SurveyTimer;
}());
/***/ }),
/* 56 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__chunks_model__ = __webpack_require__(93);
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "I", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["a"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "J", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["b"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "K", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["c"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "L", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["d"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "M", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["e"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "N", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["f"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "O", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["g"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "P", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["h"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "Q", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["i"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "R", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["j"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "S", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["k"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "T", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["l"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "U", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["m"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "V", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["n"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "W", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["o"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "X", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["p"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "Y", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["q"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "Z", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["r"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_0", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["s"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_1", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["t"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_2", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["u"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_3", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["v"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_4", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["w"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_5", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["x"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_6", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["y"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_7", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["z"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_8", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["A"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_9", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["B"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_10", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["C"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_11", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["D"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_12", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["E"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_13", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["F"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_14", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["G"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_15", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["H"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_16", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["I"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_17", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["J"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_18", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["K"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_19", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["L"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_20", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["M"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_21", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["N"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_22", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["O"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_23", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["P"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_24", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Q"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_25", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["R"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_26", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["S"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_27", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["T"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_28", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["U"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_29", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["V"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_30", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["W"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_31", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["X"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_32", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Y"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_33", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["Z"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_34", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_0"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_35", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_1"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_36", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_2"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_37", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_3"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_38", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_4"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_39", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_5"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_40", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_6"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_41", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_7"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_42", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_8"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_43", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_9"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_44", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_10"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_45", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_11"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_46", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_12"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_47", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_13"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_48", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_14"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_49", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_15"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_50", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_16"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_51", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_17"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_52", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_18"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_53", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_19"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_54", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_20"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_55", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_21"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_56", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_22"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_57", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_23"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_58", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_24"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_59", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_25"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_60", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_26"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_61", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_27"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_62", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_28"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_63", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_29"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_64", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_30"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_65", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_31"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_66", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_32"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_67", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_33"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_68", function() { return __WEBPACK_IMPORTED_MODULE_0__chunks_model__["_34"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__chunks_localization__ = __webpack_require__(92);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__ = __webpack_require__(0);
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_69", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["a"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_70", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["b"]; });
/* harmony namespace reexport (by used) */ __webpack_require__.d(__webpack_exports__, "_71", function() { return __WEBPACK_IMPORTED_MODULE_2__chunks_helpers__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__defaultCss_cssstandard__ = __webpack_require__(11);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_3__defaultCss_cssstandard__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssbootstrap__ = __webpack_require__(90);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_4__defaultCss_cssbootstrap__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssbootstrapmaterial__ = __webpack_require__(91);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_5__defaultCss_cssbootstrapmaterial__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__main_scss__ = __webpack_require__(30);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__main_scss___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6__main_scss__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__knockout_kosurvey__ = __webpack_require__(23);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_7__knockout_kosurvey__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_7__knockout_kosurvey__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__knockout_kopage__ = __webpack_require__(21);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_8__knockout_kopage__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return __WEBPACK_IMPORTED_MODULE_8__knockout_kopage__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return __WEBPACK_IMPORTED_MODULE_8__knockout_kopage__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__knockout_koquestionbase__ = __webpack_require__(22);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return __WEBPACK_IMPORTED_MODULE_9__knockout_koquestionbase__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__knockout_koquestion__ = __webpack_require__(6);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return __WEBPACK_IMPORTED_MODULE_10__knockout_koquestion__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__knockout_koquestion_baseselect__ = __webpack_require__(14);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return __WEBPACK_IMPORTED_MODULE_11__knockout_koquestion_baseselect__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return __WEBPACK_IMPORTED_MODULE_11__knockout_koquestion_baseselect__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__knockout_koquestion_checkbox__ = __webpack_require__(95);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "m", function() { return __WEBPACK_IMPORTED_MODULE_12__knockout_koquestion_checkbox__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__knockout_koquestion_comment__ = __webpack_require__(96);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "n", function() { return __WEBPACK_IMPORTED_MODULE_13__knockout_koquestion_comment__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__knockout_koquestion_dropdown__ = __webpack_require__(97);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "o", function() { return __WEBPACK_IMPORTED_MODULE_14__knockout_koquestion_dropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__knockout_koquestion_file__ = __webpack_require__(100);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "p", function() { return __WEBPACK_IMPORTED_MODULE_15__knockout_koquestion_file__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__knockout_koquestion_html__ = __webpack_require__(101);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "q", function() { return __WEBPACK_IMPORTED_MODULE_16__knockout_koquestion_html__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__knockout_koquestion_matrix__ = __webpack_require__(102);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "r", function() { return __WEBPACK_IMPORTED_MODULE_17__knockout_koquestion_matrix__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "s", function() { return __WEBPACK_IMPORTED_MODULE_17__knockout_koquestion_matrix__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__knockout_koquestion_matrixdropdown__ = __webpack_require__(35);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "t", function() { return __WEBPACK_IMPORTED_MODULE_18__knockout_koquestion_matrixdropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__knockout_koquestion_matrixdynamic__ = __webpack_require__(103);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "u", function() { return __WEBPACK_IMPORTED_MODULE_19__knockout_koquestion_matrixdynamic__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "v", function() { return __WEBPACK_IMPORTED_MODULE_19__knockout_koquestion_matrixdynamic__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__knockout_koquestion_paneldynamic__ = __webpack_require__(105);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "w", function() { return __WEBPACK_IMPORTED_MODULE_20__knockout_koquestion_paneldynamic__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__knockout_koquestion_multipletext__ = __webpack_require__(104);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return __WEBPACK_IMPORTED_MODULE_21__knockout_koquestion_multipletext__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return __WEBPACK_IMPORTED_MODULE_21__knockout_koquestion_multipletext__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "z", function() { return __WEBPACK_IMPORTED_MODULE_21__knockout_koquestion_multipletext__["c"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__knockout_koquestion_radiogroup__ = __webpack_require__(106);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "A", function() { return __WEBPACK_IMPORTED_MODULE_22__knockout_koquestion_radiogroup__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__knockout_koquestion_rating__ = __webpack_require__(107);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "B", function() { return __WEBPACK_IMPORTED_MODULE_23__knockout_koquestion_rating__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__knockout_koquestion_text__ = __webpack_require__(36);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "C", function() { return __WEBPACK_IMPORTED_MODULE_24__knockout_koquestion_text__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__knockout_koquestion_boolean__ = __webpack_require__(94);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "D", function() { return __WEBPACK_IMPORTED_MODULE_25__knockout_koquestion_boolean__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__knockout_koquestion_empty__ = __webpack_require__(98);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "E", function() { return __WEBPACK_IMPORTED_MODULE_26__knockout_koquestion_empty__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__knockout_koquestion_expression__ = __webpack_require__(99);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "F", function() { return __WEBPACK_IMPORTED_MODULE_27__knockout_koquestion_expression__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__knockout_koSurveyWindow__ = __webpack_require__(29);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "G", function() { return __WEBPACK_IMPORTED_MODULE_28__knockout_koSurveyWindow__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__knockout_templateText__ = __webpack_require__(37);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "H", function() { return __WEBPACK_IMPORTED_MODULE_29__knockout_templateText__["a"]; });
// model
// localization
// helpers
// css standard
// css bootstrap
// css bootstrap + material
// styles
// knockout
//Uncomment to include the "date" question type.
//export {QuestionDate} from "../plugins/knockout/koquestion_date";
/***/ }),
/* 57 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defaultCss_cssstandard__ = __webpack_require__(11);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return updateSurveyProps; });
var updateSurveyProps = function (survey, newProps) {
var _loop_1 = function () {
if (key == "model" || key == "children")
return "continue";
if (key == "css") {
survey.mergeValues(newProps.css, __WEBPACK_IMPORTED_MODULE_0__defaultCss_cssstandard__["b" /* surveyCss */].getCss());
return "continue";
}
if (key.indexOf("on") == 0 && survey[key] && survey[key].add) {
var funcBody_1 = newProps[key];
var func = function (sender, options) {
funcBody_1(sender, options);
};
survey[key].add(func);
}
else {
survey[key] = newProps[key];
}
};
for (var key in newProps) {
_loop_1();
}
if (newProps && newProps.data)
survey.onValueChanged.add(function (sender, options) {
newProps.data[options.name] = options.value;
});
};
/***/ }),
/* 58 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE_58__;
/***/ }),
/* 59 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 60 */
/***/ (function(module, exports) {
module.exports = "\n\n";
/***/ }),
/* 61 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 62 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 63 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 64 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 65 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 66 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 67 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 68 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 69 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 70 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 71 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 72 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 73 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 74 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 75 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 76 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 77 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 78 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 79 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 80 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 81 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 82 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 83 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 84 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 85 */
/***/ (function(module, exports) {
module.exports = "";
/***/ }),
/* 86 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 87 */
/***/ (function(module, exports) {
module.exports = "\n";
/***/ }),
/* 88 */
/***/ (function(module, exports, __webpack_require__) {
module.exports = "" + __webpack_require__(60) + "\n" + __webpack_require__(59) + "\n" + __webpack_require__(62) + "\n" + __webpack_require__(63) + "\n" + __webpack_require__(64) + "\n" + __webpack_require__(85) + "\n" + __webpack_require__(86) + "\n" + __webpack_require__(87) + "\n" + __webpack_require__(61) + "\n" + __webpack_require__(83) + "\n" + __webpack_require__(84) + "\n" + __webpack_require__(66) + "\n" + __webpack_require__(67) + "\n" + __webpack_require__(68) + "\n" + __webpack_require__(70) + "\n" + __webpack_require__(72) + "\n" + __webpack_require__(73) + "\n" + __webpack_require__(74) + "\n" + __webpack_require__(75) + "\n" + __webpack_require__(76) + "\n" + __webpack_require__(79) + "\n" + __webpack_require__(78) + "\n" + __webpack_require__(77) + "\n" + __webpack_require__(80) + "\n" + __webpack_require__(81) + "\n" + __webpack_require__(82) + "\n" + __webpack_require__(65) + "\n" + __webpack_require__(69) + "\n" + __webpack_require__(71) + "\n";
/***/ }),
/* 89 */
/***/ (function(module, exports) {
module.exports = "
";
/***/ }),
/* 90 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(11);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultBootstrapCss; });
var defaultBootstrapCss = {
root: "sv_bootstrap_css",
header: "panel-heading card-header",
body: "panel-body card-block",
footer: "panel-footer card-footer",
navigationButton: "",
completedPage: "",
navigation: {
complete: "sv_complete_btn",
prev: "sv_prev_btn",
next: "sv_next_btn",
start: "sv_start_btn"
},
progress: "progress center-block mx-auto mb-4",
progressBar: "progress-bar",
page: {
root: "",
title: "",
description: ""
},
pageTitle: "",
pageDescription: "small",
row: "",
question: {
mainRoot: "sv_qstn",
title: "",
description: "small",
comment: "form-control",
required: "",
titleRequired: "",
indent: 20
},
panel: {
title: "sv_p_title",
description: "small",
container: "sv_p_container"
},
error: {
root: "alert alert-danger",
icon: "glyphicon glyphicon-exclamation-sign",
item: ""
},
boolean: { root: "sv_qbln form-inline checkbox", item: "" },
checkbox: {
root: "sv_qcbc sv_qcbx form-inline",
item: "checkbox",
itemControl: "",
controlLabel: "",
other: "sv_q_checkbox_other"
},
comment: "form-control",
dropdown: { root: "", control: "form-control", other: "" },
matrix: { root: "table", label: "sv_q_m_label" },
matrixdropdown: { root: "table" },
matrixdynamic: { root: "table", button: "button" },
paneldynamic: { root: "", button: "button" },
multipletext: {
root: "table",
itemTitle: "",
itemValue: "sv_q_mt_item_value form-control"
},
radiogroup: {
root: "sv_qcbc form-inline",
item: "radio",
label: "",
itemControl: "",
controlLabel: "",
other: "sv_q_radiogroup_other"
},
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"
},
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"
},
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;
/***/ }),
/* 91 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__cssstandard__ = __webpack_require__(11);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return defaultBootstrapMaterialCss; });
var defaultBootstrapMaterialCss = {
root: "sv_bootstrapmaterial_css",
header: "panel-heading",
body: "panel-body",
footer: "panel-footer",
navigationButton: "",
completedPage: "",
navigation: {
complete: "sv_complete_btn",
prev: "sv_prev_btn",
next: "sv_next_btn",
start: "sv_start_btn"
},
progress: "progress center-block mx-auto mb-4",
progressBar: "progress-bar",
page: {
root: "",
title: "",
description: ""
},
pageTitle: "",
pageDescription: "small",
row: "",
question: {
mainRoot: "sv_qstn form-group",
title: "",
description: "small",
comment: "form-control",
required: "",
titleRequired: "",
indent: 20
},
panel: {
title: "sv_p_title",
description: "small",
container: "sv_p_container"
},
error: {
root: "alert alert-danger",
icon: "glyphicon glyphicon-exclamation-sign",
item: ""
},
boolean: { root: "sv_qbln form-inline checkbox", item: "" },
checkbox: {
root: "sv_qcbx form-inline",
item: "checkbox",
itemControl: "",
controlLabel: "",
other: "sv_q_checkbox_other"
},
comment: "form-control",
dropdown: { root: "", control: "form-control", other: "" },
matrix: {
root: "table",
row: "form-group",
label: "sv_q_m_label radio-inline",
itemValue: "form-control"
},
matrixdropdown: { root: "table", itemValue: "form-group" },
matrixdynamic: { root: "table", button: "button", itemValue: "form-group" },
paneldynamic: { root: "", button: "button" },
multipletext: {
root: "table",
itemTitle: "",
row: "form-group",
itemValue: "sv_q_mt_item_value form-control"
},
radiogroup: {
root: "",
item: "radio",
label: "",
itemControl: "",
controlLabel: "sv_q_radiogroup_control_label",
other: "sv_q_radiogroup_other"
},
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"
},
text: "form-control",
expression: "form-control",
file: {
root: "form-group is-fileinput sv_q_file",
placeholderInput: "",
preview: "sv_q_file_preview",
removeButton: "sv_q_file_remove_button"
},
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 */]["bootstrapmaterial"] = defaultBootstrapMaterialCss;
/***/ }),
/* 92 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__localization_arabic__ = __webpack_require__(108);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__localization_catalan__ = __webpack_require__(109);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__localization_czech__ = __webpack_require__(110);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__localization_danish__ = __webpack_require__(111);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__localization_dutch__ = __webpack_require__(112);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__localization_finnish__ = __webpack_require__(113);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__localization_french__ = __webpack_require__(114);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__localization_georgian__ = __webpack_require__(115);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__localization_german__ = __webpack_require__(116);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__localization_greek__ = __webpack_require__(117);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__localization_hebrew__ = __webpack_require__(118);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__localization_hungarian__ = __webpack_require__(119);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__localization_icelandic__ = __webpack_require__(120);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__localization_italian__ = __webpack_require__(121);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__localization_latvian__ = __webpack_require__(122);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__localization_persian__ = __webpack_require__(123);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__localization_polish__ = __webpack_require__(124);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__localization_portuguese__ = __webpack_require__(125);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__localization_romanian__ = __webpack_require__(126);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__localization_russian__ = __webpack_require__(127);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__localization_simplified_chinese__ = __webpack_require__(128);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__localization_spanish__ = __webpack_require__(129);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__localization_swedish__ = __webpack_require__(130);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__localization_turkish__ = __webpack_require__(131);
/***/ }),
/* 93 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__main_scss__ = __webpack_require__(30);
/* 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__helpers__ = __webpack_require__(9);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_1__helpers__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__validator__ = __webpack_require__(28);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "i", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["h"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "j", function() { return __WEBPACK_IMPORTED_MODULE_2__validator__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__itemvalue__ = __webpack_require__(10);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "k", function() { return __WEBPACK_IMPORTED_MODULE_3__itemvalue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__base__ = __webpack_require__(4);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "l", function() { return __WEBPACK_IMPORTED_MODULE_4__base__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "m", function() { return __WEBPACK_IMPORTED_MODULE_4__base__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "n", function() { return __WEBPACK_IMPORTED_MODULE_4__base__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "o", function() { return __WEBPACK_IMPORTED_MODULE_4__base__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__localizablestring__ = __webpack_require__(18);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "p", function() { return __WEBPACK_IMPORTED_MODULE_5__localizablestring__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__choicesRestfull__ = __webpack_require__(31);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "q", function() { return __WEBPACK_IMPORTED_MODULE_6__choicesRestfull__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__functionsfactory__ = __webpack_require__(34);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "r", function() { return __WEBPACK_IMPORTED_MODULE_7__functionsfactory__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__conditions__ = __webpack_require__(12);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "s", function() { return __WEBPACK_IMPORTED_MODULE_8__conditions__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "t", function() { return __WEBPACK_IMPORTED_MODULE_8__conditions__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "u", function() { return __WEBPACK_IMPORTED_MODULE_8__conditions__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__conditionsParser__ = __webpack_require__(32);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "v", function() { return __WEBPACK_IMPORTED_MODULE_9__conditionsParser__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__conditionProcessValue__ = __webpack_require__(13);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "w", function() { return __WEBPACK_IMPORTED_MODULE_10__conditionProcessValue__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__error__ = __webpack_require__(8);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return __WEBPACK_IMPORTED_MODULE_11__error__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return __WEBPACK_IMPORTED_MODULE_11__error__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "z", function() { return __WEBPACK_IMPORTED_MODULE_11__error__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__jsonobject__ = __webpack_require__(1);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "A", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "B", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "C", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "D", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["f"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "E", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["g"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "F", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["h"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "G", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "H", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["i"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "I", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["j"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "J", function() { return __WEBPACK_IMPORTED_MODULE_12__jsonobject__["k"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__ = __webpack_require__(15);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "K", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "L", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "M", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["e"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "N", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "O", function() { return __WEBPACK_IMPORTED_MODULE_13__question_matrixdropdownbase__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__question_matrixdropdown__ = __webpack_require__(47);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "P", function() { return __WEBPACK_IMPORTED_MODULE_14__question_matrixdropdown__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Q", function() { return __WEBPACK_IMPORTED_MODULE_14__question_matrixdropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__question_matrixdynamic__ = __webpack_require__(48);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "R", function() { return __WEBPACK_IMPORTED_MODULE_15__question_matrixdynamic__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "S", function() { return __WEBPACK_IMPORTED_MODULE_15__question_matrixdynamic__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__question_matrix__ = __webpack_require__(46);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "T", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrix__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "U", function() { return __WEBPACK_IMPORTED_MODULE_16__question_matrix__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__question_multipletext__ = __webpack_require__(49);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "V", function() { return __WEBPACK_IMPORTED_MODULE_17__question_multipletext__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "W", function() { return __WEBPACK_IMPORTED_MODULE_17__question_multipletext__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__panel__ = __webpack_require__(19);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "X", function() { return __WEBPACK_IMPORTED_MODULE_18__panel__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Y", function() { return __WEBPACK_IMPORTED_MODULE_18__panel__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "Z", function() { return __WEBPACK_IMPORTED_MODULE_18__panel__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__page__ = __webpack_require__(24);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_0", function() { return __WEBPACK_IMPORTED_MODULE_19__page__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__question__ = __webpack_require__(7);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_1", function() { return __WEBPACK_IMPORTED_MODULE_20__question__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__questionbase__ = __webpack_require__(27);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_2", function() { return __WEBPACK_IMPORTED_MODULE_21__questionbase__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__question_empty__ = __webpack_require__(42);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_3", function() { return __WEBPACK_IMPORTED_MODULE_22__question_empty__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__question_baseselect__ = __webpack_require__(20);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_4", function() { return __WEBPACK_IMPORTED_MODULE_23__question_baseselect__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_5", function() { return __WEBPACK_IMPORTED_MODULE_23__question_baseselect__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__question_checkbox__ = __webpack_require__(39);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_6", function() { return __WEBPACK_IMPORTED_MODULE_24__question_checkbox__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__question_comment__ = __webpack_require__(40);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_7", function() { return __WEBPACK_IMPORTED_MODULE_25__question_comment__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__question_dropdown__ = __webpack_require__(41);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_8", function() { return __WEBPACK_IMPORTED_MODULE_26__question_dropdown__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__questionfactory__ = __webpack_require__(3);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_9", function() { return __WEBPACK_IMPORTED_MODULE_27__questionfactory__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_10", function() { return __WEBPACK_IMPORTED_MODULE_27__questionfactory__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__question_file__ = __webpack_require__(44);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_11", function() { return __WEBPACK_IMPORTED_MODULE_28__question_file__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__question_html__ = __webpack_require__(45);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_12", function() { return __WEBPACK_IMPORTED_MODULE_29__question_html__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__question_radiogroup__ = __webpack_require__(51);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_13", function() { return __WEBPACK_IMPORTED_MODULE_30__question_radiogroup__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__question_rating__ = __webpack_require__(52);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_14", function() { return __WEBPACK_IMPORTED_MODULE_31__question_rating__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__question_expression__ = __webpack_require__(43);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_15", function() { return __WEBPACK_IMPORTED_MODULE_32__question_expression__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__question_text__ = __webpack_require__(26);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_16", function() { return __WEBPACK_IMPORTED_MODULE_33__question_text__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__question_boolean__ = __webpack_require__(38);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_17", function() { return __WEBPACK_IMPORTED_MODULE_34__question_boolean__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__question_paneldynamic__ = __webpack_require__(50);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_18", function() { return __WEBPACK_IMPORTED_MODULE_35__question_paneldynamic__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_19", function() { return __WEBPACK_IMPORTED_MODULE_35__question_paneldynamic__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__surveytimer__ = __webpack_require__(55);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_20", function() { return __WEBPACK_IMPORTED_MODULE_36__surveytimer__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__survey__ = __webpack_require__(17);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_21", function() { return __WEBPACK_IMPORTED_MODULE_37__survey__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__trigger__ = __webpack_require__(132);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_22", function() { return __WEBPACK_IMPORTED_MODULE_38__trigger__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_23", function() { return __WEBPACK_IMPORTED_MODULE_38__trigger__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_24", function() { return __WEBPACK_IMPORTED_MODULE_38__trigger__["c"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_25", function() { return __WEBPACK_IMPORTED_MODULE_38__trigger__["d"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_26", function() { return __WEBPACK_IMPORTED_MODULE_38__trigger__["e"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__surveyWindow__ = __webpack_require__(54);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_27", function() { return __WEBPACK_IMPORTED_MODULE_39__surveyWindow__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__textPreProcessor__ = __webpack_require__(16);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_28", function() { return __WEBPACK_IMPORTED_MODULE_40__textPreProcessor__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__dxSurveyService__ = __webpack_require__(33);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_29", function() { return __WEBPACK_IMPORTED_MODULE_41__dxSurveyService__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__surveyStrings__ = __webpack_require__(2);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_30", function() { return __WEBPACK_IMPORTED_MODULE_42__surveyStrings__["a"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_31", function() { return __WEBPACK_IMPORTED_MODULE_42__surveyStrings__["b"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_43__questionCustomWidgets__ = __webpack_require__(25);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_32", function() { return __WEBPACK_IMPORTED_MODULE_43__questionCustomWidgets__["b"]; });
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_33", function() { return __WEBPACK_IMPORTED_MODULE_43__questionCustomWidgets__["a"]; });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_44__stylesmanager__ = __webpack_require__(53);
/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "_34", function() { return __WEBPACK_IMPORTED_MODULE_44__stylesmanager__["a"]; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Version; });
// styles
var Version;
Version = "" + "1.0.9";
//Uncomment to include the "date" question type.
//export {default as QuestionDateModel} from "../../plugins/question_date";
/***/ }),
/* 94 */
/***/ (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_knockout__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question_boolean__ = __webpack_require__(38);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__koquestion__ = __webpack_require__(6);
/* unused harmony export QuestionBooleanImplementor */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionBoolean; });
var QuestionBooleanImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionBooleanImplementor, _super);
function QuestionBooleanImplementor(question) {
var _this = _super.call(this, question) || this;
_this.question = question;
_this.koIndeterminate = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.question.isIndeterminate);
_this.koCheckedValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.question.checkedValue);
var self = _this;
_this.koCheckedValue.subscribe(function (newValue) {
self.updateCheckedValue(newValue);
});
_this.question["koIndeterminate"] = _this.koIndeterminate;
_this.question["koCheckedValue"] = _this.koCheckedValue;
return _this;
}
QuestionBooleanImplementor.prototype.setkoValue = function (newValue) {
_super.prototype.setkoValue.call(this, newValue);
this.koIndeterminate(this.question.isIndeterminate);
if (this.koCheckedValue() != this.question.checkedValue) {
this.koCheckedValue(this.question.checkedValue);
}
};
QuestionBooleanImplementor.prototype.updateCheckedValue = function (newValue) {
this.question.checkedValue = newValue;
};
QuestionBooleanImplementor.prototype.isIndeterminate = function () {
return !this.question.value && this.question.value !== false;
};
return QuestionBooleanImplementor;
}(__WEBPACK_IMPORTED_MODULE_5__koquestion__["a" /* QuestionImplementor */]));
var QuestionBoolean = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionBoolean, _super);
function QuestionBoolean(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionBooleanImplementor(_this);
return _this;
}
QuestionBoolean.prototype.getItemCss = function (row, column) {
var isChecked = this["koCheckedValue"]();
var itemClass = this["koCss"]().item + (isChecked ? " checked" : "");
return itemClass;
};
return QuestionBoolean;
}(__WEBPACK_IMPORTED_MODULE_2__question_boolean__["a" /* QuestionBooleanModel */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("boolean", function () {
return new QuestionBoolean("");
});
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("boolean", function (name) {
return new QuestionBoolean(name);
});
/***/ }),
/* 95 */
/***/ (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_knockout__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__koquestion_baseselect__ = __webpack_require__(14);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__question_checkbox__ = __webpack_require__(39);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionCheckbox; });
var QuestionCheckboxImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionCheckboxImplementor, _super);
function QuestionCheckboxImplementor(question) {
return _super.call(this, question) || this;
}
QuestionCheckboxImplementor.prototype.createkoValue = function () {
return this.question.value
? __WEBPACK_IMPORTED_MODULE_1_knockout__["observableArray"](this.question.value)
: __WEBPACK_IMPORTED_MODULE_1_knockout__["observableArray"]();
};
QuestionCheckboxImplementor.prototype.setkoValue = function (newValue) {
if (newValue) {
this.koValue([].concat(newValue));
}
else {
this.koValue([]);
}
};
return QuestionCheckboxImplementor;
}(__WEBPACK_IMPORTED_MODULE_2__koquestion_baseselect__["b" /* QuestionCheckboxBaseImplementor */]));
var QuestionCheckbox = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionCheckbox, _super);
function QuestionCheckbox(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionCheckboxImplementor(_this);
return _this;
}
QuestionCheckbox.prototype.getItemClass = function (item) {
var isChecked = this["koValue"]() && this["koValue"]().indexOf(item.value) !== -1;
var itemClass = this.cssClasses.item +
(this.colCount === 0 ? " sv_q_checkbox_inline" : "");
if (isChecked)
itemClass += " checked";
return itemClass;
};
return QuestionCheckbox;
}(__WEBPACK_IMPORTED_MODULE_5__question_checkbox__["a" /* QuestionCheckboxModel */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("checkbox", function () {
return new QuestionCheckbox("");
});
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("checkbox", function (name) {
var q = new QuestionCheckbox(name);
q.choices = __WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 96 */
/***/ (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__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_comment__ = __webpack_require__(40);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionComment; });
var QuestionComment = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionComment, _super);
function QuestionComment(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_4__koquestion__["a" /* QuestionImplementor */](_this);
return _this;
}
return QuestionComment;
}(__WEBPACK_IMPORTED_MODULE_3__question_comment__["a" /* QuestionCommentModel */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("comment", function () {
return new QuestionComment("");
});
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("comment", function (name) {
return new QuestionComment(name);
});
/***/ }),
/* 97 */
/***/ (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_dropdown__ = __webpack_require__(41);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion_baseselect__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionDropdown; });
var QuestionDropdown = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionDropdown, _super);
function QuestionDropdown(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_4__koquestion_baseselect__["a" /* QuestionSelectBaseImplementor */](_this);
return _this;
}
return QuestionDropdown;
}(__WEBPACK_IMPORTED_MODULE_1__question_dropdown__["a" /* QuestionDropdownModel */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("dropdown", function () {
return new QuestionDropdown("");
});
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("dropdown", function (name) {
var q = new QuestionDropdown(name);
q.choices = __WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 98 */
/***/ (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_empty__ = __webpack_require__(42);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestion__ = __webpack_require__(6);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionEmpty; });
var QuestionEmpty = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionEmpty, _super);
function QuestionEmpty(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_3__koquestion__["a" /* QuestionImplementor */](_this);
return _this;
}
return QuestionEmpty;
}(__WEBPACK_IMPORTED_MODULE_1__question_empty__["a" /* QuestionEmptyModel */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("empty", function () {
return new QuestionEmpty("");
});
/***/ }),
/* 99 */
/***/ (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_knockout__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question_expression__ = __webpack_require__(43);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__koquestion__ = __webpack_require__(6);
/* unused harmony export QuestionExpressionImplementor */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionExpression; });
var QuestionExpressionImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionExpressionImplementor, _super);
function QuestionExpressionImplementor(question) {
var _this = _super.call(this, question) || this;
_this.question = question;
_this.koDisplayValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.question.displayValue);
_this.question["koDisplayValue"] = _this.koDisplayValue;
return _this;
}
QuestionExpressionImplementor.prototype.onValueChanged = function () {
_super.prototype.onValueChanged.call(this);
this.koDisplayValue(this.question.displayValue);
};
return QuestionExpressionImplementor;
}(__WEBPACK_IMPORTED_MODULE_5__koquestion__["a" /* QuestionImplementor */]));
var QuestionExpression = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionExpression, _super);
function QuestionExpression(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionExpressionImplementor(_this);
return _this;
}
return QuestionExpression;
}(__WEBPACK_IMPORTED_MODULE_2__question_expression__["a" /* QuestionExpressionModel */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("expression", function () {
return new QuestionExpression("");
});
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("expression", function (name) {
return new QuestionExpression(name);
});
/***/ }),
/* 100 */
/***/ (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_knockout__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question_file__ = __webpack_require__(44);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__koquestion__ = __webpack_require__(6);
/* unused harmony export QuestionFileImplementor */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionFile; });
var QuestionFileImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionFileImplementor, _super);
function QuestionFileImplementor(question) {
var _this = _super.call(this, question) || this;
_this.koDataUpdater = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](0);
_this.koHasValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](false);
_this.onLoadPreview = function () {
_this.koDataUpdater(_this.koDataUpdater() + 1);
};
var self = _this;
_this.koData = __WEBPACK_IMPORTED_MODULE_1_knockout__["computed"](function () {
self.koDataUpdater();
return self.question.previewValue;
});
_this.question["koData"] = _this.koData;
_this.question["koHasValue"] = _this.koHasValue;
_this.question.previewValueLoadedCallback =
self.onLoadPreview;
_this.question["dochange"] = function (data, event) {
var src = event.target || event.srcElement;
self.onChange(src);
};
_this.question["doclean"] = function (data, event) {
var src = event.target || event.srcElement;
_this.question.clear();
src.parentElement.querySelectorAll("input")[0].value = "";
_this.koHasValue(false);
};
return _this;
}
QuestionFileImplementor.prototype.onChange = function (src) {
if (!window["FileReader"])
return;
if (!src || !src.files || src.files.length < 1)
return;
var files = [];
for (var i = 0; i < src.files.length; i++) {
files.push(src.files[i]);
}
this.question.loadFiles(files);
this.koHasValue(true);
};
return QuestionFileImplementor;
}(__WEBPACK_IMPORTED_MODULE_5__koquestion__["a" /* QuestionImplementor */]));
var QuestionFile = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionFile, _super);
function QuestionFile(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionFileImplementor(_this);
return _this;
}
return QuestionFile;
}(__WEBPACK_IMPORTED_MODULE_4__question_file__["a" /* QuestionFileModel */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("file", function () {
return new QuestionFile("");
});
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("file", function (name) {
return new QuestionFile(name);
});
/***/ }),
/* 101 */
/***/ (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__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestionbase__ = __webpack_require__(22);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__question_html__ = __webpack_require__(45);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionHtml; });
var QuestionHtml = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionHtml, _super);
function QuestionHtml(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_3__koquestionbase__["a" /* QuestionImplementorBase */](_this);
return _this;
}
return QuestionHtml;
}(__WEBPACK_IMPORTED_MODULE_4__question_html__["a" /* QuestionHtmlModel */]));
__WEBPACK_IMPORTED_MODULE_1__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("html", function () {
return new QuestionHtml("");
});
__WEBPACK_IMPORTED_MODULE_2__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("html", function (name) {
return new QuestionHtml(name);
});
/***/ }),
/* 102 */
/***/ (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_knockout__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question_matrix__ = __webpack_require__(46);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestion__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MatrixRow; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrix; });
var MatrixRow = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MatrixRow, _super);
function MatrixRow(item, fullName, data, value) {
var _this = _super.call(this, item, fullName, data, value) || this;
_this.fullName = fullName;
_this.isValueUpdating = false;
_this.koValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.value);
var self = _this;
_this.koValue.subscribe(function (newValue) {
if (self.isValueUpdating)
true;
self.value = newValue;
});
return _this;
}
MatrixRow.prototype.onValueChanged = function () {
this.isValueUpdating = true;
this.koValue(this.value);
this.isValueUpdating = false;
};
return MatrixRow;
}(__WEBPACK_IMPORTED_MODULE_2__question_matrix__["a" /* MatrixRowModel */]));
var QuestionMatrix = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrix, _super);
function QuestionMatrix(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_3__koquestion__["a" /* QuestionImplementor */](_this);
return _this;
}
QuestionMatrix.prototype.createMatrixRow = function (item, fullName, value) {
return new MatrixRow(item, fullName, this, value);
};
QuestionMatrix.prototype.getItemCss = function (row, column) {
var isChecked = row.koValue() == column.value;
var itemClass = this["koCss"]().label + (isChecked ? " checked" : "");
return itemClass;
};
return QuestionMatrix;
}(__WEBPACK_IMPORTED_MODULE_2__question_matrix__["b" /* QuestionMatrixModel */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("matrix", function () {
return new QuestionMatrix("");
});
__WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrix", function (name) {
var q = new QuestionMatrix(name);
q.rows = __WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].DefaultRows;
q.columns = __WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].DefaultColums;
return q;
});
/***/ }),
/* 103 */
/***/ (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_knockout__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion_matrixdropdown__ = __webpack_require__(35);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__question_matrixdynamic__ = __webpack_require__(48);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__question_matrixdropdownbase__ = __webpack_require__(15);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionMatrixDynamicImplementor; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMatrixDynamic; });
var QuestionMatrixDynamicImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixDynamicImplementor, _super);
function QuestionMatrixDynamicImplementor(question) {
var _this = _super.call(this, question) || this;
_this.koRecalc = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](0);
_this.koRows = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
this.koRecalc();
return this.question.visibleRows;
}, _this);
_this.koOverflowX = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
return this.question.horizontalScroll
? "scroll"
: "none";
}, _this);
_this.question["koRows"] = _this.koRows;
var self = _this;
_this.koAddRowClick = function () {
self.addRow();
};
_this.koRemoveRowClick = function (data) {
self.removeRow(data);
};
_this.koCanAddRow = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.canAddRow;
});
_this.koCanRemoveRow = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.canRemoveRow;
});
_this.question["koAddRowClick"] = _this.koAddRowClick;
_this.question["koRemoveRowClick"] = _this.koRemoveRowClick;
_this.question["koOverflowX"] = _this.koOverflowX;
_this.question["koCanAddRow"] = _this.koCanAddRow;
_this.question["koCanRemoveRow"] = _this.koCanRemoveRow;
_this
.question.rowCountChangedCallback = function () {
self.onRowCountChanged();
};
_this.question.columnsChangedCallback = function () {
self.onColumnChanged();
};
_this.question.updateCellsCallback = function () {
self.onUpdateCells();
};
return _this;
}
QuestionMatrixDynamicImplementor.prototype.onUpdateCells = function () {
//Genereate rows again.
var rows = this.question["generatedVisibleRows"];
var columns = this.question.columns;
if (rows && rows.length > 0 && columns && columns.length > 0)
this.onColumnChanged();
};
QuestionMatrixDynamicImplementor.prototype.onColumnChanged = function () {
var rows = this.question.visibleRows;
this.onRowCountChanged();
};
QuestionMatrixDynamicImplementor.prototype.onRowCountChanged = function () {
this.koRecalc(this.koRecalc() + 1);
};
QuestionMatrixDynamicImplementor.prototype.addRow = function () {
this.question.addRow();
};
QuestionMatrixDynamicImplementor.prototype.removeRow = function (row) {
var rows = this.question.visibleRows;
var index = rows.indexOf(row);
if (index > -1) {
this.question.removeRowUI(index);
}
};
return QuestionMatrixDynamicImplementor;
}(__WEBPACK_IMPORTED_MODULE_4__koquestion_matrixdropdown__["b" /* QuestionMatrixBaseImplementor */]));
var QuestionMatrixDynamic = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMatrixDynamic, _super);
function QuestionMatrixDynamic(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionMatrixDynamicImplementor(_this);
return _this;
}
return QuestionMatrixDynamic;
}(__WEBPACK_IMPORTED_MODULE_5__question_matrixdynamic__["a" /* QuestionMatrixDynamicModel */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("matrixdynamic", function () {
return new QuestionMatrixDynamic("");
});
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("matrixdynamic", function (name) {
var q = new QuestionMatrixDynamic(name);
q.choices = [1, 2, 3, 4, 5];
q.rowCount = 2;
__WEBPACK_IMPORTED_MODULE_6__question_matrixdropdownbase__["a" /* QuestionMatrixDropdownModelBase */].addDefaultColumns(q);
return q;
});
/***/ }),
/* 104 */
/***/ (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_knockout__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__question_multipletext__ = __webpack_require__(49);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__koquestion__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion_text__ = __webpack_require__(36);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MultipleTextItem; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return QuestionMultipleTextImplementor; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return QuestionMultipleText; });
var MultipleTextItem = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](MultipleTextItem, _super);
function MultipleTextItem(name, title) {
if (name === void 0) { name = null; }
if (title === void 0) { title = null; }
var _this = _super.call(this, name, title) || this;
_this.name = name;
_this.isKOValueUpdating = false;
_this.koValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](_this.value);
var self = _this;
_this.koValue.subscribe(function (newValue) {
if (!self.isKOValueUpdating) {
self.value = newValue;
}
});
return _this;
}
MultipleTextItem.prototype.createEditor = function (name) {
return new __WEBPACK_IMPORTED_MODULE_4__koquestion_text__["a" /* QuestionText */](name);
};
MultipleTextItem.prototype.onValueChanged = function (newValue) {
this.isKOValueUpdating = true;
this.koValue(newValue);
this.isKOValueUpdating = false;
};
return MultipleTextItem;
}(__WEBPACK_IMPORTED_MODULE_2__question_multipletext__["a" /* MultipleTextItemModel */]));
var QuestionMultipleTextImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMultipleTextImplementor, _super);
function QuestionMultipleTextImplementor(question) {
var _this = _super.call(this, question) || this;
_this.koRows = __WEBPACK_IMPORTED_MODULE_1_knockout__["observableArray"](_this.question.getRows());
_this.question["koRows"] = _this.koRows;
_this.onColCountChanged();
var self = _this;
_this
.question.colCountChangedCallback = function () {
self.onColCountChanged();
};
return _this;
}
QuestionMultipleTextImplementor.prototype.onColCountChanged = function () {
this.koRows(this.question.getRows());
};
return QuestionMultipleTextImplementor;
}(__WEBPACK_IMPORTED_MODULE_3__koquestion__["a" /* QuestionImplementor */]));
var QuestionMultipleText = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionMultipleText, _super);
function QuestionMultipleText(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionMultipleTextImplementor(_this);
return _this;
}
QuestionMultipleText.prototype.createTextItem = function (name, title) {
return new MultipleTextItem(name, title);
};
return QuestionMultipleText;
}(__WEBPACK_IMPORTED_MODULE_2__question_multipletext__["b" /* QuestionMultipleTextModel */]));
__WEBPACK_IMPORTED_MODULE_5__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("multipletextitem", function () {
return new MultipleTextItem("");
});
__WEBPACK_IMPORTED_MODULE_5__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("multipletext", function () {
return new QuestionMultipleText("");
});
__WEBPACK_IMPORTED_MODULE_6__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("multipletext", function (name) {
var q = new QuestionMultipleText(name);
q.addItem("text1");
q.addItem("text2");
return q;
});
/***/ }),
/* 105 */
/***/ (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_knockout__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__koquestion__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__question_paneldynamic__ = __webpack_require__(50);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__kopage__ = __webpack_require__(21);
/* unused harmony export QuestionPanelDynamicImplementor */
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionPanelDynamic; });
var QuestionPanelDynamicImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionPanelDynamicImplementor, _super);
function QuestionPanelDynamicImplementor(question) {
var _this = _super.call(this, question) || this;
_this.koRecalc = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](0);
_this.koPanels = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
this.koRecalc();
return this.question.panels;
}, _this);
_this.question["koPanels"] = _this.koPanels;
var self = _this;
_this.koAddPanelClick = function () {
self.addPanel();
};
_this.koRemovePanelClick = function (data) {
self.removePanel(data);
};
_this.koPrevPanelClick = function () {
self.question.currentIndex--;
};
_this.koNextPanelClick = function () {
self.question.currentIndex++;
};
_this.koCanAddPanel = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.canAddPanel;
});
_this.koCanRemovePanel = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.canRemovePanel;
});
_this.koIsPrevButton = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isPrevButtonShowing;
});
_this.koIsNextButton = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isNextButtonShowing;
});
_this.koIsRange = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isRangeShowing;
});
_this.koPanel = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.currentPanel;
});
_this.koIsList = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isRenderModeList;
});
_this.koIsProgressTop = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isProgressTopShowing;
});
_this.koIsProgressBottom = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.isProgressBottomShowing;
});
_this.koRangeValue = __WEBPACK_IMPORTED_MODULE_1_knockout__["observable"](self.question.currentIndex);
_this.koRangeValue.subscribe(function (newValue) {
self.question.currentIndex = newValue;
});
_this.koRangeMax = __WEBPACK_IMPORTED_MODULE_1_knockout__["pureComputed"](function () {
self.koRecalc();
return self.question.panelCount - 1;
});
_this.question["koAddPanelClick"] = _this.koAddPanelClick;
_this.question["koRemovePanelClick"] = _this.koRemovePanelClick;
_this.question["koPrevPanelClick"] = _this.koPrevPanelClick;
_this.question["koNextPanelClick"] = _this.koNextPanelClick;
_this.question["koCanAddPanel"] = _this.koCanAddPanel;
_this.question["koCanRemovePanel"] = _this.koCanRemovePanel;
_this.question["koPanel"] = _this.koPanel;
_this.question["koIsList"] = _this.koIsList;
_this.question["koIsProgressTop"] = _this.koIsProgressTop;
_this.question["koIsProgressBottom"] = _this.koIsProgressBottom;
_this.question["koIsPrevButton"] = _this.koIsPrevButton;
_this.question["koIsNextButton"] = _this.koIsNextButton;
_this.question["koIsRange"] = _this.koIsRange;
_this.question["koRangeValue"] = _this.koRangeValue;
_this.question["koRangeMax"] = _this.koRangeMax;
_this.question["koPanelAfterRender"] = function (el, con) {
self.panelAfterRender(el, con);
};
_this
.question.panelCountChangedCallback = function () {
self.onPanelCountChanged();
};
_this
.question.renderModeChangedCallback = function () {
self.onRenderModeChanged();
};
_this
.question.currentIndexChangedCallback = function () {
self.onCurrentIndexChanged();
};
return _this;
}
QuestionPanelDynamicImplementor.prototype.onPanelCountChanged = function () {
this.onCurrentIndexChanged();
};
QuestionPanelDynamicImplementor.prototype.onRenderModeChanged = function () {
this.onCurrentIndexChanged();
};
QuestionPanelDynamicImplementor.prototype.onCurrentIndexChanged = function () {
this.koRecalc(this.koRecalc() + 1);
this.koRangeValue(this.question.currentIndex);
};
QuestionPanelDynamicImplementor.prototype.addPanel = function () {
this.question.addPanelUI();
};
QuestionPanelDynamicImplementor.prototype.removePanel = function (val) {
var q = this.question;
if (!q.isRenderModeList) {
val = q.currentPanel;
}
q.removePanelUI(val);
};
QuestionPanelDynamicImplementor.prototype.panelAfterRender = function (elements, con) {
if (!this.question || !this.question.survey)
return;
var el = __WEBPACK_IMPORTED_MODULE_2__base__["a" /* SurveyElement */].GetFirstNonTextElement(elements);
this.question.survey.afterRenderPanel(con, el);
};
return QuestionPanelDynamicImplementor;
}(__WEBPACK_IMPORTED_MODULE_5__koquestion__["a" /* QuestionImplementor */]));
var QuestionPanelDynamic = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionPanelDynamic, _super);
function QuestionPanelDynamic(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionPanelDynamicImplementor(_this);
return _this;
}
QuestionPanelDynamic.prototype.createNewPanelObject = function () {
return new __WEBPACK_IMPORTED_MODULE_7__kopage__["c" /* Panel */]();
};
return QuestionPanelDynamic;
}(__WEBPACK_IMPORTED_MODULE_6__question_paneldynamic__["a" /* QuestionPanelDynamicModel */]));
__WEBPACK_IMPORTED_MODULE_3__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("paneldynamic", function () {
return new QuestionPanelDynamic("");
});
__WEBPACK_IMPORTED_MODULE_4__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("paneldynamic", function (name) {
return new QuestionPanelDynamic(name);
});
/***/ }),
/* 106 */
/***/ (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_radiogroup__ = __webpack_require__(51);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__questionfactory__ = __webpack_require__(3);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__koquestion_baseselect__ = __webpack_require__(14);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRadiogroup; });
var QuestionRadiogroup = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionRadiogroup, _super);
function QuestionRadiogroup(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new __WEBPACK_IMPORTED_MODULE_4__koquestion_baseselect__["b" /* QuestionCheckboxBaseImplementor */](_this);
return _this;
}
QuestionRadiogroup.prototype.getItemClass = function (item) {
var itemClass = this.cssClasses.item +
(this.colCount === 0 ? " sv_q_radiogroup_inline" : "");
if (item.value === this["koValue"]())
itemClass += " checked";
return itemClass;
};
return QuestionRadiogroup;
}(__WEBPACK_IMPORTED_MODULE_1__question_radiogroup__["a" /* QuestionRadiogroupModel */]));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("radiogroup", function () {
return new QuestionRadiogroup("");
});
__WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("radiogroup", function (name) {
var q = new QuestionRadiogroup(name);
q.choices = __WEBPACK_IMPORTED_MODULE_3__questionfactory__["a" /* QuestionFactory */].DefaultChoices;
return q;
});
/***/ }),
/* 107 */
/***/ (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_knockout__ = __webpack_require__(5);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_knockout___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_knockout__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__koquestion__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__question_rating__ = __webpack_require__(52);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jsonobject__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__questionfactory__ = __webpack_require__(3);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return QuestionRating; });
var QuestionRatingImplementor = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionRatingImplementor, _super);
function QuestionRatingImplementor(question) {
var _this = _super.call(this, question) || this;
_this.koVisibleRateValues = __WEBPACK_IMPORTED_MODULE_1_knockout__["observableArray"](_this.getValues());
_this.question["koVisibleRateValues"] = _this.koVisibleRateValues;
var self = _this;
_this.koChange = function (val) {
self.koValue(val.itemValue);
};
_this.question["koChange"] = _this.koChange;
_this.question.rateValuesChangedCallback = function () {
self.onRateValuesChanged();
};
_this.question["koGetCss"] = function (val) {
var css = self.question.itemCss;
var selected = self.question.selectedCss;
return self.question["koValue"]() == val.value
? css + " " + selected
: css;
};
return _this;
}
QuestionRatingImplementor.prototype.onRateValuesChanged = function () {
this.koVisibleRateValues(this.getValues());
};
QuestionRatingImplementor.prototype.getValues = function () {
return this.question.visibleRateValues;
};
return QuestionRatingImplementor;
}(__WEBPACK_IMPORTED_MODULE_2__koquestion__["a" /* QuestionImplementor */]));
var QuestionRating = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](QuestionRating, _super);
function QuestionRating(name) {
var _this = _super.call(this, name) || this;
_this.name = name;
new QuestionRatingImplementor(_this);
return _this;
}
QuestionRating.prototype.onSetData = function () {
var css = this.survey ? this.survey["css"] : null;
if (css && css.rating) {
this.itemCss = css.rating.item;
this.selectedCss = css.rating.selected;
}
};
return QuestionRating;
}(__WEBPACK_IMPORTED_MODULE_3__question_rating__["a" /* QuestionRatingModel */]));
__WEBPACK_IMPORTED_MODULE_4__jsonobject__["a" /* JsonObject */].metaData.overrideClassCreatore("rating", function () {
return new QuestionRating("");
});
__WEBPACK_IMPORTED_MODULE_5__questionfactory__["a" /* QuestionFactory */].Instance.registerQuestion("rating", function (name) {
return new QuestionRating(name);
});
/***/ }),
/* 108 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export arabicSurveyStrings */
var arabicSurveyStrings = {
pagePrevText: "السابق",
pageNextText: "التالي",
completeText: "انهاء- تم",
progressText: "{1} صفحة {0} من",
otherItemText: "نص آخر",
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: "رجاء قم بإدخال بريد الكتروني صحيح",
urlRequestError: "طلب إرجاع خطأ '{0}'. {1}ا",
urlGetChoicesError: "عاد طلب بيانات فارغة أو 'المسار' ممتلكات غير صحيحة ",
exceedMaxSize: "وينبغي ألا يتجاوز حجم الملف {0}ا",
otherRequiredError: "الرجاء إدخال قيمة أخرى",
uploadingFile: "الملف الخاص بك تحميل. يرجى الانتظار عدة ثوان وحاول مرة أخرى",
addRow: "اضافة صف",
removeRow: "إزالة صف"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ar"] = arabicSurveyStrings;
/***/ }),
/* 109 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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;
/***/ }),
/* 110 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export czechSurveyStrings */
var czechSurveyStrings = {
pagePrevText: "Předchozí",
pageNextText: "Další",
completeText: "Hotovo",
otherItemText: "Jiná odpověď (napište)",
progressText: "Strana {0} z {1}",
emptySurvey: "Průzkumu neobsahuje žádné otázky.",
completingSurvey: "Děkujeme za vyplnění průzkumu!",
loadingSurvey: "Probíhá načítání průzkumu...",
optionsCaption: "Vyber...",
requiredError: "Odpovězte prosím na otázku.",
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.",
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.",
addRow: "Přidat řádek",
removeRow: "Odstranit"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["cz"] = czechSurveyStrings;
/***/ }),
/* 111 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export danishSurveyStrings */
var danishSurveyStrings = {
pagePrevText: "Tilbage",
pageNextText: "Videre",
completeText: "Færdig",
progressText: "Side {0} af {1}",
emptySurvey: "Der er ingen synlige spørgsmål.",
completingSurvey: "Mange tak for din besvarelse!",
loadingSurvey: "Spørgeskemaet hentes fra serveren...",
otherItemText: "Valgfrit svar...",
optionsCaption: "Vælg...",
requiredError: "Besvar venligst spørgsmålet.",
numericError: "Angiv et tal.",
textMinLength: "Angiv mindst {0} tegn.",
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.",
exceedMaxSize: "Filstørrelsen må ikke overstige {0}.",
otherRequiredError: "Angiv en værdi for dit valgfrie svar."
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["da"] = danishSurveyStrings;
/***/ }),
/* 112 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export dutchSurveyStrings */
//Created on behalf https://github.com/Frank13
var dutchSurveyStrings = {
pagePrevText: "Vorige",
pageNextText: "Volgende",
completeText: "Afsluiten",
otherItemText: "Andere",
progressText: "Pagina {0} van {1}",
emptySurvey: "Er is geen zichtbare pagina of vraag in deze vragenlijst",
completingSurvey: "Bedankt om deze vragenlijst in te vullen",
loadingSurvey: "De vragenlijst is aan het laden...",
optionsCaption: "Kies...",
requiredError: "Gelieve een antwoord in te vullen",
numericError: "Het antwoord moet een getal zijn",
textMinLength: "Gelieve minsten {0} karakters in te vullen.",
minSelectError: "Gelieve minimum {0} antwoorden te selecteren.",
maxSelectError: "Gelieve niet meer dan {0} antwoorden te selecteren.",
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: "Gelieve een geldig e-mailadres in te vullen.",
exceedMaxSize: "De grootte van het bestand mag niet groter zijn dan {0}.",
otherRequiredError: "Gelieve het veld 'Andere' in te vullen"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["nl"] = dutchSurveyStrings;
/***/ }),
/* 113 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export finnishSurveyStrings */
var finnishSurveyStrings = {
pagePrevText: "Edellinen",
pageNextText: "Seuraava",
completeText: "Valmis",
otherItemText: "Muu (kuvaile)",
progressText: "Sivu {0}/{1}",
emptySurvey: "Tässä kyselyssä ei ole yhtäkään näkyvillä olevaa sivua tai kysymystä.",
completingSurvey: "Kiitos kyselyyn vastaamisesta!",
loadingSurvey: "Kyselyä ladataan palvelimelta...",
optionsCaption: "Valitse...",
requiredError: "Vastaa kysymykseen, kiitos.",
numericError: "Arvon tulee olla numeerinen.",
textMinLength: "Ole hyvä ja syötä vähintään {0} merkkiä.",
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.",
otherRequiredError: 'Ole hyvä ja syötä "Muu (kuvaile)"'
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fi"] = finnishSurveyStrings;
/***/ }),
/* 114 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export frenchSurveyStrings */
//Created on behalf https://github.com/Frank13
var frenchSurveyStrings = {
pagePrevText: "Pr\u00e9c\u00e9dent",
pageNextText: "Suivant",
completeText: "Terminer",
otherItemText: "Autre (pr\u00e9ciser)",
progressText: "Page {0} sur {1}",
emptySurvey: "Il n'y a ni page visible ni question visible dans ce questionnaire",
completingSurvey: "Merci d'avoir r\u00e9pondu au questionnaire!",
loadingSurvey: "Le questionnaire est en cours de chargement...",
optionsCaption: "Choisissez...",
requiredError: "La r\u00e9ponse \u00e0 cette question est obligatoire.",
requiredInAllRowsError: "Toutes les lignes sont obligatoires",
numericError: "La r\u00e9ponse doit \u00eatre un nombre.",
textMinLength: "Merci d'entrer au moins {0} symboles.",
minSelectError: "Merci de s\u00e9lectionner au moins {0}r\u00e9ponses.",
maxSelectError: "Merci de s\u00e9lectionner au plus {0}r\u00e9ponses.",
numericMinMax: "Votre r\u00e9ponse '{0}' doit \u00eatresup\u00e9rieure ou \u00e9gale \u00e0 {1} et inf\u00e9rieure ou\u00e9gale \u00e0 {2}",
numericMin: "Votre r\u00e9ponse '{0}' doit \u00eatresup\u00e9rieure ou \u00e9gale \u00e0 {1}",
numericMax: "Votre r\u00e9ponse '{0}' doit \u00eatreinf\u00e9rieure ou \u00e9gale \u00e0 {1}",
invalidEmail: "Merci d'entrer une adresse mail valide.",
exceedMaxSize: "La taille du fichier ne doit pas exc\u00e9der {0}.",
otherRequiredError: "Merci de pr\u00e9ciser le champ 'Autre'."
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fr"] = frenchSurveyStrings;
/***/ }),
/* 115 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* 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;
/***/ }),
/* 116 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export germanSurveyStrings */
var germanSurveyStrings = {
pagePrevText: "Zurück",
pageNextText: "Weiter",
completeText: "Absenden",
progressText: "Seite {0} von {1}",
emptySurvey: "Es gibt keine sichtbare Frage.",
completingSurvey: "Vielen Dank für die Beantwortung des Fragebogens!",
loadingSurvey: "Der Fragebogen wird vom Server geladen...",
otherItemText: "Benutzerdefinierte Antwort...",
optionsCaption: "Wählen...",
requiredError: "Bitte beantworten Sie diese Frage.",
numericError: "Der Wert sollte eine Zahl sein.",
textMinLength: "Bitte geben Sie mindestens {0} Zeichen ein.",
minSelectError: "Bitte wählen Sie mindestens {0} Einträge.",
maxSelectError: "Bitte wählen Sie nicht mehr als {0} Einträge.",
numericMinMax: "'{0}' sollte gleich oder größer sein als {1} und gleich oder kleiner als {2}.",
numericMin: "'{0}' sollte gleich oder größer sein als {1}.",
numericMax: "'{0}' sollte gleich oder kleiner als {1} sein.",
invalidEmail: "Bitte geben Sie eine gültige E-Mail Adresse ein.",
exceedMaxSize: "Die Dateigröße darf {0} KB nicht überschreiten.",
otherRequiredError: "Bitte geben Sie Ihre benutzerdefinierte Antwort ein."
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["de"] = germanSurveyStrings;
/***/ }),
/* 117 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export greekSurveyStrings */
//Created by https://github.com/agelospanagiotakis
var greekSurveyStrings = {
pagePrevText: "Προηγούμενο",
pageNextText: "Επόμενο",
completeText: "Ολοκλήρωση",
otherItemText: "Άλλο (παρακαλώ διευκρινίστε)",
progressText: "Σελίδα {0} από {1}",
emptySurvey: "Δεν υπάρχει καμία ορατή σελίδα ή ορατή ερώτηση σε αυτό το ερωτηματολόγιο.",
completingSurvey: "Ευχαριστούμε για την συμπλήρωση αυτου του ερωτηματολογίου!",
loadingSurvey: "Το ερωτηματολόγιο φορτώνεται απο το διακομιστή...",
optionsCaption: "Επιλέξτε...",
requiredError: "Παρακαλώ απαντήστε στην ερώτηση.",
requiredInAllRowsError: "Παρακαλώ απαντήστε στις ερωτήσεις σε όλες τις γραμμές.",
numericError: "Η τιμή πρέπει να είναι αριθμιτική.",
textMinLength: "Παρακαλώ συμπληρώστε τουλάχιστον {0} σύμβολα.",
minRowCountError: "Παρακαλώ συμπληρώστε τουλάχιστον {0} γραμμές.",
minSelectError: "Παρακαλώ επιλέξτε τουλάχιστον {0} παραλλαγές.",
maxSelectError: "Παρακαλώ επιλέξτε όχι παραπάνω απο {0} παραλλαγές.",
numericMinMax: "Το '{0}' θα πρέπει να είναι ίσο ή μεγαλύτερο απο το {1} και ίσο ή μικρότερο απο το {2}",
numericMin: "Το '{0}' πρέπει να είναι μεγαλύτερο ή ισο με το {1}",
numericMax: "Το '{0}' πρέπει να είναι μικρότερο ή ίσο απο το {1}",
invalidEmail: "Παρακαλώ δώστε μια αποδεκτή διεύθυνση e-mail.",
urlRequestError: "Η αίτηση επέστρεψε σφάλμα '{0}'. {1}",
urlGetChoicesError: "Η αίτηση επέστρεψε κενά δεδομένα ή η ιδότητα 'μονοπάτι/path' είναι εσφαλέμένη",
exceedMaxSize: "Το μέγεθος δεν μπορεί να υπερβένει τα {0}.",
otherRequiredError: "Παρακαλώ συμπληρώστε την τιμή για το πεδίο 'άλλο'.",
uploadingFile: "Το αρχείο σας ανεβαίνει. Παρακαλώ περιμένετε καποια δευτερόλεπτα και δοκιμάστε ξανά.",
addRow: "Προσθήκη γραμμής",
removeRow: "Αφαίρεση"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["gr"] = greekSurveyStrings;
/***/ }),
/* 118 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export hebrewSurveyStrings */
var hebrewSurveyStrings = {
pagePrevText: "אחורה",
pageNextText: "קדימה",
completeText: "סיום",
progressText: "דף {1} מתוך {0}",
emptySurvey: "אין שאלות",
completingSurvey: "תודה על מילוי השאלון!",
loadingSurvey: "טעינה מהשרת...",
otherItemText: "אחר (נא לתאר)",
optionsCaption: "בחר...",
requiredError: "אנא השב על השאלה",
numericError: "התשובה צריכה להיות מספר.",
textMinLength: "הזן לפחות {0} תווים.",
minSelectError: "בחר לפחות {0} אפשרויות.",
maxSelectError: "בחר עד {0} אפשרויות.",
numericMinMax: "'{0}' חייב להיות שווה או גדול מ {1}, ושווה ל- {2} או פחות מ- {}}",
numericMin: "'{0}' חייב להיות שווה או גדול מ {1}",
numericMax: "'{0}' חייב להיות שווה או קטן מ {1}",
invalidEmail: 'הזן כתובת דוא"ל חוקית.',
otherRequiredError: 'נא להזין נתונים בשדה "אחר"'
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["he"] = hebrewSurveyStrings;
/***/ }),
/* 119 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export hungarianSurveyStrings */
var hungarianSurveyStrings = {
pagePrevText: "Vissza",
pageNextText: "Tovább",
completeText: "Kész",
otherItemText: "Egyéb (adja meg)",
progressText: "{0}./{1} oldal",
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!",
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!",
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.",
confirmDelete: "Törli ezt a rekordot?",
keyDuplicationError: "Az értéknek egyedinek kell lennie.",
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"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["hu"] = hungarianSurveyStrings;
/***/ }),
/* 120 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export icelandicSurveyStrings */
var icelandicSurveyStrings = {
pagePrevText: "Tilbaka",
pageNextText: "Áfram",
completeText: "Lokið",
otherItemText: "Hinn (skýring)",
progressText: "Síða {0} of {1}",
emptySurvey: "Það er enginn síða eða spurningar í þessari könnun.",
completingSurvey: "Takk fyrir að fyllja út þessa könnun!",
loadingSurvey: "Könnunin er að hlaða...",
optionsCaption: "Veldu...",
requiredError: "Vinsamlegast svarið spurningunni.",
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.",
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.",
addRow: "Bæta við röð",
removeRow: "Fjarlægja",
choices_firstItem: "fyrsti hlutur",
choices_secondItem: "annar hlutur",
choices_thirdItem: "þriðji hlutur",
matrix_column: "Dálkur",
matrix_row: "Röð"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["is"] = icelandicSurveyStrings;
/***/ }),
/* 121 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export italianSurveyStrings */
var italianSurveyStrings = {
pagePrevText: "Precedente",
pageNextText: "Successivo",
completeText: "Salva",
otherItemText: "Altro (descrivi)",
progressText: "Pagina {0} di {1}",
emptySurvey: "Non ci sono pagine o domande visibili nel questionario.",
completingSurvey: "Grazie per aver completato il questionario!",
loadingSurvey: "Caricamento del questionario in corso...",
optionsCaption: "Scegli...",
requiredError: "Campo obbligatorio",
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",
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",
addRow: "Aggiungi riga",
removeRow: "Rimuovi riga",
choices_Item: "Elemento",
matrix_column: "Colonna",
matrix_row: "Riga"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["it"] = italianSurveyStrings;
/***/ }),
/* 122 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export latvianSurveyStrings */
var latvianSurveyStrings = {
pagePrevText: "Atpakaļ",
pageNextText: "Tālāk",
completeText: "Pabeigt",
progressText: "Lappuse {0} no {1}",
emptySurvey: "Nav neviena jautājuma.",
completingSurvey: "Pateicamies Jums par anketas aizpildīšanu!",
loadingSurvey: "Ielāde no servera...",
otherItemText: "Cits (lūdzu, aprakstiet!)",
optionsCaption: "Izvēlēties...",
requiredError: "Lūdzu, atbildiet uz jautājumu!",
numericError: "Atbildei ir jābūt skaitlim.",
textMinLength: "Lūdzu, ievadiet vismaz {0} simbolus.",
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!",
otherRequiredError: 'Lūdzu, ievadiet datus laukā "Cits"'
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["lv"] = latvianSurveyStrings;
/***/ }),
/* 123 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export persianSurveyStrings */
var persianSurveyStrings = {
pagePrevText: "قبلی",
pageNextText: "بعدی",
completeText: "تکمیل",
otherItemText: "دیگر(توضیح)",
progressText: "صفحه {0} از {1}",
emptySurvey: "صفحه ای یا گزینه ای برای این پرسشنامه موجود نیست.",
completingSurvey: "از شما بابت تکمیل این پرسشنامه متشکریم",
completingSurveyBefore: "به نظر می رسد هم هم اکنون پرسشنامه را تکمیل کرده اید.",
loadingSurvey: "درحال ایجاد پرسشنامه",
optionsCaption: "انتخاب کنید...",
value: "مقدار",
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: "لطفا ایمیل صحیح درج کنید",
urlRequestError: "درخواست با خطا روبرو شد: '{0}'. {1}",
urlGetChoicesError: "درخواست مسیری خالی بازگشت داده یا مسیر درست تنظیم نشده",
exceedMaxSize: "بیشترین حجم مجاز فایل: {0}",
otherRequiredError: "مقدار 'دیگر' را وارد کنید",
uploadingFile: "فایل در حال آیلود می باشد. لطفا صبر کنید.",
confirmDelete: "آیا مایل به حذف این ردیف هستید؟",
keyDuplicationError: "این مقدار باید غیر تکراری باشد",
addRow: "سطر جدید",
removeRow: "حذف",
addPanel: "جدید",
removePanel: "حذف",
choices_Item: "آیتم",
matrix_column: "ستون",
matrix_row: "سطر",
savingData: "نتایج در حال ذخیره سازی در سرور می باشد",
savingDataError: "خطایی در ذخیره سازی نتایج رخ داده است",
savingDataSuccess: "نتایج با موفقیت ذخیره شد",
saveAgainButton: "مجدد تلاش کنید"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["fa"] = persianSurveyStrings;
/***/ }),
/* 124 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export polishSurveyStrings */
var polishSurveyStrings = {
pagePrevText: "Wstecz",
pageNextText: "Dalej",
completeText: "Gotowe",
otherItemText: "Inna odpowiedź (wpisz)",
progressText: "Strona {0} z {1}",
emptySurvey: "Nie ma widocznych pytań.",
completingSurvey: "Dziękujemy za wypełnienie ankiety!",
loadingSurvey: "Trwa wczytywanie ankiety...",
optionsCaption: "Wybierz...",
requiredError: "Proszę odpowiedzieć na to 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.",
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.",
addRow: "Dodaj wiersz",
removeRow: "Usuń"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["pl"] = polishSurveyStrings;
/***/ }),
/* 125 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export portugueseSurveyStrings */
var portugueseSurveyStrings = {
pagePrevText: "Anterior",
pageNextText: "Próximo",
completeText: "Finalizar",
otherItemText: "Outros (descrever)",
progressText: "Pagina {0} de {1}",
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.",
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.",
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.",
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"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["pt"] = portugueseSurveyStrings;
/***/ }),
/* 126 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export romanianSurveyStrings */
var romanianSurveyStrings = {
pagePrevText: "Precedent",
pageNextText: "Următor",
completeText: "Finalizare",
otherItemText: "Altul(precizaţi)",
progressText: "Pagina {0} din {1}",
emptySurvey: "Nu sunt întrebări pentru acest chestionar",
completingSurvey: "Vă mulţumim pentru timpul acordat!",
loadingSurvey: "Chestionarul se încarcă...",
optionsCaption: "Alegeţi...",
requiredError: "Răspunsul la această întrebare este obligatoriu.",
requiredInAllRowsError: "Toate răspunsurile sunt obligatorii",
numericError: "Răspunsul trebuie să fie numeric.",
textMinLength: "Trebuie să introduceți minim {0} caractere.",
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ă.",
exceedMaxSize: "Dimensiunea fişierului nu trebuie să depăşească {0}.",
otherRequiredError: "Trebuie să completați câmpul 'Altul'.",
completingSurveyBefore: "Din înregistrările noastre reiese că ați completat deja acest chestionar.",
value: "valoare",
requiredErrorInPanel: "Vă rugăm să răspundeți la cel puțin o întrebare.",
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.",
urlRequestError: "Request-ul a returnat eroarea '{0}'. {1}",
urlGetChoicesError: "Request-ul nu a returnat date sau proprietatea 'path' este incorectă",
uploadingFile: "Fișierul dumneavoastră este în curs de încărcare. Vă rugăm așteptați câteva secunde și reveniți apoi.",
confirmDelete: "Sunteți sigur că doriți să ștergeți înregistrarea?",
keyDuplicationError: "Valoarea trebuie să fie unică.",
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."
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ro"] = romanianSurveyStrings;
/***/ }),
/* 127 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export russianSurveyStrings */
var russianSurveyStrings = {
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: "Пожалуйста, введите действительный адрес электронной почты.",
otherRequiredError: 'Пожалуйста, введите данные в поле "Другое"'
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["ru"] = russianSurveyStrings;
/***/ }),
/* 128 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export simplifiedChineseSurveyStrings */
var simplifiedChineseSurveyStrings = {
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-cn"] = simplifiedChineseSurveyStrings;
/***/ }),
/* 129 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export spanishSurveyStrings */
var spanishSurveyStrings = {
pagePrevText: "Anterior",
pageNextText: "Siguiente",
completeText: "Completo",
otherItemText: "Otro (describa)",
progressText: "Página {0} de {1}",
emptySurvey: "No hay página visible o pregunta en la encuesta.",
completingSurvey: "Gracias por completar la encuesta!",
loadingSurvey: "La encuesta está cargando...",
optionsCaption: "Seleccione...",
requiredError: "Por favor conteste la 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.",
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.",
addRow: "Agregue una hilera",
removeRow: "Eliminar una hilera",
choices_firstItem: "primer artículo",
choices_secondItem: "segundo artículo",
choices_thirdItem: "tercera artículo",
matrix_column: "Columna",
matrix_row: "Hilera"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["es"] = spanishSurveyStrings;
/***/ }),
/* 130 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export swedishSurveyStrings */
//Create by Mattias Asplund
var swedishSurveyStrings = {
pagePrevText: "Föregående",
pageNextText: "Nästa",
completeText: "Färdig",
otherItemText: "Annat (beskriv)",
progressText: "Sida {0} av {1}",
emptySurvey: "Det finns ingen synlig sida eller fråga i enkäten.",
completingSurvey: "Tack för att du genomfört enkäten!!",
loadingSurvey: "Enkäten laddas...",
optionsCaption: "Välj...",
requiredError: "Var vänlig besvara frågan.",
requiredInAllRowsError: "Var vänlig besvara frågorna på alla rader.",
numericError: "Värdet ska vara numeriskt.",
textMinLength: "Var vänlig ange minst {0} 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.",
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.",
addRow: "Lägg till rad",
removeRow: "Ta bort"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["sv"] = swedishSurveyStrings;
/***/ }),
/* 131 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__surveyStrings__ = __webpack_require__(2);
/* unused harmony export turkishSurveyStrings */
var turkishSurveyStrings = {
pagePrevText: "Geri",
pageNextText: "İleri",
completeText: "Anketi Tamamla",
otherItemText: "Diğer (açıklayınız)",
progressText: "Sayfa {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.",
loadingSurvey: "Anket sunucudan yükleniyor ...",
optionsCaption: "Seçiniz ...",
requiredError: "Lütfen soruya cevap veriniz",
numericError: "Girilen değer numerik olmalıdır",
textMinLength: "En az {0} sembol giriniz.",
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.",
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.",
addRow: "Satır Ekle",
removeRow: "Kaldır"
};
__WEBPACK_IMPORTED_MODULE_0__surveyStrings__["a" /* surveyLocalization */].locales["tr"] = turkishSurveyStrings;
/***/ }),
/* 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__base__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__jsonobject__ = __webpack_require__(1);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", 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; });
/**
* 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_IMPORTED_MODULE_0_tslib__["b" /* __extends */](Trigger, _super);
function Trigger() {
var _this = _super.call(this) || this;
_this.opValue = "equal";
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";
};
Object.defineProperty(Trigger.prototype, "operator", {
get: function () {
return this.opValue;
},
set: function (value) {
if (!value)
return;
value = value.toLowerCase();
if (!Trigger.operators[value])
return;
this.opValue = value;
},
enumerable: true,
configurable: true
});
Trigger.prototype.check = function (value) {
if (Trigger.operators[this.operator](value, this.value)) {
this.onSuccess();
}
else {
this.onFailure();
}
};
Trigger.prototype.onSuccess = function () { };
Trigger.prototype.onFailure = function () { };
Trigger.operatorsValue = null;
return Trigger;
}(__WEBPACK_IMPORTED_MODULE_1__base__["c" /* Base */]));
/**
* It extends the Trigger base class and add properties required for SurveyJS classes.
*/
var SurveyTrigger = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyTrigger, _super);
function SurveyTrigger() {
var _this = _super.call(this) || this;
_this.owner = null;
return _this;
}
SurveyTrigger.prototype.setOwner = function (owner) {
this.owner = 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_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 () {
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_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 true;
},
enumerable: true,
configurable: true
});
SurveyTriggerComplete.prototype.onSuccess = function () {
if (this.owner)
this.owner.doComplete();
};
return SurveyTriggerComplete;
}(SurveyTrigger));
var SurveyTriggerSetValue = /** @class */ (function (_super) {
__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __extends */](SurveyTriggerSetValue, _super);
function SurveyTriggerSetValue() {
return _super.call(this) || this;
}
SurveyTriggerSetValue.prototype.getType = function () {
return "setvaluetrigger";
};
SurveyTriggerSetValue.prototype.onSuccess = function () {
if (!this.setToName || !this.owner)
return;
this.owner.setTriggerValue(this.setToName, this.setValue, this.isVariable);
};
return SurveyTriggerSetValue;
}(SurveyTrigger));
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("trigger", ["operator", "!value"]);
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("surveytrigger", ["!name"], null, "trigger");
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("visibletrigger", ["pages", "questions"], function () {
return new SurveyTriggerVisible();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("completetrigger", [], function () {
return new SurveyTriggerComplete();
}, "surveytrigger");
__WEBPACK_IMPORTED_MODULE_2__jsonobject__["a" /* JsonObject */].metaData.addClass("setvaluetrigger", ["!setToName", "setValue", "isVariable:boolean"], function () {
return new SurveyTriggerSetValue();
}, "surveytrigger");
/***/ }),
/* 133 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__survey__ = __webpack_require__(17);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__knockout_koSurveyWindow__ = __webpack_require__(29);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_jquery__ = __webpack_require__(58);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_jquery__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__utils_updateSurveyProps__ = __webpack_require__(57);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__knockout__ = __webpack_require__(56);
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "defaultStandardCss", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["a"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "defaultBootstrapCss", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["b"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "defaultBootstrapMaterialCss", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["c"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Survey", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["d"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Model", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["e"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRow", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["f"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Page", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["g"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Panel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["h"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionImplementorBase", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["i"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionImplementor", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["j"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionSelectBaseImplementor", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["k"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxBaseImplementor", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["l"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckbox", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["m"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionComment", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["n"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionDropdown", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["o"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFile", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["p"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionHtml", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["q"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixRow", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["r"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrix", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["s"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdown", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["t"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamicImplementor", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["u"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamic", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["v"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamic", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["w"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MultipleTextItem", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["x"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleTextImplementor", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["y"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleText", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["z"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRadiogroup", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["A"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRating", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["B"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionText", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["C"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionBoolean", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["D"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionEmpty", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["E"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionExpression", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["F"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyWindow", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["G"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTemplateText", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["H"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Version", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["I"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Helpers", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["J"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "AnswerCountValidator", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["K"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "EmailValidator", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["L"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "NumericValidator", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["M"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RegexValidator", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["N"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyValidator", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["O"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextValidator", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["P"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorResult", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["Q"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ValidatorRunner", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["R"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ItemValue", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["S"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Base", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["T"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Event", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["U"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyError", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["V"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyElement", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["W"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "LocalizableString", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["X"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ChoicesRestfull", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["Y"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "FunctionFactory", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["Z"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Condition", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_0"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionNode", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_1"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionRunner", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_2"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ConditionsParser", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_3"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ProcessValue", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_4"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomError", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_5"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ExceedSizeError", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_6"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "RequreNumericError", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_7"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonError", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_8"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonIncorrectTypeError", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_9"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadata", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_10"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMetadataClass", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_11"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeError", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_12"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonMissingTypeErrorBase", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_13"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObject", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_14"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonObjectProperty", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_15"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonRequiredPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_16"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "JsonUnknownPropertyError", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_17"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownCell", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_18"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownColumn", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_19"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "matrixDropdownColumnTypes", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_20"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModelBase", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_21"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModelBase", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_22"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDropdownRowModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_23"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_24"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixDynamicRowModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_25"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_26"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MatrixRowModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_27"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMatrixModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_28"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "MultipleTextItemModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_29"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionMultipleTextModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_30"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_31"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PanelModelBase", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_32"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRowModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_33"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "PageModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_34"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Question", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_35"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionBase", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_36"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionEmptyModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_37"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxBase", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_38"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionSelectBase", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_39"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCheckboxModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_40"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCommentModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_41"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionDropdownModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_42"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFactory", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_43"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "ElementFactory", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_44"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionFileModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_45"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionHtmlModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_46"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRadiogroupModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_47"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionRatingModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_48"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionExpressionModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_49"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionTextModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_50"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionBooleanModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_51"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_52"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionPanelDynamicItem", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_53"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTimer", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_54"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_55"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTrigger", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_56"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerComplete", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_57"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerSetValue", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_58"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyTriggerVisible", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_59"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "Trigger", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_60"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "SurveyWindowModel", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_61"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "TextPreProcessor", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_62"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "dxSurveyService", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_63"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyLocalization", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_64"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "surveyStrings", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_65"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "QuestionCustomWidget", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_66"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "CustomWidgetCollection", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_67"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "StylesManager", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_68"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__assign", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_69"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__extends", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_70"]; });
/* harmony namespace reexport (by provided) */ __webpack_require__.d(__webpack_exports__, "__decorate", function() { return __WEBPACK_IMPORTED_MODULE_4__knockout__["_71"]; });
__WEBPACK_IMPORTED_MODULE_2_jquery___default.a["fn"].extend({
Survey: function (props) {
this.each(function () {
var model = props.model;
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__utils_updateSurveyProps__["a" /* updateSurveyProps */])(model, props);
model.render(this);
});
},
SurveyWindow: function (props) {
this.each(function () {
var model = props.model;
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__utils_updateSurveyProps__["a" /* updateSurveyProps */])(model, props);
var survey = new __WEBPACK_IMPORTED_MODULE_1__knockout_koSurveyWindow__["a" /* SurveyWindow */](null, model);
if (props.expanded !== undefined) {
survey.isExpanded = props.expanded;
}
survey.show();
});
}
});
__WEBPACK_IMPORTED_MODULE_0__survey__["a" /* SurveyModel */].platform = "jquery";
/***/ })
/******/ ]);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBlZDE3ZjIzMWUzOTU4NTljNDlhMSIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9jaHVua3MvaGVscGVycy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvanNvbm9iamVjdC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvc3VydmV5U3RyaW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25mYWN0b3J5LnRzIiwid2VicGFjazovLy8uL3NyYy9iYXNlLnRzIiwid2VicGFjazovLy8uL34va25vY2tvdXQvYnVpbGQvb3V0cHV0L2tub2Nrb3V0LWxhdGVzdC5kZWJ1Zy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Vycm9yLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9pdGVtdmFsdWUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbmRpdGlvbnMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbmRpdGlvblByb2Nlc3NWYWx1ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9iYXNlc2VsZWN0LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RleHRQcmVQcm9jZXNzb3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemFibGVzdHJpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhbmVsLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9iYXNlc2VsZWN0LnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3BhZ2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25iYXNlLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25DdXN0b21XaWRnZXRzLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl90ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbmJhc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3ZhbGlkYXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29TdXJ2ZXlXaW5kb3cudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21haW4uc2NzcyIsIndlYnBhY2s6Ly8vLi9zcmMvY2hvaWNlc1Jlc3RmdWxsLnRzIiwid2VicGFjazovLy8uL3NyYy9jb25kaXRpb25zUGFyc2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9keFN1cnZleVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Z1bmN0aW9uc2ZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fdGV4dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVUZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9ib29sZWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9jaGVja2JveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX2VtcHR5LnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9maWxlLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9odG1sLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tYXRyaXhkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9xdWVzdGlvbl9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1ZXN0aW9uX3BhbmVsZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fcmFkaW9ncm91cC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcXVlc3Rpb25fcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9zdHlsZXNtYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9zdXJ2ZXlXaW5kb3cudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleXRpbWVyLnRzIiwid2VicGFjazovLy8uL3NyYy9lbnRyaWVzL2tub2Nrb3V0LnRzIiwid2VicGFjazovLy8uL3NyYy91dGlscy91cGRhdGVTdXJ2ZXlQcm9wcy50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wicm9vdFwiOlwialF1ZXJ5XCIsXCJjb21tb25qczJcIjpcImpxdWVyeVwiLFwiY29tbW9uanNcIjpcImpxdWVyeVwiLFwiYW1kXCI6XCJqcXVlcnlcIn0iLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9jb21tZW50Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9pbmRleC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvbWF0cml4Y2VsbC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcGFnZS5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcGFuZWwuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3Byb2dyZXNzLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1ib29sZWFuLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1jaGVja2JveC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tY29tbWVudC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZHJvcGRvd24uaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWVtcHR5Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1lcnJvcnMuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWV4cHJlc3Npb24uaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWZpbGUuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWh0bWwuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLW1hdHJpeC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tbWF0cml4ZHJvcGRvd24uaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLW1hdHJpeGR5bmFtaWMuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLW11bHRpcGxldGV4dC5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tcGFuZWxkeW5hbWljLW5hdmlnYXRvci5odG1sIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tcGFuZWxkeW5hbWljLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1yYWRpb2dyb3VwLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1yYXRpbmcuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLXRleHQuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbnRpdGxlLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9yb3dzLmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9zdHJpbmcuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3RpbWVycGFuZWwuaHRtbCIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL2VudHJ5Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy93aW5kb3cvd2luZG93Lmh0bWwiLCJ3ZWJwYWNrOi8vLy4vc3JjL2RlZmF1bHRDc3MvY3NzYm9vdHN0cmFwLnRzIiwid2VicGFjazovLy8uL3NyYy9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcG1hdGVyaWFsLnRzIiwid2VicGFjazovLy8uL3NyYy9lbnRyaWVzL2NodW5rcy9sb2NhbGl6YXRpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMvY2h1bmtzL21vZGVsLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fY2hlY2tib3gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9lbXB0eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2ZpbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25faHRtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcGFuZWxkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX3JhZGlvZ3JvdXAudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vYXJhYmljLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vY2F0YWxhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2N6ZWNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZGFuaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZHV0Y2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9maW5uaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZnJlbmNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vZ2VvcmdpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9nZXJtYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9ncmVlay50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2hlYnJldy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2h1bmdhcmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2ljZWxhbmRpYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL2l0YWxpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9sYXR2aWFuLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vcGVyc2lhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3BvbGlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9yb21hbmlhbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3J1c3NpYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9zaW1wbGlmaWVkLWNoaW5lc2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2xvY2FsaXphdGlvbi9zcGFuaXNoLnRzIiwid2VicGFjazovLy8uL3NyYy9sb2NhbGl6YXRpb24vc3dlZGlzaC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvbG9jYWxpemF0aW9uL3R1cmtpc2gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyaWdnZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2VudHJpZXMv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QTREO0FBQzVEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTOztBQUVUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSwyREFBMkQscUNBQXFDLEVBQUU7QUFDbEc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixhQUFhO0FBQ2I7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7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NkNBQTZDO0FBQzdDO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFO0FBQ2xFO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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OztBQUVuSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdEQUF3RCxTQUFTO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtHQUFrRztBQUNsRztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkMsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFD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QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDZDQUE2QyxxRkFBcUYsR0FBRztBQUNySTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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QVcsRUFBRSxJQUFJLENBQUMsV0FBVzthQUM5QixDQUFDO1lBQ0YsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFDSCw4QkFBQztBQUFELENBQUMsQ0FsRzRDLDJEQUFRLEdBa0dwRDs7QUFFRDtJQUNFLE1BQU0sQ0FBQztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7S0FDTixDQUFDO0FBQ0osQ0FBQztBQUVELCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDMUIsWUFBWSxFQUNaO0lBQ0UsdUJBQXVCO0lBQ3ZCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUU7SUFDdEQ7UUFDRSxJQUFJLEVBQUUsY0FBYztRQUNwQixPQUFPLEVBQUUsU0FBUztRQUNsQixPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUM7S0FDcEQ7SUFDRDtRQUNFLElBQUksRUFBRSxVQUFVO1FBQ2hCLE9BQU8sRUFBRTtZQUNQLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxFQUFFLEtBQUs7S0FDZjtJQUNELEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7SUFDOUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDdkMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDcEMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDdEMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDcEMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtJQUM3QyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtDQUN2QyxFQUNEO0lBQ0UsTUFBTSxDQUFDLElBQUksdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekMsQ0FBQyxFQUNELFVBQVUsQ0FDWCxDQUFDO0FBQ0YseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLGNBQUk7SUFDMUQsTUFBTSxDQUFDLElBQUksdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyVW1DO0FBQ0k7QUFDVTtBQUVHO0FBQ0Y7QUFFckQ7O0dBRUc7QUFDSDtJQUF1QyxvRkFBUTtJQUk3QywyQkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUNaO1FBRmtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFIdkIsaUJBQVcsR0FBWSxLQUFLLENBQUM7UUFFOUIsa0JBQVksR0FBVSxFQUFFLENBQUM7O0lBR2hDLENBQUM7SUFDTSxtQ0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBSUQsc0JBQVcsMENBQVc7UUFIdEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JELENBQUM7YUFDRCxVQUF1QixHQUFZO1lBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyw0Q0FBYTtRQUh4Qjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkQsQ0FBQzthQUNELFVBQXlCLEdBQVk7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QyxDQUFDOzs7T0FIQTtJQU9ELHNCQUFXLDBDQUFXO1FBSHRCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlDLENBQUM7YUFDRCxVQUF1QixHQUFXO1lBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyx5Q0FBVTtRQUhyQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxDQUFDO2FBQ0QsVUFBc0IsR0FBVztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLENBQUM7OztPQUhBO0lBU0Qsc0JBQVcsOENBQWU7UUFMMUI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RCxDQUFDO2FBQ0QsVUFBMkIsR0FBWTtZQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEQsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyxzQ0FBTztRQUhsQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQzthQUNELFVBQW1CLEdBQVc7WUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QyxDQUFDOzs7T0FIQTtJQU9ELHNCQUFJLGlEQUFrQjtRQUh0Qjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN0RCxDQUFDOzs7T0FBQTtJQUNEOztPQUVHO0lBQ0ksaUNBQUssR0FBWjtRQUNFLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNEOzs7T0FHRztJQUNJLG9DQUFRLEdBQWYsVUFBZ0IsSUFBVTtRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0kscUNBQVMsR0FBaEIsVUFBaUIsS0FBYTtRQUE5QixpQkFlQztRQWRDLEVBQUUsQ0FBQyxDQUNELElBQUksQ0FBQyxNQUFNO1lBQ1gsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQUk7Z0JBQ2YsWUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQ3BCLEtBQUksQ0FBQyxJQUFJLEVBQ1QsSUFBSSxFQUNKLEtBQUksQ0FBQyxlQUFlLEVBQ3BCLGdCQUFNLElBQUksUUFBQyxLQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sS0FBSyxXQUFXLENBQUMsRUFBM0MsQ0FBMkMsQ0FDdEQ7WUFMRCxDQUtDLENBRUwsQ0FBQyxDQUFDLENBQUM7WUFDRCxNQUFNLENBQUM7UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ1Msd0NBQVksR0FBdEIsVUFBdUIsSUFBVTtRQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ1MseUNBQWEsR0FBdkIsVUFBd0IsS0FBYTtRQUFyQyxpQkF3QkM7UUF2QkMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLE1BQU0sQ0FBQztRQUNULENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUMvQyxNQUFNLENBQUM7UUFDVCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFJLElBQUksWUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUE3QixDQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sQ0FBQztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsT0FBTyxDQUFDLGNBQUk7WUFDaEIsSUFBSSxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNsQyxVQUFVLENBQUMsTUFBTSxHQUFHLFdBQUM7Z0JBQ25CLEVBQUUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO29CQUN6QixLQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztnQkFDRCxFQUFFLENBQUMsQ0FBQyxLQUFJLENBQUMsV0FBVyxJQUFJLEtBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMvQyxLQUFJLENBQUMsWUFBWSxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQ2xFLEtBQUksQ0FBQyxZQUFZLENBQUMsS0FBSSxDQUFDLDBCQUEwQixDQUFDLENBQUM7Z0JBQ3JELENBQUM7WUFDSCxDQUFDLENBQUM7WUFDRixVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNTLDRDQUFnQixHQUExQixVQUEyQixNQUEwQjtRQUNuRCxpQkFBTSxnQkFBZ0IsWUFBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNyQixNQUFNLENBQUMsSUFBSSxDQUNULElBQUksMkRBQVcsQ0FBQywwRUFBa0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FDL0QsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBQ08sOENBQWtCLEdBQTFCLFVBQTJCLElBQVU7UUFDbkMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNqQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksK0RBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ08sdUNBQVcsR0FBbkIsVUFBb0IsSUFBVTtRQUM1QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDaEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNILHdCQUFDO0FBQUQsQ0FBQyxDQS9Kc0MsMkRBQVEsR0ErSjlDOztBQUNELCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDMUIsTUFBTSxFQUNOO0lBQ0UscUJBQXFCO0lBQ3JCLHVCQUF1QjtJQUN2QixhQUFhO0lBQ2IsWUFBWTtJQUNaLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7SUFDbEQsZ0JBQWdCO0NBQ2pCLEVBQ0Q7SUFDRSxNQUFNLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNuQyxDQUFDLEVBQ0QsVUFBVSxDQUNYLENBQUM7QUFDRix5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsY0FBSTtJQUNwRCxNQUFNLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUMzTDJDO0FBQ0o7QUFDVTtBQUdwRDs7R0FFRztBQUNIO0lBQXVDLG9GQUFZO0lBQ2pELDJCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixLQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLEtBQUksQ0FBQyxDQUFDOztJQUM3QyxDQUFDO0lBQ00sbUNBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNELHNCQUFXLG1DQUFJO2FBQWY7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNuRCxDQUFDO2FBQ0QsVUFBZ0IsR0FBVztZQUN6QixJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLENBQUM7OztPQUhBO0lBSUQsc0JBQUksc0NBQU87YUFBWDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyw0Q0FBYTthQUF4QjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEUsQ0FBQzs7O09BQUE7SUFDSCx3QkFBQztBQUFELENBQUMsQ0FwQnNDLG1FQUFZLEdBb0JsRDs7QUFDRCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQzFCLE1BQU0sRUFDTixDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUN6RDtJQUNFLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25DLENBQUMsRUFDRCxjQUFjLENBQ2YsQ0FBQztBQUNGLHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxjQUFJO0lBQ3BELE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0Q3FDO0FBQ0Y7QUFDSTtBQUVXO0FBQ2Y7QUFDYztBQU9wRDtJQUtFLHdCQUNFLElBQWUsRUFDUixRQUFnQixFQUN2QixJQUFpQixFQUNqQixLQUFVO1FBRkgsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUl2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBQ0Qsc0JBQVcsZ0NBQUk7YUFBZjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixDQUFDOzs7T0FBQTtJQUNELHNCQUFXLGdDQUFJO2FBQWY7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEIsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyxtQ0FBTzthQUFsQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUMzQixDQUFDOzs7T0FBQTtJQUNELHNCQUFXLGlDQUFLO2FBQWhCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDdkIsQ0FBQzthQUNELFVBQWlCLFFBQWE7WUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDekIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixDQUFDOzs7T0FMQTtJQU1TLHVDQUFjLEdBQXhCLGNBQTRCLENBQUM7SUFDL0IscUJBQUM7QUFBRCxDQUFDOztBQUVEOztHQUVHO0FBQ0g7SUFBeUMsc0ZBQVE7SUFLL0MsNkJBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FHWjtRQUprQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBRnZCLG1CQUFhLEdBQUcsS0FBSyxDQUFDO1FBSTVCLEtBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELEtBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDOztJQUNqRCxDQUFDO0lBQ00scUNBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELHNCQUFXLGlEQUFnQjthQUEzQjtZQUNFLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDZixDQUFDOzs7T0FBQTtJQUlELHNCQUFXLGlEQUFnQjtRQUgzQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxRCxDQUFDO2FBQ0QsVUFBNEIsR0FBWTtZQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyx3Q0FBTztRQUhsQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNuQyxDQUFDOzs7T0FBQTtJQUlELHNCQUFJLHdDQUFPO1FBSFg7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzNCLENBQUM7YUFDRCxVQUFZLFFBQW9CO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0MsQ0FBQzs7O09BSEE7SUFPRCxzQkFBSSxxQ0FBSTtRQUhSOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDO2FBQ0QsVUFBUyxRQUFvQjtZQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLENBQUM7OztPQUhBO0lBT0Qsc0JBQVcsNENBQVc7UUFIdEI7O1dBRUc7YUFDSDtZQUNFLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFrQixDQUFDO1lBQ3pDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDckIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNuQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQUMsUUFBUSxDQUFDO2dCQUNsQyxNQUFNLENBQUMsSUFBSSxDQUNULElBQUksQ0FBQyxlQUFlLENBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQy9DLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUN4QixDQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSw2REFBUyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6RSxDQUFDO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztZQUNuQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ2hCLENBQUM7OztPQUFBO0lBQ0Qsd0RBQTBCLEdBQTFCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFDUyw4Q0FBZ0IsR0FBMUIsVUFBMkIsTUFBMEI7UUFDbkQsaUJBQU0sZ0JBQWdCLFlBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxQixNQUFNLENBQUMsSUFBSSxDQUNULElBQUksMkRBQVcsQ0FBQywwRUFBa0IsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUN4RSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDTyw0Q0FBYyxHQUF0QjtRQUNFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN6QyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBQ08sZ0RBQWtCLEdBQTFCO1FBQ0UsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQ3JDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbkMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDeEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDUyw2Q0FBZSxHQUF6QixVQUNFLElBQWUsRUFDZixRQUFnQixFQUNoQixLQUFVO1FBRVYsTUFBTSxDQUFDLElBQUksY0FBYyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDUyw0Q0FBYyxHQUF4QjtRQUNFLEVBQUUsQ0FBQyxDQUNELElBQUksQ0FBQyxhQUFhO1lBQ2xCLENBQUMsSUFBSSxDQUFDLG9CQUFvQjtZQUMxQixJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxJQUFJLENBQ3RDLENBQUM7WUFDQyxNQUFNLENBQUM7UUFDVCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNuQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQzNDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDbEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDOUMsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ0Qsc0JBQVcsNkNBQVk7YUFBdkI7WUFDRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3hCLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDM0IsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLDZEQUFTLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNoQixDQUFDOzs7T0FBQTtJQUNELGFBQWE7SUFDYixnREFBa0IsR0FBbEIsVUFBbUIsR0FBbUI7UUFDcEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDMUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUNkLFFBQVEsR0FBRyxFQUFFLENBQUM7WUFDaEIsQ0FBQztZQUNELFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ0gsMEJBQUM7QUFBRCxDQUFDLENBckp3QywyREFBUSxHQXFKaEQ7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUMxQixRQUFRLEVBQ1I7SUFDRTtRQUNFLElBQUksRUFBRSxvQkFBb0I7UUFDMUIsVUFBVSxFQUFFLFVBQVMsR0FBUTtZQUMzQixNQUFNLENBQUMsNkRBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxVQUFVLEVBQUUsVUFBUyxHQUFRLEVBQUUsS0FBVTtZQUN2QyxHQUFHLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN0QixDQUFDO0tBQ0Y7SUFDRDtRQUNFLElBQUksRUFBRSxpQkFBaUI7UUFDdkIsVUFBVSxFQUFFLFVBQVMsR0FBUTtZQUMzQixNQUFNLENBQUMsNkRBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFDRCxVQUFVLEVBQUUsVUFBUyxHQUFRLEVBQUUsS0FBVTtZQUN2QyxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNuQixDQUFDO0tBQ0Y7SUFDRCwwQkFBMEI7Q0FDM0IsRUFDRDtJQUNFLE1BQU0sQ0FBQyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLENBQUMsRUFDRCxVQUFVLENBQ1gsQ0FBQztBQUVGLHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxjQUFJO0lBQ3RELElBQUksQ0FBQyxHQUFHLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLElBQUksR0FBRyx5RUFBZSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxDQUFDLENBQUMsT0FBTyxHQUFHLHlFQUFlLENBQUMsYUFBYSxDQUFDO0lBQzFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ3pPb0M7QUFDRztBQUNGO0FBQ1k7QUFJcEQ7SUFBNEMseUZBQTBCO0lBRXBFLGdDQUNTLElBQVksRUFDbkIsSUFBZSxFQUNmLElBQXlCLEVBQ3pCLEtBQVU7UUFKWixZQU1FLGtCQUFNLElBQUksRUFBRSxLQUFLLENBQUMsU0FHbkI7UUFSUSxVQUFJLEdBQUosSUFBSSxDQUFRO1FBTW5CLEtBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLEtBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7SUFDcEIsQ0FBQztJQUNELHNCQUFXLDJDQUFPO2FBQWxCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQzs7O09BQUE7SUFDRCxzQkFBVyx3Q0FBSTthQUFmO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3hCLENBQUM7OztPQUFBO0lBQ0Qsc0JBQVcsMkNBQU87YUFBbEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDM0IsQ0FBQzs7O09BQUE7SUFDSCw2QkFBQztBQUFELENBQUMsQ0FyQjJDLGdHQUEwQixHQXFCckU7O0FBQ0Q7O0dBRUc7QUFDSDtJQUFpRCw4RkFBK0I7SUFJOUUscUNBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FNWjtRQVBrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBRTdCLEtBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNoQixLQUFJLENBQUMsc0NBQXNDLENBQUMsTUFBTSxFQUFFO1lBQ2xELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7O0lBQ0wsQ0FBQztJQUNNLDZDQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUNELHNCQUFXLHFEQUFZO2FBQXZCO1lBQ0UsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN4QixFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzNCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDNUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNsQyxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUFDLFFBQVEsQ0FBQztnQkFDbkIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDaEIsQ0FBQzs7O09BQUE7SUFLRCxzQkFBVyw2Q0FBSTtRQUhmOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDO2FBQ0QsVUFBZ0IsR0FBZTtZQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7OztPQUhBO0lBSVMsa0RBQVksR0FBdEI7UUFDRSxJQUFJLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBMEIsQ0FBQztRQUNqRCxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN4RCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNuQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFBQyxRQUFRLENBQUM7WUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDUyxxREFBZSxHQUF6QixVQUNFLElBQWUsRUFDZixLQUFVO1FBRVYsSUFBSSxHQUFHLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ0gsa0NBQUM7QUFBRCxDQUFDLENBeERnRCxxR0FBK0IsR0F3RC9FOztBQUVELCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDMUIsZ0JBQWdCLEVBQ2hCO0lBQ0U7UUFDRSxJQUFJLEVBQUUsaUJBQWlCO1FBQ3ZCLFVBQVUsRUFBRSxVQUFTLEdBQVE7WUFDM0IsTUFBTSxDQUFDLDZEQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsVUFBVSxFQUFFLFVBQVMsR0FBUSxFQUFFLEtBQVU7WUFDdkMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDbkIsQ0FBQztLQUNGO0NBQ0YsRUFDRDtJQUNFLE1BQU0sQ0FBQyxJQUFJLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzdDLENBQUMsRUFDRCxvQkFBb0IsQ0FDckIsQ0FBQztBQUVGLHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLGNBQUk7SUFDOUQsSUFBSSxDQUFDLEdBQUcsSUFBSSwyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxJQUFJLEdBQUcseUVBQWUsQ0FBQyxhQUFhLENBQUM7SUFDdkMscUdBQStCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2xIb0M7QUFDRztBQUNVO0FBQ0M7QUFFZjtBQUd0QztJQUEyQyx3RkFBMEI7SUFDbkUsK0JBQW1CLEtBQWEsRUFBRSxJQUF5QixFQUFFLEtBQVU7UUFBdkUsWUFDRSxrQkFBTSxJQUFJLEVBQUUsS0FBSyxDQUFDLFNBRW5CO1FBSGtCLFdBQUssR0FBTCxLQUFLLENBQVE7UUFFOUIsS0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDOztJQUNwQixDQUFDO0lBQ0Qsc0JBQVcsMENBQU87YUFBbEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNqQixDQUFDOzs7T0FBQTtJQUNILDRCQUFDO0FBQUQsQ0FBQyxDQVIwQyxnR0FBMEIsR0FRcEU7O0FBRUQ7OztHQUdHO0FBQ0g7SUFBZ0QsNkZBQStCO0lBTzdFLG9DQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBS1o7UUFOa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUp2QixnQkFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLG1CQUFhLEdBQVcsQ0FBQyxDQUFDO1FBS2hDLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUN4RCxLQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDMUQsS0FBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksRUFBRSxLQUFJLENBQUMsQ0FBQztRQUNqRCxLQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxFQUFFLEtBQUksQ0FBQyxDQUFDOztJQUN0RCxDQUFDO0lBQ00sNENBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUtELHNCQUFXLHFEQUFhO1FBSnhCOzs7V0FHRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkQsQ0FBQzthQUNELFVBQXlCLEdBQVk7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QyxDQUFDOzs7T0FIQTtJQVFELHNCQUFXLCtDQUFPO1FBSmxCOzs7V0FHRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUMsQ0FBQzthQUNELFVBQW1CLEdBQVc7WUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4QyxDQUFDOzs7T0FIQTtJQVNELHNCQUFXLGdEQUFRO1FBTG5COzs7O1dBSUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQzVCLENBQUM7YUFDRCxVQUFvQixHQUFXO1lBQzdCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLDBCQUEwQixDQUFDLFdBQVcsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDcEUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztZQUN6QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLENBQUM7WUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ25DLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDbEQsQ0FBQzs7O09BbEJBO0lBd0JELHNCQUFXLG1EQUFXO1FBTHRCOzs7O1dBSUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFDRCxVQUF1QixHQUFXO1lBQ2hDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztnQkFBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztRQUMvQyxDQUFDOzs7T0FOQTtJQVlELHNCQUFXLG1EQUFXO1FBTHRCOzs7O1dBSUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQzFCLGFBQWEsRUFDYiwwQkFBMEIsQ0FBQyxXQUFXLENBQ3ZDLENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBdUIsR0FBVztZQUNoQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsMEJBQTBCLENBQUMsV0FBVyxDQUFDO2dCQUMvQyxHQUFHLEdBQUcsMEJBQTBCLENBQUMsV0FBVyxDQUFDO1lBQy9DLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO2dCQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQy9DLENBQUM7OztPQVJBO0lBZUQsc0JBQVcsaURBQVM7UUFOcEI7Ozs7O1dBS0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUMsQ0FBQzs7O09BQUE7SUFPRCxzQkFBVyxvREFBWTtRQU52Qjs7Ozs7V0FLRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQyxDQUFDOzs7T0FBQTtJQUNEOztPQUVHO0lBQ0ksMkNBQU0sR0FBYjtRQUNFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDbEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNoQixFQUFFLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFDRDs7Ozs7T0FLRztJQUNJLGdEQUFXLEdBQWxCLFVBQW1CLEtBQVU7UUFDM0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQztJQUNEOzs7T0FHRztJQUNJLDhDQUFTLEdBQWhCLFVBQWlCLEtBQWE7UUFDNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQy9CLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDaEQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLG9CQUFvQjtnQkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7Z0JBQ2xDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckIsR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBSUQsc0JBQVcseURBQWlCO1FBSDVCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxtQkFBbUIsRUFDbkIsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUM5QyxDQUFDO1FBQ0osQ0FBQzthQUNELFVBQTZCLEdBQVc7WUFDdEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFELENBQUM7OztPQUhBO0lBSUQsc0JBQUksNERBQW9CO2FBQXhCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3hELENBQUM7OztPQUFBO0lBTUQsc0JBQVcsMkRBQW1CO1FBSjlCOzs7V0FHRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FDbEMscUJBQXFCLEVBQ3JCLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUNwRCxDQUFDO1FBQ0osQ0FBQzthQUNELFVBQStCLEdBQVc7WUFDeEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVELENBQUM7OztPQUhBO0lBSUQsc0JBQUksOERBQXNCO2FBQTFCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzFELENBQUM7OztPQUFBO0lBSUQsc0JBQVcsa0RBQVU7UUFIckI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQ2xDLFlBQVksRUFDWiwwRUFBa0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQ3ZDLENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBc0IsR0FBVztZQUMvQixJQUFJLENBQUMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELENBQUM7OztPQUhBO0lBSUQsc0JBQUkscURBQWE7YUFBakI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELENBQUM7OztPQUFBO0lBSUQsc0JBQVcscURBQWE7UUFIeEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQ2xDLGVBQWUsRUFDZiwwRUFBa0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQzFDLENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBeUIsR0FBVztZQUNsQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELENBQUM7OztPQUhBO0lBSUQsc0JBQUksd0RBQWdCO2FBQXBCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNwRCxDQUFDOzs7T0FBQTtJQUNELHNCQUFXLG9EQUFZO2FBQXZCO1lBQ0UsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN4QixFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzNCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDNUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzFELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7b0JBQUMsUUFBUSxDQUFDO2dCQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNoQixDQUFDOzs7T0FBQTtJQUVNLCtEQUEwQixHQUFqQztRQUNFLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ1MscURBQWdCLEdBQTFCLFVBQTJCLE1BQTBCO1FBQ25ELGlCQUFNLGdCQUFnQixZQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUIsTUFBTSxDQUFDLElBQUksQ0FDVCxJQUFJLDJEQUFXLENBQ2IsMEVBQWtCO2lCQUNmLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUM3QixRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQy9CLENBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBQ00sOENBQVMsR0FBaEIsVUFBaUIsWUFBNEI7UUFBNUIsa0RBQTRCO1FBQzNDLElBQUksU0FBUyxHQUFHLGlCQUFNLFNBQVMsWUFBQyxZQUFZLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksU0FBUyxDQUFDO0lBQy9DLENBQUM7SUFDTyxtREFBYyxHQUF0QjtRQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN0RSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDaEIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLEdBQUcsQ0FBQyxDQUNGLElBQUksUUFBUSxHQUFHLENBQUMsRUFDaEIsUUFBUSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQzNDLFFBQVEsRUFBRSxFQUNWLENBQUM7WUFDRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO2dCQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDeEMsQ0FBQztJQUNPLHNEQUFpQixHQUF6QjtRQUNFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDOUQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzFCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDaEIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUQsR0FBRztnQkFDRCxJQUFJLENBQUMsc0JBQXNCLENBQ3pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFDNUIsTUFBTSxFQUNOLFNBQVMsQ0FDVixJQUFJLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNPLDJEQUFzQixHQUE5QixVQUNFLEdBQStCLEVBQy9CLE1BQTRCLEVBQzVCLFNBQXFCO1FBRXJCLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2xELElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDM0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSwyREFBVyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDUyxpREFBWSxHQUF0QjtRQUNFLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUF5QixDQUFDO1FBQ2hELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN2QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNTLG9EQUFlLEdBQXpCLFVBQTBCLEtBQVU7UUFDbEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNTLHlEQUFvQixHQUE5QixVQUErQixHQUFRO1FBQ3JDLElBQUksV0FBVyxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsRUFBRSxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUM7UUFDakMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBQ1MsbURBQWMsR0FBeEIsVUFBeUIsUUFBYTtRQUNwQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUM7UUFDdEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNYLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ1MsbURBQWMsR0FBeEIsVUFDRSxRQUFhLEVBQ2IsR0FBK0I7UUFFL0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ2hCLEtBQUssQ0FBQztZQUNSLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDbkMsQ0FBQztJQUVPLHVEQUFrQixHQUExQixVQUEyQixhQUFrQixFQUFFLEtBQWE7UUFDMUQsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNO1lBQy9DLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDO0lBQ1Msb0RBQWUsR0FBekIsVUFDRSxHQUErQixFQUMvQixhQUFrQixFQUNsQixNQUF1QjtRQUF2Qix1Q0FBdUI7UUFFdkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQzVCLGFBQWEsRUFDYixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUN2QyxDQUFDO0lBQ0osQ0FBQztJQTVXYSxzQ0FBVyxHQUFHLEdBQUcsQ0FBQztJQTZXbEMsaUNBQUM7Q0FBQSxDQS9XK0MscUdBQStCLEdBK1c5RTtBQS9Xc0M7QUFpWHZDLCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDMUIsZUFBZSxFQUNmO0lBQ0UsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtJQUN2QyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO0lBQzFDO1FBQ0UsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixPQUFPLEVBQUUsMEJBQTBCLENBQUMsV0FBVztLQUNoRDtJQUNELEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtJQUNuQjtRQUNFLElBQUksRUFBRSxxQkFBcUI7UUFDM0IscUJBQXFCLEVBQUUsd0JBQXdCO0tBQ2hEO0lBQ0QsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUU7SUFDakM7UUFDRSxJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLHFCQUFxQixFQUFFLHNCQUFzQjtLQUM5QztJQUNELEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUU7SUFDOUQsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFO0NBQ3JFLEVBQ0Q7SUFDRSxNQUFNLENBQUMsSUFBSSwwQkFBMEIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM1QyxDQUFDLEVBQ0Qsb0JBQW9CLENBQ3JCLENBQUM7QUFFRix5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsY0FBSTtJQUM3RCxJQUFJLENBQUMsR0FBRyxJQUFJLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDNUIscUdBQStCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdmFhO0FBQ2dFO0FBQzFDO0FBQ2M7QUFDVjtBQUNVO0FBRU47QUFjOUM7SUFBMkMsd0ZBQUk7SUFRN0MsK0JBQVksSUFBZ0IsRUFBRSxLQUFvQjtRQUF0QyxrQ0FBZ0I7UUFBRSxvQ0FBb0I7UUFBbEQsWUFDRSxpQkFBTyxTQU1SO1FBVEQsZ0JBQVUsR0FBMkIsSUFBSSxLQUFLLEVBQW1CLENBQUM7UUFJaEUsS0FBSSxDQUFDLFdBQVcsR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLEtBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUNuQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ1YsS0FBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsQ0FBQzs7SUFDSCxDQUFDO0lBQ00sdUNBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztJQUM1QixDQUFDO0lBQ0Qsc0JBQVcscUNBQUU7YUFBYjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN4QixDQUFDOzs7T0FBQTtJQUlELHNCQUFXLHVDQUFJO1FBSGY7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUMxQixDQUFDO2FBQ0QsVUFBZ0IsR0FBVztZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDekIsQ0FBQzs7O09BSEE7SUFJRCxzQkFBVyx5Q0FBTTthQUFqQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFCLENBQUM7OztPQUFBO0lBQ1MsNENBQVksR0FBdEIsVUFBdUIsSUFBWTtRQUNqQyxNQUFNLENBQUMsSUFBSSx5RUFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsdUNBQU8sR0FBUCxVQUFRLElBQXVCO1FBQzdCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUlELHNCQUFXLDZDQUFVO1FBSHJCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDaEMsQ0FBQzthQUNELFVBQXNCLEdBQVk7WUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1FBQy9CLENBQUM7OztPQUhBO0lBT0Qsc0JBQVcsNENBQVM7UUFIcEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUMvQixDQUFDO2FBQ0QsVUFBcUIsR0FBVztZQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7UUFDOUIsQ0FBQzs7O09BSEE7SUFRRCxzQkFBVyx3Q0FBSztRQUpoQjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMzQixDQUFDO2FBQ0QsVUFBaUIsR0FBVztZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDMUIsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSwyQ0FBUTthQUFaO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQzlCLENBQUM7OztPQUFBO0lBSUQsc0JBQVcsNENBQVM7UUFIcEI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUMvQixDQUFDOzs7T0FBQTtJQUlELHNCQUFXLDhDQUFXO1FBSHRCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDakMsQ0FBQzthQUNELFVBQXVCLEdBQVc7WUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO1FBQ2hDLENBQUM7OztPQUhBO0lBSUQsc0JBQUksaURBQWM7YUFBbEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDcEMsQ0FBQzs7O09BQUE7SUFJRCxzQkFBVyx3Q0FBSztRQUhoQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEUsQ0FBQzthQUNELFVBQWlCLEtBQVU7WUFDekIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbkQsQ0FBQztRQUNILENBQUM7OztPQUxBO0lBTU0sOENBQWMsR0FBckIsVUFBc0IsUUFBYTtRQUNqQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUNELGFBQWE7SUFDYiw0Q0FBWSxHQUFaO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCx5Q0FBUyxHQUFUO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNsRCxDQUFDO0lBQ0QsZ0RBQWdCLEdBQWhCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pELENBQUM7SUFDRCxhQUFhO0lBQ2Isd0NBQVEsR0FBUixVQUFTLElBQVk7UUFDbkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0Qsd0NBQVEsR0FBUixVQUFTLElBQVksRUFBRSxLQUFVO1FBQy9CLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFDRCwwQ0FBVSxHQUFWLFVBQVcsSUFBWTtRQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELDBDQUFVLEdBQVYsVUFBVyxJQUFZLEVBQUUsUUFBZ0IsSUFBRyxDQUFDO0lBQzdDLDRDQUFZLEdBQVo7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUNELGlCQUFpQjtJQUNqQixpREFBaUIsR0FBakI7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0Qsc0JBQUksaURBQWM7YUFBbEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO2FBQ0QsVUFBbUIsR0FBUTtZQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNuQixDQUFDOzs7T0FIQTtJQUlILDRCQUFDO0FBQUQsQ0FBQyxDQWhKMEMsbURBQUksR0FnSjlDOztBQUVEOztHQUVHO0FBQ0g7SUFBK0MsNEZBQVE7SUFNckQsbUNBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FXWjtRQVprQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBSHZCLGlCQUFXLEdBQWlDLElBQUksS0FBSyxFQUUxRCxDQUFDO1FBb0dJLGlDQUEyQixHQUFHLEtBQUssQ0FBQztRQWpHMUMsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLEtBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsVUFBUyxJQUFJO1lBQzNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsc0NBQXNDLENBQUMsT0FBTyxFQUFFO1lBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsc0NBQXNDLENBQUMsVUFBVSxFQUFFO1lBQ3RELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7O0lBQ0wsQ0FBQztJQUNNLDJDQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFDTSxpREFBYSxHQUFwQixVQUFxQixLQUFrQjtRQUNyQyxpQkFBTSxhQUFhLFlBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBQ0Qsc0JBQVcsdURBQWdCO2FBQTNCO1lBQ0UsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNmLENBQUM7OztPQUFBO0lBQ0Qsc0RBQWtCLEdBQWxCO1FBQ0UsaUJBQU0sa0JBQWtCLFdBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFJRCxzQkFBVyw0Q0FBSztRQUhoQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQzthQUNELFVBQWlCLEdBQWlDO1lBQ2hELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQzs7O09BSEE7SUFJRDs7OztPQUlHO0lBQ0ksMkNBQU8sR0FBZCxVQUFlLElBQVksRUFBRSxLQUFvQjtRQUFwQixvQ0FBb0I7UUFDL0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDTSxtREFBZSxHQUF0QjtRQUNFLGlCQUFNLGVBQWUsV0FBRSxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBQ0QsOERBQTBCLEdBQTFCO1FBQ0UsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUN6QyxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFJRCxzQkFBVywrQ0FBUTtRQUhuQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUMsQ0FBQzthQUNELFVBQW9CLEdBQVc7WUFDN0IsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7OztPQUpBO0lBUUQsc0JBQVcsK0NBQVE7UUFIbkI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUM7YUFDRCxVQUFvQixHQUFXO1lBQzdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekMsQ0FBQzs7O09BSEE7SUFJRDs7T0FFRztJQUNJLDJDQUFPLEdBQWQ7UUFDRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzdCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdEMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQixDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLEtBQUssRUFBRSxDQUFDO1lBQ1IsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDWixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRVMsa0RBQWMsR0FBeEI7UUFDRSxpQkFBTSxjQUFjLFdBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBQ1Msa0RBQWMsR0FBeEIsVUFBeUIsSUFBWSxFQUFFLEtBQWE7UUFDbEQsTUFBTSxDQUFDLElBQUkscUJBQXFCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDUyxzREFBa0IsR0FBNUI7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDN0MsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQztZQUNyQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUNTLGlEQUFhLEdBQXZCO1FBQ0UsSUFBSSxLQUFLLEdBQUcsaUJBQU0sYUFBYSxXQUFFLENBQUM7UUFDbEMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDaEMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLEtBQUssR0FBRyxJQUFJLG1FQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNsQyxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDUyxvREFBZ0IsR0FBMUIsVUFBMkIsTUFBMEI7UUFDbkQsaUJBQU0sZ0JBQWdCLFlBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksbUVBQW1CLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELG1CQUFtQjtJQUNuQix3REFBb0IsR0FBcEIsVUFBcUIsSUFBWTtRQUMvQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFDRCx3REFBb0IsR0FBcEIsVUFBcUIsSUFBWSxFQUFFLEtBQVU7UUFDM0MsSUFBSSxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQztRQUN4QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNkLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFDRCw2Q0FBUyxHQUFUO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNELG9EQUFnQixHQUFoQjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFDRCxnREFBWSxHQUFaO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRCxDQUFDO0lBQ0QscURBQWlCLEdBQWpCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUNILGdDQUFDO0FBQUQsQ0FBQyxDQXhLOEMsMkRBQVEsR0F3S3REOztBQUVELCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDMUIsa0JBQWtCLEVBQ2xCO0lBQ0UsTUFBTTtJQUNOLG9CQUFvQjtJQUNwQixFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUU7SUFDaEU7UUFDRSxJQUFJLEVBQUUsV0FBVztRQUNqQixPQUFPLEVBQUUsTUFBTTtRQUNmLE9BQU8sRUFBRTtZQUNQLE9BQU87WUFDUCxNQUFNO1lBQ04sVUFBVTtZQUNWLGdCQUFnQjtZQUNoQixPQUFPO1lBQ1AsT0FBTztZQUNQLFFBQVE7WUFDUixVQUFVO1lBQ1YsT0FBTztZQUNQLEtBQUs7WUFDTCxNQUFNO1lBQ04sTUFBTTtZQUNOLEtBQUs7WUFDTCxNQUFNO1NBQ1A7S0FDRjtJQUNELEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUU7SUFDcEQ7UUFDRSxJQUFJLEVBQUUsdUJBQXVCO1FBQzdCLGFBQWEsRUFBRSxpQkFBaUI7UUFDaEMsYUFBYSxFQUFFLFdBQVc7S0FDM0I7Q0FDRixFQUNEO0lBQ0UsTUFBTSxDQUFDLElBQUkscUJBQXFCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkMsQ0FBQyxDQUNGLENBQUM7QUFFRiwrREFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQzFCLGNBQWMsRUFDZDtJQUNFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRTtJQUMzRCxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFO0lBQ3hDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Q0FDL0QsRUFDRDtJQUNFLE1BQU0sQ0FBQyxJQUFJLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUMsRUFDRCxVQUFVLENBQ1gsQ0FBQztBQUVGLHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxjQUFJO0lBQzVELElBQUksQ0FBQyxHQUFHLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeFlhO0FBQ3FDO0FBRXdCO0FBQ3RCO0FBQ2pCO0FBQ2U7QUFDWDtBQUNVO0FBQ2Q7QUFTdEM7SUFPRSxrQ0FBWSxJQUErQixFQUFFLEtBQWlCO1FBQzVELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSwyRUFBZ0IsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsVUFDaEMsU0FBZ0M7WUFFaEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBQ0Qsc0JBQVcsMkNBQUs7YUFBaEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN6QixDQUFDOzs7T0FBQTtJQUNNLCtDQUFZLEdBQW5CLFVBQW9CLE1BQXNCO1FBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDTSwyQ0FBUSxHQUFmLFVBQWdCLElBQVk7UUFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFDTSwyQ0FBUSxHQUFmLFVBQWdCLElBQVksRUFBRSxRQUFhO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ00sNkNBQVUsR0FBakIsVUFBa0IsSUFBWTtRQUM1QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxtREFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDTSw2Q0FBVSxHQUFqQixVQUFrQixJQUFZLEVBQUUsUUFBZ0I7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsbURBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNNLHVEQUFvQixHQUEzQjtRQUNFLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ3JDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUNNLGtEQUFlLEdBQXRCLFVBQXVCLEtBQWEsRUFBRSxTQUFrQjtRQUN0RCxNQUFNLENBQUMsNERBQWEsQ0FBQyxlQUFlLENBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUNwQixLQUFLLEVBQ0wsU0FBUyxDQUNWLENBQUM7SUFDSixDQUFDO0lBRUQsK0NBQVksR0FBWjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCwrQ0FBWSxHQUFaO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCw0Q0FBUyxHQUFUO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNsRCxDQUFDO0lBQ0QsbURBQWdCLEdBQWhCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxnQkFBZ0I7SUFDUix3REFBcUIsR0FBN0IsVUFBOEIsU0FBZ0M7UUFDNUQsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFDakUsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDMUIsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUNELElBQUksU0FBUyxHQUFHLElBQUksNEVBQVksRUFBRSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsU0FBUyxDQUFDLFFBQVEsR0FBRyxTQUFTLElBQUksd0JBQXdCLENBQUMsZ0JBQWdCLENBQUM7UUFDNUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDdkIsa0NBQWtDO1FBQ2xDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQ3JDLHdCQUF3QixDQUFDLGdCQUFnQixHQUFHLEdBQUcsRUFDL0MsRUFBRSxDQUNILENBQUM7UUFDRixJQUFJLFNBQVMsR0FBRyxJQUFJLDRFQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQUksUUFBUSxHQUFhLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDYixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDLGtCQUFrQjtnQkFDOUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZO2dCQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNyQixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDZCxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDO1FBQ0QsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLDRFQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsOENBQVcsR0FBWCxVQUFZLElBQVksRUFBRSxrQkFBMkI7UUFDbkQsSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDL0QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0RSxDQUFDO0lBQ0QsZ0RBQWEsR0FBYixVQUFjLElBQVk7UUFDeEIsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BDLElBQUkscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDO1FBQ3hFLElBQUksR0FBRyxHQUFHLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN0RCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxHQUFHLENBQUMscUJBQXFCO1lBQ3ZCLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxxQkFBcUIsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELG9EQUFpQixHQUFqQixVQUFrQixJQUFZO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFuSGEseUNBQWdCLEdBQUcsT0FBTyxDQUFDO0lBQzNCLDBDQUFpQixHQUFHLFlBQVksQ0FBQztJQW1IakQsK0JBQUM7Q0FBQTtBQXRIb0M7QUF3SHJDOzs7R0FHRztBQUNIO0lBQStDLDRGQUFRO0lBZ0JyRCxtQ0FBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQWtCWjtRQW5Ca0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQVp2QixnQkFBVSxHQUFvQyxJQUFJLEtBQUssRUFFNUQsQ0FBQztRQUNJLHVCQUFpQixHQUFXLENBQUMsQ0FBQztRQUc5Qix1QkFBaUIsR0FBVyxDQUFDLENBQUMsQ0FBQztRQVFyQyxLQUFJLENBQUMsYUFBYSxHQUFHLEtBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3pELEtBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUNuQyxLQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixHQUFHLEtBQUksQ0FBQztRQUM3QyxJQUFJLElBQUksR0FBRyxLQUFJLENBQUM7UUFDaEIsS0FBSSxDQUFDLDhCQUE4QixHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7UUFDeEUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRztZQUNsQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQzFDLENBQUMsQ0FBQztRQUVGLEtBQUksQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUN4RCxLQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDMUQsS0FBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUNuRCxLQUFJLENBQUMsdUJBQXVCLENBQUMsaUJBQWlCLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDdEQsS0FBSSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUNwRCxLQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxFQUFFLEtBQUksQ0FBQyxDQUFDOztJQUN0RCxDQUFDO0lBQ00saURBQWEsR0FBcEIsVUFBcUIsS0FBa0I7UUFDckMsaUJBQU0sYUFBYSxZQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBQ08seURBQXFCLEdBQTdCO1FBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ25DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBQ00sMkNBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUNELHNCQUFXLHVEQUFnQjthQUEzQjtZQUNFLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDZixDQUFDOzs7T0FBQTtJQUNNLGlEQUFhLEdBQXBCLFVBQXFCLE9BQWlCO1FBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBUUQsc0JBQVcsK0NBQVE7UUFObkI7Ozs7O1dBS0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQzVCLENBQUM7OztPQUFBO0lBT0Qsc0JBQVcsdURBQWdCO1FBTjNCOzs7OztXQUtHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDaEMsQ0FBQzs7O09BQUE7SUFPRCxzQkFBVyxvREFBYTtRQU54Qjs7Ozs7V0FLRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzdCLENBQUM7YUFDRCxVQUF5QixRQUFnQjtZQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7UUFDakMsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSx1REFBZ0I7YUFBcEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDaEMsQ0FBQzs7O09BQUE7SUFRRCxzQkFBVywwREFBbUI7UUFQOUI7Ozs7OztXQU1HO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDbkMsQ0FBQzthQUNELFVBQStCLFFBQWdCO1lBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUN2QyxDQUFDOzs7T0FIQTtJQUlELHNCQUFJLDZEQUFzQjthQUExQjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUN0QyxDQUFDOzs7T0FBQTtJQUVELHNCQUFjLDRDQUFLO2FBQW5CO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQzs7O09BQUE7SUFNRCxzQkFBVyw2Q0FBTTtRQUxqQjs7OztXQUlHO2FBQ0g7WUFDRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDYixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzNDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNiLENBQUM7OztPQUFBO0lBUUQsc0JBQVcsbURBQVk7UUFQdkI7Ozs7OztXQU1HO2FBQ0g7WUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Z0JBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLENBQUM7WUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNoQyxDQUFDO2FBQ0QsVUFBd0IsR0FBVztZQUNqQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztZQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3RELENBQUM7OztPQUxBO0lBYUQsc0JBQVcsbURBQVk7UUFQdkI7Ozs7OztXQU1HO2FBQ0g7WUFDRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQzlCLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDMUQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsQ0FBQzs7O09BQUE7SUFLRCxzQkFBVyxvREFBYTtRQUp4Qjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFDRCxVQUF5QixHQUFZO1lBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUMsQ0FBQzs7O09BSEE7SUFRRCxzQkFBVyw4Q0FBTztRQUpsQjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7YUFDRCxVQUFtQixHQUFXO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEMsQ0FBQzs7O09BSEE7SUFPRCxzQkFBVyx3REFBaUI7UUFINUI7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQ2xDLG1CQUFtQixFQUNuQiwwRUFBa0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQzlDLENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBNkIsR0FBVztZQUN0QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUQsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSwyREFBb0I7YUFBeEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEQsQ0FBQzs7O09BQUE7SUFLRCxzQkFBVywwREFBbUI7UUFKOUI7OztXQUdHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxxQkFBcUIsRUFDckIsMEVBQWtCLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQ3BELENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBK0IsR0FBVztZQUN4QyxJQUFJLENBQUMsd0JBQXdCLENBQUMscUJBQXFCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUQsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSw2REFBc0I7YUFBMUI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDMUQsQ0FBQzs7O09BQUE7SUFPRCxzQkFBVyxvREFBYTtRQU54Qjs7Ozs7V0FLRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FDbEMsZUFBZSxFQUNmLDBFQUFrQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FDN0MsQ0FBQztRQUNKLENBQUM7YUFDRCxVQUF5QixHQUFXO1lBQ2xDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdEQsQ0FBQzs7O09BSEE7SUFJRCxzQkFBSSx1REFBZ0I7YUFBcEI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7OztPQUFBO0lBT0Qsc0JBQVcsb0RBQWE7UUFOeEI7Ozs7O1dBS0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQ2xDLGVBQWUsRUFDZiwwRUFBa0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQzdDLENBQUM7UUFDSixDQUFDO2FBQ0QsVUFBeUIsR0FBVztZQUNsQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELENBQUM7OztPQUhBO0lBSUQsc0JBQUksdURBQWdCO2FBQXBCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNwRCxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLG1EQUFZO1FBSHZCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxjQUFjLEVBQ2QsMEVBQWtCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUN6QyxDQUFDO1FBQ0osQ0FBQzthQUNELFVBQXdCLEtBQWE7WUFDbkMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2RCxDQUFDOzs7T0FIQTtJQUlELHNCQUFJLHNEQUFlO2FBQW5CO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuRCxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLHNEQUFlO1FBSDFCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUNsQyxpQkFBaUIsRUFDakIsMEVBQWtCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUM1QyxDQUFDO1FBQ0osQ0FBQzthQUNELFVBQTJCLEdBQVc7WUFDcEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELENBQUM7OztPQUhBO0lBSUQsc0JBQUkseURBQWtCO2FBQXRCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3RELENBQUM7OztPQUFBO0lBSUQsc0JBQVcsMkRBQW9CO1FBSC9COztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsQ0FDTCxJQUFJLENBQUMsVUFBVSxJQUFJLGFBQWEsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLG1CQUFtQixDQUMzRSxDQUFDO1FBQ0osQ0FBQzs7O09BQUE7SUFJRCxzQkFBVyw4REFBdUI7UUFIbEM7O1dBRUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxDQUNMLElBQUksQ0FBQyxVQUFVLElBQUksZ0JBQWdCO2dCQUNuQyxJQUFJLENBQUMsVUFBVSxJQUFJLG1CQUFtQixDQUN2QyxDQUFDO1FBQ0osQ0FBQzs7O09BQUE7SUFNRCxzQkFBVywwREFBbUI7UUFMOUI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBT0Qsc0JBQVcsMERBQW1CO1FBTjlCOzs7OztXQUtHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUMzRSxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLHFEQUFjO1FBSHpCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsQ0FDTCxJQUFJLENBQUMsbUJBQW1CO2dCQUN4QixDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQ2hELENBQUM7UUFDSixDQUFDOzs7T0FBQTtJQUNNLHVEQUFtQixHQUExQixVQUEyQixhQUE4QjtRQUE5QixxREFBOEI7UUFDdkQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqRSxDQUFDO0lBVUQsc0JBQVcsaURBQVU7UUFUckI7Ozs7Ozs7O1dBUUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFlBQVk7Z0JBQ2hELENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCO2dCQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDeEIsQ0FBQzthQUNELFVBQXNCLEdBQVc7WUFDL0IsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDcEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO2dCQUM3QixNQUFNLENBQUM7WUFDVCxDQUFDO1lBQ0QsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQzFELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDcEQsQ0FBQzs7O09BZkE7SUFnQk8sNkRBQXlCLEdBQWpDO1FBQ0UsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN2QixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hELEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUM1QyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRTtZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ2pDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBTUQsc0JBQVcsb0RBQWE7UUFMeEI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQzthQUNELFVBQXlCLEdBQVc7WUFDbEMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUFDLE1BQU0sQ0FBQztZQUNsRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO2dCQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1FBQ25ELENBQUM7OztPQU5BO0lBWUQsc0JBQVcsb0RBQWE7UUFMeEI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FDMUIsZUFBZSxFQUNmLHlCQUF5QixDQUFDLGFBQWEsQ0FDeEMsQ0FBQztRQUNKLENBQUM7YUFDRCxVQUF5QixHQUFXO1lBQ2xDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyx5QkFBeUIsQ0FBQyxhQUFhLENBQUM7Z0JBQ2hELEdBQUcsR0FBRyx5QkFBeUIsQ0FBQyxhQUFhLENBQUM7WUFDaEQsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7Z0JBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7UUFDbkQsQ0FBQzs7O09BUkE7SUFhRCxzQkFBVyxvREFBYTtRQUp4Qjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RELENBQUM7YUFDRCxVQUF5QixHQUFZO1lBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUMsQ0FBQzs7O09BSEE7SUFRRCxzQkFBVyx1REFBZ0I7UUFKM0I7OztXQUdHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pELENBQUM7YUFDRCxVQUE0QixHQUFZO1lBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRCxDQUFDOzs7T0FIQTtJQVNELHNCQUFXLDREQUFxQjtRQUxoQzs7OztXQUlHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7YUFDRCxVQUFpQyxLQUFhO1lBQzVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDOzs7T0FIQTtJQVFELHNCQUFXLDBEQUFtQjtRQUo5Qjs7O1dBR0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0QsQ0FBQzthQUNELFVBQStCLEdBQVc7WUFDeEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUQsQ0FBQztRQUNILENBQUM7OztPQU5BO0lBWUQsc0JBQVcsMERBQW1CO1FBTDlCOzs7O1dBSUc7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUQsQ0FBQzthQUNELFVBQStCLEdBQVk7WUFDekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDdEQsQ0FBQzs7O09BSkE7SUFRRCxzQkFBVyxpREFBVTtRQUhyQjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsQ0FBQzthQUNELFVBQXNCLEdBQVc7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3BELENBQUM7OztPQUpBO0lBU0Qsc0JBQVcsdURBQWdCO1FBSjNCOzs7V0FHRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDO1FBQ25DLENBQUM7OztPQUFBO0lBQ00sbURBQWUsR0FBdEIsVUFBdUIsS0FBYTtRQUNsQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQ3pDLFVBQVUsRUFDVixJQUFJLENBQUMsbUJBQW1CLElBQUksS0FBSyxDQUNsQyxDQUFDO1lBQ0YsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLFVBQVUsSUFBSSxPQUFPLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFDRCxpQkFBTSxlQUFlLFlBQUMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDekUsQ0FBQztJQU9ELHNCQUFXLGtEQUFXO1FBTnRCOzs7OztXQUtHO2FBQ0g7WUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDMUQsTUFBTSxDQUFDLENBQ0wsSUFBSSxDQUFDLGFBQWE7Z0JBQ2xCLENBQUMsSUFBSSxDQUFDLFVBQVU7Z0JBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FDckMsQ0FBQztRQUNKLENBQUM7OztPQUFBO0lBT0Qsc0JBQVcscURBQWM7UUFOekI7Ozs7O1dBS0c7YUFDSDtZQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7Z0JBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUMxRCxNQUFNLENBQUMsQ0FDTCxJQUFJLENBQUMsZ0JBQWdCO2dCQUNyQixDQUFDLElBQUksQ0FBQyxVQUFVO2dCQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQ3JDLENBQUM7UUFDSixDQUFDOzs7T0FBQTtJQUNTLGlEQUFhLEdBQXZCO1FBQ0UsSUFBSSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQTRCLENBQUM7UUFDbEQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLHdCQUF3QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUM5RCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUN4QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3pDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ08saUVBQTZCLEdBQXJDLFVBQXNDLFFBQXlCO1FBQzdELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFBQyxRQUFRLENBQUM7WUFDbkMsSUFBSSxLQUFLLEdBQXlCLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQztZQUMvQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7Z0JBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUNEOzs7Ozs7T0FNRztJQUNJLDhDQUFVLEdBQWpCO1FBQ0UsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNJLDRDQUFRLEdBQWY7UUFDRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFDRDs7Ozs7Ozs7T0FRRztJQUNJLGlEQUFhLEdBQXBCLFVBQXFCLEtBQVU7UUFDN0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2pDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFDRDs7Ozs7T0FLRztJQUNJLCtDQUFXLEdBQWxCLFVBQW1CLEtBQVU7UUFDM0IsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3ZCLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUNyRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2xELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBQ08saURBQWEsR0FBckIsVUFBc0IsR0FBUTtRQUM1QixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ3pELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUM7Z0JBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUNNLGdEQUFZLEdBQW5CO1FBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDM0MsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO1FBQ0QsaUJBQU0sWUFBWSxXQUFFLENBQUM7SUFDdkIsQ0FBQztJQUNNLGdEQUFZLEdBQW5CLFVBQW9CLE1BQXNCO1FBQ3hDLGlCQUFNLFlBQVksWUFBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNPLGtEQUFjLEdBQXRCO1FBQ0UsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDUyxzREFBa0IsR0FBNUIsVUFBNkIsTUFBc0I7UUFDakQsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN2QyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMzQyxTQUFTLENBQ1Asd0JBQXdCLENBQUMsZ0JBQWdCLENBQzFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxTQUFTLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFDRCxxREFBaUIsR0FBakIsVUFBa0IsSUFBWTtRQUM1QixpQkFBTSxpQkFBaUIsWUFBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUNNLDZDQUFTLEdBQWhCLFVBQWlCLFlBQTRCO1FBQTVCLGtEQUE0QjtRQUMzQyxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEQsTUFBTSxDQUFDLGlCQUFNLFNBQVMsWUFBQyxZQUFZLENBQUMsSUFBSSxhQUFhLENBQUM7SUFDeEQsQ0FBQztJQUNNLHlEQUFxQixHQUE1QjtRQUNFLGlCQUFNLHFCQUFxQixXQUFFLENBQUM7UUFDOUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3pDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDTSxnREFBWSxHQUFuQjtRQUNFLElBQUksTUFBTSxHQUFHLGlCQUFNLFlBQVksV0FBRSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN6QyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN6QyxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ08sb0RBQWdCLEdBQXhCLFVBQXlCLFlBQXFCO1FBQzVDLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQztRQUNoQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pELFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLFFBQVEsQ0FBQztZQUNwRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztZQUN4QixDQUFDO1lBQ0QsR0FBRyxHQUFHLFFBQVEsSUFBSSxHQUFHLENBQUM7UUFDeEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDYixDQUFDO0lBQ08scURBQWlCLEdBQXpCLFVBQTBCLEtBQWlCLEVBQUUsU0FBcUI7UUFDaEUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNoQyxJQUFJLFFBQVEsR0FBYSxLQUFLLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbEQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUMzQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMxQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLDJEQUFXLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNTLGlEQUFhLEdBQXZCO1FBQ0UsTUFBTSxDQUFDLElBQUksd0JBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDUyxrREFBYyxHQUF4QjtRQUNFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ2hELElBQUksSUFBSSxHQUFHLElBQUksK0RBQVUsRUFBRSxDQUFDO1FBQzVCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLEtBQUssQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ1MsZ0VBQTRCLEdBQXRDO1FBQ0UsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDeEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2hCLEtBQUssQ0FBQywwQkFBMEIsR0FBRztZQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7UUFDakQsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDTyxvRUFBZ0MsR0FBeEM7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLFNBQVM7WUFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUI7WUFDNUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFDUyx3REFBb0IsR0FBOUI7UUFDRSxNQUFNLENBQUMsSUFBSSwwREFBVSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNTLGtEQUFjLEdBQXhCO1FBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzNDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckIsSUFBSSxhQUFhLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRCxFQUFFLENBQUMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUM3QyxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztJQUNsQyxDQUFDO0lBQ00sd0RBQW9CLEdBQTNCLFVBQTRCLFFBQWE7UUFDdkMsaUJBQU0sb0JBQW9CLFlBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUNTLDZDQUFTLEdBQW5CO1FBQ0UsaUJBQU0sU0FBUyxXQUFFLENBQUM7UUFDbEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELDJCQUEyQjtJQUMzQixnREFBWSxHQUFaLFVBQWEsSUFBOEI7UUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxvREFBZ0IsR0FBaEIsVUFBaUIsSUFBOEI7UUFDN0MsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN4QixFQUFFLENBQUMsQ0FDRCxLQUFLLEdBQUcsQ0FBQztZQUNULEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUM3QixDQUFDLENBQUMsQ0FBQztZQUNELEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDekIsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDO1lBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMzRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxvREFBZ0IsR0FBaEIsVUFBaUIsSUFBOEIsRUFBRSxJQUFZLEVBQUUsR0FBUTtRQUNyRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3pDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDeEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDNUIsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDcEIsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBQ0QsNkNBQVMsR0FBVDtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFsd0JhLHVDQUFhLEdBQUcsR0FBRyxDQUFDO0lBbXdCcEMsZ0NBQUM7Q0FBQSxDQXJ3QjhDLDJEQUFRLEdBcXdCdEQ7QUFyd0JxQztBQXV3QnRDLCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDMUIsY0FBYyxFQUNkO0lBQ0UsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFO0lBQzFFLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFO0lBQ3pFO1FBQ0UsSUFBSSxFQUFFLDBCQUEwQjtRQUNoQyxxQkFBcUIsRUFBRSx3QkFBd0I7S0FDaEQ7SUFDRCxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO0lBQ2hELEVBQUUsSUFBSSxFQUFFLDBCQUEwQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7SUFDbkQ7UUFDRSxJQUFJLEVBQUUsbUJBQW1CO1FBQ3pCLE9BQU8sRUFBRSxDQUFDO1FBQ1YsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztLQUM1QztJQUNELEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7SUFDNUM7UUFDRSxJQUFJLEVBQUUsc0JBQXNCO1FBQzVCLE9BQU8sRUFBRSx5QkFBeUIsQ0FBQyxhQUFhO0tBQ2pEO0lBQ0QsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO0lBQ25CO1FBQ0UsSUFBSSxFQUFFLHFCQUFxQjtRQUMzQixxQkFBcUIsRUFBRSx3QkFBd0I7S0FDaEQ7SUFDRCxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRTtJQUNqQztRQUNFLElBQUksRUFBRSxtQkFBbUI7UUFDekIscUJBQXFCLEVBQUUsc0JBQXNCO0tBQzlDO0lBQ0QsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFO0lBQ2xFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFO0lBQ3hFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRTtJQUNwRSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUU7SUFDcEU7UUFDRSxJQUFJLEVBQUUscUJBQXFCO1FBQzNCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUM7S0FDeEM7SUFDRCxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO0lBQzlDO1FBQ0UsSUFBSSxFQUFFLFlBQVk7UUFDbEIsT0FBTyxFQUFFLE1BQU07UUFDZixPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDO0tBQ3hFO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsdUJBQXVCO1FBQzdCLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztLQUM5QztDQUNGLEVBQ0Q7SUFDRSxNQUFNLENBQUMsSUFBSSx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMzQyxDQUFDLEVBQ0QsVUFBVSxDQUNYLENBQUM7QUFDRix5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsY0FBSTtJQUM1RCxNQUFNLENBQUMsSUFBSSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUMxOUJ1QztBQUNVO0FBQ1M7QUFFN0Q7O0dBRUc7QUFDSDtJQUE2QywwRkFBb0I7SUFDL0QsaUNBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FDWjtRQUZrQixVQUFJLEdBQUosSUFBSSxDQUFROztJQUUvQixDQUFDO0lBQ00seUNBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUNELDREQUEwQixHQUExQjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0gsOEJBQUM7QUFBRCxDQUFDLENBVjRDLGtGQUFvQixHQVVoRTs7QUFFRCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQzFCLFlBQVksRUFDWixFQUFFLEVBQ0Y7SUFDRSxNQUFNLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6QyxDQUFDLEVBQ0QsY0FBYyxDQUNmLENBQUM7QUFFRix5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsY0FBSTtJQUMxRCxJQUFJLENBQUMsR0FBRyxJQUFJLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQyxPQUFPLEdBQUcseUVBQWUsQ0FBQyxjQUFjLENBQUM7SUFDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUNoQ3FDO0FBQ0Y7QUFDSTtBQUNVO0FBR3BEOztHQUVHO0FBQ0g7SUFBeUMsc0ZBQVE7SUFNL0MsNkJBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FnQ1o7UUFqQ2tCLFVBQUksR0FBSixJQUFJLENBQVE7UUFFN0IsS0FBSSxDQUFDLEtBQUssR0FBRyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLEtBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxPQUFPLEVBQUU7WUFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBUyxNQUFNLEVBQUUsT0FBTztZQUNqRCxFQUFFLENBQUMsQ0FDRCxPQUFPLENBQUMsSUFBSSxJQUFJLFNBQVM7Z0JBQ3pCLE9BQU8sQ0FBQyxJQUFJLElBQUksU0FBUztnQkFDekIsT0FBTyxDQUFDLElBQUksSUFBSSxVQUNsQixDQUFDLENBQUMsQ0FBQztnQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksMEJBQTBCLEdBQUcsS0FBSSxDQUFDLHVCQUF1QixDQUMzRCxvQkFBb0IsRUFDcEIsS0FBSSxFQUNKLElBQUksQ0FDTCxDQUFDO1FBQ0YsSUFBSSwwQkFBMEIsR0FBRyxLQUFJLENBQUMsdUJBQXVCLENBQzNELG9CQUFvQixFQUNwQixLQUFJLEVBQ0osSUFBSSxDQUNMLENBQUM7UUFDRiwwQkFBMEIsQ0FBQyxpQkFBaUIsR0FBRyxVQUFTLElBQUk7WUFDMUQsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2xDLENBQUMsQ0FBQztRQUNGLDBCQUEwQixDQUFDLGlCQUFpQixHQUFHLFVBQVMsSUFBSTtZQUMxRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDOztJQUNKLENBQUM7SUFDTSwwQ0FBWSxHQUFuQjtRQUNFLGlCQUFNLFlBQVksV0FBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDcEQsQ0FBQztJQU9ELHNCQUFXLDJDQUFVO1FBTnJCOzs7OztXQUtHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDO2FBQ0QsVUFBc0IsR0FBZTtZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7OztPQUhBO0lBVUQsc0JBQVcsd0NBQU87UUFObEI7Ozs7O1dBS0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7YUFDRCxVQUFtQixHQUFXO1lBQzVCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUMzRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7OztPQUpBO0lBV0Qsc0JBQVcsd0NBQU87UUFObEI7Ozs7O1dBS0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7YUFDRCxVQUFtQixHQUFXO1lBQzVCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUMzRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7OztPQUpBO0lBV0Qsc0JBQVcseUNBQVE7UUFObkI7Ozs7O1dBS0c7YUFDSDtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUM7YUFDRCxVQUFvQixHQUFXO1lBQzdCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUN0QixFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDekUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN6QyxDQUFDOzs7T0FMQTtJQU1ELHNCQUFJLGtEQUFpQjthQUFyQjtZQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN2RCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3pCLE9BQ0UsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPO2dCQUNyQixHQUFHLENBQUMsTUFBTSxHQUFHLG1CQUFtQixDQUFDLHFCQUFxQixFQUN0RCxDQUFDO2dCQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSw2REFBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3pCLENBQUM7WUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ2IsQ0FBQzs7O09BQUE7SUFDTSxxQ0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0Qsd0RBQTBCLEdBQTFCO1FBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNkLENBQUM7SUFDTSw0Q0FBYyxHQUFyQjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ00sMENBQVksR0FBbkI7UUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUlELHNCQUFXLG1EQUFrQjtRQUg3Qjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzdELENBQUM7YUFDRCxVQUE4QixHQUFXO1lBQ3ZDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRCxDQUFDOzs7T0FIQTtJQUlELHNCQUFJLHNEQUFxQjthQUF6QjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN6RCxDQUFDOzs7T0FBQTtJQUlELHNCQUFXLG1EQUFrQjtRQUg3Qjs7V0FFRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzdELENBQUM7YUFDRCxVQUE4QixHQUFXO1lBQ3ZDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRCxDQUFDOzs7T0FIQTtJQUlELHNCQUFJLHNEQUFxQjthQUF6QjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN6RCxDQUFDOzs7T0FBQTtJQS9JYSx5Q0FBcUIsR0FBVyxFQUFFLENBQUM7SUFnSm5ELDBCQUFDO0NBQUEsQ0FqSndDLDJEQUFRLEdBaUpoRDtBQWpKK0I7QUFrSmhDLCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDMUIsUUFBUSxFQUNSO0lBQ0Usb0JBQW9CO0lBQ3BCO1FBQ0UsSUFBSSxFQUFFLHVCQUF1QjtRQUM3QixVQUFVLEVBQUUsVUFBUyxHQUFRO1lBQzNCLE1BQU0sQ0FBQyw2REFBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELFVBQVUsRUFBRSxVQUFTLEdBQVEsRUFBRSxLQUFVO1lBQ3ZDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUM7S0FDRjtJQUNELEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUU7SUFDdEMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRTtJQUN0QyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO0lBQ3ZDO1FBQ0UsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixlQUFlLEVBQUUsd0JBQXdCO1FBQ3pDLHFCQUFxQixFQUFFLHVCQUF1QjtLQUMvQztJQUNEO1FBQ0UsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixlQUFlLEVBQUUsd0JBQXdCO1FBQ3pDLHFCQUFxQixFQUFFLHVCQUF1QjtLQUMvQztDQUNGLEVBQ0Q7SUFDRSxNQUFNLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNyQyxDQUFDLEVBQ0QsVUFBVSxDQUNYLENBQUM7QUFDRix5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsY0FBSTtJQUN0RCxNQUFNLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7QUM3TEg7QUFBQTtJQW1SRTtRQWpEUSxVQUFLLEdBQWtCLElBQUksQ0FBQztRQWtEbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsV0FBVyxDQUNwQyxhQUFhLENBQUMscUJBQXFCLENBQ3BDLENBQUM7WUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBdkRNLHVCQUFTLEdBQWhCLFVBQWlCLFlBQW9CO1FBQ25DLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyRCxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLENBQWdCLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLHlCQUFXLEdBQWxCLFVBQW1CLFlBQW9CO1FBQ3JDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUM7UUFDeEIsdURBQXVEO1FBQ3ZELHdDQUF3QztRQUN4QyxzRUFBc0U7UUFDdEUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0MsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsTUFBTSxDQUFnQixLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFYSx3QkFBVSxHQUF4QixVQUNFLFNBQTZCLEVBQzdCLGFBQWtDO1FBRGxDLGlEQUE2QjtRQUM3QiwwREFBa0M7UUFFbEMsSUFBSSxLQUFLLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFDL0QsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ1gsS0FBSyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1lBQzdELElBQUksT0FBSyxHQUNQLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO2dCQUNwQyxhQUFhLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBUTtnQkFDbEQsSUFBSSxXQUFXLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFLLENBQUMsQ0FBQyxPQUFPLENBQ3hCLDJCQUFpQjtvQkFDZixRQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUNoQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLEVBQ3pDLE9BQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUN6QixDQUFDO2dCQUhGLENBR0UsQ0FDTCxDQUFDO2dCQUNGLEtBQUssQ0FBQyxVQUFVLENBQ2QsYUFBYSxHQUFHLFFBQVEsR0FBRyxLQUFLLEdBQUcsV0FBVyxHQUFHLElBQUksRUFDckQsQ0FBQyxDQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBWU0sd0NBQWdCLEdBQXZCLFVBQXdCLEtBQW9CO1FBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBUTtZQUNoRCxZQUFLLENBQUMsVUFBVSxDQUNkLFFBQVEsR0FBRyxLQUFLLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLEVBQ3hELENBQUMsQ0FDRjtRQUhELENBR0MsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQW5TYyxtQ0FBcUIsR0FBRyxVQUFVLENBQUM7SUFFcEMsb0JBQU0sR0FBOEI7UUFDaEQsdUJBQXVCO1FBQ3ZCLGtFQUFrRTtRQUNsRSx5Q0FBeUM7UUFDekMsa0ZBQWtGO1FBQ2xGLHFDQUFxQztRQUNyQyx5RkFBeUY7UUFDekYsbUNBQW1DO1FBQ25DLDJGQUEyRjtRQUMzRiw0QkFBNEIsRUFBRSwrQkFBK0I7UUFDN0QsK0ZBQStGLEVBQzdGLDBDQUEwQztRQUU1QywwREFBMEQsRUFDeEQsb0NBQW9DO1FBRXRDLFVBQVUsRUFBRSw2Q0FBNkM7UUFDekQsV0FBVyxFQUFFLGFBQWE7UUFDMUIsZUFBZSxFQUFFLG1EQUFtRDtRQUNwRSxpQkFBaUIsRUFBRSw2Q0FBNkM7UUFDaEUsNkJBQTZCLEVBQUUsb0JBQW9CO1FBQ25ELDZCQUE2QixFQUFFLG9CQUFvQjtRQUNuRCwwQkFBMEIsRUFBRSwrQ0FBK0M7UUFDM0UsdUJBQXVCLEVBQUUsK0NBQStDO1FBQ3hFLDZCQUE2QixFQUFFLGdDQUFnQztRQUMvRCxxQkFBcUIsRUFBRSxjQUFjO1FBQ3JDLHVCQUF1QixFQUFFLHFCQUFxQjtRQUM5QyxzQkFBc0IsRUFBRSxpQ0FBaUM7UUFDekQsd0JBQXdCLEVBQUUsa0JBQWtCO1FBQzVDLGdEQUFnRCxFQUFFLHdCQUF3QjtRQUMxRSw0Q0FBNEMsRUFBRSx3QkFBd0I7UUFDdEUsZ0RBQWdELEVBQUUscUJBQXFCO1FBQ3ZFLHFEQUFxRCxFQUFFLG9CQUFvQjtRQUMzRSx1REFBdUQsRUFDckQsb0JBQW9CO1FBQ3RCLG1CQUFtQixFQUFFLHNDQUFzQztRQUMzRCxzQkFBc0IsRUFBRSx3QkFBd0I7UUFDaEQsaUNBQWlDLEVBQUUsY0FBYztRQUVqRCxhQUFhLEVBQUUsNERBQTREO1FBQzNFLDRCQUE0QixFQUFFLGtDQUFrQztRQUNoRSxvQ0FBb0MsRUFDbEMsMnhCQUEyeEI7UUFDN3hCLGdEQUFnRCxFQUM5Qyw0QkFBNEI7UUFFOUIsb0RBQW9ELEVBQ2xELHdCQUF3QjtRQUMxQixvQkFBb0IsRUFBRSx3QkFBd0I7UUFDOUMsMEJBQTBCLEVBQUUsc0JBQXNCO0tBQ25ELENBQUM7SUFFWSx5QkFBVyxHQUFpRDtRQUN4RSxPQUFPLEVBQUU7WUFDUCwwQkFBMEIsRUFBRSxTQUFTO1lBQ3JDLGtDQUFrQyxFQUFFLFNBQVM7WUFFN0MsYUFBYSxFQUFFLFNBQVM7WUFDeEIsbUJBQW1CLEVBQUUsU0FBUztZQUM5Qix3QkFBd0IsRUFBRSxPQUFPO1lBQ2pDLDBCQUEwQixFQUFFLE9BQU87WUFDbkMsYUFBYSxFQUFFLFNBQVM7WUFDeEIsZUFBZSxFQUFFLFNBQVM7WUFDMUIsZUFBZSxFQUFFLFNBQVM7WUFFMUIsY0FBYyxFQUFFLFNBQVM7WUFDekIseUJBQXlCLEVBQUUsU0FBUztTQUNyQztRQUNELE1BQU0sRUFBRTtZQUNOLDBCQUEwQixFQUFFLFNBQVM7WUFDckMsa0NBQWtDLEVBQUUsU0FBUztZQUU3QyxhQUFhLEVBQUUsU0FBUztZQUN4QixtQkFBbUIsRUFBRSxTQUFTO1lBQzlCLHdCQUF3QixFQUFFLE9BQU87WUFDakMsMEJBQTBCLEVBQUUsT0FBTztZQUNuQyxhQUFhLEVBQUUsU0FBUztZQUN4QixlQUFlLEVBQUUsU0FBUztZQUMxQixlQUFlLEVBQUUsU0FBUztZQUUxQixjQUFjLEVBQUUsU0FBUztZQUN6Qix5QkFBeUIsRUFBRSxTQUFTO1NBQ3JDO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsMEJBQTBCLEVBQUUsU0FBUztZQUNyQyxrQ0FBa0MsRUFBRSxTQUFTO1lBRTdDLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLG1CQUFtQixFQUFFLFNBQVM7WUFDOUIsd0JBQXdCLEVBQUUsT0FBTztZQUNqQywwQkFBMEIsRUFBRSxPQUFPO1lBQ25DLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLGVBQWUsRUFBRSxTQUFTO1lBQzFCLGVBQWUsRUFBRSxTQUFTO1lBRTFCLGNBQWMsRUFBRSxTQUFTO1lBQ3pCLHlCQUF5QixFQUFFLFNBQVM7U0FDckM7UUFDRCxRQUFRLEVBQUU7WUFDUiwwQkFBMEIsRUFBRSxTQUFTO1lBQ3JDLGtDQUFrQyxFQUFFLFNBQVM7WUFFN0MsYUFBYSxFQUFFLFNBQVM7WUFDeEIsbUJBQW1CLEVBQUUsU0FBUztZQUM5Qix3QkFBd0IsRUFBRSxPQUFPO1lBQ2pDLDBCQUEwQixFQUFFLE9BQU87WUFDbkMsYUFBYSxFQUFFLFNBQVM7WUFDeEIsZUFBZSxFQUFFLFNBQVM7WUFDMUIsZUFBZSxFQUFFLFNBQVM7WUFFMUIsY0FBYyxFQUFFLFNBQVM7WUFDekIseUJBQXlCLEVBQUUsU0FBUztTQUNyQztRQUNELEtBQUssRUFBRTtZQUNMLDBCQUEwQixFQUFFLFNBQVM7WUFDckMsa0NBQWtDLEVBQUUsU0FBUztZQUU3QyxhQUFhLEVBQUUsU0FBUztZQUN4QixtQkFBbUIsRUFBRSxTQUFTO1lBQzlCLHdCQUF3QixFQUFFLE9BQU87WUFDakMsMEJBQTBCLEVBQUUsT0FBTztZQUNuQyxhQUFhLEVBQUUsU0FBUztZQUN4QixlQUFlLEVBQUUsU0FBUztZQUMxQixlQUFlLEVBQUUsU0FBUztZQUUxQixjQUFjLEVBQUUsU0FBUztZQUN6Qix5QkFBeUIsRUFBRSxTQUFTO1NBQ3JDO1FBQ0QsTUFBTSxFQUFFO1lBQ04sMEJBQTBCLEVBQUUsU0FBUztZQUNyQyxrQ0FBa0MsRUFBRSxTQUFTO1lBRTdDLGFBQWEsRUFBRSxTQUFTO1lBQ3hCLG1CQUFtQixFQUFFLFNBQVM7WUFDOUIsd0JBQXdCLEVBQUUsT0FBTztZQUNqQywwQkFBMEIsRUFBRSxPQUFPO1lBQ25DLGFBQWEsRUFBRSxNQUFNO1lBQ3JCLGVBQWUsRUFBRSxNQUFNO1lBQ3ZCLGVBQWUsRUFBRSxTQUFTO1lBRTFCLGNBQWMsRUFBRSxTQUFTO1lBQ3pCLHlCQUF5QixFQUFFLFNBQVM7U0FDckM7UUFDRCxXQUFXLEVBQUU7WUFDWCwwQkFBMEIsRUFBRSxTQUFTO1lBQ3JDLGtDQUFrQyxFQUFFLFNBQVM7WUFFN0MsYUFBYSxFQUFFLFNBQVM7WUFDeEIsbUJBQW1CLEVBQUUsU0FBUztZQUM5Qix3QkFBd0IsRUFBRSxPQUFPO1lBQ2pDLDBCQUEwQixFQUFFLE9BQU87WUFDbkMsYUFBYSxFQUFFLE1BQU07WUFDckIsZUFBZSxFQUFFLE1BQU07WUFDdkIsZUFBZSxFQUFFLFNBQVM7WUFFMUIsY0FBYyxFQUFFLFNBQVM7WUFDekIseUJBQXlCLEVBQUUsU0FBUztTQUNyQztLQUNGLENBQUM7SUFDWSxzQkFBUSxHQUE4QjtRQUNsRCxpQkFBaUIsRUFBRSxxREFBcUQ7UUFFeEUsb0JBQW9CLEVBQUUsOEJBQThCO1FBRXBELDhEQUE4RCxFQUM1RCwrREFBK0Q7UUFDakUsMEVBQTBFLEVBQ3hFLHNDQUFzQztRQUV4Qyw0QkFBNEIsRUFBRSx1QkFBdUI7UUFDckQsbUNBQW1DLEVBQ2pDLDZDQUE2QztRQUMvQywrQkFBK0IsRUFBRSxxQkFBcUI7UUFDdEQsMEJBQTBCLEVBQ3hCLHNFQUFzRTtRQUN4RSw4QkFBOEIsRUFBRSxrQ0FBa0M7UUFDbEUsa0NBQWtDLEVBQUUsZ0NBQWdDO1FBRXBFLHNDQUFzQyxFQUFFLDhCQUE4QjtRQUN0RSxxREFBcUQsRUFDbkQsMkNBQTJDO1FBQzdDLHNEQUFzRCxFQUNwRCxxREFBcUQ7UUFFdkQsbUNBQW1DLEVBQ2pDLDhGQUE4RjtRQUNoRyxpQ0FBaUMsRUFDL0IsOEZBQThGO1FBQ2hHLHdDQUF3QyxFQUN0Qyw4RkFBOEY7UUFDaEcsb0NBQW9DLEVBQ2xDLDhGQUE4RjtRQUNoRyx3QkFBd0IsRUFDdEIsOEZBQThGO1FBQ2hHLDBCQUEwQixFQUN4Qiw4RkFBOEY7UUFDaEcseUNBQXlDLEVBQUUsNEJBQTRCO1FBQ3ZFLHVDQUF1QyxFQUFFLDRCQUE0QjtRQUNyRSw4Q0FBOEMsRUFDNUMsNEJBQTRCO1FBQzlCLDBDQUEwQyxFQUFFLDRCQUE0QjtRQUN4RSw4QkFBOEIsRUFBRSw0QkFBNEI7UUFDNUQsZ0NBQWdDLEVBQUUsNEJBQTRCO1FBRTlELG9DQUFvQyxFQUNsQywyQ0FBMkM7UUFDN0MsNENBQTRDLEVBQzFDLGdDQUFnQztRQUVsQyxpRUFBaUUsRUFDL0Qsc0dBQXNHO1FBQ3hHLDBEQUEwRCxFQUN4RCw4QkFBOEI7UUFDaEMsZ0VBQWdFLEVBQzlELGtDQUFrQztRQUVwQyxzQ0FBc0MsRUFBRSw4QkFBOEI7UUFDdEUsK0NBQStDLEVBQzdDLDhCQUE4QjtRQUNoQyw4Q0FBOEMsRUFDNUMsOEJBQThCO0tBQ2pDLENBQUM7SUFxRUosb0JBQUM7Q0FBQTtBQXJTeUI7Ozs7Ozs7Ozs7Ozs7QUNBSTtBQUNTO0FBR3ZDOztHQUVHO0FBQ0g7SUFBdUMsb0ZBQUk7SUFXekMsMkJBQVksT0FBWSxFQUFFLFlBQWdDO1FBQWhDLGtEQUFnQztRQUExRCxZQUNFLGlCQUFPLFNBVVI7UUFwQk8scUJBQWUsR0FBWSxLQUFLLENBQUM7UUFXdkMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNqQixLQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztRQUNsQyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixLQUFJLENBQUMsV0FBVyxHQUFHLEtBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELEtBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUNuQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEtBQUssT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLEtBQUksQ0FBQyxhQUFhLEdBQW1CLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckUsQ0FBQzs7SUFDSCxDQUFDO0lBQ00sbUNBQU8sR0FBZDtRQUNFLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUtELHNCQUFXLHFDQUFNO1FBSmpCOzs7V0FHRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQzs7O09BQUE7SUFNRCxzQkFBVyx3Q0FBUztRQUxwQjs7OztXQUlHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUM3QixDQUFDO2FBQ0QsVUFBcUIsR0FBWTtZQUMvQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7WUFDMUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO2dCQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2pFLENBQUM7OztPQUxBO0lBTUQ7Ozs7T0FJRztJQUNJLGdDQUFJLEdBQVg7UUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNJLGdDQUFJLEdBQVg7UUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBTUQsc0JBQVcseUNBQVU7UUFMckI7Ozs7V0FJRzthQUNIO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDOUIsQ0FBQzthQUNELFVBQXNCLEdBQVk7WUFDaEMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QixJQUFJO2dCQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixDQUFDOzs7T0FKQTtJQVFELHNCQUFXLG9DQUFLO1FBSGhCOztXQUVHO2FBQ0g7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDM0IsQ0FBQzthQUNELFVBQWlCLEtBQWE7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUM7OztPQUhBO0lBSUQsc0JBQUksdUNBQVE7YUFBWjtZQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUM5QixDQUFDOzs7T0FBQTtJQUNEOztPQUVHO0lBQ0ksa0NBQU0sR0FBYjtRQUNFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNEOztPQUVHO0lBQ0ksb0NBQVEsR0FBZjtRQUNFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNTLHdDQUFZLEdBQXRCLFVBQXVCLE9BQVk7UUFDakMsTUFBTSxDQUFDLElBQUksNERBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ1MsMENBQWMsR0FBeEIsVUFBeUIsS0FBYztRQUNyQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUMxQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUM7WUFBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBeEdhLG1DQUFpQixHQUFHLGdCQUFnQixDQUFDO0lBeUdyRCx3QkFBQztDQUFBLENBMUdzQyxtREFBSSxHQTBHMUM7QUExRzZCOzs7Ozs7Ozs7OztBQ1BDO0FBRXhCLElBQUksb0JBQW9CLEdBQUc7SUFDaEMsV0FBVyxFQUFFLFVBQVMsSUFBZTtRQUNuQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELGFBQWEsRUFBRSxVQUFTLE9BQWU7UUFDckMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0YsQ0FBQztBQUVGO0lBQUE7UUFRVSxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUNwQixZQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDZCxZQUFPLEdBQTBCLElBQUksb0RBQUssRUFBa0IsQ0FBQztJQTJCdEUsQ0FBQztJQW5DQyxzQkFBa0IsdUJBQVE7YUFBMUI7WUFDRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixXQUFXLENBQUMsYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEQsQ0FBQztZQUNELE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO1FBQ25DLENBQUM7OztPQUFBO0lBSU0sMkJBQUssR0FBWixVQUFhLElBQXNCO1FBQXRCLGtDQUFzQjtRQUNqQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7WUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxXQUFXLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUNNLDBCQUFJLEdBQVgsVUFBWSxJQUFzQjtRQUF0QixrQ0FBc0I7UUFDaEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNULElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkQsb0JBQW9CLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBQ00sNkJBQU8sR0FBZDtRQUNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBbkNjLHlCQUFhLEdBQWdCLElBQUksQ0FBQztJQW9DbkQsa0JBQUM7Q0FBQTtBQXJDdUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1h4QjtBQUFBLFFBQVE7QUFDdUI7QUFFL0IsZUFBZTtBQUNnQjtBQUUvQixVQUFVO0FBQ3VCO0FBRWpDLGVBQWU7QUFDZ0Q7QUFDL0QsZ0JBQWdCO0FBQ2lEO0FBQ2pFLDJCQUEyQjtBQUdpQjtBQUM1QyxTQUFTO0FBQ2E7QUFFdEIsV0FBVztBQUNtQztBQUNTO0FBQ087QUFDTztBQUNSO0FBR2xCO0FBR0E7QUFDd0I7QUFDRjtBQUNFO0FBQ1I7QUFDQTtBQUNlO0FBQ0s7QUFJakM7QUFDNkI7QUFLOUI7QUFDMEI7QUFDUjtBQUNKO0FBQ007QUFDSjtBQUNVO0FBQ2I7QUFDSTtBQUU5RCxnREFBZ0Q7QUFDaEQsbUVBQW1FOzs7Ozs7Ozs7O0FDMURiO0FBRS9DLElBQU0saUJBQWlCLEdBQUcsVUFBQyxNQUFtQixFQUFFLFFBQWE7O1FBRWhFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxPQUFPLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQzs4QkFBVTtRQUNsRCxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqQixNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsMEVBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDOztRQUV2RCxDQUFDO1FBQ0QsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzdELElBQUksVUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QixJQUFJLElBQUksR0FBRyxVQUFTLE1BQU0sRUFBRSxPQUFPO2dCQUNqQyxVQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzVCLENBQUMsQ0FBQztZQUNGLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQWZELEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQzs7S0FleEI7SUFFRCxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUM1QixNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFDLE1BQU0sRUFBRSxPQUFPO1lBQ3hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7Ozs7Ozs7QUN6QkYsZ0Q7Ozs7OztBQ0FBLHlPQUF5TyxzRUFBc0Usd047Ozs7OztBQ0EvUyxxQ0FBcUMsMERBQTBELHVaQUF1Wix3Q0FBd0MsaU9BQWlPLHFCQUFxQixhQUFhLHlFQUF5RSwwZUFBMGUsMkJBQTJCLG1OQUFtTix5QkFBeUIsYUFBYSwyRUFBMkUsZ1BBQWdQLDJCQUEyQiwrNkQ7Ozs7OztBQ0E5N0Qsc09BQXNPLHNEQUFzRCwrREFBK0QsdUVBQXVFLHNFOzs7Ozs7QUNBbGEsbVFBQW1RLHdDQUF3QyxrS0FBa0ssOENBQThDLDJFQUEyRSxrQ0FBa0MsbUQ7Ozs7OztBQ0F4bUIsK0ZBQStGLHVCQUF1QixTQUFTLE9BQU8sb0xBQW9MLHdDQUF3Qyx3SUFBd0ksOEJBQThCLGtKQUFrSiw4Q0FBOEMsMkVBQTJFLDhDQUE4Qyx3RkFBd0YsNkJBQTZCLG9DQUFvQyxrQ0FBa0MsdUU7Ozs7OztBQ0E1L0IsdUtBQXVLLDBCQUEwQixxTDs7Ozs7O0FDQWpNLHFQQUFxUCx3RkFBd0YsaURBQWlELHdDQUF3Qyw0SkFBNEosK0NBQStDLDREOzs7Ozs7QUNBam5CLGtLQUFrSyxrRkFBa0YsdUNBQXVDLGlEQUFpRCxrS0FBa0ssbUlBQW1JLHdXQUF3Vyw0Q0FBNEMsb09BQW9PLGdDQUFnQywwREFBMEQsRUFBRSw4SUFBOEksNkY7Ozs7OztBQ0FuOUMsNkhBQTZILHFMQUFxTCxpRjs7Ozs7O0FDQWxULDZOQUE2TixtRUFBbUUsaWhCQUFpaEIsZ0NBQWdDLDBEQUEwRCxFQUFFLCtEOzs7Ozs7QUNBNzRCLHNHOzs7Ozs7QUNBQSwySkFBMkosNkJBQTZCLDhSOzs7Ozs7QUNBeEwsb0w7Ozs7OztBQ0FBLG9PQUFvTywrSEFBK0gsVUFBVSwwQkFBMEIsOFlBQThZLDhCQUE4Qiw4SkFBOEosdUVBQXVFLG1KOzs7Ozs7QUNBeGhDLG9KOzs7Ozs7QUNBQSx5WUFBeVksdUNBQXVDLDZNQUE2TSx3Q0FBd0MsaUxBQWlMLDJDQUEyQyxzVkFBc1Ysb0tBQW9LLCtoQkFBK2hCLGlOOzs7Ozs7QUNBMTVELGtIQUFrSCxtREFBbUQsZ1BBQWdQLDJDQUEyQyxzQkFBc0Isd0NBQXdDLDZKQUE2Six3Q0FBd0MsdUVBQXVFLDJDQUEyQyxxSEFBcUgsa0dBQWtHLHdNOzs7Ozs7QUNBNWdDLGlIQUFpSCxtREFBbUQsaU5BQWlOLDJDQUEyQyxnREFBZ0Qsd0NBQXdDLDRVQUE0VSxtQ0FBbUMsc0hBQXNILGtHQUFrRywyMUI7Ozs7OztBQ0EvakMsZ0pBQWdKLG9DQUFvQyx1Q0FBdUMsd0JBQXdCLGlIQUFpSCw2Q0FBNkMsNklBQTZJLE9BQU8sWUFBWSwwS0FBMEssMExBQTBMLHdCQUF3QiwySjs7Ozs7O0FDQTc2QixtSkFBbUosV0FBVyxrRkFBa0YseUJBQXlCLHFEQUFxRCw0TUFBNE0sNE1BQTRNLHVLOzs7Ozs7QUNBdHRCLDhNQUE4TSwwQkFBMEIsaUNBQWlDLDhGQUE4RixrbkJBQWtuQixnRkFBZ0YsMkVBQTJFLDJHQUEyRyxvVkFBb1YsZ0ZBQWdGLDZGOzs7Ozs7QUNBbm9ELG9LQUFvSyxrRkFBa0YsdUNBQXVDLGlEQUFpRCwrSkFBK0osc0pBQXNKLHVVQUF1VSw0Q0FBNEMsb09BQW9PLGdDQUFnQywwREFBMEQsOElBQThJLDZGOzs7Ozs7QUNBbDhDLGlUQUFpVCxzQkFBc0Isd0dBQXdHLFVBQVUsMkJBQTJCLG9NQUFvTSw4REFBOEQseUxBQXlMLDZDQUE2QyxpUEFBaVAsOERBQThELCtOQUErTixnQ0FBZ0Msc0JBQXNCLEVBQUUsa0M7Ozs7OztBQ0FsZ0QsdUpBQXVKLHFKQUFxSix1Tzs7Ozs7O0FDQTVTLDhIQUE4SCw0R0FBNEcsU0FBUyxnQkFBZ0Isb0NBQW9DLHNDQUFzQywyRkFBMkYsaURBQWlELDJHQUEyRyx3Q0FBd0MsaUdBQWlHLGlEQUFpRCx5RkFBeUYsK0ZBQStGLCtNQUErTSxnQ0FBZ0MsdUNBQXVDLEVBQUUsOEhBQThILGlEQUFpRCwrSUFBK0ksaURBQWlELGlHOzs7Ozs7QUNBN2pELGtKQUFrSix3Q0FBd0MsbUlBQW1JLDhDQUE4Qyx5Qzs7Ozs7O0FDQTNXLHdGQUF3Rix5QkFBeUIsc0hBQXNILHdFQUF3RSw2RUFBNkUsMEZBQTBGLG1JOzs7Ozs7QUNBdGQsdUlBQXVJLGlJQUFpSSw4RTs7Ozs7O0FDQXhRLHlJOzs7Ozs7QUNBQSxpOUI7Ozs7OztBQ0FBLCtDQUErQyxhQUFhLGFBQWEsNEpBQTRKLGlCQUFpQixzWDs7Ozs7Ozs7O0FDQTVNO0FBRW5DLElBQUksbUJBQW1CLEdBQUc7SUFDL0IsSUFBSSxFQUFFLGtCQUFrQjtJQUN4QixNQUFNLEVBQUUsMkJBQTJCO0lBQ25DLElBQUksRUFBRSx1QkFBdUI7SUFDN0IsTUFBTSxFQUFFLDBCQUEwQjtJQUNsQyxnQkFBZ0IsRUFBRSxFQUFFO0lBQ3BCLGFBQWEsRUFBRSxFQUFFO0lBQ2pCLFVBQVUsRUFBRTtRQUNWLFFBQVEsRUFBRSxpQkFBaUI7UUFDM0IsSUFBSSxFQUFFLGFBQWE7UUFDbkIsSUFBSSxFQUFFLGFBQWE7UUFDbkIsS0FBSyxFQUFFLGNBQWM7S0FDdEI7SUFDRCxRQUFRLEVBQUUsb0NBQW9DO0lBQzlDLFdBQVcsRUFBRSxjQUFjO0lBQzNCLElBQUksRUFBRTtRQUNKLElBQUksRUFBRSxFQUFFO1FBQ1IsS0FBSyxFQUFFLEVBQUU7UUFDVCxXQUFXLEVBQUUsRUFBRTtLQUNoQjtJQUNELFNBQVMsRUFBRSxFQUFFO0lBQ2IsZUFBZSxFQUFFLE9BQU87SUFDeEIsR0FBRyxFQUFFLEVBQUU7SUFDUCxRQUFRLEVBQUU7UUFDUixRQUFRLEVBQUUsU0FBUztRQUNuQixLQUFLLEVBQUUsRUFBRTtRQUNULFdBQVcsRUFBRSxPQUFPO1FBQ3BCLE9BQU8sRUFBRSxjQUFjO1FBQ3ZCLFFBQVEsRUFBRSxFQUFFO1FBQ1osYUFBYSxFQUFFLEVBQUU7UUFDakIsTUFBTSxFQUFFLEVBQUU7S0FDWDtJQUNELEtBQUssRUFBRTtRQUNMLEtBQUssRUFBRSxZQUFZO1FBQ25CLFdBQVcsRUFBRSxPQUFPO1FBQ3BCLFNBQVMsRUFBRSxnQkFBZ0I7S0FDNUI7SUFDRCxLQUFLLEVBQUU7UUFDTCxJQUFJLEVBQUUsb0JBQW9CO1FBQzFCLElBQUksRUFBRSxzQ0FBc0M7UUFDNUMsSUFBSSxFQUFFLEVBQUU7S0FDVDtJQUVELE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSw4QkFBOEIsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO0lBQzNELFFBQVEsRUFBRTtRQUNSLElBQUksRUFBRSw2QkFBNkI7UUFDbkMsSUFBSSxFQUFFLFVBQVU7UUFDaEIsV0FBVyxFQUFFLEVBQUU7UUFDZixZQUFZLEVBQUUsRUFBRTtRQUNoQixLQUFLLEVBQUUscUJBQXFCO0tBQzdCO0lBQ0QsT0FBTyxFQUFFLGNBQWM7SUFDdkIsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7SUFDMUQsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO0lBQ2hELGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7SUFDakMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0lBQ2xELFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtJQUM1QyxZQUFZLEVBQUU7UUFDWixJQUFJLEVBQUUsT0FBTztRQUNiLFNBQVMsRUFBRSxFQUFFO1FBQ2IsU0FBUyxFQUFFLGlDQUFpQztLQUM3QztJQUNELFVBQVUsRUFBRTtRQUNWLElBQUksRUFBRSxxQkFBcUI7UUFDM0IsSUFBSSxFQUFFLE9BQU87UUFDYixLQUFLLEVBQUUsRUFBRTtRQUNULFdBQVcsRUFBRSxFQUFFO1FBQ2YsWUFBWSxFQUFFLEVBQUU7UUFDaEIsS0FBSyxFQUFFLHVCQUF1QjtLQUMvQjtJQUNELE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSxXQUFXO1FBQ2pCLElBQUksRUFBRSwrQkFBK0I7UUFDckMsUUFBUSxFQUFFLFFBQVE7UUFDbEIsT0FBTyxFQUFFLHNCQUFzQjtRQUMvQixRQUFRLEVBQUUsdUJBQXVCO1FBQ2pDLE9BQU8sRUFBRSxzQkFBc0I7S0FDaEM7SUFDRCxJQUFJLEVBQUUsY0FBYztJQUNwQixVQUFVLEVBQUUsY0FBYztJQUMxQixJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsV0FBVztRQUNqQixnQkFBZ0IsRUFBRSx1QkFBdUI7UUFDekMsT0FBTyxFQUFFLG1CQUFtQjtRQUM1QixZQUFZLEVBQUUseUJBQXlCO0tBQ3hDO0lBQ0QsUUFBUSxFQUFFO1FBQ1IsSUFBSSxFQUFFLEVBQUU7UUFDUixNQUFNLEVBQUUsa0JBQWtCO1FBQzFCLEtBQUssRUFBRSxvQkFBb0I7UUFDM0IsT0FBTyxFQUFFLHFCQUFxQjtRQUM5QixlQUFlLEVBQUUsRUFBRTtLQUNwQjtJQUNELE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSxlQUFlO1FBQ3JCLElBQUksRUFBRSxZQUFZO1FBQ2xCLE1BQU0sRUFBRTtZQUNOLElBQUksRUFBRSwwQkFBMEI7WUFDaEMsS0FBSyxFQUFFLFdBQVc7WUFDbEIsTUFBTSxFQUFFLHNCQUFzQjtZQUM5QixjQUFjLEVBQUUsMkNBQTJDO1lBQzNELGVBQWUsRUFBRSw2Q0FBNkM7U0FDL0Q7S0FDRjtDQUNGLENBQUM7QUFDRiwrREFBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDOzs7Ozs7Ozs7O0FDM0dIO0FBRW5DLElBQUksMkJBQTJCLEdBQUc7SUFDdkMsSUFBSSxFQUFFLDBCQUEwQjtJQUNoQyxNQUFNLEVBQUUsZUFBZTtJQUN2QixJQUFJLEVBQUUsWUFBWTtJQUNsQixNQUFNLEVBQUUsY0FBYztJQUN0QixnQkFBZ0IsRUFBRSxFQUFFO0lBQ3BCLGFBQWEsRUFBRSxFQUFFO0lBQ2pCLFVBQVUsRUFBRTtRQUNWLFFBQVEsRUFBRSxpQkFBaUI7UUFDM0IsSUFBSSxFQUFFLGFBQWE7UUFDbkIsSUFBSSxFQUFFLGFBQWE7UUFDbkIsS0FBSyxFQUFFLGNBQWM7S0FDdEI7SUFDRCxRQUFRLEVBQUUsb0NBQW9DO0lBQzlDLFdBQVcsRUFBRSxjQUFjO0lBQzNCLElBQUksRUFBRTtRQUNKLElBQUksRUFBRSxFQUFFO1FBQ1IsS0FBSyxFQUFFLEVBQUU7UUFDVCxXQUFXLEVBQUUsRUFBRTtLQUNoQjtJQUNELFNBQVMsRUFBRSxFQUFFO0lBQ2IsZUFBZSxFQUFFLE9BQU87SUFDeEIsR0FBRyxFQUFFLEVBQUU7SUFDUCxRQUFRLEVBQUU7UUFDUixRQUFRLEVBQUUsb0JBQW9CO1FBQzlCLEtBQUssRUFBRSxFQUFFO1FBQ1QsV0FBVyxFQUFFLE9BQU87UUFDcEIsT0FBTyxFQUFFLGNBQWM7UUFDdkIsUUFBUSxFQUFFLEVBQUU7UUFDWixhQUFhLEVBQUUsRUFBRTtRQUNqQixNQUFNLEVBQUUsRUFBRTtLQUNYO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsS0FBSyxFQUFFLFlBQVk7UUFDbkIsV0FBVyxFQUFFLE9BQU87UUFDcEIsU0FBUyxFQUFFLGdCQUFnQjtLQUM1QjtJQUNELEtBQUssRUFBRTtRQUNMLElBQUksRUFBRSxvQkFBb0I7UUFDMUIsSUFBSSxFQUFFLHNDQUFzQztRQUM1QyxJQUFJLEVBQUUsRUFBRTtLQUNUO0lBRUQsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLDhCQUE4QixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7SUFDM0QsUUFBUSxFQUFFO1FBQ1IsSUFBSSxFQUFFLHFCQUFxQjtRQUMzQixJQUFJLEVBQUUsVUFBVTtRQUNoQixXQUFXLEVBQUUsRUFBRTtRQUNmLFlBQVksRUFBRSxFQUFFO1FBQ2hCLEtBQUssRUFBRSxxQkFBcUI7S0FDN0I7SUFDRCxPQUFPLEVBQUUsY0FBYztJQUN2QixRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtJQUMxRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsT0FBTztRQUNiLEdBQUcsRUFBRSxZQUFZO1FBQ2pCLEtBQUssRUFBRSwyQkFBMkI7UUFDbEMsU0FBUyxFQUFFLGNBQWM7S0FDMUI7SUFDRCxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUU7SUFDMUQsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUU7SUFDM0UsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0lBQzVDLFlBQVksRUFBRTtRQUNaLElBQUksRUFBRSxPQUFPO1FBQ2IsU0FBUyxFQUFFLEVBQUU7UUFDYixHQUFHLEVBQUUsWUFBWTtRQUNqQixTQUFTLEVBQUUsaUNBQWlDO0tBQzdDO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsSUFBSSxFQUFFLEVBQUU7UUFDUixJQUFJLEVBQUUsT0FBTztRQUNiLEtBQUssRUFBRSxFQUFFO1FBQ1QsV0FBVyxFQUFFLEVBQUU7UUFDZixZQUFZLEVBQUUsK0JBQStCO1FBQzdDLEtBQUssRUFBRSx1QkFBdUI7S0FDL0I7SUFDRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUUsK0JBQStCO1FBQ3JDLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxzQkFBc0I7UUFDL0IsUUFBUSxFQUFFLHVCQUF1QjtRQUNqQyxPQUFPLEVBQUUsc0JBQXNCO0tBQ2hDO0lBQ0QsSUFBSSxFQUFFLGNBQWM7SUFDcEIsVUFBVSxFQUFFLGNBQWM7SUFDMUIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLG1DQUFtQztRQUN6QyxnQkFBZ0IsRUFBRSxFQUFFO1FBQ3BCLE9BQU8sRUFBRSxtQkFBbUI7UUFDNUIsWUFBWSxFQUFFLHlCQUF5QjtLQUN4QztJQUNELFFBQVEsRUFBRTtRQUNSLElBQUksRUFBRSxFQUFFO1FBQ1IsTUFBTSxFQUFFLGtCQUFrQjtRQUMxQixLQUFLLEVBQUUsb0JBQW9CO1FBQzNCLE9BQU8sRUFBRSxxQkFBcUI7UUFDOUIsZUFBZSxFQUFFLEVBQUU7S0FDcEI7SUFDRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsZUFBZTtRQUNyQixJQUFJLEVBQUUsWUFBWTtRQUNsQixNQUFNLEVBQUU7WUFDTixJQUFJLEVBQUUsMEJBQTBCO1lBQ2hDLEtBQUssRUFBRSxXQUFXO1lBQ2xCLE1BQU0sRUFBRSxzQkFBc0I7WUFDOUIsY0FBYyxFQUFFLDJDQUEyQztZQUMzRCxlQUFlLEVBQUUsNkNBQTZDO1NBQy9EO0tBQ0Y7Q0FDRixDQUFDO0FBQ0YsK0RBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pIMUI7QUFDQztBQUNGO0FBQ0M7QUFDRDtBQUNFO0FBQ0Q7QUFDRTtBQUNGO0FBQ0Q7QUFDQztBQUNHO0FBQ0E7QUFDRjtBQUNBO0FBQ0E7QUFDRDtBQUNJO0FBQ0Y7QUFDRDtBQUNXO0FBQ1g7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZCcEM7QUFBQSxTQUFTO0FBQ2dCO0FBRWxCLElBQUksT0FBZSxDQUFDO0FBQzNCLE9BQU8sR0FBRyxLQUFHLE9BQXFCLENBQUM7QUFFSztBQVVmO0FBQ21CO0FBQ2tDO0FBQ0M7QUFDdkI7QUFDQztBQUNvQjtBQUNuQjtBQUNDO0FBQ29CO0FBWXJEO0FBT2lCO0FBSUo7QUFJRDtBQUNzQztBQUl2QztBQUNzQztBQUNwQztBQUNHO0FBQ1E7QUFDUTtBQUl2QjtBQUM2QjtBQUNGO0FBQ0U7QUFDUTtBQUNoQjtBQUNBO0FBQ1k7QUFDUjtBQUNRO0FBQ1o7QUFDTTtBQUl6QjtBQUNXO0FBQ0w7QUFPcEI7QUFDZ0M7QUFDRztBQUVGO0FBQ2dCO0FBSW5DO0FBRWU7QUFFcEQsZ0RBQWdEO0FBQ2hELDJFQUEyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEc1QztBQUM0QjtBQUNoQjtBQUNVO0FBQ0Y7QUFHbkQ7SUFBZ0QsNkZBQW1CO0lBR2pFLG9DQUFtQixRQUFrQjtRQUFyQyxZQUNFLGtCQUFNLFFBQVEsQ0FBQyxTQWFoQjtRQWRrQixjQUFRLEdBQVIsUUFBUSxDQUFVO1FBRW5DLEtBQUksQ0FBQyxlQUFlLEdBQUcsb0RBQWEsQ0FDaEIsS0FBSSxDQUFDLFFBQVMsQ0FBQyxlQUFlLENBQ2pELENBQUM7UUFDRixLQUFJLENBQUMsY0FBYyxHQUFHLG9EQUFhLENBQ2YsS0FBSSxDQUFDLFFBQVMsQ0FBQyxZQUFZLENBQzlDLENBQUM7UUFDRixJQUFJLElBQUksR0FBRyxLQUFJLENBQUM7UUFDaEIsS0FBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsVUFBUyxRQUFRO1lBQzdDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3hELEtBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDOztJQUN4RCxDQUFDO0lBQ1MsK0NBQVUsR0FBcEIsVUFBcUIsUUFBYTtRQUNoQyxpQkFBTSxVQUFVLFlBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBbUIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RSxFQUFFLENBQUMsQ0FDRCxJQUFJLENBQUMsY0FBYyxFQUFFLElBQXNCLElBQUksQ0FBQyxRQUFTLENBQUMsWUFDNUQsQ0FBQyxDQUFDLENBQUM7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFtQixJQUFJLENBQUMsUUFBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JFLENBQUM7SUFDSCxDQUFDO0lBQ1MsdURBQWtCLEdBQTVCLFVBQTZCLFFBQWE7UUFDdEIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO0lBQzNELENBQUM7SUFDTyxvREFBZSxHQUF2QjtRQUNFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQztJQUMvRCxDQUFDO0lBQ0gsaUNBQUM7QUFBRCxDQUFDLENBakMrQyx3RUFBbUIsR0FpQ2xFOztBQUVEO0lBQXFDLGtGQUFvQjtJQUN2RCx5QkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUVaO1FBSGtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFFN0IsSUFBSSwwQkFBMEIsQ0FBQyxLQUFJLENBQUMsQ0FBQzs7SUFDdkMsQ0FBQztJQUNNLG9DQUFVLEdBQWpCLFVBQWtCLEdBQUcsRUFBRSxNQUFNO1FBQzNCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDekMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNILHNCQUFDO0FBQUQsQ0FBQyxDQVZvQywrRUFBb0IsR0FVeEQ7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFO0lBQ25ELE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMsQ0FBQztBQUVILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxjQUFJO0lBQ3ZELE1BQU0sQ0FBQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNuQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1RDRCO0FBQzJDO0FBQy9CO0FBQ1U7QUFDUTtBQUc3RDtJQUEwQyw4RkFBK0I7SUFDdkUscUNBQVksUUFBa0I7ZUFDNUIsa0JBQU0sUUFBUSxDQUFDO0lBQ2pCLENBQUM7SUFDUyxtREFBYSxHQUF2QjtRQUNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUs7WUFDeEIsQ0FBQyxDQUFDLHlEQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyx5REFBa0IsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDUyxnREFBVSxHQUFwQixVQUFxQixRQUFhO1FBQ2hDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBQ0gsa0NBQUM7QUFBRCxDQUFDLENBaEJ5QywrRkFBK0IsR0FnQnhFO0FBQ0Q7SUFBc0MsbUZBQXFCO0lBQ3pELDBCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLDJCQUEyQixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUN4QyxDQUFDO0lBQ0QsdUNBQVksR0FBWixVQUFhLElBQUk7UUFDZixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksU0FBUyxHQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSTtZQUNwQixDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdkQsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQztRQUV2QyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDSCx1QkFBQztBQUFELENBQUMsQ0FmcUMsaUZBQXFCLEdBZTFEOztBQUVELCtEQUFVLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRTtJQUNwRCxNQUFNLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUMsQ0FBQztBQUNILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxjQUFJO0lBQ3hELElBQUksQ0FBQyxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLE9BQU8sR0FBRyx5RUFBZSxDQUFDLGNBQWMsQ0FBQztJQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ1gsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQy9Dd0M7QUFDVTtBQUNNO0FBQ1I7QUFFbkQ7SUFBcUMsa0ZBQW9CO0lBQ3ZELHlCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLHdFQUFtQixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUNoQyxDQUFDO0lBQ0gsc0JBQUM7QUFBRCxDQUFDLENBTG9DLCtFQUFvQixHQUt4RDs7QUFFRCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUU7SUFDbkQsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQyxDQUFDO0FBQ0gseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLGNBQUk7SUFDdkQsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUNqQjBEO0FBQ2xCO0FBQ1U7QUFDbUI7QUFFeEU7SUFBc0MsbUZBQXFCO0lBQ3pELDBCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLDZGQUE2QixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUMxQyxDQUFDO0lBQ0gsdUJBQUM7QUFBRCxDQUFDLENBTHFDLGlGQUFxQixHQUsxRDs7QUFFRCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUU7SUFDcEQsTUFBTSxDQUFDLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDLENBQUM7QUFDSCx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsY0FBSTtJQUN4RCxJQUFJLENBQUMsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxPQUFPLEdBQUcseUVBQWUsQ0FBQyxjQUFjLENBQUM7SUFDM0MsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQ25Cb0Q7QUFDWjtBQUNRO0FBR25EO0lBQW1DLGdGQUFrQjtJQUNuRCx1QkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUVaO1FBSGtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFFN0IsSUFBSSx3RUFBbUIsQ0FBQyxLQUFJLENBQUMsQ0FBQzs7SUFDaEMsQ0FBQztJQUNILG9CQUFDO0FBQUQsQ0FBQyxDQUxrQywyRUFBa0IsR0FLcEQ7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsT0FBTyxFQUFFO0lBQ2pELE1BQU0sQ0FBQyxJQUFJLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZjRCO0FBQ2tDO0FBQ3RCO0FBQ1U7QUFDRjtBQUduRDtJQUFtRCxnR0FBbUI7SUFFcEUsdUNBQW1CLFFBQWtCO1FBQXJDLFlBQ0Usa0JBQU0sUUFBUSxDQUFDLFNBR2hCO1FBSmtCLGNBQVEsR0FBUixRQUFRLENBQVU7UUFFbkMsS0FBSSxDQUFDLGNBQWMsR0FBRyxvREFBYSxDQUFDLEtBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUksQ0FBQyxjQUFjLENBQUM7O0lBQ3hELENBQUM7SUFDUyxzREFBYyxHQUF4QjtRQUNFLGlCQUFNLGNBQWMsV0FBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0gsb0NBQUM7QUFBRCxDQUFDLENBWGtELHdFQUFtQixHQVdyRTs7QUFFRDtJQUF3QyxxRkFBdUI7SUFDN0QsNEJBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FFWjtRQUhrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBRTdCLElBQUksNkJBQTZCLENBQUMsS0FBSSxDQUFDLENBQUM7O0lBQzFDLENBQUM7SUFDSCx5QkFBQztBQUFELENBQUMsQ0FMdUMscUZBQXVCLEdBSzlEOztBQUVELCtEQUFVLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRTtJQUN0RCxNQUFNLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsQ0FBQztBQUNILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxjQUFJO0lBQzFELE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoQzRCO0FBQ1k7QUFDVTtBQUNBO0FBQ0Y7QUFHbkQ7SUFBNkMsMEZBQW1CO0lBSTlELGlDQUFZLFFBQWtCO1FBQTlCLFlBQ0Usa0JBQU0sUUFBUSxDQUFDLFNBb0JoQjtRQXhCRCxtQkFBYSxHQUFHLG9EQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakMsZ0JBQVUsR0FBRyxvREFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBaUNsQyxtQkFBYSxHQUFHO1lBQ2QsS0FBSSxDQUFDLGFBQWEsQ0FBQyxLQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDO1FBaENBLElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNoQixLQUFJLENBQUMsTUFBTSxHQUFHLGtEQUFXLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sQ0FBcUIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxZQUFZLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUM7UUFDdEMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxLQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFCLEtBQUksQ0FBQyxRQUFTLENBQUMsMEJBQTBCO1lBQzNELElBQUksQ0FBQyxhQUFhLENBQUM7UUFDckIsS0FBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxVQUFDLElBQUksRUFBRSxLQUFLO1lBQ3RDLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsVUFBQyxJQUFJLEVBQUUsS0FBSztZQUNyQyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDdkIsS0FBSSxDQUFDLFFBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQyxHQUFHLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDMUQsS0FBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUM7O0lBQ0osQ0FBQztJQUNPLDBDQUFRLEdBQWhCLFVBQWlCLEdBQVE7UUFDdkIsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDbEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUFDLE1BQU0sQ0FBQztRQUN2RCxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUNtQixJQUFJLENBQUMsUUFBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFJSCw4QkFBQztBQUFELENBQUMsQ0F2QzRDLHdFQUFtQixHQXVDL0Q7O0FBRUQ7SUFBa0MsK0VBQWlCO0lBQ2pELHNCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLHVCQUF1QixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUNwQyxDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLENBTGlDLHlFQUFpQixHQUtsRDs7QUFFRCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUU7SUFDaEQsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQzlCLENBQUMsQ0FBQyxDQUFDO0FBQ0gseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLGNBQUk7SUFDcEQsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUMzRHdDO0FBQ1U7QUFDTTtBQUNOO0FBRXJEO0lBQWtDLCtFQUFpQjtJQUNqRCxzQkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUVaO1FBSGtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFFN0IsSUFBSSxnRkFBdUIsQ0FBQyxLQUFJLENBQUMsQ0FBQzs7SUFDcEMsQ0FBQztJQUNILG1CQUFDO0FBQUQsQ0FBQyxDQUxpQyx5RUFBaUIsR0FLbEQ7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFO0lBQ2hELE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM5QixDQUFDLENBQUMsQ0FBQztBQUNILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxjQUFJO0lBQ3BELE1BQU0sQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEI0QjtBQUtIO0FBQ3VCO0FBQ1I7QUFDVTtBQUdyRDtJQUErQiw0RUFBYztJQUczQyxtQkFDRSxJQUFlLEVBQ1IsUUFBZ0IsRUFDdkIsSUFBaUIsRUFDakIsS0FBVTtRQUpaLFlBTUUsa0JBQU0sSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLFNBT25DO1FBWFEsY0FBUSxHQUFSLFFBQVEsQ0FBUTtRQUpqQixxQkFBZSxHQUFHLEtBQUssQ0FBQztRQVM5QixLQUFJLENBQUMsT0FBTyxHQUFHLG9EQUFhLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNoQixLQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFTLFFBQVE7WUFDdEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFBQyxJQUFJLENBQUM7WUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7O0lBQ0wsQ0FBQztJQUNTLGtDQUFjLEdBQXhCO1FBQ0UsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxDQXRCOEIsd0VBQWMsR0FzQjVDOztBQUNEO0lBQW9DLGlGQUFtQjtJQUNyRCx3QkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUVaO1FBSGtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFFN0IsSUFBSSx3RUFBbUIsQ0FBQyxLQUFJLENBQUMsQ0FBQzs7SUFDaEMsQ0FBQztJQUNTLHdDQUFlLEdBQXpCLFVBQ0UsSUFBZSxFQUNmLFFBQWdCLEVBQ2hCLEtBQVU7UUFFVixNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUNNLG1DQUFVLEdBQWpCLFVBQWtCLEdBQUcsRUFBRSxNQUFNO1FBQzNCLElBQUksU0FBUyxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzlDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RSxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDSCxxQkFBQztBQUFELENBQUMsQ0FqQm1DLDZFQUFtQixHQWlCdEQ7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFO0lBQ2xELE1BQU0sQ0FBQyxJQUFJLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMsQ0FBQztBQUNILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxjQUFJO0lBQ3RELElBQUksQ0FBQyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxJQUFJLEdBQUcseUVBQWUsQ0FBQyxXQUFXLENBQUM7SUFDckMsQ0FBQyxDQUFDLE9BQU8sR0FBRyx5RUFBZSxDQUFDLGFBQWEsQ0FBQztJQUMxQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ1gsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3RDRCO0FBQ1k7QUFDVTtBQUV1QjtBQUNMO0FBRVU7QUFHakY7SUFBc0QsbUdBQTZCO0lBUWpGLDBDQUFZLFFBQWtCO1FBQTlCLFlBQ0Usa0JBQU0sUUFBUSxDQUFDLFNBMkNoQjtRQTFDQyxLQUFJLENBQUMsUUFBUSxHQUFHLG9EQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsS0FBSSxDQUFDLE1BQU0sR0FBRyxzREFBZSxDQUFDO1lBQzVCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXlCLElBQUksQ0FBQyxRQUFTLENBQUMsV0FBVyxDQUFDO1FBQzVELENBQUMsRUFBRSxLQUFJLENBQUMsQ0FBQztRQUVULEtBQUksQ0FBQyxXQUFXLEdBQUcsc0RBQWUsQ0FBQztZQUNqQyxNQUFNLENBQW1DLElBQUksQ0FBQyxRQUFTLENBQUMsZ0JBQWdCO2dCQUN0RSxDQUFDLENBQUMsUUFBUTtnQkFDVixDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2IsQ0FBQyxFQUFFLEtBQUksQ0FBQyxDQUFDO1FBQ1QsS0FBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3RDLElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNoQixLQUFJLENBQUMsYUFBYSxHQUFHO1lBQ25CLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQixDQUFDLENBQUM7UUFDRixLQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBUyxJQUFJO1lBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDO1FBQ0YsS0FBSSxDQUFDLFdBQVcsR0FBRyxzREFBZSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXlCLElBQUksQ0FBQyxRQUFTLENBQUMsU0FBUyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLGNBQWMsR0FBRyxzREFBZSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXlCLElBQUksQ0FBQyxRQUFTLENBQUMsWUFBWSxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsR0FBRyxLQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3BELEtBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsR0FBRyxLQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDMUQsS0FBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2hELEtBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSSxDQUFDLFdBQVcsQ0FBQztRQUNoRCxLQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQztRQUM5QixLQUFJO2FBQ3pCLFFBQVMsQ0FBQyx1QkFBdUIsR0FBRztZQUNyQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUM7UUFDc0IsS0FBSSxDQUFDLFFBQVMsQ0FBQyxzQkFBc0IsR0FBRztZQUM5RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQyxDQUFDO1FBQ3NCLEtBQUksQ0FBQyxRQUFTLENBQUMsbUJBQW1CLEdBQUc7WUFDM0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQzs7SUFDSixDQUFDO0lBQ1Msd0RBQWEsR0FBdkI7UUFDRSx1QkFBdUI7UUFDdkIsSUFBSSxJQUFJLEdBQTJCLElBQUksQ0FBQyxRQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxRSxJQUFJLE9BQU8sR0FBMkIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxPQUFPLENBQUM7UUFDN0QsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNTLDBEQUFlLEdBQXpCO1FBQ0UsSUFBSSxJQUFJLEdBQTJCLElBQUksQ0FBQyxRQUFTLENBQUMsV0FBVyxDQUFDO1FBQzlELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDUyw0REFBaUIsR0FBM0I7UUFDRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ1MsaURBQU0sR0FBaEI7UUFDMEIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBQ1Msb0RBQVMsR0FBbkIsVUFBb0IsR0FBMEI7UUFDNUMsSUFBSSxJQUFJLEdBQTJCLElBQUksQ0FBQyxRQUFTLENBQUMsV0FBVyxDQUFDO1FBQzlELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNTLElBQUksQ0FBQyxRQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELENBQUM7SUFDSCxDQUFDO0lBQ0gsdUNBQUM7QUFBRCxDQUFDLENBN0VxRCxpR0FBNkIsR0E2RWxGOztBQUVEO0lBQTJDLHdGQUEwQjtJQUVuRSwrQkFBbUIsSUFBWTtRQUEvQixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQUVaO1FBSGtCLFVBQUksR0FBSixJQUFJLENBQVE7UUFFN0IsSUFBSSxnQ0FBZ0MsQ0FBQyxLQUFJLENBQUMsQ0FBQzs7SUFDN0MsQ0FBQztJQUNILDRCQUFDO0FBQUQsQ0FBQyxDQU4wQywyRkFBMEIsR0FNcEU7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsZUFBZSxFQUFFO0lBQ3pELE1BQU0sQ0FBQyxJQUFJLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0FBRUgseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLGNBQUk7SUFDN0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2YscUdBQStCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNHNEI7QUFJRztBQUVpQjtBQUNGO0FBRU47QUFDVTtBQUVyRDtJQUFzQyxtRkFBcUI7SUFHekQsMEJBQW1CLElBQWdCLEVBQUUsS0FBb0I7UUFBdEMsa0NBQWdCO1FBQUUsb0NBQW9CO1FBQXpELFlBQ0Usa0JBQU0sSUFBSSxFQUFFLEtBQUssQ0FBQyxTQVFuQjtRQVRrQixVQUFJLEdBQUosSUFBSSxDQUFZO1FBRjNCLHVCQUFpQixHQUFHLEtBQUssQ0FBQztRQUloQyxLQUFJLENBQUMsT0FBTyxHQUFHLG9EQUFhLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksSUFBSSxHQUFHLEtBQUksQ0FBQztRQUNoQixLQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFTLFFBQVE7WUFDdEMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7O0lBQ0wsQ0FBQztJQUNTLHVDQUFZLEdBQXRCLFVBQXVCLElBQVk7UUFDakMsTUFBTSxDQUFDLElBQUksc0VBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ0QseUNBQWMsR0FBZCxVQUFlLFFBQWE7UUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUNILHVCQUFDO0FBQUQsQ0FBQyxDQXJCcUMscUZBQXFCLEdBcUIxRDs7QUFFRDtJQUFxRCxrR0FBbUI7SUFFdEUseUNBQVksUUFBa0I7UUFBOUIsWUFDRSxrQkFBTSxRQUFRLENBQUMsU0FXaEI7UUFWQyxLQUFJLENBQUMsTUFBTSxHQUFHLHlEQUFrQixDQUNGLEtBQUksQ0FBQyxRQUFTLENBQUMsT0FBTyxFQUFFLENBQ3JELENBQUM7UUFDRixLQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUM7UUFDdEMsS0FBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ1ksS0FBSTthQUM3QixRQUFTLENBQUMsdUJBQXVCLEdBQUc7WUFDckMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDOztJQUNKLENBQUM7SUFDUywyREFBaUIsR0FBM0I7UUFDRSxJQUFJLENBQUMsTUFBTSxDQUE2QixJQUFJLENBQUMsUUFBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNILHNDQUFDO0FBQUQsQ0FBQyxDQWxCb0Qsd0VBQW1CLEdBa0J2RTs7QUFFRDtJQUEwQyx1RkFBeUI7SUFDakUsOEJBQW1CLElBQVk7UUFBL0IsWUFDRSxrQkFBTSxJQUFJLENBQUMsU0FFWjtRQUhrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBRTdCLElBQUksK0JBQStCLENBQUMsS0FBSSxDQUFDLENBQUM7O0lBQzVDLENBQUM7SUFDUyw2Q0FBYyxHQUF4QixVQUF5QixJQUFZLEVBQUUsS0FBYTtRQUNsRCxNQUFNLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNILDJCQUFDO0FBQUQsQ0FBQyxDQVJ5Qyx5RkFBeUIsR0FRbEU7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLEVBQUU7SUFDNUQsTUFBTSxDQUFDLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDLENBQUM7QUFFSCwrREFBVSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLEVBQUU7SUFDeEQsTUFBTSxDQUFDLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEMsQ0FBQyxDQUFDLENBQUM7QUFFSCx5RUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsY0FBSTtJQUM1RCxJQUFJLENBQUMsR0FBRyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ1gsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUU0QjtBQUNTO0FBQ0c7QUFDVTtBQUNGO0FBSWpCO0FBR0Q7QUFFakM7SUFBcUQsa0dBQW1CO0lBa0J0RSx5Q0FBWSxRQUFrQjtRQUE5QixZQUNFLGtCQUFNLFFBQVEsQ0FBQyxTQXFHaEI7UUFwR0MsS0FBSSxDQUFDLFFBQVEsR0FBRyxvREFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLEtBQUksQ0FBQyxRQUFRLEdBQUcsc0RBQWUsQ0FBQztZQUM5QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUF3QixJQUFJLENBQUMsUUFBUyxDQUFDLE1BQU0sQ0FBQztRQUN0RCxDQUFDLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFFVCxLQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUM7UUFDMUMsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLEtBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxrQkFBa0IsR0FBRyxVQUFTLElBQUk7WUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUM7UUFDRixLQUFJLENBQUMsZ0JBQWdCLEdBQUc7WUFDQyxJQUFJLENBQUMsUUFBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZELENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRztZQUNDLElBQUksQ0FBQyxRQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdkQsQ0FBQyxDQUFDO1FBRUYsS0FBSSxDQUFDLGFBQWEsR0FBRyxzREFBZSxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsV0FBVyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLGdCQUFnQixHQUFHLHNEQUFlLENBQUM7WUFDdEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBd0IsSUFBSSxDQUFDLFFBQVMsQ0FBQyxjQUFjLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsY0FBYyxHQUFHLHNEQUFlLENBQUM7WUFDcEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBd0IsSUFBSSxDQUFDLFFBQVMsQ0FBQyxtQkFBbUIsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxjQUFjLEdBQUcsc0RBQWUsQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUF3QixJQUFJLENBQUMsUUFBUyxDQUFDLG1CQUFtQixDQUFDO1FBQ25FLENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLFNBQVMsR0FBRyxzREFBZSxDQUFDO1lBQy9CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsY0FBYyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLE9BQU8sR0FBRyxzREFBZSxDQUFDO1lBQzdCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsWUFBWSxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLFFBQVEsR0FBRyxzREFBZSxDQUFDO1lBQzlCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsZ0JBQWdCLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFJLENBQUMsZUFBZSxHQUFHLHNEQUFlLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBd0IsSUFBSSxDQUFDLFFBQVMsQ0FBQyxvQkFBb0IsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUksQ0FBQyxrQkFBa0IsR0FBRyxzREFBZSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsdUJBQXVCLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFJLENBQUMsWUFBWSxHQUFHLG9EQUFhLENBQ1IsSUFBSSxDQUFDLFFBQVMsQ0FBQyxZQUFZLENBQ25ELENBQUM7UUFDRixLQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFTLFFBQVE7WUFDcEIsSUFBSSxDQUFDLFFBQVMsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSSxDQUFDLFVBQVUsR0FBRyxzREFBZSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQXdCLElBQUksQ0FBQyxRQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztRQUVILEtBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3hELEtBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsR0FBRyxLQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDOUQsS0FBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUMxRCxLQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzFELEtBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEdBQUcsS0FBSSxDQUFDLGFBQWEsQ0FBQztRQUNwRCxLQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsS0FBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzFELEtBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSSxDQUFDLE9BQU8sQ0FBQztRQUN4QyxLQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUM7UUFDMUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEtBQUksQ0FBQyxlQUFlLENBQUM7UUFDeEQsS0FBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUM5RCxLQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQztRQUN0RCxLQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQztRQUN0RCxLQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUM7UUFDNUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDO1FBQ2xELEtBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQztRQUU5QyxLQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsVUFBUyxFQUFFLEVBQUUsR0FBRztZQUNwRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQztRQUNxQixLQUFJO2FBQ3hCLFFBQVMsQ0FBQyx5QkFBeUIsR0FBRztZQUN2QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUM7UUFDcUIsS0FBSTthQUN4QixRQUFTLENBQUMseUJBQXlCLEdBQUc7WUFDdkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDO1FBQ3FCLEtBQUk7YUFDeEIsUUFBUyxDQUFDLDJCQUEyQixHQUFHO1lBQ3pDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQzs7SUFDSixDQUFDO0lBQ1MsNkRBQW1CLEdBQTdCO1FBQ0UsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUNTLDZEQUFtQixHQUE3QjtRQUNFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFDUywrREFBcUIsR0FBL0I7UUFDRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxDQUF3QixJQUFJLENBQUMsUUFBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDUyxrREFBUSxHQUFsQjtRQUN5QixJQUFJLENBQUMsUUFBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFDUyxxREFBVyxHQUFyQixVQUFzQixHQUFRO1FBQzVCLElBQUksQ0FBQyxHQUF5QixJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzVDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUN4QixHQUFHLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUN2QixDQUFDO1FBQ0QsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ08sMERBQWdCLEdBQXhCLFVBQXlCLFFBQVEsRUFBRSxHQUFHO1FBQ3BDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3BELElBQUksRUFBRSxHQUFHLDREQUFhLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDSCxzQ0FBQztBQUFELENBQUMsQ0FsSm9ELHdFQUFtQixHQWtKdkU7O0FBRUQ7SUFBMEMsdUZBQXlCO0lBQ2pFLDhCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLCtCQUErQixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUM1QyxDQUFDO0lBQ1MsbURBQW9CLEdBQTlCO1FBQ0UsTUFBTSxDQUFDLElBQUksc0RBQUssRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFDSCwyQkFBQztBQUFELENBQUMsQ0FSeUMseUZBQXlCLEdBUWxFOztBQUVELCtEQUFVLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsRUFBRTtJQUN4RCxNQUFNLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN0QyxDQUFDLENBQUMsQ0FBQztBQUVILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxjQUFJO0lBQzVELE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUNoTDhEO0FBQ3RCO0FBQ1U7QUFDcUI7QUFFMUU7SUFBd0MscUZBQXVCO0lBQzdELDRCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLCtGQUErQixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUM1QyxDQUFDO0lBQ0QseUNBQVksR0FBWixVQUFhLElBQUk7UUFDZixJQUFJLFNBQVMsR0FDWCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUk7WUFDcEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFBQyxTQUFTLElBQUksVUFBVSxDQUFDO1FBQzlELE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNILHlCQUFDO0FBQUQsQ0FBQyxDQVp1QyxxRkFBdUIsR0FZOUQ7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsWUFBWSxFQUFFO0lBQ3RELE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BDLENBQUMsQ0FBQyxDQUFDO0FBRUgseUVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLGNBQUk7SUFDMUQsSUFBSSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUMsT0FBTyxHQUFHLHlFQUFlLENBQUMsY0FBYyxDQUFDO0lBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1QjRCO0FBQ29CO0FBQ007QUFDZDtBQUNVO0FBR3JEO0lBQXdDLDRGQUFtQjtJQUl6RCxtQ0FBWSxRQUFrQjtRQUE5QixZQUNFLGtCQUFNLFFBQVEsQ0FBQyxTQWtCaEI7UUFqQkMsS0FBSSxDQUFDLG1CQUFtQixHQUFHLHlEQUFrQixDQUFDLEtBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLEtBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsR0FBRyxLQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDaEUsSUFBSSxJQUFJLEdBQUcsS0FBSSxDQUFDO1FBQ2hCLEtBQUksQ0FBQyxRQUFRLEdBQUcsVUFBUyxHQUFHO1lBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSSxDQUFDLFFBQVEsQ0FBQztRQUN6QixLQUFJLENBQUMsUUFBUyxDQUFDLHlCQUF5QixHQUFHO1lBQzFELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQztRQUNGLEtBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBUyxHQUFHO1lBQ3RDLElBQUksR0FBRyxHQUFvQixJQUFJLENBQUMsUUFBUyxDQUFDLE9BQU8sQ0FBQztZQUNsRCxJQUFJLFFBQVEsR0FBb0IsSUFBSSxDQUFDLFFBQVMsQ0FBQyxXQUFXLENBQUM7WUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsS0FBSztnQkFDNUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsUUFBUTtnQkFDdEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNWLENBQUMsQ0FBQzs7SUFDSixDQUFDO0lBQ1MsdURBQW1CLEdBQTdCO1FBQ0UsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDTyw2Q0FBUyxHQUFqQjtRQUNFLE1BQU0sQ0FBa0IsSUFBSSxDQUFDLFFBQVMsQ0FBQyxpQkFBaUIsQ0FBQztJQUMzRCxDQUFDO0lBQ0gsZ0NBQUM7QUFBRCxDQUFDLENBOUJ1Qyx3RUFBbUIsR0E4QjFEO0FBRUQ7SUFBb0MsaUZBQW1CO0lBR3JELHdCQUFtQixJQUFZO1FBQS9CLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBRVo7UUFIa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUU3QixJQUFJLHlCQUF5QixDQUFDLEtBQUksQ0FBQyxDQUFDOztJQUN0QyxDQUFDO0lBQ1Msa0NBQVMsR0FBbkI7UUFDRSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEQsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUNILHFCQUFDO0FBQUQsQ0FBQyxDQWRtQyw2RUFBbUIsR0FjdEQ7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFO0lBQ2xELE1BQU0sQ0FBQyxJQUFJLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMsQ0FBQztBQUVILHlFQUFlLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxjQUFJO0lBQ3RELE1BQU0sQ0FBQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7OztBQzdEbUQ7QUFFL0MsSUFBSSxtQkFBbUIsR0FBRztJQUMvQixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUsV0FBVztJQUN6QixZQUFZLEVBQUUsaUJBQWlCO0lBQy9CLGFBQWEsRUFBRSxRQUFRO0lBQ3ZCLFdBQVcsRUFBRSxxQ0FBcUM7SUFDbEQsZ0JBQWdCLEVBQUUsNkJBQTZCO0lBQy9DLGFBQWEsRUFBRSx3QkFBd0I7SUFDdkMsY0FBYyxFQUFFLFNBQVM7SUFDekIsYUFBYSxFQUFFLDBCQUEwQjtJQUN6QyxzQkFBc0IsRUFBRSx5Q0FBeUM7SUFDakUsWUFBWSxFQUFFLDZCQUE2QjtJQUMzQyxhQUFhLEVBQUUsbUNBQW1DO0lBQ2xELGFBQWEsRUFBRSw2QkFBNkI7SUFDNUMsZ0JBQWdCLEVBQUUsd0NBQXdDO0lBQzFELGdCQUFnQixFQUFFLGtDQUFrQztJQUNwRCxjQUFjLEVBQUUsdUNBQXVDO0lBQ3ZELGNBQWMsRUFBRSx3Q0FBd0M7SUFDeEQsYUFBYSxFQUNYLGdFQUFnRTtJQUNsRSxVQUFVLEVBQUUsMkNBQTJDO0lBQ3ZELFVBQVUsRUFBRSwwQ0FBMEM7SUFDdEQsWUFBWSxFQUFFLG1DQUFtQztJQUNqRCxlQUFlLEVBQUUsMkJBQTJCO0lBQzVDLGtCQUFrQixFQUFFLHFEQUFxRDtJQUN6RSxhQUFhLEVBQUUsa0NBQWtDO0lBQ2pELGtCQUFrQixFQUFFLHdCQUF3QjtJQUM1QyxhQUFhLEVBQUUsNkRBQTZEO0lBQzVFLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLFNBQVMsRUFBRSxVQUFVO0NBQ3RCLENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7QUNuQ0Q7QUFFL0MsSUFBSSxvQkFBb0IsR0FBRztJQUNoQyxZQUFZLEVBQUUsVUFBVTtJQUN4QixZQUFZLEVBQUUsU0FBUztJQUN2QixZQUFZLEVBQUUsU0FBUztJQUN2QixhQUFhLEVBQUUsc0JBQXNCO0lBQ3JDLFlBQVksRUFBRSxtQkFBbUI7SUFDakMsV0FBVyxFQUFFLHNEQUFzRDtJQUNuRSxnQkFBZ0IsRUFBRSxtQ0FBbUM7SUFDckQsYUFBYSxFQUFFLGlDQUFpQztJQUNoRCxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGFBQWEsRUFBRSxrQ0FBa0M7SUFDakQsc0JBQXNCLEVBQUUsbURBQW1EO0lBQzNFLFlBQVksRUFBRSxpQ0FBaUM7SUFDL0MsYUFBYSxFQUFFLHVDQUF1QztJQUN0RCxhQUFhLEVBQUUsd0NBQXdDO0lBQ3ZELGdCQUFnQixFQUFFLHFEQUFxRDtJQUN2RSxnQkFBZ0IsRUFBRSx1Q0FBdUM7SUFDekQsY0FBYyxFQUFFLDZDQUE2QztJQUM3RCxjQUFjLEVBQUUsK0NBQStDO0lBQy9ELGFBQWEsRUFBRSw0REFBNEQ7SUFDM0UsVUFBVSxFQUFFLHVDQUF1QztJQUNuRCxVQUFVLEVBQUUseUNBQXlDO0lBQ3JELFlBQVksRUFBRSwrQ0FBK0M7SUFDN0QsZUFBZSxFQUFFLDJDQUEyQztJQUM1RCxrQkFBa0IsRUFDaEIscUZBQXFGO0lBQ3ZGLGFBQWEsRUFBRSx3Q0FBd0M7SUFDdkQsa0JBQWtCLEVBQUUsc0NBQXNDO0lBQzFELGFBQWEsRUFDWCxnRkFBZ0Y7SUFDbEYsTUFBTSxFQUFFLG1CQUFtQjtJQUMzQixTQUFTLEVBQUUscUJBQXFCO0lBQ2hDLGlCQUFpQixFQUFFLGdCQUFnQjtJQUNuQyxrQkFBa0IsRUFBRSxlQUFlO0lBQ25DLGlCQUFpQixFQUFFLGdCQUFnQjtJQUNuQyxhQUFhLEVBQUUsU0FBUztJQUN4QixVQUFVLEVBQUUsUUFBUTtDQUNyQixDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDOzs7Ozs7Ozs7O0FDekNGO0FBRS9DLElBQUksa0JBQWtCLEdBQUc7SUFDOUIsWUFBWSxFQUFFLFdBQVc7SUFDekIsWUFBWSxFQUFFLE9BQU87SUFDckIsWUFBWSxFQUFFLFFBQVE7SUFDdEIsYUFBYSxFQUFFLHdCQUF3QjtJQUN2QyxZQUFZLEVBQUUsa0JBQWtCO0lBQ2hDLFdBQVcsRUFBRSxtQ0FBbUM7SUFDaEQsZ0JBQWdCLEVBQUUsZ0NBQWdDO0lBQ2xELGFBQWEsRUFBRSw4QkFBOEI7SUFDN0MsY0FBYyxFQUFFLFVBQVU7SUFDMUIsYUFBYSxFQUFFLDZCQUE2QjtJQUM1QyxzQkFBc0IsRUFBRSxxQ0FBcUM7SUFDN0QsWUFBWSxFQUFFLHFDQUFxQztJQUNuRCxhQUFhLEVBQUUsbUNBQW1DO0lBQ2xELGFBQWEsRUFBRSxvQ0FBb0M7SUFDbkQsZ0JBQWdCLEVBQUUsbURBQW1EO0lBQ3JFLGdCQUFnQixFQUFFLG1DQUFtQztJQUNyRCxjQUFjLEVBQUUsc0NBQXNDO0lBQ3RELGNBQWMsRUFBRSwwQ0FBMEM7SUFDMUQsYUFBYSxFQUNYLHVFQUF1RTtJQUN6RSxVQUFVLEVBQUUsZ0RBQWdEO0lBQzVELFVBQVUsRUFBRSxnREFBZ0Q7SUFDNUQsWUFBWSxFQUFFLDJDQUEyQztJQUN6RCxlQUFlLEVBQUUsbUNBQW1DO0lBQ3BELGtCQUFrQixFQUFFLGdEQUFnRDtJQUNwRSxhQUFhLEVBQUUsK0NBQStDO0lBQzlELGtCQUFrQixFQUFFLCtCQUErQjtJQUNuRCxhQUFhLEVBQUUsNERBQTREO0lBQzNFLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLFNBQVMsRUFBRSxXQUFXO0NBQ3ZCLENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7QUNuQ0E7QUFFL0MsSUFBSSxtQkFBbUIsR0FBRztJQUMvQixZQUFZLEVBQUUsU0FBUztJQUN2QixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUsaUJBQWlCO0lBQy9CLFdBQVcsRUFBRSxpQ0FBaUM7SUFDOUMsZ0JBQWdCLEVBQUUsK0JBQStCO0lBQ2pELGFBQWEsRUFBRSxzQ0FBc0M7SUFDckQsYUFBYSxFQUFFLGtCQUFrQjtJQUNqQyxjQUFjLEVBQUUsU0FBUztJQUN6QixhQUFhLEVBQUUsOEJBQThCO0lBQzdDLFlBQVksRUFBRSxlQUFlO0lBQzdCLGFBQWEsRUFBRSx3QkFBd0I7SUFDdkMsY0FBYyxFQUFFLDZDQUE2QztJQUM3RCxjQUFjLEVBQUUsNkNBQTZDO0lBQzdELGFBQWEsRUFDWCw4RUFBOEU7SUFDaEYsVUFBVSxFQUFFLDhDQUE4QztJQUMxRCxVQUFVLEVBQUUsOENBQThDO0lBQzFELFlBQVksRUFBRSwwQ0FBMEM7SUFDeEQsYUFBYSxFQUFFLHNDQUFzQztJQUNyRCxrQkFBa0IsRUFBRSx1Q0FBdUM7Q0FDNUQsQ0FBQztBQUVGLDBFQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxtQkFBbUIsQ0FBQzs7Ozs7Ozs7O0FDMUJ2RDtBQUFBLDhDQUE4QztBQUNRO0FBRS9DLElBQUksa0JBQWtCLEdBQUc7SUFDOUIsWUFBWSxFQUFFLFFBQVE7SUFDdEIsWUFBWSxFQUFFLFVBQVU7SUFDeEIsWUFBWSxFQUFFLFdBQVc7SUFDekIsYUFBYSxFQUFFLFFBQVE7SUFDdkIsWUFBWSxFQUFFLG9CQUFvQjtJQUNsQyxXQUFXLEVBQUUsMERBQTBEO0lBQ3ZFLGdCQUFnQixFQUFFLDBDQUEwQztJQUM1RCxhQUFhLEVBQUUsb0NBQW9DO0lBQ25ELGNBQWMsRUFBRSxTQUFTO0lBQ3pCLGFBQWEsRUFBRSxtQ0FBbUM7SUFDbEQsWUFBWSxFQUFFLGtDQUFrQztJQUNoRCxhQUFhLEVBQUUsNkNBQTZDO0lBQzVELGNBQWMsRUFBRSwrQ0FBK0M7SUFDL0QsY0FBYyxFQUFFLHFEQUFxRDtJQUNyRSxhQUFhLEVBQ1gsbUZBQW1GO0lBQ3JGLFVBQVUsRUFBRSxzREFBc0Q7SUFDbEUsVUFBVSxFQUFFLHNEQUFzRDtJQUNsRSxZQUFZLEVBQUUsOENBQThDO0lBQzVELGFBQWEsRUFBRSwwREFBMEQ7SUFDekUsa0JBQWtCLEVBQUUsd0NBQXdDO0NBQzdELENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7QUMzQkE7QUFFL0MsSUFBSSxvQkFBb0IsR0FBRztJQUNoQyxZQUFZLEVBQUUsV0FBVztJQUN6QixZQUFZLEVBQUUsVUFBVTtJQUN4QixZQUFZLEVBQUUsUUFBUTtJQUN0QixhQUFhLEVBQUUsZUFBZTtJQUM5QixZQUFZLEVBQUUsY0FBYztJQUM1QixXQUFXLEVBQ1QsdUVBQXVFO0lBQ3pFLGdCQUFnQixFQUFFLGdDQUFnQztJQUNsRCxhQUFhLEVBQUUsa0NBQWtDO0lBQ2pELGNBQWMsRUFBRSxZQUFZO0lBQzVCLGFBQWEsRUFBRSw2QkFBNkI7SUFDNUMsWUFBWSxFQUFFLDhCQUE4QjtJQUM1QyxhQUFhLEVBQUUsMENBQTBDO0lBQ3pELGNBQWMsRUFBRSxnREFBZ0Q7SUFDaEUsY0FBYyxFQUFFLCtDQUErQztJQUMvRCxhQUFhLEVBQ1gsdUZBQXVGO0lBQ3pGLFVBQVUsRUFBRSxtREFBbUQ7SUFDL0QsVUFBVSxFQUFFLG9EQUFvRDtJQUNoRSxZQUFZLEVBQUUsZ0NBQWdDO0lBQzlDLGtCQUFrQixFQUFFLG1DQUFtQztDQUN4RCxDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDOzs7Ozs7Ozs7QUMxQnhEO0FBQUEsOENBQThDO0FBQ1E7QUFFL0MsSUFBSSxtQkFBbUIsR0FBRztJQUMvQixZQUFZLEVBQUUscUJBQXFCO0lBQ25DLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFlBQVksRUFBRSxVQUFVO0lBQ3hCLGFBQWEsRUFBRSx1QkFBdUI7SUFDdEMsWUFBWSxFQUFFLGtCQUFrQjtJQUNoQyxXQUFXLEVBQ1Qsb0VBQW9FO0lBQ3RFLGdCQUFnQixFQUFFLDhDQUE4QztJQUNoRSxhQUFhLEVBQUUsZ0RBQWdEO0lBQy9ELGNBQWMsRUFBRSxlQUFlO0lBQy9CLGFBQWEsRUFBRSx3REFBd0Q7SUFDdkUsc0JBQXNCLEVBQUUscUNBQXFDO0lBQzdELFlBQVksRUFBRSwyQ0FBMkM7SUFDekQsYUFBYSxFQUFFLHVDQUF1QztJQUN0RCxjQUFjLEVBQUUsdURBQXVEO0lBQ3ZFLGNBQWMsRUFBRSxzREFBc0Q7SUFDdEUsYUFBYSxFQUNYLDRIQUE0SDtJQUM5SCxVQUFVLEVBQ1IsaUZBQWlGO0lBQ25GLFVBQVUsRUFDUixpRkFBaUY7SUFDbkYsWUFBWSxFQUFFLHlDQUF5QztJQUN2RCxhQUFhLEVBQUUsb0RBQW9EO0lBQ25FLGtCQUFrQixFQUFFLDBDQUEwQztDQUMvRCxDQUFDO0FBQ0YsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDOzs7Ozs7Ozs7O0FDOUJEO0FBRS9DLElBQUkscUJBQXFCLEdBQUc7SUFDakMsWUFBWSxFQUFFLE1BQU07SUFDcEIsWUFBWSxFQUFFLFFBQVE7SUFDdEIsWUFBWSxFQUFFLFdBQVc7SUFDekIsWUFBWSxFQUFFLGtCQUFrQjtJQUNoQyxXQUFXLEVBQUUseUJBQXlCO0lBQ3RDLGdCQUFnQixFQUFFLGtDQUFrQztJQUNwRCxhQUFhLEVBQUUseUJBQXlCO0lBQ3hDLGFBQWEsRUFBRSx3QkFBd0I7SUFDdkMsY0FBYyxFQUFFLFdBQVc7SUFDM0IsYUFBYSxFQUFFLDBCQUEwQjtJQUN6QyxZQUFZLEVBQUUsMEJBQTBCO0lBQ3hDLGFBQWEsRUFBRSx5Q0FBeUM7SUFDeEQsY0FBYyxFQUFFLHdDQUF3QztJQUN4RCxjQUFjLEVBQUUsd0NBQXdDO0lBQ3hELGFBQWEsRUFDWCx1RUFBdUU7SUFDekUsVUFBVSxFQUFFLHdDQUF3QztJQUNwRCxVQUFVLEVBQUUsMkNBQTJDO0lBQ3ZELFlBQVksRUFBRSxnREFBZ0Q7SUFDOUQsaUJBQWlCLEVBQUUsNEJBQTRCO0NBQ2hELENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcscUJBQXFCLENBQUM7Ozs7Ozs7Ozs7QUN6Qkg7QUFFL0MsSUFBSSxtQkFBbUIsR0FBRztJQUMvQixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUsVUFBVTtJQUN4QixZQUFZLEVBQUUsbUJBQW1CO0lBQ2pDLFdBQVcsRUFBRSxnQ0FBZ0M7SUFDN0MsZ0JBQWdCLEVBQUUsbURBQW1EO0lBQ3JFLGFBQWEsRUFBRSwyQ0FBMkM7SUFDMUQsYUFBYSxFQUFFLCtCQUErQjtJQUM5QyxjQUFjLEVBQUUsV0FBVztJQUMzQixhQUFhLEVBQUUsb0NBQW9DO0lBQ25ELFlBQVksRUFBRSxpQ0FBaUM7SUFDL0MsYUFBYSxFQUFFLDZDQUE2QztJQUM1RCxjQUFjLEVBQUUsMkNBQTJDO0lBQzNELGNBQWMsRUFBRSwrQ0FBK0M7SUFDL0QsYUFBYSxFQUNYLCtFQUErRTtJQUNqRixVQUFVLEVBQUUsK0NBQStDO0lBQzNELFVBQVUsRUFBRSxnREFBZ0Q7SUFDNUQsWUFBWSxFQUFFLGtEQUFrRDtJQUNoRSxhQUFhLEVBQUUsaURBQWlEO0lBQ2hFLGtCQUFrQixFQUFFLHNEQUFzRDtDQUMzRSxDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDOzs7Ozs7Ozs7QUMxQnZEO0FBQUEsa0RBQWtEO0FBQ0k7QUFFL0MsSUFBSSxrQkFBa0IsR0FBRztJQUM5QixZQUFZLEVBQUUsYUFBYTtJQUMzQixZQUFZLEVBQUUsU0FBUztJQUN2QixZQUFZLEVBQUUsWUFBWTtJQUMxQixhQUFhLEVBQUUsOEJBQThCO0lBQzdDLFlBQVksRUFBRSxvQkFBb0I7SUFDbEMsV0FBVyxFQUNULDJFQUEyRTtJQUM3RSxnQkFBZ0IsRUFDZCw0REFBNEQ7SUFDOUQsYUFBYSxFQUFFLG1EQUFtRDtJQUNsRSxjQUFjLEVBQUUsYUFBYTtJQUM3QixhQUFhLEVBQUUsa0NBQWtDO0lBQ2pELHNCQUFzQixFQUNwQix3REFBd0Q7SUFDMUQsWUFBWSxFQUFFLG9DQUFvQztJQUNsRCxhQUFhLEVBQUUsK0NBQStDO0lBQzlELGdCQUFnQixFQUFFLCtDQUErQztJQUNqRSxjQUFjLEVBQUUsK0NBQStDO0lBQy9ELGNBQWMsRUFBRSxvREFBb0Q7SUFDcEUsYUFBYSxFQUNYLHdGQUF3RjtJQUMxRixVQUFVLEVBQUUscURBQXFEO0lBQ2pFLFVBQVUsRUFBRSxxREFBcUQ7SUFDakUsWUFBWSxFQUFFLCtDQUErQztJQUM3RCxlQUFlLEVBQUUsc0NBQXNDO0lBQ3ZELGtCQUFrQixFQUNoQiwrRUFBK0U7SUFDakYsYUFBYSxFQUFFLDRDQUE0QztJQUMzRCxrQkFBa0IsRUFBRSxvREFBb0Q7SUFDeEUsYUFBYSxFQUNYLHNGQUFzRjtJQUN4RixNQUFNLEVBQUUsa0JBQWtCO0lBQzFCLFNBQVMsRUFBRSxVQUFVO0NBQ3RCLENBQUM7QUFDRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7QUN0Q0E7QUFFL0MsSUFBSSxtQkFBbUIsR0FBRztJQUMvQixZQUFZLEVBQUUsT0FBTztJQUNyQixZQUFZLEVBQUUsT0FBTztJQUNyQixZQUFZLEVBQUUsTUFBTTtJQUNwQixZQUFZLEVBQUUsaUJBQWlCO0lBQy9CLFdBQVcsRUFBRSxXQUFXO0lBQ3hCLGdCQUFnQixFQUFFLHVCQUF1QjtJQUN6QyxhQUFhLEVBQUUsZ0JBQWdCO0lBQy9CLGFBQWEsRUFBRSxlQUFlO0lBQzlCLGNBQWMsRUFBRSxRQUFRO0lBQ3hCLGFBQWEsRUFBRSxrQkFBa0I7SUFDakMsWUFBWSxFQUFFLDBCQUEwQjtJQUN4QyxhQUFhLEVBQUUsc0JBQXNCO0lBQ3JDLGNBQWMsRUFBRSx5QkFBeUI7SUFDekMsY0FBYyxFQUFFLHNCQUFzQjtJQUN0QyxhQUFhLEVBQ1gsa0VBQWtFO0lBQ3BFLFVBQVUsRUFBRSxxQ0FBcUM7SUFDakQsVUFBVSxFQUFFLG9DQUFvQztJQUNoRCxZQUFZLEVBQUUsd0JBQXdCO0lBQ3RDLGtCQUFrQixFQUFFLDRCQUE0QjtDQUNqRCxDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDOzs7Ozs7Ozs7O0FDekJEO0FBRS9DLElBQUksc0JBQXNCLEdBQUc7SUFDbEMsWUFBWSxFQUFFLFFBQVE7SUFDdEIsWUFBWSxFQUFFLFFBQVE7SUFDdEIsWUFBWSxFQUFFLE1BQU07SUFDcEIsYUFBYSxFQUFFLGtCQUFrQjtJQUNqQyxZQUFZLEVBQUUsZ0JBQWdCO0lBQzlCLFdBQVcsRUFBRSxxREFBcUQ7SUFDbEUsZ0JBQWdCLEVBQUUsMkNBQTJDO0lBQzdELHNCQUFzQixFQUFFLDZCQUE2QjtJQUNyRCxhQUFhLEVBQUUsdUJBQXVCO0lBQ3RDLGNBQWMsRUFBRSxjQUFjO0lBQzlCLEtBQUssRUFBRSxPQUFPO0lBQ2QsYUFBYSxFQUFFLHVDQUF1QztJQUN0RCxzQkFBc0IsRUFBRSxxQ0FBcUM7SUFDN0QsWUFBWSxFQUFFLGtDQUFrQztJQUNoRCxhQUFhLEVBQUUsbUNBQW1DO0lBQ2xELGFBQWEsRUFBRSxxQ0FBcUM7SUFDcEQsZ0JBQWdCLEVBQUUsc0RBQXNEO0lBQ3hFLGdCQUFnQixFQUFFLDhCQUE4QjtJQUNoRCxjQUFjLEVBQUUsd0NBQXdDO0lBQ3hELGNBQWMsRUFBRSwwQ0FBMEM7SUFDMUQsYUFBYSxFQUNYLGlGQUFpRjtJQUNuRixVQUFVLEVBQUUsNEJBQTRCO0lBQ3hDLFVBQVUsRUFBRSx3Q0FBd0M7SUFDcEQsWUFBWSxFQUFFLGtDQUFrQztJQUNoRCxlQUFlLEVBQUUsOENBQThDO0lBQy9ELGtCQUFrQixFQUNoQiwyRUFBMkU7SUFDN0UsYUFBYSxFQUFFLHNDQUFzQztJQUNyRCxrQkFBa0IsRUFBRSw0QkFBNEI7SUFDaEQsYUFBYSxFQUNYLG9FQUFvRTtJQUN0RSxhQUFhLEVBQUUsdUJBQXVCO0lBQ3RDLG1CQUFtQixFQUFFLG9DQUFvQztJQUN6RCxNQUFNLEVBQUUsZ0JBQWdCO0lBQ3hCLFNBQVMsRUFBRSxhQUFhO0lBQ3hCLFFBQVEsRUFBRSxlQUFlO0lBQ3pCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFlBQVksRUFBRSxNQUFNO0lBQ3BCLGFBQWEsRUFBRSxRQUFRO0lBQ3ZCLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFVBQVUsRUFBRSxpQ0FBaUM7SUFDN0MsZUFBZSxFQUFFLHFEQUFxRDtJQUN0RSxpQkFBaUIsRUFBRSw0QkFBNEI7SUFDL0MsZUFBZSxFQUFFLGVBQWU7Q0FDakMsQ0FBQztBQUVGLDBFQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxzQkFBc0IsQ0FBQzs7Ozs7Ozs7OztBQ2xESjtBQUUvQyxJQUFJLHNCQUFzQixHQUFHO0lBQ2xDLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFlBQVksRUFBRSxPQUFPO0lBQ3JCLFlBQVksRUFBRSxPQUFPO0lBQ3JCLGFBQWEsRUFBRSxnQkFBZ0I7SUFDL0IsWUFBWSxFQUFFLGlCQUFpQjtJQUMvQixXQUFXLEVBQUUscURBQXFEO0lBQ2xFLGdCQUFnQixFQUFFLHVDQUF1QztJQUN6RCxhQUFhLEVBQUUseUJBQXlCO0lBQ3hDLGNBQWMsRUFBRSxVQUFVO0lBQzFCLGFBQWEsRUFBRSxtQ0FBbUM7SUFDbEQsc0JBQXNCLEVBQUUsK0NBQStDO0lBQ3ZFLFlBQVksRUFBRSxrQ0FBa0M7SUFDaEQsYUFBYSxFQUFFLG1DQUFtQztJQUNsRCxhQUFhLEVBQUUsaUNBQWlDO0lBQ2hELGdCQUFnQixFQUFFLHNEQUFzRDtJQUN4RSxnQkFBZ0IsRUFBRSxvREFBb0Q7SUFDdEUsY0FBYyxFQUFFLHFEQUFxRDtJQUNyRSxjQUFjLEVBQUUsbURBQW1EO0lBQ25FLGFBQWEsRUFDWCx3RUFBd0U7SUFDMUUsVUFBVSxFQUFFLDZDQUE2QztJQUN6RCxVQUFVLEVBQUUsOENBQThDO0lBQzFELFlBQVksRUFBRSxzQ0FBc0M7SUFDcEQsZUFBZSxFQUFFLGlEQUFpRDtJQUNsRSxrQkFBa0IsRUFBRSxxREFBcUQ7SUFDekUsYUFBYSxFQUFFLHVDQUF1QztJQUN0RCxrQkFBa0IsRUFBRSxvQ0FBb0M7SUFDeEQsYUFBYSxFQUNYLDhFQUE4RTtJQUNoRixNQUFNLEVBQUUsY0FBYztJQUN0QixTQUFTLEVBQUUsV0FBVztJQUN0QixpQkFBaUIsRUFBRSxlQUFlO0lBQ2xDLGtCQUFrQixFQUFFLGNBQWM7SUFDbEMsaUJBQWlCLEVBQUUsZUFBZTtJQUNsQyxhQUFhLEVBQUUsUUFBUTtJQUN2QixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLHNCQUFzQixDQUFDOzs7Ozs7Ozs7O0FDekNKO0FBRS9DLElBQUksb0JBQW9CLEdBQUc7SUFDaEMsWUFBWSxFQUFFLFlBQVk7SUFDMUIsWUFBWSxFQUFFLFlBQVk7SUFDMUIsWUFBWSxFQUFFLE9BQU87SUFDckIsYUFBYSxFQUFFLGtCQUFrQjtJQUNqQyxZQUFZLEVBQUUsbUJBQW1CO0lBQ2pDLFdBQVcsRUFBRSx5REFBeUQ7SUFDdEUsZ0JBQWdCLEVBQUUsNkNBQTZDO0lBQy9ELGFBQWEsRUFBRSwwQ0FBMEM7SUFDekQsY0FBYyxFQUFFLFdBQVc7SUFDM0IsYUFBYSxFQUFFLG9CQUFvQjtJQUNuQyxzQkFBc0IsRUFBRSwyQkFBMkI7SUFDbkQsWUFBWSxFQUFFLGdDQUFnQztJQUM5QyxhQUFhLEVBQUUsK0JBQStCO0lBQzlDLGFBQWEsRUFBRSw0Q0FBNEM7SUFDM0QsZ0JBQWdCLEVBQ2QsNkRBQTZEO0lBQy9ELGdCQUFnQixFQUFFLDhCQUE4QjtJQUNoRCxjQUFjLEVBQUUsa0NBQWtDO0lBQ2xELGNBQWMsRUFBRSxtQ0FBbUM7SUFDbkQsYUFBYSxFQUNYLHVFQUF1RTtJQUN6RSxVQUFVLEVBQUUsNENBQTRDO0lBQ3hELFVBQVUsRUFBRSw0Q0FBNEM7SUFDeEQsWUFBWSxFQUFFLGdDQUFnQztJQUM5QyxlQUFlLEVBQUUsbURBQW1EO0lBQ3BFLGtCQUFrQixFQUNoQixpRUFBaUU7SUFDbkUsYUFBYSxFQUFFLDhCQUE4QjtJQUM3QyxrQkFBa0IsRUFBRSw0QkFBNEI7SUFDaEQsYUFBYSxFQUFFLHVEQUF1RDtJQUN0RSxNQUFNLEVBQUUsZUFBZTtJQUN2QixTQUFTLEVBQUUsY0FBYztJQUN6QixZQUFZLEVBQUUsVUFBVTtJQUN4QixhQUFhLEVBQUUsU0FBUztJQUN4QixVQUFVLEVBQUUsTUFBTTtDQUNuQixDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDOzs7Ozs7Ozs7O0FDeENGO0FBRS9DLElBQUksb0JBQW9CLEdBQUc7SUFDaEMsWUFBWSxFQUFFLFNBQVM7SUFDdkIsWUFBWSxFQUFFLE9BQU87SUFDckIsWUFBWSxFQUFFLFNBQVM7SUFDdkIsWUFBWSxFQUFFLG9CQUFvQjtJQUNsQyxXQUFXLEVBQUUsd0JBQXdCO0lBQ3JDLGdCQUFnQixFQUFFLDRDQUE0QztJQUM5RCxhQUFhLEVBQUUsc0JBQXNCO0lBQ3JDLGFBQWEsRUFBRSwyQkFBMkI7SUFDMUMsY0FBYyxFQUFFLGVBQWU7SUFDL0IsYUFBYSxFQUFFLGdDQUFnQztJQUMvQyxZQUFZLEVBQUUsNkJBQTZCO0lBQzNDLGFBQWEsRUFBRSxzQ0FBc0M7SUFDckQsY0FBYyxFQUFFLHlDQUF5QztJQUN6RCxjQUFjLEVBQUUsa0RBQWtEO0lBQ2xFLGFBQWEsRUFDWCwrRUFBK0U7SUFDakYsVUFBVSxFQUFFLHVDQUF1QztJQUNuRCxVQUFVLEVBQUUsdUNBQXVDO0lBQ25ELFlBQVksRUFBRSx5Q0FBeUM7SUFDdkQsa0JBQWtCLEVBQUUsb0NBQW9DO0NBQ3pELENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7QUN6QkY7QUFFL0MsSUFBSSxvQkFBb0IsR0FBRztJQUNoQyxZQUFZLEVBQUUsTUFBTTtJQUNwQixZQUFZLEVBQUUsTUFBTTtJQUNwQixZQUFZLEVBQUUsT0FBTztJQUNyQixhQUFhLEVBQUUsYUFBYTtJQUM1QixZQUFZLEVBQUUsaUJBQWlCO0lBQy9CLFdBQVcsRUFBRSxtREFBbUQ7SUFDaEUsZ0JBQWdCLEVBQUUsd0NBQXdDO0lBQzFELHNCQUFzQixFQUNwQix1REFBdUQ7SUFDekQsYUFBYSxFQUFFLHNCQUFzQjtJQUNyQyxjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLEtBQUssRUFBRSxPQUFPO0lBQ2QsYUFBYSxFQUFFLHdCQUF3QjtJQUN2QyxzQkFBc0IsRUFBRSx1Q0FBdUM7SUFDL0QsWUFBWSxFQUFFLHNCQUFzQjtJQUNwQyxhQUFhLEVBQUUsK0JBQStCO0lBQzlDLGFBQWEsRUFBRSxrQ0FBa0M7SUFDakQsZ0JBQWdCLEVBQUUscURBQXFEO0lBQ3ZFLGdCQUFnQixFQUFFLCtCQUErQjtJQUNqRCxjQUFjLEVBQUUsd0JBQXdCO0lBQ3hDLGNBQWMsRUFBRSxpQ0FBaUM7SUFDakQsYUFBYSxFQUFFLCtCQUErQjtJQUM5QyxVQUFVLEVBQUUsNkJBQTZCO0lBQ3pDLFVBQVUsRUFBRSxxQ0FBcUM7SUFDakQsWUFBWSxFQUFFLDBCQUEwQjtJQUN4QyxlQUFlLEVBQUUscUNBQXFDO0lBQ3RELGtCQUFrQixFQUFFLHdEQUF3RDtJQUM1RSxhQUFhLEVBQUUsNEJBQTRCO0lBQzNDLGtCQUFrQixFQUFFLDJCQUEyQjtJQUMvQyxhQUFhLEVBQUUsMkNBQTJDO0lBQzFELGFBQWEsRUFBRSxpQ0FBaUM7SUFDaEQsbUJBQW1CLEVBQUUsZ0NBQWdDO0lBQ3JELE1BQU0sRUFBRSxVQUFVO0lBQ2xCLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFlBQVksRUFBRSxNQUFNO0lBQ3BCLGFBQWEsRUFBRSxNQUFNO0lBQ3JCLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFVBQVUsRUFBRSx5Q0FBeUM7SUFDckQsZUFBZSxFQUFFLHVDQUF1QztJQUN4RCxpQkFBaUIsRUFBRSwwQkFBMEI7SUFDN0MsZUFBZSxFQUFFLGdCQUFnQjtDQUNsQyxDQUFDO0FBQ0YsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDOzs7Ozs7Ozs7O0FDL0NGO0FBRS9DLElBQUksbUJBQW1CLEdBQUc7SUFDL0IsWUFBWSxFQUFFLFFBQVE7SUFDdEIsWUFBWSxFQUFFLE9BQU87SUFDckIsWUFBWSxFQUFFLFFBQVE7SUFDdEIsYUFBYSxFQUFFLHdCQUF3QjtJQUN2QyxZQUFZLEVBQUUsa0JBQWtCO0lBQ2hDLFdBQVcsRUFBRSwwQkFBMEI7SUFDdkMsZ0JBQWdCLEVBQUUsb0NBQW9DO0lBQ3RELGFBQWEsRUFBRSw2QkFBNkI7SUFDNUMsY0FBYyxFQUFFLFlBQVk7SUFDNUIsYUFBYSxFQUFFLG9DQUFvQztJQUNuRCxzQkFBc0IsRUFBRSwyQ0FBMkM7SUFDbkUsWUFBWSxFQUFFLHVDQUF1QztJQUNyRCxhQUFhLEVBQUUsdUNBQXVDO0lBQ3RELGFBQWEsRUFBRSxxQ0FBcUM7SUFDcEQsZ0JBQWdCLEVBQUUsc0RBQXNEO0lBQ3hFLGdCQUFnQixFQUFFLDRDQUE0QztJQUM5RCxjQUFjLEVBQUUsd0NBQXdDO0lBQ3hELGNBQWMsRUFBRSwyQ0FBMkM7SUFDM0QsYUFBYSxFQUNYLCtFQUErRTtJQUNqRixVQUFVLEVBQUUsbURBQW1EO0lBQy9ELFVBQVUsRUFBRSxvREFBb0Q7SUFDaEUsWUFBWSxFQUFFLHNDQUFzQztJQUNwRCxlQUFlLEVBQUUsa0NBQWtDO0lBQ25ELGtCQUFrQixFQUNoQiw2REFBNkQ7SUFDL0QsYUFBYSxFQUFFLHFEQUFxRDtJQUNwRSxrQkFBa0IsRUFBRSw4QkFBOEI7SUFDbEQsYUFBYSxFQUNYLDZFQUE2RTtJQUMvRSxNQUFNLEVBQUUsY0FBYztJQUN0QixTQUFTLEVBQUUsTUFBTTtDQUNsQixDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDOzs7Ozs7Ozs7O0FDckNEO0FBRS9DLElBQUksdUJBQXVCLEdBQUc7SUFDbkMsWUFBWSxFQUFFLFVBQVU7SUFDeEIsWUFBWSxFQUFFLFNBQVM7SUFDdkIsWUFBWSxFQUFFLFdBQVc7SUFDekIsYUFBYSxFQUFFLG9CQUFvQjtJQUNuQyxZQUFZLEVBQUUsbUJBQW1CO0lBQ2pDLFdBQVcsRUFBRSxnREFBZ0Q7SUFDN0QsZ0JBQWdCLEVBQUUsb0NBQW9DO0lBQ3RELHNCQUFzQixFQUNwQiw0REFBNEQ7SUFDOUQsYUFBYSxFQUFFLCtCQUErQjtJQUM5QyxjQUFjLEVBQUUsY0FBYztJQUM5QixLQUFLLEVBQUUsT0FBTztJQUNkLGFBQWEsRUFBRSxpQ0FBaUM7SUFDaEQsc0JBQXNCLEVBQ3BCLHNEQUFzRDtJQUN4RCxZQUFZLEVBQUUsNEJBQTRCO0lBQzFDLGFBQWEsRUFBRSw4Q0FBOEM7SUFDN0QsYUFBYSxFQUFFLDRDQUE0QztJQUMzRCxnQkFBZ0IsRUFBRSwwREFBMEQ7SUFDNUUsZ0JBQWdCLEVBQUUsaUNBQWlDO0lBQ25ELGNBQWMsRUFBRSxrQ0FBa0M7SUFDbEQsY0FBYyxFQUFFLGtEQUFrRDtJQUNsRSxhQUFhLEVBQ1gsbUVBQW1FO0lBQ3JFLFVBQVUsRUFBRSwwQ0FBMEM7SUFDdEQsVUFBVSxFQUFFLDBDQUEwQztJQUN0RCxZQUFZLEVBQUUsc0NBQXNDO0lBQ3BELGVBQWUsRUFBRSx5Q0FBeUM7SUFDMUQsa0JBQWtCLEVBQ2hCLCtFQUErRTtJQUNqRixhQUFhLEVBQUUsNENBQTRDO0lBQzNELGtCQUFrQixFQUFFLG1DQUFtQztJQUN2RCxhQUFhLEVBQ1gseUZBQXlGO0lBQzNGLE1BQU0sRUFBRSxpQkFBaUI7SUFDekIsU0FBUyxFQUFFLGVBQWU7SUFDMUIsUUFBUSxFQUFFLGdCQUFnQjtJQUMxQixXQUFXLEVBQUUsU0FBUztJQUN0QixZQUFZLEVBQUUsTUFBTTtJQUNwQixhQUFhLEVBQUUsUUFBUTtJQUN2QixVQUFVLEVBQUUsT0FBTztJQUNuQixVQUFVLEVBQUUsZ0RBQWdEO0lBQzVELGVBQWUsRUFBRSwwREFBMEQ7SUFDM0UsaUJBQWlCLEVBQUUseUNBQXlDO0lBQzVELGVBQWUsRUFBRSxpQkFBaUI7Q0FDbkMsQ0FBQztBQUVGLDBFQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyx1QkFBdUIsQ0FBQzs7Ozs7Ozs7OztBQ2xETDtBQUUvQyxJQUFJLHFCQUFxQixHQUFHO0lBQ2pDLFlBQVksRUFBRSxXQUFXO0lBQ3pCLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFlBQVksRUFBRSxZQUFZO0lBQzFCLGFBQWEsRUFBRSxrQkFBa0I7SUFDakMsWUFBWSxFQUFFLG9CQUFvQjtJQUNsQyxXQUFXLEVBQUUsMkNBQTJDO0lBQ3hELGdCQUFnQixFQUFFLG9DQUFvQztJQUN0RCxhQUFhLEVBQUUsNEJBQTRCO0lBQzNDLGNBQWMsRUFBRSxZQUFZO0lBQzVCLGFBQWEsRUFBRSxrREFBa0Q7SUFDakUsc0JBQXNCLEVBQUUscUNBQXFDO0lBQzdELFlBQVksRUFBRSxtQ0FBbUM7SUFDakQsYUFBYSxFQUFFLDZDQUE2QztJQUM1RCxjQUFjLEVBQUUseUNBQXlDO0lBQ3pELGNBQWMsRUFBRSx5Q0FBeUM7SUFDekQsYUFBYSxFQUFFLG9GQUFvRjtJQUNuRyxVQUFVLEVBQUUseURBQXlEO0lBQ3JFLFVBQVUsRUFBRSx3REFBd0Q7SUFDcEUsWUFBWSxFQUFFLGtEQUFrRDtJQUNoRSxhQUFhLEVBQUUsc0RBQXNEO0lBQ3JFLGtCQUFrQixFQUFFLHVDQUF1QztJQUMzRCxzQkFBc0IsRUFBRSwyRUFBMkU7SUFDcEcsS0FBSyxFQUFFLFNBQVM7SUFDaEIsb0JBQW9CLEVBQUUsa0RBQWtEO0lBQ3hFLGFBQWEsRUFBRSw2Q0FBNkM7SUFDM0QsZ0JBQWdCLEVBQUUsdUVBQXVFO0lBQzFGLGdCQUFnQixFQUFFLDBDQUEwQztJQUM1RCxlQUFlLEVBQUUsMENBQTBDO0lBQzNELGtCQUFrQixFQUFFLHNFQUFzRTtJQUMxRixhQUFhLEVBQUUsdUdBQXVHO0lBQ3JILGFBQWEsRUFBRSxvREFBb0Q7SUFDbkUsbUJBQW1CLEVBQUUsZ0NBQWdDO0lBQ3JELE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLFdBQVcsRUFBRSxVQUFVO0lBQ3ZCLFlBQVksRUFBRSxTQUFTO0lBQ3ZCLGFBQWEsRUFBRSxTQUFTO0lBQ3hCLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFVBQVUsRUFBRSx3Q0FBd0M7SUFDcEQsZUFBZSxFQUFFLDREQUE0RDtJQUM3RSxpQkFBaUIsRUFBRSx3Q0FBd0M7SUFDM0QsZUFBZSxFQUFFLG1CQUFtQjtJQUNwQyxRQUFRLEVBQUUsS0FBSztJQUNmLFFBQVEsRUFBRSxLQUFLO0lBQ2YsYUFBYSxFQUFFLHFEQUFxRDtJQUNwRSxjQUFjLEVBQUUscUNBQXFDO0lBQ3JELGdCQUFnQixFQUFFLDRCQUE0QjtJQUM5QyxhQUFhLEVBQUUscUVBQXFFO0lBQ3BGLGNBQWMsRUFBRSw2Q0FBNkM7SUFDN0QsZ0JBQWdCLEVBQUUsb0NBQW9DO0NBQ3ZELENBQUM7QUFDRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcscUJBQXFCLENBQUM7Ozs7Ozs7Ozs7QUN2REg7QUFFL0MsSUFBSSxvQkFBb0IsR0FBRztJQUNoQyxZQUFZLEVBQUUsT0FBTztJQUNyQixZQUFZLEVBQUUsT0FBTztJQUNyQixZQUFZLEVBQUUsUUFBUTtJQUN0QixZQUFZLEVBQUUscUJBQXFCO0lBQ25DLFdBQVcsRUFBRSx3QkFBd0I7SUFDckMsZ0JBQWdCLEVBQUUsc0NBQXNDO0lBQ3hELGFBQWEsRUFBRSx1QkFBdUI7SUFDdEMsYUFBYSxFQUFFLDhCQUE4QjtJQUM3QyxjQUFjLEVBQUUsWUFBWTtJQUM1QixhQUFhLEVBQUUsaUNBQWlDO0lBQ2hELFlBQVksRUFBRSwyQkFBMkI7SUFDekMsYUFBYSxFQUFFLDJDQUEyQztJQUMxRCxjQUFjLEVBQUUsNkNBQTZDO0lBQzdELGNBQWMsRUFBRSw4Q0FBOEM7SUFDOUQsYUFBYSxFQUNYLDRFQUE0RTtJQUM5RSxVQUFVLEVBQUUsOENBQThDO0lBQzFELFVBQVUsRUFBRSw4Q0FBOEM7SUFDMUQsWUFBWSxFQUFFLDZEQUE2RDtJQUMzRSxrQkFBa0IsRUFBRSw0Q0FBNEM7Q0FDakUsQ0FBQztBQUVGLDBFQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxvQkFBb0IsQ0FBQzs7Ozs7Ozs7OztBQ3pCRjtBQUUvQyxJQUFJLDhCQUE4QixHQUFHO0lBQzFDLFlBQVksRUFBRSxLQUFLO0lBQ25CLFlBQVksRUFBRSxLQUFLO0lBQ25CLFlBQVksRUFBRSxNQUFNO0lBQ3BCLGFBQWEsRUFBRSxRQUFRO0lBQ3ZCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsV0FBVyxFQUFFLFlBQVk7SUFDekIsZ0JBQWdCLEVBQUUsU0FBUztJQUMzQixhQUFhLEVBQUUsWUFBWTtJQUMzQixjQUFjLEVBQUUsUUFBUTtJQUN4QixhQUFhLEVBQUUsUUFBUTtJQUN2QixzQkFBc0IsRUFBRSxXQUFXO0lBQ25DLFlBQVksRUFBRSxVQUFVO0lBQ3hCLGFBQWEsRUFBRSxnQkFBZ0I7SUFDL0IsYUFBYSxFQUFFLGtCQUFrQjtJQUNqQyxnQkFBZ0IsRUFBRSx5QkFBeUI7SUFDM0MsZ0JBQWdCLEVBQUUsZ0JBQWdCO0lBQ2xDLGNBQWMsRUFBRSxnQkFBZ0I7SUFDaEMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxhQUFhLEVBQUUsK0JBQStCO0lBQzlDLFVBQVUsRUFBRSxxQkFBcUI7SUFDakMsVUFBVSxFQUFFLHFCQUFxQjtJQUNqQyxZQUFZLEVBQUUsaUJBQWlCO0lBQy9CLGVBQWUsRUFBRSxzQkFBc0I7SUFDdkMsa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLGFBQWEsRUFBRSxjQUFjO0lBQzdCLGtCQUFrQixFQUFFLFNBQVM7SUFDN0IsYUFBYSxFQUFFLHFCQUFxQjtJQUNwQyxNQUFNLEVBQUUsTUFBTTtJQUNkLFNBQVMsRUFBRSxNQUFNO0lBQ2pCLFlBQVksRUFBRSxJQUFJO0lBQ2xCLGFBQWEsRUFBRSxHQUFHO0lBQ2xCLFVBQVUsRUFBRSxHQUFHO0lBQ2YsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixlQUFlLEVBQUUsc0JBQXNCO0lBQ3ZDLGlCQUFpQixFQUFFLFNBQVM7SUFDNUIsZUFBZSxFQUFFLEtBQUs7Q0FDdkIsQ0FBQztBQUVGLDBFQUFrQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyw4QkFBOEIsQ0FBQzs7Ozs7Ozs7OztBQ3pDZjtBQUUvQyxJQUFJLG9CQUFvQixHQUFHO0lBQ2hDLFlBQVksRUFBRSxVQUFVO0lBQ3hCLFlBQVksRUFBRSxXQUFXO0lBQ3pCLFlBQVksRUFBRSxVQUFVO0lBQ3hCLGFBQWEsRUFBRSxpQkFBaUI7SUFDaEMsWUFBWSxFQUFFLG1CQUFtQjtJQUNqQyxXQUFXLEVBQUUsa0RBQWtEO0lBQy9ELGdCQUFnQixFQUFFLG9DQUFvQztJQUN0RCxhQUFhLEVBQUUsOEJBQThCO0lBQzdDLGNBQWMsRUFBRSxlQUFlO0lBQy9CLGFBQWEsRUFBRSxpQ0FBaUM7SUFDaEQsc0JBQXNCLEVBQUUsa0RBQWtEO0lBQzFFLFlBQVksRUFBRSxrQ0FBa0M7SUFDaEQsYUFBYSxFQUFFLDRDQUE0QztJQUMzRCxhQUFhLEVBQUUsd0NBQXdDO0lBQ3ZELGdCQUFnQixFQUFFLHFEQUFxRDtJQUN2RSxnQkFBZ0IsRUFBRSwyQ0FBMkM7SUFDN0QsY0FBYyxFQUFFLGtEQUFrRDtJQUNsRSxjQUFjLEVBQUUsK0NBQStDO0lBQy9ELGFBQWEsRUFDWCxnRUFBZ0U7SUFDbEUsVUFBVSxFQUFFLHNDQUFzQztJQUNsRCxVQUFVLEVBQUUsd0NBQXdDO0lBQ3BELFlBQVksRUFBRSxpREFBaUQ7SUFDL0QsZUFBZSxFQUFFLHVDQUF1QztJQUN4RCxrQkFBa0IsRUFDaEIsZ0ZBQWdGO0lBQ2xGLGFBQWEsRUFBRSwrQ0FBK0M7SUFDOUQsa0JBQWtCLEVBQUUsdUNBQXVDO0lBQzNELGFBQWEsRUFDWCxpRkFBaUY7SUFDbkYsTUFBTSxFQUFFLG9CQUFvQjtJQUM1QixTQUFTLEVBQUUscUJBQXFCO0lBQ2hDLGlCQUFpQixFQUFFLGlCQUFpQjtJQUNwQyxrQkFBa0IsRUFBRSxrQkFBa0I7SUFDdEMsaUJBQWlCLEVBQUUsa0JBQWtCO0lBQ3JDLGFBQWEsRUFBRSxTQUFTO0lBQ3hCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUM7Ozs7Ozs7OztBQzFDeEQ7QUFBQSwyQkFBMkI7QUFDMkI7QUFFL0MsSUFBSSxvQkFBb0IsR0FBRztJQUNoQyxZQUFZLEVBQUUsWUFBWTtJQUMxQixZQUFZLEVBQUUsT0FBTztJQUNyQixZQUFZLEVBQUUsUUFBUTtJQUN0QixhQUFhLEVBQUUsaUJBQWlCO0lBQ2hDLFlBQVksRUFBRSxpQkFBaUI7SUFDL0IsV0FBVyxFQUFFLG9EQUFvRDtJQUNqRSxnQkFBZ0IsRUFBRSxxQ0FBcUM7SUFDdkQsYUFBYSxFQUFFLG1CQUFtQjtJQUNsQyxjQUFjLEVBQUUsU0FBUztJQUN6QixhQUFhLEVBQUUsNEJBQTRCO0lBQzNDLHNCQUFzQixFQUFFLDRDQUE0QztJQUNwRSxZQUFZLEVBQUUsNEJBQTRCO0lBQzFDLGFBQWEsRUFBRSxtQ0FBbUM7SUFDbEQsZ0JBQWdCLEVBQUUsb0NBQW9DO0lBQ3RELGNBQWMsRUFBRSwyQ0FBMkM7SUFDM0QsY0FBYyxFQUFFLDZDQUE2QztJQUM3RCxhQUFhLEVBQ1gsNEVBQTRFO0lBQzlFLFVBQVUsRUFBRSwwQ0FBMEM7SUFDdEQsVUFBVSxFQUFFLDZDQUE2QztJQUN6RCxZQUFZLEVBQUUsMENBQTBDO0lBQ3hELGVBQWUsRUFBRSx3Q0FBd0M7SUFDekQsa0JBQWtCLEVBQ2hCLHNGQUFzRjtJQUN4RixhQUFhLEVBQUUsb0NBQW9DO0lBQ25ELGtCQUFrQixFQUFFLG1DQUFtQztJQUN2RCxhQUFhLEVBQ1gsNEVBQTRFO0lBQzlFLE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLFNBQVMsRUFBRSxTQUFTO0NBQ3JCLENBQUM7QUFFRiwwRUFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7QUNwQ0Y7QUFFL0MsSUFBSSxvQkFBb0IsR0FBRztJQUNoQyxZQUFZLEVBQUUsTUFBTTtJQUNwQixZQUFZLEVBQUUsT0FBTztJQUNyQixZQUFZLEVBQUUsZ0JBQWdCO0lBQzlCLGFBQWEsRUFBRSxxQkFBcUI7SUFDcEMsWUFBWSxFQUFFLGlCQUFpQjtJQUMvQixXQUFXLEVBQUUsdURBQXVEO0lBQ3BFLGdCQUFnQixFQUFFLGlEQUFpRDtJQUNuRSxhQUFhLEVBQUUsZ0NBQWdDO0lBQy9DLGNBQWMsRUFBRSxhQUFhO0lBQzdCLGFBQWEsRUFBRSw2QkFBNkI7SUFDNUMsWUFBWSxFQUFFLGlDQUFpQztJQUMvQyxhQUFhLEVBQUUsMkJBQTJCO0lBQzFDLGdCQUFnQixFQUFFLG1DQUFtQztJQUNyRCxjQUFjLEVBQUUsb0NBQW9DO0lBQ3BELGNBQWMsRUFBRSxzQ0FBc0M7SUFDdEQsYUFBYSxFQUNYLHVFQUF1RTtJQUN6RSxVQUFVLEVBQUUscURBQXFEO0lBQ2pFLFVBQVUsRUFBRSx1REFBdUQ7SUFDbkUsWUFBWSxFQUFFLDJDQUEyQztJQUN6RCxlQUFlLEVBQUUsbUNBQW1DO0lBQ3BELGtCQUFrQixFQUNoQiwrREFBK0Q7SUFDakUsYUFBYSxFQUFFLG9DQUFvQztJQUNuRCxrQkFBa0IsRUFBRSxpQ0FBaUM7SUFDckQsYUFBYSxFQUNYLHVFQUF1RTtJQUN6RSxNQUFNLEVBQUUsWUFBWTtJQUNwQixTQUFTLEVBQUUsUUFBUTtDQUNwQixDQUFDO0FBRUYsMEVBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2pDMUI7QUFDWTtBQUUxQzs7OztHQUlHO0FBQ0g7SUFBNkIsMEVBQUk7SUEwQy9CO1FBQUEsWUFDRSxpQkFBTyxTQUNSO1FBSk8sYUFBTyxHQUFXLE9BQU8sQ0FBQzs7SUFJbEMsQ0FBQztJQTFDRCxzQkFBVyxvQkFBUzthQUFwQjtZQUNFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDO2dCQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxjQUFjLEdBQUc7Z0JBQ3ZCLEtBQUssRUFBRSxVQUFTLEtBQUssRUFBRSxhQUFhO29CQUNsQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hCLENBQUM7Z0JBQ0QsUUFBUSxFQUFFLFVBQVMsS0FBSyxFQUFFLGFBQWE7b0JBQ3JDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNqQixDQUFDO2dCQUNELEtBQUssRUFBRSxVQUFTLEtBQUssRUFBRSxhQUFhO29CQUNsQyxNQUFNLENBQUMsS0FBSyxJQUFJLGFBQWEsQ0FBQztnQkFDaEMsQ0FBQztnQkFDRCxRQUFRLEVBQUUsVUFBUyxLQUFLLEVBQUUsYUFBYTtvQkFDckMsTUFBTSxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUM7Z0JBQ2hDLENBQUM7Z0JBQ0QsUUFBUSxFQUFFLFVBQVMsS0FBSyxFQUFFLGFBQWE7b0JBQ3JDLE1BQU0sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLENBQUM7Z0JBQ0QsV0FBVyxFQUFFLFVBQVMsS0FBSyxFQUFFLGFBQWE7b0JBQ3hDLE1BQU0sQ0FBQyxDQUNMLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ2xFLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxPQUFPLEVBQUUsVUFBUyxLQUFLLEVBQUUsYUFBYTtvQkFDcEMsTUFBTSxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUM7Z0JBQy9CLENBQUM7Z0JBQ0QsSUFBSSxFQUFFLFVBQVMsS0FBSyxFQUFFLGFBQWE7b0JBQ2pDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDO2dCQUMvQixDQUFDO2dCQUNELGNBQWMsRUFBRSxVQUFTLEtBQUssRUFBRSxhQUFhO29CQUMzQyxNQUFNLENBQUMsS0FBSyxJQUFJLGFBQWEsQ0FBQztnQkFDaEMsQ0FBQztnQkFDRCxXQUFXLEVBQUUsVUFBUyxLQUFLLEVBQUUsYUFBYTtvQkFDeEMsTUFBTSxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUM7Z0JBQ2hDLENBQUM7YUFDRixDQUFDO1lBQ0YsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7UUFDaEMsQ0FBQzs7O09BQUE7SUFNTSx5QkFBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBQ0Qsc0JBQVcsNkJBQVE7YUFBbkI7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDO2FBQ0QsVUFBb0IsS0FBYTtZQUMvQixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFBQyxNQUFNLENBQUM7WUFDbkIsS0FBSyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENBQUM7OztPQU5BO0lBT00sdUJBQUssR0FBWixVQUFhLEtBQVU7UUFDckIsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNTLDJCQUFTLEdBQW5CLGNBQXVCLENBQUM7SUFDZCwyQkFBUyxHQUFuQixjQUF1QixDQUFDO0lBaEVqQixzQkFBYyxHQUF3QixJQUFJLENBQUM7SUFpRXBELGNBQUM7Q0FBQSxDQWxFNEIsbURBQUksR0FrRWhDO0FBbEVtQjtBQTBFcEI7O0dBRUc7QUFDSDtJQUFtQyxnRkFBTztJQUd4QztRQUFBLFlBQ0UsaUJBQU8sU0FDUjtRQUhTLFdBQUssR0FBd0IsSUFBSSxDQUFDOztJQUc1QyxDQUFDO0lBQ00sZ0NBQVEsR0FBZixVQUFnQixLQUEwQjtRQUN4QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBQ0Qsc0JBQVcsdUNBQVk7YUFBdkI7WUFDRSxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2YsQ0FBQzs7O09BQUE7SUFDSCxvQkFBQztBQUFELENBQUMsQ0Faa0MsT0FBTyxHQVl6Qzs7QUFDRDs7O0dBR0c7QUFDSDtJQUEwQyx1RkFBYTtJQUdyRDtRQUFBLFlBQ0UsaUJBQU8sU0FDUjtRQUpNLFdBQUssR0FBYSxFQUFFLENBQUM7UUFDckIsZUFBUyxHQUFhLEVBQUUsQ0FBQzs7SUFHaEMsQ0FBQztJQUNNLHNDQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUNTLHdDQUFTLEdBQW5CO1FBQ0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNTLHdDQUFTLEdBQW5CO1FBQ0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNPLHdDQUFTLEdBQWpCLFVBQWtCLElBQWM7UUFDOUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQUMsTUFBTSxDQUFDO1FBQ3hCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNTLDRDQUFhLEdBQXZCLFVBQXdCLElBQVM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUNTLDRDQUFhLEdBQXZCLFVBQXdCLElBQVM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUNILDJCQUFDO0FBQUQsQ0FBQyxDQTVCeUMsYUFBYSxHQTRCdEQ7O0FBQ0Q7O0dBRUc7QUFDSDtJQUEyQyx3RkFBYTtJQUN0RDtlQUNFLGlCQUFPO0lBQ1QsQ0FBQztJQUNNLHVDQUFPLEdBQWQ7UUFDRSxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUNELHNCQUFXLCtDQUFZO2FBQXZCO1lBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQztRQUNkLENBQUM7OztPQUFBO0lBQ1MseUNBQVMsR0FBbkI7UUFDRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBQ0gsNEJBQUM7QUFBRCxDQUFDLENBYjBDLGFBQWEsR0FhdkQ7O0FBQ0Q7SUFBMkMsd0ZBQWE7SUFJdEQ7ZUFDRSxpQkFBTztJQUNULENBQUM7SUFDTSx1Q0FBTyxHQUFkO1FBQ0UsTUFBTSxDQUFDLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFDUyx5Q0FBUyxHQUFuQjtRQUNFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBQyxNQUFNLENBQUM7UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBQ0gsNEJBQUM7QUFBRCxDQUFDLENBZDBDLGFBQWEsR0FjdkQ7O0FBRUQsK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLCtEQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDMUUsK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUMxQixnQkFBZ0IsRUFDaEIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLEVBQ3RCO0lBQ0UsTUFBTSxDQUFDLElBQUksb0JBQW9CLEVBQUUsQ0FBQztBQUNwQyxDQUFDLEVBQ0QsZUFBZSxDQUNoQixDQUFDO0FBQ0YsK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUMxQixpQkFBaUIsRUFDakIsRUFBRSxFQUNGO0lBQ0UsTUFBTSxDQUFDLElBQUkscUJBQXFCLEVBQUUsQ0FBQztBQUNyQyxDQUFDLEVBQ0QsZUFBZSxDQUNoQixDQUFDO0FBQ0YsK0RBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUMxQixpQkFBaUIsRUFDakIsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLEVBQ2hEO0lBQ0UsTUFBTSxDQUFDLElBQUkscUJBQXFCLEVBQUUsQ0FBQztBQUNyQyxDQUFDLEVBQ0QsZUFBZSxDQUNoQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0xzQztBQUVrQjtBQUM5QjtBQUNtQztBQUUvRCw4Q0FBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsQixNQUFNLEVBQUUsVUFBUyxLQUFLO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDUixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3hCLDBHQUFpQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVksRUFBRSxVQUFTLEtBQUs7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNSLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDeEIsMEdBQWlCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLElBQUksTUFBTSxHQUFHLElBQUksOEVBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0MsRUFBRSxFQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQ3JDLENBQUM7WUFDRCxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsNERBQVcsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBRUwiLCJmaWxlIjoiLi9wYWNrYWdlcy9zdXJ2ZXktanF1ZXJ5L3N1cnZleS5qcXVlcnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJqcXVlcnlcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJTdXJ2ZXlcIiwgW1wianF1ZXJ5XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlN1cnZleVwiXSA9IGZhY3RvcnkocmVxdWlyZShcImpxdWVyeVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiU3VydmV5XCJdID0gZmFjdG9yeShyb290W1wialF1ZXJ5XCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNThfXykge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxMzMpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGVkMTdmMjMxZTM5NTg1OWM0OWExIiwiZXhwb3J0IHZhciBfX2Fzc2lnbiA9XG4gIE9iamVjdFtcImFzc2lnblwiXSB8fFxuICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBwIGluIHMpXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRhcmdldFtwXSA9IHNbcF07XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHModGhpc0NsYXNzLCBiYXNlQ2xhc3MpIHtcbiAgZm9yICh2YXIgcCBpbiBiYXNlQ2xhc3MpXG4gICAgaWYgKGJhc2VDbGFzcy5oYXNPd25Qcm9wZXJ0eShwKSkgdGhpc0NsYXNzW3BdID0gYmFzZUNsYXNzW3BdO1xuICBmdW5jdGlvbiBfXygpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yID0gdGhpc0NsYXNzO1xuICB9XG4gIHRoaXNDbGFzcy5wcm90b3R5cGUgPVxuICAgIGJhc2VDbGFzcyA9PT0gbnVsbFxuICAgICAgPyBPYmplY3QuY3JlYXRlKGJhc2VDbGFzcylcbiAgICAgIDogKChfXy5wcm90b3R5cGUgPSBiYXNlQ2xhc3MucHJvdG90eXBlKSwgbmV3IF9fKCkpO1xufVxuXG5kZWNsYXJlIHZhciBSZWZsZWN0O1xuXG5leHBvcnQgdmFyIF9fZGVjb3JhdGUgPSBmdW5jdGlvbihkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgciA9XG4gICAgICBjIDwgM1xuICAgICAgICA/IHRhcmdldFxuICAgICAgICA6IGRlc2MgPT09IG51bGxcbiAgICAgICAgICA/IChkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkpXG4gICAgICAgICAgOiBkZXNjLFxuICAgIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZVxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuICAgICAgaWYgKChkID0gZGVjb3JhdG9yc1tpXSkpXG4gICAgICAgIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9lbnRyaWVzL2NodW5rcy9oZWxwZXJzLnRzIiwiaW1wb3J0IHsgSGVscGVycywgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgcHJpdmF0ZSBzdGF0aWMgbWVyZ2FibGVWYWx1ZXMgPSBbXG4gICAgXCJ0eXBlVmFsdWVcIixcbiAgICBcImNob2ljZXNWYWx1ZVwiLFxuICAgIFwicmVhZE9ubHlWYWx1ZVwiLFxuICAgIFwidmlzaWJsZVZhbHVlXCIsXG4gICAgXCJpc1NlcmlhbGl6YWJsZVwiLFxuICAgIFwiaXNMb2NhbGl6YWJsZVZhbHVlXCIsXG4gICAgXCJjbGFzc05hbWVcIixcbiAgICBcImFsdGVybmF0aXZlTmFtZVwiLFxuICAgIFwiY2xhc3NOYW1lUGFydFwiLFxuICAgIFwiYmFzZUNsYXNzTmFtZVwiLFxuICAgIFwiZGVmYXVsdFZhbHVlXCIsXG4gICAgXCJzZXJpYWxpemF0aW9uUHJvcGVydHlcIixcbiAgICBcIm9uR2V0VmFsdWVcIixcbiAgICBcIm9uU2V0VmFsdWVcIlxuICBdO1xuICBwcml2YXRlIHR5cGVWYWx1ZTogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBjaG9pY2VzVmFsdWU6IEFycmF5PGFueT4gPSBudWxsO1xuICBwcml2YXRlIGlzUmVxdWlyZWRWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRPbmx5VmFsdWUgPSBudWxsO1xuICBwcml2YXRlIHZpc2libGVWYWx1ZSA9IG51bGw7XG4gIHByaXZhdGUgaXNMb2NhbGl6YWJsZVZhbHVlID0gbnVsbDtcbiAgcHJpdmF0ZSBjaG9pY2VzZnVuYzogKG9iajogYW55KSA9PiBBcnJheTxhbnk+ID0gbnVsbDtcbiAgcHVibGljIGlzU2VyaWFsaXphYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIGFsdGVybmF0aXZlTmFtZTogc3RyaW5nID0gbnVsbDtcbiAgcHVibGljIGNsYXNzTmFtZVBhcnQ6IHN0cmluZyA9IG51bGw7XG4gIHB1YmxpYyBiYXNlQ2xhc3NOYW1lOiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsO1xuICBwdWJsaWMgc2VyaWFsaXphdGlvblByb3BlcnR5OiBzdHJpbmcgPSBudWxsO1xuICBwdWJsaWMgb25HZXRWYWx1ZTogKG9iajogYW55KSA9PiBhbnkgPSBudWxsO1xuICBwdWJsaWMgb25TZXRWYWx1ZTogKG9iajogYW55LCB2YWx1ZTogYW55LCBqc29uQ29udjogSnNvbk9iamVjdCkgPT4gYW55ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBpc1JlcXVpcmVkOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICB0aGlzLmlzUmVxdWlyZWRWYWx1ZSA9IGlzUmVxdWlyZWQ7XG4gIH1cbiAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudHlwZVZhbHVlID8gdGhpcy50eXBlVmFsdWUgOiBcInN0cmluZ1wiO1xuICB9XG4gIHB1YmxpYyBzZXQgdHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy50eXBlVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXF1aXJlZFZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVG9Vc2VHZXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vbkdldFZhbHVlIHx8IHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5O1xuICB9XG4gIHB1YmxpYyBpc0RlZmF1bHRWYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFIZWxwZXJzLmlzVmFsdWVFbXB0eSh0aGlzLmRlZmF1bHRWYWx1ZSkpXG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWUgPT0gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gXCJcIiB8fCBIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKG9iajogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5vbkdldFZhbHVlKSByZXR1cm4gdGhpcy5vbkdldFZhbHVlKG9iaik7XG4gICAgaWYgKHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5KVxuICAgICAgcmV0dXJuIG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0uZ2V0SnNvbigpO1xuICAgIHJldHVybiBvYmpbdGhpcy5uYW1lXTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydHlWYWx1ZShvYmo6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNMb2NhbGl6YWJsZSkgcmV0dXJuIG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0udGV4dDtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZShvYmopO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVG9Vc2VTZXRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vblNldFZhbHVlIHx8IHRoaXMuc2VyaWFsaXphdGlvblByb3BlcnR5O1xuICB9XG4gIHB1YmxpYyBzZXRWYWx1ZShvYmo6IGFueSwgdmFsdWU6IGFueSwganNvbkNvbnY6IEpzb25PYmplY3QpIHtcbiAgICBpZiAodGhpcy5vblNldFZhbHVlKSB7XG4gICAgICB0aGlzLm9uU2V0VmFsdWUob2JqLCB2YWx1ZSwganNvbkNvbnYpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zZXJpYWxpemF0aW9uUHJvcGVydHkpXG4gICAgICAgIG9ialt0aGlzLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV0uc2V0SnNvbih2YWx1ZSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0cnVlXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9ialt0aGlzLm5hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRPYmpUeXBlKG9ialR5cGU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jbGFzc05hbWVQYXJ0KSByZXR1cm4gb2JqVHlwZTtcbiAgICByZXR1cm4gb2JqVHlwZS5yZXBsYWNlKHRoaXMuY2xhc3NOYW1lUGFydCwgXCJcIik7XG4gIH1cbiAgcHVibGljIGdldENsYXNzTmFtZShjbGFzc05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NOYW1lUGFydCAmJiBjbGFzc05hbWUuaW5kZXhPZih0aGlzLmNsYXNzTmFtZVBhcnQpIDwgMFxuICAgICAgPyBjbGFzc05hbWUgKyB0aGlzLmNsYXNzTmFtZVBhcnRcbiAgICAgIDogY2xhc3NOYW1lO1xuICB9XG4gIHB1YmxpYyBnZXQgY2hvaWNlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDaG9pY2VzKG51bGwpO1xuICB9XG4gIHB1YmxpYyBnZXRDaG9pY2VzKG9iajogYW55KTogQXJyYXk8YW55PiB7XG4gICAgaWYgKHRoaXMuY2hvaWNlc1ZhbHVlICE9IG51bGwpIHJldHVybiB0aGlzLmNob2ljZXNWYWx1ZTtcbiAgICBpZiAodGhpcy5jaG9pY2VzZnVuYyAhPSBudWxsKSByZXR1cm4gdGhpcy5jaG9pY2VzZnVuYyhvYmopO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBzZXRDaG9pY2VzKHZhbHVlOiBBcnJheTxhbnk+LCB2YWx1ZUZ1bmM6ICgpID0+IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLmNob2ljZXNWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuY2hvaWNlc2Z1bmMgPSB2YWx1ZUZ1bmM7XG4gIH1cbiAgcHVibGljIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkT25seVZhbHVlICE9IG51bGwgPyB0aGlzLnJlYWRPbmx5VmFsdWUgOiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlYWRPbmx5KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMucmVhZE9ubHlWYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVZhbHVlICE9IG51bGwgPyB0aGlzLnZpc2libGVWYWx1ZSA6IHRydWU7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMudmlzaWJsZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNMb2NhbGl6YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvY2FsaXphYmxlVmFsdWUgIT0gbnVsbCA/IHRoaXMuaXNMb2NhbGl6YWJsZVZhbHVlIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIHNldCBpc0xvY2FsaXphYmxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNMb2NhbGl6YWJsZVZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBtZXJnZVdpdGgocHJvcDogSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgdmFyIHZhbHVlc05hbWVzID0gSnNvbk9iamVjdFByb3BlcnR5Lm1lcmdhYmxlVmFsdWVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMubWVyZ2VWYWx1ZShwcm9wLCB2YWx1ZXNOYW1lc1tpXSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgbWVyZ2VWYWx1ZShwcm9wOiBKc29uT2JqZWN0UHJvcGVydHksIHZhbHVlTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXNbdmFsdWVOYW1lXSA9PSBudWxsICYmIHByb3BbdmFsdWVOYW1lXSAhPSBudWxsKSB7XG4gICAgICB0aGlzW3ZhbHVlTmFtZV0gPSBwcm9wW3ZhbHVlTmFtZV07XG4gICAgfVxuICB9XG59XG5leHBvcnQgY2xhc3MgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ge1xuICBwcml2YXRlIHN0YXRpYyBwcm9wZXJ0aWVzID0ge307XG4gIHByaXZhdGUgc3RhdGljIHBhcmVudENsYXNzZXMgPSB7fTtcbiAgcHVibGljIHN0YXRpYyBhZGRQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHk6IGFueSkge1xuICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgaWYgKCFwcm9wc1tjbGFzc05hbWVdKSB7XG4gICAgICBwcm9wc1tjbGFzc05hbWVdID0gW107XG4gICAgfVxuICAgIHByb3BzW2NsYXNzTmFtZV0ucHVzaChwcm9wZXJ0eSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyByZW1vdmVQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgcHJvcHMgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wcm9wZXJ0aWVzO1xuICAgIGlmICghcHJvcHNbY2xhc3NOYW1lXSkgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gcHJvcHNbY2xhc3NOYW1lXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcm9wZXJ0aWVzW2ldLm5hbWUgPT0gcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIHByb3BzW2NsYXNzTmFtZV0uc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHVibGljIHN0YXRpYyBhZGRDbGFzcyhjbGFzc05hbWU6IHN0cmluZywgcGFyZW50Q2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wYXJlbnRDbGFzc2VzW2NsYXNzTmFtZV0gPSBwYXJlbnRDbGFzc05hbWU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nKTogQXJyYXk8YW55PiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgd2hpbGUgKGNsYXNzTmFtZSkge1xuICAgICAgdmFyIHByb3BlcnRpZXMgPSBwcm9wc1tjbGFzc05hbWVdO1xuICAgICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNsYXNzTmFtZSA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnBhcmVudENsYXNzZXNbY2xhc3NOYW1lXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZVByb3BlcnRpZXMob2JqOiBhbnkpIHtcbiAgICBpZiAoIW9iaiB8fCAhb2JqLmdldFR5cGUpIHJldHVybjtcbiAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzQ29yZShvYmosIG9iai5nZXRUeXBlKCkpO1xuICB9XG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVByb3BlcnRpZXNDb3JlKG9iajogYW55LCBjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHZhciBwcm9wcyA9IEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLnByb3BlcnRpZXM7XG4gICAgaWYgKHByb3BzW2NsYXNzTmFtZV0pIHtcbiAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXNJbk9iaihvYmosIHByb3BzW2NsYXNzTmFtZV0pO1xuICAgIH1cbiAgICB2YXIgcGFyZW50Q2xhc3MgPSBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5wYXJlbnRDbGFzc2VzW2NsYXNzTmFtZV07XG4gICAgaWYgKHBhcmVudENsYXNzKSB7XG4gICAgICBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcmVhdGVQcm9wZXJ0aWVzQ29yZShvYmosIHBhcmVudENsYXNzKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUHJvcGVydGllc0luT2JqKG9iajogYW55LCBwcm9wZXJ0aWVzOiBhbnlbXSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uY3JlYXRlUHJvcGVydHlJbk9iaihvYmosIHByb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eUluT2JqKG9iajogYW55LCBwcm9wOiBhbnkpIHtcbiAgICBpZiAob2JqW3Byb3AubmFtZV0gfHwgb2JqLmhhc093blByb3BlcnR5KHByb3AubmFtZSkpIHJldHVybjtcbiAgICBpZiAoXG4gICAgICBwcm9wLmlzTG9jYWxpemFibGUgJiZcbiAgICAgIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5ICYmXG4gICAgICAhb2JqW3Byb3Auc2VyaWFsaXphdGlvblByb3BlcnR5XSAmJlxuICAgICAgb2JqLmNyZWF0ZUN1c3RvbUxvY2FsaXphYmxlT2JqXG4gICAgKSB7XG4gICAgICBvYmouY3JlYXRlQ3VzdG9tTG9jYWxpemFibGVPYmoocHJvcC5uYW1lKTtcbiAgICAgIHZhciBsb2NEZXNjID0ge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBvYmouZ2V0TG9jYWxpemFibGVTdHJpbmcocHJvcC5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5LCBsb2NEZXNjKTtcbiAgICAgIHZhciBkZXNjID0ge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBvYmouZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KHByb3AubmFtZSwgcHJvcC5kZWZhdWx0VmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uKHY6IGFueSkge1xuICAgICAgICAgIG9iai5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQocHJvcC5uYW1lLCB2KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AubmFtZSwgZGVzYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBkZXNjID0ge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBvYmouZ2V0UHJvcGVydHlWYWx1ZShwcm9wLm5hbWUsIHByb3AuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbih2OiBhbnkpIHtcbiAgICAgICAgICBvYmouc2V0UHJvcGVydHlWYWx1ZShwcm9wLm5hbWUsIHYpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcC5uYW1lLCBkZXNjKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEpzb25NZXRhZGF0YUNsYXNzIHtcbiAgc3RhdGljIHJlcXVpcmVkU3ltYm9sID0gXCIhXCI7XG4gIHN0YXRpYyB0eXBlU3ltYm9sID0gXCI6XCI7XG4gIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4gPSBudWxsO1xuICByZXF1aXJlZFByb3BlcnRpZXM6IEFycmF5PHN0cmluZz4gPSBudWxsO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM6IEFycmF5PGFueT4sXG4gICAgcHVibGljIGNyZWF0b3I6ICgpID0+IGFueSA9IG51bGwsXG4gICAgcHVibGljIHBhcmVudE5hbWU6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmFkZENsYXNzKG5hbWUsIHBhcmVudE5hbWUpO1xuICAgIH1cbiAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSB0aGlzLmNyZWF0ZVByb3BlcnR5KHByb3BlcnRpZXNbaV0pO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1c2gocHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBmaW5kKG5hbWU6IHN0cmluZyk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgY3JlYXRlUHJvcGVydHkocHJvcEluZm86IGFueSk6IEpzb25PYmplY3RQcm9wZXJ0eSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHR5cGVvZiBwcm9wSW5mbyA9PT0gXCJzdHJpbmdcIiA/IHByb3BJbmZvIDogcHJvcEluZm8ubmFtZTtcbiAgICBpZiAoIXByb3BlcnR5TmFtZSkgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0eVR5cGUgPSBudWxsO1xuICAgIHZhciB0eXBlSW5kZXggPSBwcm9wZXJ0eU5hbWUuaW5kZXhPZihKc29uTWV0YWRhdGFDbGFzcy50eXBlU3ltYm9sKTtcbiAgICBpZiAodHlwZUluZGV4ID4gLTEpIHtcbiAgICAgIHByb3BlcnR5VHlwZSA9IHByb3BlcnR5TmFtZS5zdWJzdHJpbmcodHlwZUluZGV4ICsgMSk7XG4gICAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIHR5cGVJbmRleCk7XG4gICAgfVxuICAgIHZhciBpc1JlcXVpcmVkID0gdGhpcy5nZXRJc1Byb3BlcnR5TmFtZVJlcXVpcmVkKHByb3BlcnR5TmFtZSk7XG4gICAgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKTtcbiAgICB2YXIgcHJvcCA9IG5ldyBKc29uT2JqZWN0UHJvcGVydHkocHJvcGVydHlOYW1lLCBpc1JlcXVpcmVkKTtcbiAgICBpZiAocHJvcGVydHlUeXBlKSB7XG4gICAgICBwcm9wLnR5cGUgPSBwcm9wZXJ0eVR5cGU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHJvcEluZm8gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChwcm9wSW5mby50eXBlKSB7XG4gICAgICAgIHByb3AudHlwZSA9IHByb3BJbmZvLnR5cGU7XG4gICAgICB9XG4gICAgICBpZiAoIUhlbHBlcnMuaXNWYWx1ZUVtcHR5KHByb3BJbmZvLmRlZmF1bHQpKSB7XG4gICAgICAgIHByb3AuZGVmYXVsdFZhbHVlID0gcHJvcEluZm8uZGVmYXVsdDtcbiAgICAgIH1cbiAgICAgIGlmICghSGVscGVycy5pc1ZhbHVlRW1wdHkocHJvcEluZm8uaXNTZXJpYWxpemFibGUpKSB7XG4gICAgICAgIHByb3AuaXNTZXJpYWxpemFibGUgPSBwcm9wSW5mby5pc1NlcmlhbGl6YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby52aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgICBwcm9wLnZpc2libGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5pc1JlcXVpcmVkKSB7XG4gICAgICAgIHRoaXMubWFrZVByb3BlcnR5UmVxdWlyZWQocHJvcC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5jaG9pY2VzKSB7XG4gICAgICAgIHZhciBjaG9pY2VzRnVuYyA9XG4gICAgICAgICAgdHlwZW9mIHByb3BJbmZvLmNob2ljZXMgPT09IFwiZnVuY3Rpb25cIiA/IHByb3BJbmZvLmNob2ljZXMgOiBudWxsO1xuICAgICAgICB2YXIgY2hvaWNlc1ZhbHVlID1cbiAgICAgICAgICB0eXBlb2YgcHJvcEluZm8uY2hvaWNlcyAhPT0gXCJmdW5jdGlvblwiID8gcHJvcEluZm8uY2hvaWNlcyA6IG51bGw7XG4gICAgICAgIHByb3Auc2V0Q2hvaWNlcyhjaG9pY2VzVmFsdWUsIGNob2ljZXNGdW5jKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5vbkdldFZhbHVlKSB7XG4gICAgICAgIHByb3Aub25HZXRWYWx1ZSA9IHByb3BJbmZvLm9uR2V0VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8ub25TZXRWYWx1ZSkge1xuICAgICAgICBwcm9wLm9uU2V0VmFsdWUgPSBwcm9wSW5mby5vblNldFZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmlzTG9jYWxpemFibGUpIHtcbiAgICAgICAgcHJvcEluZm8uc2VyaWFsaXphdGlvblByb3BlcnR5ID0gXCJsb2NcIiArIHByb3BJbmZvLm5hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uc2VyaWFsaXphdGlvblByb3BlcnR5KSB7XG4gICAgICAgIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5ID0gcHJvcEluZm8uc2VyaWFsaXphdGlvblByb3BlcnR5O1xuICAgICAgICB2YXIgczogc3RyaW5nO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJvcC5zZXJpYWxpemF0aW9uUHJvcGVydHkgJiZcbiAgICAgICAgICBwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eS5pbmRleE9mKFwibG9jXCIpID09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvcC5pc0xvY2FsaXphYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmlzTG9jYWxpemFibGUpIHtcbiAgICAgICAgcHJvcC5pc0xvY2FsaXphYmxlID0gcHJvcEluZm8uaXNMb2NhbGl6YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5jbGFzc05hbWUpIHtcbiAgICAgICAgcHJvcC5jbGFzc05hbWUgPSBwcm9wSW5mby5jbGFzc05hbWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEluZm8uYmFzZUNsYXNzTmFtZSkge1xuICAgICAgICBwcm9wLmJhc2VDbGFzc05hbWUgPSBwcm9wSW5mby5iYXNlQ2xhc3NOYW1lO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BJbmZvLmNsYXNzTmFtZVBhcnQpIHtcbiAgICAgICAgcHJvcC5jbGFzc05hbWVQYXJ0ID0gcHJvcEluZm8uY2xhc3NOYW1lUGFydDtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wSW5mby5hbHRlcm5hdGl2ZU5hbWUpIHtcbiAgICAgICAgcHJvcC5hbHRlcm5hdGl2ZU5hbWUgPSBwcm9wSW5mby5hbHRlcm5hdGl2ZU5hbWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wO1xuICB9XG4gIHByaXZhdGUgZ2V0SXNQcm9wZXJ0eU5hbWVSZXF1aXJlZChwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBwcm9wZXJ0eU5hbWUubGVuZ3RoID4gMCAmJlxuICAgICAgcHJvcGVydHlOYW1lWzBdID09IEpzb25NZXRhZGF0YUNsYXNzLnJlcXVpcmVkU3ltYm9sXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGdldFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmdldElzUHJvcGVydHlOYW1lUmVxdWlyZWQocHJvcGVydHlOYW1lKSkgcmV0dXJuIHByb3BlcnR5TmFtZTtcbiAgICBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWUuc2xpY2UoMSk7XG4gICAgdGhpcy5tYWtlUHJvcGVydHlSZXF1aXJlZChwcm9wZXJ0eU5hbWUpO1xuICAgIHJldHVybiBwcm9wZXJ0eU5hbWU7XG4gIH1cbiAgcHJpdmF0ZSBtYWtlUHJvcGVydHlSZXF1aXJlZChwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5yZXF1aXJlZFByb3BlcnRpZXMpIHtcbiAgICAgIHRoaXMucmVxdWlyZWRQcm9wZXJ0aWVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICB9XG4gICAgdGhpcy5yZXF1aXJlZFByb3BlcnRpZXMucHVzaChwcm9wZXJ0eU5hbWUpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvbk1ldGFkYXRhIHtcbiAgcHJpdmF0ZSBjbGFzc2VzOiBIYXNoVGFibGU8SnNvbk1ldGFkYXRhQ2xhc3M+ID0ge307XG4gIHByaXZhdGUgY2hpbGRyZW5DbGFzc2VzOiBIYXNoVGFibGU8QXJyYXk8SnNvbk1ldGFkYXRhQ2xhc3M+PiA9IHt9O1xuICBwcml2YXRlIGNsYXNzUHJvcGVydGllczogSGFzaFRhYmxlPEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4+ID0ge307XG4gIHByaXZhdGUgY2xhc3NSZXF1aXJlZFByb3BlcnRpZXM6IEhhc2hUYWJsZTxBcnJheTxzdHJpbmc+PiA9IHt9O1xuICBwdWJsaWMgYWRkQ2xhc3MoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM6IEFycmF5PGFueT4sXG4gICAgY3JlYXRvcjogKCkgPT4gYW55ID0gbnVsbCxcbiAgICBwYXJlbnROYW1lOiBzdHJpbmcgPSBudWxsXG4gICk6IEpzb25NZXRhZGF0YUNsYXNzIHtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IG5ldyBKc29uTWV0YWRhdGFDbGFzcyhcbiAgICAgIG5hbWUsXG4gICAgICBwcm9wZXJ0aWVzLFxuICAgICAgY3JlYXRvcixcbiAgICAgIHBhcmVudE5hbWVcbiAgICApO1xuICAgIHRoaXMuY2xhc3Nlc1tuYW1lXSA9IG1ldGFEYXRhQ2xhc3M7XG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5DbGFzc2VzW3BhcmVudE5hbWVdO1xuICAgICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgICB0aGlzLmNoaWxkcmVuQ2xhc3Nlc1twYXJlbnROYW1lXSA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGlsZHJlbkNsYXNzZXNbcGFyZW50TmFtZV0ucHVzaChtZXRhRGF0YUNsYXNzKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFEYXRhQ2xhc3M7XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlQ2xhc3NDcmVhdG9yZShuYW1lOiBzdHJpbmcsIGNyZWF0b3I6ICgpID0+IGFueSkge1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MobmFtZSk7XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MpIHtcbiAgICAgIG1ldGFEYXRhQ2xhc3MuY3JlYXRvciA9IGNyZWF0b3I7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmNsYXNzUHJvcGVydGllc1tjbGFzc05hbWVdO1xuICAgIGlmICghcHJvcGVydGllcykge1xuICAgICAgcHJvcGVydGllcyA9IG5ldyBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+KCk7XG4gICAgICB0aGlzLmZpbGxQcm9wZXJ0aWVzKGNsYXNzTmFtZSwgcHJvcGVydGllcyk7XG4gICAgICB0aGlzLmNsYXNzUHJvcGVydGllc1tjbGFzc05hbWVdID0gcHJvcGVydGllcztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXREeW5hbWljUHJvcGVydGllcyhvYmo6IGFueSk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIGlmIChvYmouZ2V0RHluYW1pY1Byb3BlcnRpZXMgJiYgb2JqLmdldER5bmFtaWNUeXBlKSB7XG4gICAgICB2YXIgbmFtZXMgPSBvYmouZ2V0RHluYW1pY1Byb3BlcnRpZXMoKTtcbiAgICAgIHJldHVybiBKc29uT2JqZWN0Lm1ldGFEYXRhLmZpbmRQcm9wZXJ0aWVzKG9iai5nZXREeW5hbWljVHlwZSgpLCBuYW1lcyk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuICBwdWJsaWMgZ2V0UHJvcGVydGllc0J5T2JqKG9iajogYW55KTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgaWYgKCFvYmogfHwgIW9iai5nZXRUeXBlKSByZXR1cm4gW107XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBwcm9wcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhvYmouZ2V0VHlwZSgpKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChwcm9wc1tpXSk7XG4gICAgfVxuICAgIHZhciBkeW5hbWljUHJvcHMgPSB0aGlzLmdldER5bmFtaWNQcm9wZXJ0aWVzKG9iaik7XG4gICAgaWYgKGR5bmFtaWNQcm9wcyAmJiBkeW5hbWljUHJvcHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkeW5hbWljUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzLnB1c2goZHluYW1pY1Byb3BzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUHJvcGVydHkoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmdcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICByZXR1cm4gdGhpcy5maW5kUHJvcGVydHlDb3JlKHRoaXMuZ2V0UHJvcGVydGllcyhjbGFzc05hbWUpLCBwcm9wZXJ0eU5hbWUpO1xuICB9XG4gIHB1YmxpYyBmaW5kUHJvcGVydGllcyhcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBwcm9wZXJ0eU5hbWVzOiBBcnJheTxzdHJpbmc+XG4gICk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcyhjbGFzc05hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSB0aGlzLmZpbmRQcm9wZXJ0eUNvcmUocHJvcGVydGllcywgcHJvcGVydHlOYW1lc1tpXSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICByZXN1bHQucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGZpbmRQcm9wZXJ0eUNvcmUoXG4gICAgcHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PixcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuICApOiBKc29uT2JqZWN0UHJvcGVydHkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHByb3BlcnRpZXNbaV0ubmFtZSA9PSBwcm9wZXJ0eU5hbWUpIHJldHVybiBwcm9wZXJ0aWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgY3JlYXRlQ2xhc3MobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuIG51bGw7XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MuY3JlYXRvcikgcmV0dXJuIG1ldGFEYXRhQ2xhc3MuY3JlYXRvcigpO1xuICAgIHZhciBwYXJlbnROYW1lID0gbWV0YURhdGFDbGFzcy5wYXJlbnROYW1lO1xuICAgIHdoaWxlIChwYXJlbnROYW1lKSB7XG4gICAgICBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MocGFyZW50TmFtZSk7XG4gICAgICBpZiAoIW1ldGFEYXRhQ2xhc3MpIHJldHVybiBudWxsO1xuICAgICAgcGFyZW50TmFtZSA9IG1ldGFEYXRhQ2xhc3MucGFyZW50TmFtZTtcbiAgICAgIGlmIChtZXRhRGF0YUNsYXNzLmNyZWF0b3IpXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUN1c3RvbVR5cGUobmFtZSwgbWV0YURhdGFDbGFzcy5jcmVhdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVDdXN0b21UeXBlKG5hbWU6IHN0cmluZywgY3JlYXRvcjogYW55KTogYW55IHtcbiAgICB2YXIgcmVzID0gY3JlYXRvcigpO1xuICAgIHJlcy5jdXN0b21UeXBlTmFtZSA9IG5hbWU7XG4gICAgcmVzLmN1c3RvbVRlbXBsYXRlTmFtZSA9IHJlcy5nZXRUZW1wbGF0ZVxuICAgICAgPyByZXMuZ2V0VGVtcGxhdGUoKVxuICAgICAgOiByZXMuZ2V0VHlwZSgpO1xuICAgIHJlcy5nZXRUeXBlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcmVzLmN1c3RvbVR5cGVOYW1lO1xuICAgIH07XG4gICAgcmVzLmdldFRlbXBsYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcmVzLmN1c3RvbVRlbXBsYXRlTmFtZTtcbiAgICB9O1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXMocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXRDaGlsZHJlbkNsYXNzZXMoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNhbkJlQ3JlYXRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PEpzb25NZXRhZGF0YUNsYXNzPiB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHRoaXMuZmlsbENoaWxkcmVuQ2xhc3NlcyhuYW1lLCBjYW5CZUNyZWF0ZWQsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKG5hbWU6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5jbGFzc1JlcXVpcmVkUHJvcGVydGllc1tuYW1lXTtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHtcbiAgICAgIHByb3BlcnRpZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgICAgdGhpcy5maWxsUmVxdWlyZWRQcm9wZXJ0aWVzKG5hbWUsIHByb3BlcnRpZXMpO1xuICAgICAgdGhpcy5jbGFzc1JlcXVpcmVkUHJvcGVydGllc1tuYW1lXSA9IHByb3BlcnRpZXM7XG4gICAgfVxuICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICB9XG4gIHB1YmxpYyBhZGRQcm9wZXJ0aWVzKGNsYXNzTmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzSW5mb3M6IEFycmF5PGFueT4pIHtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzSW5mb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkQ3VzdG9tUHJvcGVydHlDb3JlKG1ldGFEYXRhQ2xhc3MsIHByb3BlcnRpZXNJbmZvc1tpXSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhZGRQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHlJbmZvOiBhbnkpIHtcbiAgICB0aGlzLmFkZEN1c3RvbVByb3BlcnR5Q29yZSh0aGlzLmZpbmRDbGFzcyhjbGFzc05hbWUpLCBwcm9wZXJ0eUluZm8pO1xuICB9XG4gIHByaXZhdGUgYWRkQ3VzdG9tUHJvcGVydHlDb3JlKFxuICAgIG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIHByb3BlcnR5SW5mbzogYW55XG4gICkge1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuO1xuICAgIHZhciBwcm9wZXJ0eSA9IG1ldGFEYXRhQ2xhc3MuY3JlYXRlUHJvcGVydHkocHJvcGVydHlJbmZvKTtcbiAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgIHRoaXMuYWRkUHJvcGVydHlUb0NsYXNzKG1ldGFEYXRhQ2xhc3MsIHByb3BlcnR5KTtcbiAgICAgIHRoaXMuZW1wdHlDbGFzc1Byb3BlcnRpZXNIYXNoKG1ldGFEYXRhQ2xhc3MpO1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uYWRkUHJvcGVydHkobWV0YURhdGFDbGFzcy5uYW1lLCBwcm9wZXJ0eSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyByZW1vdmVQcm9wZXJ0eShjbGFzc05hbWU6IHN0cmluZywgcHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHByb3BlcnR5ID0gbWV0YURhdGFDbGFzcy5maW5kKHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICB0aGlzLnJlbW92ZVByb3BlcnR5RnJvbUNsYXNzKG1ldGFEYXRhQ2xhc3MsIHByb3BlcnR5KTtcbiAgICAgIHRoaXMuZW1wdHlDbGFzc1Byb3BlcnRpZXNIYXNoKG1ldGFEYXRhQ2xhc3MpO1xuICAgICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24ucmVtb3ZlUHJvcGVydHkoY2xhc3NOYW1lLCBwcm9wZXJ0eU5hbWUpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZFByb3BlcnR5VG9DbGFzcyhcbiAgICBtZXRhRGF0YUNsYXNzOiBKc29uTWV0YWRhdGFDbGFzcyxcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5XG4gICkge1xuICAgIGlmIChtZXRhRGF0YUNsYXNzLmZpbmQocHJvcGVydHkubmFtZSkgIT0gbnVsbCkgcmV0dXJuO1xuICAgIG1ldGFEYXRhQ2xhc3MucHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgfVxuICBwcml2YXRlIHJlbW92ZVByb3BlcnR5RnJvbUNsYXNzKFxuICAgIG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzLFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgdmFyIGluZGV4ID0gbWV0YURhdGFDbGFzcy5wcm9wZXJ0aWVzLmluZGV4T2YocHJvcGVydHkpO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcbiAgICBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAobWV0YURhdGFDbGFzcy5yZXF1aXJlZFByb3BlcnRpZXMpIHtcbiAgICAgIGluZGV4ID0gbWV0YURhdGFDbGFzcy5yZXF1aXJlZFByb3BlcnRpZXMuaW5kZXhPZihwcm9wZXJ0eS5uYW1lKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIG1ldGFEYXRhQ2xhc3MucmVxdWlyZWRQcm9wZXJ0aWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZW1wdHlDbGFzc1Byb3BlcnRpZXNIYXNoKG1ldGFEYXRhQ2xhc3M6IEpzb25NZXRhZGF0YUNsYXNzKSB7XG4gICAgdGhpcy5jbGFzc1Byb3BlcnRpZXNbbWV0YURhdGFDbGFzcy5uYW1lXSA9IG51bGw7XG4gICAgdmFyIGNoaWxkQ2xhc3NlcyA9IHRoaXMuZ2V0Q2hpbGRyZW5DbGFzc2VzKG1ldGFEYXRhQ2xhc3MubmFtZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2xhc3NQcm9wZXJ0aWVzW2NoaWxkQ2xhc3Nlc1tpXS5uYW1lXSA9IG51bGw7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmlsbENoaWxkcmVuQ2xhc3NlcyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2FuQmVDcmVhdGVkOiBib29sZWFuLFxuICAgIHJlc3VsdDogQXJyYXk8SnNvbk1ldGFkYXRhQ2xhc3M+XG4gICkge1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5DbGFzc2VzW25hbWVdO1xuICAgIGlmICghY2hpbGRyZW4pIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIWNhbkJlQ3JlYXRlZCB8fCBjaGlsZHJlbltpXS5jcmVhdG9yKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsbENoaWxkcmVuQ2xhc3NlcyhjaGlsZHJlbltpXS5uYW1lLCBjYW5CZUNyZWF0ZWQsIHJlc3VsdCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBmaW5kQ2xhc3MobmFtZTogc3RyaW5nKTogSnNvbk1ldGFkYXRhQ2xhc3Mge1xuICAgIHJldHVybiB0aGlzLmNsYXNzZXNbbmFtZV07XG4gIH1cbiAgcHJpdmF0ZSBmaWxsUHJvcGVydGllcyhuYW1lOiBzdHJpbmcsIGxpc3Q6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4pIHtcbiAgICB2YXIgbWV0YURhdGFDbGFzcyA9IHRoaXMuZmluZENsYXNzKG5hbWUpO1xuICAgIGlmICghbWV0YURhdGFDbGFzcykgcmV0dXJuO1xuICAgIGlmIChtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUpIHtcbiAgICAgIHRoaXMuZmlsbFByb3BlcnRpZXMobWV0YURhdGFDbGFzcy5wYXJlbnROYW1lLCBsaXN0KTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhRGF0YUNsYXNzLnByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYWRkUHJvcGVydHlDb3JlKG1ldGFEYXRhQ2xhc3MucHJvcGVydGllc1tpXSwgbGlzdCwgbGlzdC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZFByb3BlcnR5Q29yZShcbiAgICBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5LFxuICAgIGxpc3Q6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAgZW5kSW5kZXg6IG51bWJlclxuICApIHtcbiAgICB2YXIgaW5kZXggPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuZEluZGV4OyBpKyspIHtcbiAgICAgIGlmIChsaXN0W2ldLm5hbWUgPT0gcHJvcGVydHkubmFtZSkge1xuICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICBsaXN0LnB1c2gocHJvcGVydHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wZXJ0eS5tZXJnZVdpdGgobGlzdFtpbmRleF0pO1xuICAgICAgbGlzdFtpbmRleF0gPSBwcm9wZXJ0eTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaWxsUmVxdWlyZWRQcm9wZXJ0aWVzKG5hbWU6IHN0cmluZywgbGlzdDogQXJyYXk8c3RyaW5nPikge1xuICAgIHZhciBtZXRhRGF0YUNsYXNzID0gdGhpcy5maW5kQ2xhc3MobmFtZSk7XG4gICAgaWYgKCFtZXRhRGF0YUNsYXNzKSByZXR1cm47XG4gICAgaWYgKG1ldGFEYXRhQ2xhc3MucmVxdWlyZWRQcm9wZXJ0aWVzKSB7XG4gICAgICBBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShsaXN0LCBtZXRhRGF0YUNsYXNzLnJlcXVpcmVkUHJvcGVydGllcyk7XG4gICAgfVxuICAgIGlmIChtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUpIHtcbiAgICAgIHRoaXMuZmlsbFJlcXVpcmVkUHJvcGVydGllcyhtZXRhRGF0YUNsYXNzLnBhcmVudE5hbWUsIGxpc3QpO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25FcnJvciB7XG4gIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nID0gXCJcIjtcbiAgcHVibGljIGF0OiBOdW1iZXIgPSAtMTtcbiAgY29uc3RydWN0b3IocHVibGljIHR5cGU6IHN0cmluZywgcHVibGljIG1lc3NhZ2U6IHN0cmluZykge31cbiAgcHVibGljIGdldEZ1bGxEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2UgKyAodGhpcy5kZXNjcmlwdGlvbiA/IFwiXFxuXCIgKyB0aGlzLmRlc2NyaXB0aW9uIDogXCJcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uVW5rbm93blByb3BlcnR5RXJyb3IgZXh0ZW5kcyBKc29uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyBjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgXCJ1bmtub3ducHJvcGVydHlcIixcbiAgICAgIFwiVGhlIHByb3BlcnR5ICdcIiArXG4gICAgICAgIHByb3BlcnR5TmFtZSArXG4gICAgICAgIFwiJyBpbiBjbGFzcyAnXCIgK1xuICAgICAgICBjbGFzc05hbWUgK1xuICAgICAgICBcIicgaXMgdW5rbm93bi5cIlxuICAgICk7XG4gICAgdmFyIHByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMoY2xhc3NOYW1lKTtcbiAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IFwiVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHByb3BlcnRpZXMgYXJlOiBcIjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSA+IDApIHRoaXMuZGVzY3JpcHRpb24gKz0gXCIsIFwiO1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uICs9IHByb3BlcnRpZXNbaV0ubmFtZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gKz0gXCIuXCI7XG4gICAgfVxuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlIGV4dGVuZHMgSnNvbkVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgdHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIodHlwZSwgbWVzc2FnZSk7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IFwiVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgYXZhaWxhYmxlOiBcIjtcbiAgICB2YXIgdHlwZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldENoaWxkcmVuQ2xhc3NlcyhiYXNlQ2xhc3NOYW1lLCB0cnVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaSA+IDApIHRoaXMuZGVzY3JpcHRpb24gKz0gXCIsIFwiO1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbiArPSBcIidcIiArIHR5cGVzW2ldLm5hbWUgKyBcIidcIjtcbiAgICB9XG4gICAgdGhpcy5kZXNjcmlwdGlvbiArPSBcIi5cIjtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEpzb25NaXNzaW5nVHlwZUVycm9yIGV4dGVuZHMgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHByb3BlcnR5TmFtZTogc3RyaW5nLCBwdWJsaWMgYmFzZUNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBiYXNlQ2xhc3NOYW1lLFxuICAgICAgXCJtaXNzaW5ndHlwZXByb3BlcnR5XCIsXG4gICAgICBcIlRoZSBwcm9wZXJ0eSB0eXBlIGlzIG1pc3NpbmcgaW4gdGhlIG9iamVjdC4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHByb3BlcnR5OiAnXCIgK1xuICAgICAgICBwcm9wZXJ0eU5hbWUgK1xuICAgICAgICBcIicuXCJcbiAgICApO1xuICB9XG59XG5leHBvcnQgY2xhc3MgSnNvbkluY29ycmVjdFR5cGVFcnJvciBleHRlbmRzIEpzb25NaXNzaW5nVHlwZUVycm9yQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm9wZXJ0eU5hbWU6IHN0cmluZywgcHVibGljIGJhc2VDbGFzc05hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKFxuICAgICAgYmFzZUNsYXNzTmFtZSxcbiAgICAgIFwiaW5jb3JyZWN0dHlwZXByb3BlcnR5XCIsXG4gICAgICBcIlRoZSBwcm9wZXJ0eSB0eXBlIGlzIGluY29ycmVjdCBpbiB0aGUgb2JqZWN0LiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgcHJvcGVydHk6ICdcIiArXG4gICAgICAgIHByb3BlcnR5TmFtZSArXG4gICAgICAgIFwiJy5cIlxuICAgICk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBKc29uUmVxdWlyZWRQcm9wZXJ0eUVycm9yIGV4dGVuZHMgSnNvbkVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHByb3BlcnR5TmFtZTogc3RyaW5nLCBwdWJsaWMgY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIFwicmVxdWlyZWRwcm9wZXJ0eVwiLFxuICAgICAgXCJUaGUgcHJvcGVydHkgJ1wiICtcbiAgICAgICAgcHJvcGVydHlOYW1lICtcbiAgICAgICAgXCInIGlzIHJlcXVpcmVkIGluIGNsYXNzICdcIiArXG4gICAgICAgIGNsYXNzTmFtZSArXG4gICAgICAgIFwiJy5cIlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEpzb25PYmplY3Qge1xuICBwcml2YXRlIHN0YXRpYyB0eXBlUHJvcGVydHlOYW1lID0gXCJ0eXBlXCI7XG4gIHByaXZhdGUgc3RhdGljIHBvc2l0aW9uUHJvcGVydHlOYW1lID0gXCJwb3NcIjtcbiAgcHJpdmF0ZSBzdGF0aWMgbWV0YURhdGFWYWx1ZSA9IG5ldyBKc29uTWV0YWRhdGEoKTtcbiAgcHVibGljIHN0YXRpYyBnZXQgbWV0YURhdGEoKSB7XG4gICAgcmV0dXJuIEpzb25PYmplY3QubWV0YURhdGFWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZXJyb3JzID0gbmV3IEFycmF5PEpzb25FcnJvcj4oKTtcbiAgcHVibGljIHRvSnNvbk9iamVjdChvYmo6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudG9Kc29uT2JqZWN0Q29yZShvYmosIG51bGwpO1xuICB9XG4gIHB1YmxpYyB0b09iamVjdChqc29uT2JqOiBhbnksIG9iajogYW55KSB7XG4gICAgaWYgKCFqc29uT2JqKSByZXR1cm47XG4gICAgdmFyIHByb3BlcnRpZXMgPSBudWxsO1xuICAgIGlmIChvYmouZ2V0VHlwZSkge1xuICAgICAgcHJvcGVydGllcyA9IEpzb25PYmplY3QubWV0YURhdGEuZ2V0UHJvcGVydGllcyhvYmouZ2V0VHlwZSgpKTtcbiAgICB9XG4gICAgaWYgKCFwcm9wZXJ0aWVzKSByZXR1cm47XG4gICAgaWYgKG9iai5zdGFydExvYWRpbmdGcm9tSnNvbikge1xuICAgICAgb2JqLnN0YXJ0TG9hZGluZ0Zyb21Kc29uKCk7XG4gICAgfVxuICAgIHByb3BlcnRpZXMgPSB0aGlzLmFkZER5bmFtaWNQcm9wZXJ0aWVzKG9iaiwganNvbk9iaiwgcHJvcGVydGllcyk7XG4gICAgZm9yICh2YXIga2V5IGluIGpzb25PYmopIHtcbiAgICAgIGlmIChrZXkgPT0gSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lKSBjb250aW51ZTtcbiAgICAgIGlmIChrZXkgPT0gSnNvbk9iamVjdC5wb3NpdGlvblByb3BlcnR5TmFtZSkge1xuICAgICAgICBvYmpba2V5XSA9IGpzb25PYmpba2V5XTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLmZpbmRQcm9wZXJ0eShwcm9wZXJ0aWVzLCBrZXkpO1xuICAgICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgICB0aGlzLmFkZE5ld0Vycm9yKFxuICAgICAgICAgIG5ldyBKc29uVW5rbm93blByb3BlcnR5RXJyb3Ioa2V5LnRvU3RyaW5nKCksIG9iai5nZXRUeXBlKCkpLFxuICAgICAgICAgIGpzb25PYmpcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aGlzLnZhbHVlVG9PYmooanNvbk9ialtrZXldLCBvYmosIGtleSwgcHJvcGVydHkpO1xuICAgIH1cbiAgICBpZiAob2JqLmVuZExvYWRpbmdGcm9tSnNvbikge1xuICAgICAgb2JqLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdG9Kc29uT2JqZWN0Q29yZShvYmo6IGFueSwgcHJvcGVydHk6IEpzb25PYmplY3RQcm9wZXJ0eSk6IGFueSB7XG4gICAgaWYgKCFvYmouZ2V0VHlwZSkgcmV0dXJuIG9iajtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgIXByb3BlcnR5LmNsYXNzTmFtZSkge1xuICAgICAgcmVzdWx0W0pzb25PYmplY3QudHlwZVByb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eS5nZXRPYmpUeXBlKG9iai5nZXRUeXBlKCkpO1xuICAgIH1cbiAgICB0aGlzLnByb3BlcnRpZXNUb0pzb24oXG4gICAgICBvYmosXG4gICAgICBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFByb3BlcnRpZXMob2JqLmdldFR5cGUoKSksXG4gICAgICByZXN1bHRcbiAgICApO1xuICAgIHRoaXMucHJvcGVydGllc1RvSnNvbihvYmosIHRoaXMuZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqKSwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqOiBhbnkpOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICBpZiAob2JqLmdldER5bmFtaWNQcm9wZXJ0aWVzICYmIG9iai5nZXREeW5hbWljVHlwZSkge1xuICAgICAgdmFyIG5hbWVzID0gb2JqLmdldER5bmFtaWNQcm9wZXJ0aWVzKCk7XG4gICAgICByZXR1cm4gSnNvbk9iamVjdC5tZXRhRGF0YS5maW5kUHJvcGVydGllcyhvYmouZ2V0RHluYW1pY1R5cGUoKSwgbmFtZXMpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHJpdmF0ZSBhZGREeW5hbWljUHJvcGVydGllcyhcbiAgICBvYmo6IGFueSxcbiAgICBqc29uT2JqOiBhbnksXG4gICAgcHJvcGVydGllczogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PlxuICApOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+IHtcbiAgICBpZiAoIW9iai5nZXREeW5hbWljUHJvcGVydHlOYW1lKSByZXR1cm4gcHJvcGVydGllcztcbiAgICB2YXIgZHluYW1pY1Byb3BOYW1lID0gb2JqLmdldER5bmFtaWNQcm9wZXJ0eU5hbWUoKTtcbiAgICBpZiAoIWR5bmFtaWNQcm9wTmFtZSkgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgaWYgKGpzb25PYmpbZHluYW1pY1Byb3BOYW1lXSkge1xuICAgICAgb2JqW2R5bmFtaWNQcm9wTmFtZV0gPSBqc29uT2JqW2R5bmFtaWNQcm9wTmFtZV07XG4gICAgfVxuICAgIHZhciBkeW5hbWljUHJvcGVydGllcyA9IHRoaXMuZ2V0RHluYW1pY1Byb3BlcnRpZXMob2JqKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMucHVzaChwcm9wZXJ0aWVzW2ldKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkeW5hbWljUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2goZHluYW1pY1Byb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgcHJvcGVydGllc1RvSnNvbihcbiAgICBvYmo6IGFueSxcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxKc29uT2JqZWN0UHJvcGVydHk+LFxuICAgIGpzb246IGFueVxuICApIHtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy52YWx1ZVRvSnNvbihvYmosIGpzb24sIHByb3BlcnRpZXNbaV0pO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVUb0pzb24ob2JqOiBhbnksIHJlc3VsdDogYW55LCBwcm9wZXJ0eTogSnNvbk9iamVjdFByb3BlcnR5KSB7XG4gICAgaWYgKHByb3BlcnR5LmlzU2VyaWFsaXphYmxlID09PSBmYWxzZSkgcmV0dXJuO1xuICAgIHZhciB2YWx1ZSA9IHByb3BlcnR5LmdldFZhbHVlKG9iaik7XG4gICAgaWYgKHByb3BlcnR5LmlzRGVmYXVsdFZhbHVlKHZhbHVlKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzVmFsdWVBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhciBhcnJWYWx1ZSA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJWYWx1ZS5wdXNoKHRoaXMudG9Kc29uT2JqZWN0Q29yZSh2YWx1ZVtpXSwgcHJvcGVydHkpKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gYXJyVmFsdWUubGVuZ3RoID4gMCA/IGFyclZhbHVlIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSB0aGlzLnRvSnNvbk9iamVjdENvcmUodmFsdWUsIHByb3BlcnR5KTtcbiAgICB9XG4gICAgaWYgKCFwcm9wZXJ0eS5pc0RlZmF1bHRWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdFtwcm9wZXJ0eS5uYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVUb09iaihcbiAgICB2YWx1ZTogYW55LFxuICAgIG9iajogYW55LFxuICAgIGtleTogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiBwcm9wZXJ0eS5oYXNUb1VzZVNldFZhbHVlKSB7XG4gICAgICBwcm9wZXJ0eS5zZXRWYWx1ZShvYmosIHZhbHVlLCB0aGlzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUFycmF5KHZhbHVlKSkge1xuICAgICAgdGhpcy52YWx1ZVRvQXJyYXkodmFsdWUsIG9iaiwgcHJvcGVydHkubmFtZSwgcHJvcGVydHkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmV3T2JqID0gdGhpcy5jcmVhdGVOZXdPYmoodmFsdWUsIHByb3BlcnR5KTtcbiAgICBpZiAobmV3T2JqLm5ld09iaikge1xuICAgICAgdGhpcy50b09iamVjdCh2YWx1ZSwgbmV3T2JqLm5ld09iaik7XG4gICAgICB2YWx1ZSA9IG5ld09iai5uZXdPYmo7XG4gICAgfVxuICAgIGlmICghbmV3T2JqLmVycm9yKSB7XG4gICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkge1xuICAgICAgICBwcm9wZXJ0eS5zZXRWYWx1ZShvYmosIHZhbHVlLCB0aGlzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtwcm9wZXJ0eS5uYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzVmFsdWVBcnJheSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTmV3T2JqKHZhbHVlOiBhbnksIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHkpOiBhbnkge1xuICAgIHZhciByZXN1bHQgPSB7IG5ld09iajogbnVsbCwgZXJyb3I6IG51bGwgfTtcbiAgICB2YXIgY2xhc3NOYW1lID0gdmFsdWVbSnNvbk9iamVjdC50eXBlUHJvcGVydHlOYW1lXTtcbiAgICBpZiAoIWNsYXNzTmFtZSAmJiBwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5LmNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lID0gcHJvcGVydHkuY2xhc3NOYW1lO1xuICAgIH1cbiAgICBjbGFzc05hbWUgPSBwcm9wZXJ0eS5nZXRDbGFzc05hbWUoY2xhc3NOYW1lKTtcbiAgICByZXN1bHQubmV3T2JqID0gY2xhc3NOYW1lXG4gICAgICA/IEpzb25PYmplY3QubWV0YURhdGEuY3JlYXRlQ2xhc3MoY2xhc3NOYW1lKVxuICAgICAgOiBudWxsO1xuICAgIHJlc3VsdC5lcnJvciA9IHRoaXMuY2hlY2tOZXdPYmplY3RPbkVycm9ycyhcbiAgICAgIHJlc3VsdC5uZXdPYmosXG4gICAgICB2YWx1ZSxcbiAgICAgIHByb3BlcnR5LFxuICAgICAgY2xhc3NOYW1lXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgY2hlY2tOZXdPYmplY3RPbkVycm9ycyhcbiAgICBuZXdPYmo6IGFueSxcbiAgICB2YWx1ZTogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHksXG4gICAgY2xhc3NOYW1lOiBzdHJpbmdcbiAgKTogSnNvbkVycm9yIHtcbiAgICB2YXIgZXJyb3IgPSBudWxsO1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIHZhciByZXF1aXJlZFByb3BlcnRpZXMgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmdldFJlcXVpcmVkUHJvcGVydGllcyhcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApO1xuICAgICAgaWYgKHJlcXVpcmVkUHJvcGVydGllcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcXVpcmVkUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdmFsdWVbcmVxdWlyZWRQcm9wZXJ0aWVzW2ldXSkge1xuICAgICAgICAgICAgZXJyb3IgPSBuZXcgSnNvblJlcXVpcmVkUHJvcGVydHlFcnJvcihcbiAgICAgICAgICAgICAgcmVxdWlyZWRQcm9wZXJ0aWVzW2ldLFxuICAgICAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb3BlcnR5LmJhc2VDbGFzc05hbWUpIHtcbiAgICAgICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBKc29uTWlzc2luZ1R5cGVFcnJvcihcbiAgICAgICAgICAgIHByb3BlcnR5Lm5hbWUsXG4gICAgICAgICAgICBwcm9wZXJ0eS5iYXNlQ2xhc3NOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvciA9IG5ldyBKc29uSW5jb3JyZWN0VHlwZUVycm9yKFxuICAgICAgICAgICAgcHJvcGVydHkubmFtZSxcbiAgICAgICAgICAgIHByb3BlcnR5LmJhc2VDbGFzc05hbWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgdGhpcy5hZGROZXdFcnJvcihlcnJvciwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbiAgcHJpdmF0ZSBhZGROZXdFcnJvcihlcnJvcjogSnNvbkVycm9yLCBqc29uT2JqOiBhbnkpIHtcbiAgICBpZiAoanNvbk9iaiAmJiBqc29uT2JqW0pzb25PYmplY3QucG9zaXRpb25Qcm9wZXJ0eU5hbWVdKSB7XG4gICAgICBlcnJvci5hdCA9IGpzb25PYmpbSnNvbk9iamVjdC5wb3NpdGlvblByb3BlcnR5TmFtZV0uc3RhcnQ7XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICB9XG4gIHByaXZhdGUgdmFsdWVUb0FycmF5KFxuICAgIHZhbHVlOiBBcnJheTxhbnk+LFxuICAgIG9iajogYW55LFxuICAgIGtleTogYW55LFxuICAgIHByb3BlcnR5OiBKc29uT2JqZWN0UHJvcGVydHlcbiAgKSB7XG4gICAgaWYgKG9ialtrZXldICYmIHZhbHVlLmxlbmd0aCA+IDApIG9ialtrZXldLnNwbGljZSgwLCBvYmpba2V5XS5sZW5ndGgpO1xuICAgIGlmICghb2JqW2tleV0pIG9ialtrZXldID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdPYmoodmFsdWVbaV0sIHByb3BlcnR5KTtcbiAgICAgIGlmIChuZXdWYWx1ZS5uZXdPYmopIHtcbiAgICAgICAgb2JqW2tleV0ucHVzaChuZXdWYWx1ZS5uZXdPYmopO1xuICAgICAgICB0aGlzLnRvT2JqZWN0KHZhbHVlW2ldLCBuZXdWYWx1ZS5uZXdPYmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFuZXdWYWx1ZS5lcnJvcikge1xuICAgICAgICAgIG9ialtrZXldLnB1c2godmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZmluZFByb3BlcnR5KFxuICAgIHByb3BlcnRpZXM6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4sXG4gICAga2V5OiBhbnlcbiAgKTogSnNvbk9iamVjdFByb3BlcnR5IHtcbiAgICBpZiAoIXByb3BlcnRpZXMpIHJldHVybiBudWxsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgaWYgKHByb3AubmFtZSA9PSBrZXkgfHwgcHJvcC5hbHRlcm5hdGl2ZU5hbWUgPT0ga2V5KSByZXR1cm4gcHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9qc29ub2JqZWN0LnRzIiwiZXhwb3J0IHZhciBzdXJ2ZXlMb2NhbGl6YXRpb24gPSB7XG4gIGN1cnJlbnRMb2NhbGU6IFwiXCIsXG4gIGRlZmF1bHRMb2NhbGU6IFwiZW5cIixcbiAgbG9jYWxlczoge30sXG4gIHN1cHBvcnRlZExvY2FsZXM6IFtdLFxuICBnZXRTdHJpbmc6IGZ1bmN0aW9uKHN0ck5hbWU6IHN0cmluZykge1xuICAgIHZhciBsb2MgPSB0aGlzLmN1cnJlbnRMb2NhbGVcbiAgICAgID8gdGhpcy5sb2NhbGVzW3RoaXMuY3VycmVudExvY2FsZV1cbiAgICAgIDogdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgaWYgKCFsb2MgfHwgIWxvY1tzdHJOYW1lXSkgbG9jID0gdGhpcy5sb2NhbGVzW3RoaXMuZGVmYXVsdExvY2FsZV07XG4gICAgcmV0dXJuIGxvY1tzdHJOYW1lXTtcbiAgfSxcbiAgZ2V0TG9jYWxlczogZnVuY3Rpb24oKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHJlcy5wdXNoKFwiXCIpO1xuICAgIGlmICh0aGlzLnN1cHBvcnRlZExvY2FsZXMgJiYgdGhpcy5zdXBwb3J0ZWRMb2NhbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdXBwb3J0ZWRMb2NhbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy5wdXNoKHRoaXMuc3VwcG9ydGVkTG9jYWxlc1tpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmxvY2FsZXMpIHtcbiAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzLnNvcnQoKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59O1xuZXhwb3J0IHZhciBzdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiUHJldmlvdXNcIixcbiAgcGFnZU5leHRUZXh0OiBcIk5leHRcIixcbiAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRlXCIsXG4gIHN0YXJ0U3VydmV5VGV4dDogXCJTdGFydFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk90aGVyIChkZXNjcmliZSlcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlBhZ2UgezB9IG9mIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJUaGVyZSBpcyBubyB2aXNpYmxlIHBhZ2Ugb3IgcXVlc3Rpb24gaW4gdGhlIHN1cnZleS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUaGFuayB5b3UgZm9yIGNvbXBsZXRpbmcgdGhlIHN1cnZleSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk91ciByZWNvcmRzIHNob3cgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGNvbXBsZXRlZCB0aGlzIHN1cnZleS5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJTdXJ2ZXkgaXMgbG9hZGluZy4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJDaG9vc2UuLi5cIixcbiAgdmFsdWU6IFwidmFsdWVcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJQbGVhc2UgYW5zd2VyIHRoZSBxdWVzdGlvbi5cIixcbiAgcmVxdWlyZWRFcnJvckluUGFuZWw6IFwiUGxlYXNlIGFuc3dlciBhdCBsZWFzdCBvbmUgcXVlc3Rpb24uXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUGxlYXNlIGFuc3dlciBxdWVzdGlvbnMgaW4gYWxsIHJvd3MuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJUaGUgdmFsdWUgc2hvdWxkIGJlIG51bWVyaWMuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUGxlYXNlIGVudGVyIGF0IGxlYXN0IHswfSBjaGFyYWN0ZXJzLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlBsZWFzZSBlbnRlciBsZXNzIHRoYW4gezB9IGNoYXJhY3RlcnMuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUGxlYXNlIGVudGVyIG1vcmUgdGhhbiB7MH0gYW5kIGxlc3MgdGhhbiB7MX0gY2hhcmFjdGVycy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQbGVhc2UgZmlsbCBpbiBhdCBsZWFzdCB7MH0gcm93cy5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCB7MH0gdmFyaWFudHMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBsZWFzZSBzZWxlY3Qgbm8gbW9yZSB0aGFuIHswfSB2YXJpYW50cy5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbW9yZSB0aGFuIHsxfSBhbmQgZXF1YWwgb3IgbGVzcyB0aGFuIHsyfVwiLFxuICBudW1lcmljTWluOiBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbW9yZSB0aGFuIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIlRoZSAnezB9JyBzaG91bGQgYmUgZXF1YWwgb3IgbGVzcyB0aGFuIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZS1tYWlsIGFkZHJlc3MuXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJUaGUgcmVxdWVzdCByZXR1cm5lZCBlcnJvciAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIlRoZSByZXF1ZXN0IHJldHVybmVkIGVtcHR5IGRhdGEgb3IgdGhlICdwYXRoJyBwcm9wZXJ0eSBpcyBpbmNvcnJlY3RcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJUaGUgZmlsZSBzaXplIHNob3VsZCBub3QgZXhjZWVkIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlBsZWFzZSBlbnRlciB0aGUgb3RoZXIgdmFsdWUuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJZb3VyIGZpbGUgaXMgdXBsb2FkaW5nLiBQbGVhc2Ugd2FpdCBzZXZlcmFsIHNlY29uZHMgYW5kIHRyeSBhZ2Fpbi5cIixcbiAgY29uZmlybURlbGV0ZTogXCJEbyB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHJlY29yZD9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCJUaGlzIHZhbHVlIHNob3VsZCBiZSB1bmlxdWUuXCIsXG4gIGFkZFJvdzogXCJBZGQgcm93XCIsXG4gIHJlbW92ZVJvdzogXCJSZW1vdmVcIixcbiAgYWRkUGFuZWw6IFwiQWRkIG5ld1wiLFxuICByZW1vdmVQYW5lbDogXCJSZW1vdmVcIixcbiAgY2hvaWNlc19JdGVtOiBcIml0ZW1cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2x1bW5cIixcbiAgbWF0cml4X3JvdzogXCJSb3dcIixcbiAgc2F2aW5nRGF0YTogXCJUaGUgcmVzdWx0cyBhcmUgc2F2aW5nIG9uIHRoZSBzZXJ2ZXIuLi5cIixcbiAgc2F2aW5nRGF0YUVycm9yOiBcIkFuIGVycm9yIG9jY3VycmVkIGFuZCB3ZSBjb3VsZCBub3Qgc2F2ZSB0aGUgcmVzdWx0cy5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiVGhlIHJlc3VsdHMgd2VyZSBzYXZlZCBzdWNjZXNzZnVsbHkhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJUcnkgYWdhaW5cIixcbiAgdGltZXJNaW46IFwibWluXCIsXG4gIHRpbWVyU2VjOiBcInNlY1wiLFxuICB0aW1lclNwZW50QWxsOiBcIllvdSBoYXZlIHNwZW50IHswfSBvbiB0aGlzIHBhZ2UgYW5kIHsxfSBpbiB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9uIHRoaXMgcGFnZS5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJZb3UgaGF2ZSBzcGVudCB7MH0gaW4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6XG4gICAgXCJZb3UgaGF2ZSBzcGVudCB7MH0gb2YgezF9IG9uIHRoaXMgcGFnZSBhbmQgezJ9IG9mIHszfSBpbiB0b3RhbC5cIixcbiAgdGltZXJMaW1pdFBhZ2U6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBvbiB0aGlzIHBhZ2UuXCIsXG4gIHRpbWVyTGltaXRTdXJ2ZXk6IFwiWW91IGhhdmUgc3BlbnQgezB9IG9mIHsxfSBpbiB0b3RhbC5cIixcbiAgY2xlYW5DYXB0aW9uOiBcIkNsZWFuXCJcbn07XG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImVuXCJdID0gc3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9zdXJ2ZXlTdHJpbmdzLnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25CYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25iYXNlXCI7XG5pbXBvcnQgeyBJRWxlbWVudCB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcblxuLy9UT0RPIHJlcGxhY2UgY29tcGxldGVseSB3aXRoIEVsZW1lbnRGYWN0b3J5XG5leHBvcnQgY2xhc3MgUXVlc3Rpb25GYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogUXVlc3Rpb25GYWN0b3J5ID0gbmV3IFF1ZXN0aW9uRmFjdG9yeSgpO1xuICBwdWJsaWMgc3RhdGljIGdldCBEZWZhdWx0Q2hvaWNlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIikgKyBcIjFcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIikgKyBcIjJcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjaG9pY2VzX0l0ZW1cIikgKyBcIjNcIlxuICAgIF07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdENvbHVtcygpOiBzdHJpbmdbXSB7XG4gICAgdmFyIGNvbE5hbWUgPSBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwibWF0cml4X2NvbHVtblwiKSArIFwiIFwiO1xuICAgIHJldHVybiBbY29sTmFtZSArIFwiMVwiLCBjb2xOYW1lICsgXCIyXCIsIGNvbE5hbWUgKyBcIjNcIl07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXQgRGVmYXVsdFJvd3MoKTogc3RyaW5nW10ge1xuICAgIHZhciByb3dOYW1lID0gc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm1hdHJpeF9yb3dcIikgKyBcIiBcIjtcbiAgICByZXR1cm4gW3Jvd05hbWUgKyBcIjFcIiwgcm93TmFtZSArIFwiMlwiXTtcbiAgfVxuICBwcml2YXRlIGNyZWF0b3JIYXNoOiBIYXNoVGFibGU8KG5hbWU6IHN0cmluZykgPT4gUXVlc3Rpb25CYXNlPiA9IHt9O1xuXG4gIHB1YmxpYyByZWdpc3RlclF1ZXN0aW9uKFxuICAgIHF1ZXN0aW9uVHlwZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uQ3JlYXRvcjogKG5hbWU6IHN0cmluZykgPT4gUXVlc3Rpb25CYXNlXG4gICkge1xuICAgIHRoaXMuY3JlYXRvckhhc2hbcXVlc3Rpb25UeXBlXSA9IHF1ZXN0aW9uQ3JlYXRvcjtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5jcmVhdG9ySGFzaCA9IHt9O1xuICB9XG4gIHB1YmxpYyBnZXRBbGxUeXBlcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5jcmVhdG9ySGFzaCkge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdC5zb3J0KCk7XG4gIH1cbiAgcHVibGljIGNyZWF0ZVF1ZXN0aW9uKHF1ZXN0aW9uVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbkJhc2Uge1xuICAgIHZhciBjcmVhdG9yID0gdGhpcy5jcmVhdG9ySGFzaFtxdWVzdGlvblR5cGVdO1xuICAgIGlmIChjcmVhdG9yID09IG51bGwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBjcmVhdG9yKG5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50RmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IEVsZW1lbnRGYWN0b3J5ID0gbmV3IEVsZW1lbnRGYWN0b3J5KCk7XG4gIHByaXZhdGUgY3JlYXRvckhhc2g6IEhhc2hUYWJsZTwobmFtZTogc3RyaW5nKSA9PiBJRWxlbWVudD4gPSB7fTtcblxuICBwdWJsaWMgcmVnaXN0ZXJFbGVtZW50KFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4gICAgZWxlbWVudENyZWF0b3I6IChuYW1lOiBzdHJpbmcpID0+IElFbGVtZW50XG4gICkge1xuICAgIHRoaXMuY3JlYXRvckhhc2hbZWxlbWVudFR5cGVdID0gZWxlbWVudENyZWF0b3I7XG4gIH1cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMuY3JlYXRvckhhc2ggPSB7fTtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsVHlwZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHJlc3VsdCA9IFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5nZXRBbGxUeXBlcygpO1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmNyZWF0b3JIYXNoKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnNvcnQoKTtcbiAgfVxuICBwdWJsaWMgY3JlYXRlRWxlbWVudChlbGVtZW50VHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBJRWxlbWVudCB7XG4gICAgdmFyIGNyZWF0b3IgPSB0aGlzLmNyZWF0b3JIYXNoW2VsZW1lbnRUeXBlXTtcbiAgICBpZiAoY3JlYXRvciA9PSBudWxsKVxuICAgICAgcmV0dXJuIFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5jcmVhdGVRdWVzdGlvbihlbGVtZW50VHlwZSwgbmFtZSk7XG4gICAgcmV0dXJuIGNyZWF0b3IobmFtZSk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbmZhY3RvcnkudHMiLCJpbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBDdXN0b21Qcm9wZXJ0aWVzQ29sbGVjdGlvbiB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJU3VydmV5RGF0YSB7XG4gIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueTtcbiAgc2V0VmFsdWUobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTtcbiAgZ2V0Q29tbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG4gIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKTtcbiAgZ2V0QWxsVmFsdWVzKCk6IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVRleHRQcm9jZXNzb3Ige1xuICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZztcbiAgcHJvY2Vzc1RleHRFeCh0ZXh0OiBzdHJpbmcpOiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXkgZXh0ZW5kcyBJVGV4dFByb2Nlc3NvciB7XG4gIGN1cnJlbnRQYWdlOiBJUGFnZTtcbiAgcGFnZXM6IEFycmF5PElQYWdlPjtcbiAgaXNQYWdlU3RhcnRlZChwYWdlOiBJUGFnZSk6IGJvb2xlYW47XG4gIHBhZ2VWaXNpYmlsaXR5Q2hhbmdlZChwYWdlOiBJUGFnZSwgbmV3VmFsdWU6IGJvb2xlYW4pO1xuICBwYW5lbFZpc2liaWxpdHlDaGFuZ2VkKHBhbmVsOiBJUGFuZWwsIG5ld1ZhbHVlOiBib29sZWFuKTtcbiAgcXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBuZXdWYWx1ZTogYm9vbGVhbik7XG4gIHF1ZXN0aW9uc09yZGVyOiBzdHJpbmc7XG4gIHF1ZXN0aW9uQWRkZWQoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhcmVudFBhbmVsOiBhbnksXG4gICAgcm9vdFBhbmVsOiBhbnlcbiAgKTtcbiAgcGFuZWxBZGRlZChwYW5lbDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIsIHBhcmVudFBhbmVsOiBhbnksIHJvb3RQYW5lbDogYW55KTtcbiAgcXVlc3Rpb25SZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pO1xuICBwYW5lbFJlbW92ZWQocGFuZWw6IElFbGVtZW50KTtcbiAgdmFsaWRhdGVRdWVzdGlvbihxdWVzdGlvbjogSVF1ZXN0aW9uKTogU3VydmV5RXJyb3I7XG4gIHZhbGlkYXRlUGFuZWwocGFuZWw6IElQYW5lbCk6IFN1cnZleUVycm9yO1xuICBoYXNWaXNpYmxlUXVlc3Rpb25CeVZhbHVlTmFtZSh2YWx1ZU5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG4gIHByb2Nlc3NIdG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZztcbiAgaXNEaXNwbGF5TW9kZTogYm9vbGVhbjtcbiAgaXNEZXNpZ25Nb2RlOiBib29sZWFuO1xuICBpc0xvYWRpbmdGcm9tSnNvbjogYm9vbGVhbjtcbiAgcmVxdWlyZWRUZXh0OiBzdHJpbmc7XG4gIHF1ZXN0aW9uU3RhcnRJbmRleDogc3RyaW5nO1xuICBxdWVzdGlvblRpdGxlTG9jYXRpb246IHN0cmluZztcbiAgcXVlc3Rpb25FcnJvckxvY2F0aW9uOiBzdHJpbmc7XG4gIGdldFF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSgpOiBzdHJpbmc7XG4gIHN0b3JlT3RoZXJzQXNDb21tZW50OiBib29sZWFuO1xuICB1cGxvYWRGaWxlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmaWxlOiBGaWxlLFxuICAgIHN0b3JlRGF0YUFzVGV4dDogYm9vbGVhbixcbiAgICB1cGxvYWRpbmdDYWxsYmFjazogKHN0YXR1czogc3RyaW5nKSA9PiBhbnlcbiAgKTogYm9vbGVhbjtcbiAgdXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNzc0NsYXNzZXM6IGFueSk7XG4gIHVwZGF0ZVBhbmVsQ3NzQ2xhc3NlcyhwYW5lbDogSVBhbmVsLCBjc3NDbGFzc2VzOiBhbnkpO1xuICBhZnRlclJlbmRlclF1ZXN0aW9uKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGh0bWxFbGVtZW50KTtcbiAgYWZ0ZXJSZW5kZXJQYW5lbChwYW5lbDogSUVsZW1lbnQsIGh0bWxFbGVtZW50KTtcbiAgYWZ0ZXJSZW5kZXJQYWdlKGh0bWxFbGVtZW50KTtcbiAgbWF0cml4Um93QWRkZWQocXVlc3Rpb246IElRdWVzdGlvbik7XG4gIG1hdHJpeFJvd1JlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgcm93SW5kZXg6IG51bWJlciwgcm93OiBhbnkpO1xuICBtYXRyaXhDZWxsQ3JlYXRlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpO1xuICBtYXRyaXhBZnRlckNlbGxSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTtcbiAgbWF0cml4Q2VsbFZhbHVlQ2hhbmdlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpO1xuICBtYXRyaXhDZWxsVmFsaWRhdGUocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KTogU3VydmV5RXJyb3I7XG4gIGR5bmFtaWNQYW5lbEFkZGVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24pO1xuICBkeW5hbWljUGFuZWxSZW1vdmVkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHBhbmVsSW5kZXg6IG51bWJlcik7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTdXJ2ZXlJbXBsIHtcbiAgZ2VTdXJ2ZXlEYXRhKCk6IElTdXJ2ZXlEYXRhO1xuICBnZXRTdXJ2ZXkoKTogSVN1cnZleTtcbiAgZ2V0VGV4dFByb2Nlc3NvcigpOiBJVGV4dFByb2Nlc3Nvcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbmRpdGlvblJ1bm5lciB7XG4gIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleUVsZW1lbnQge1xuICBuYW1lOiBzdHJpbmc7XG4gIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKTtcbiAgb25TdXJ2ZXlMb2FkKCk7XG4gIGdldFR5cGUoKTogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBJRWxlbWVudCBleHRlbmRzIElDb25kaXRpb25SdW5uZXIsIElTdXJ2ZXlFbGVtZW50IHtcbiAgdmlzaWJsZTogYm9vbGVhbjtcbiAgaXNWaXNpYmxlOiBib29sZWFuO1xuICBwYXJlbnQ6IElQYW5lbDtcbiAgcmVuZGVyV2lkdGg6IHN0cmluZztcbiAgd2lkdGg6IHN0cmluZztcbiAgcmlnaHRJbmRlbnQ6IG51bWJlcjtcbiAgc3RhcnRXaXRoTmV3TGluZTogYm9vbGVhbjtcbiAgaXNQYW5lbDogYm9vbGVhbjtcbiAgcmVtb3ZlRWxlbWVudChlbDogSUVsZW1lbnQpOiBib29sZWFuO1xuICBvbkxvY2FsZUNoYW5nZWQoKTtcbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKTtcbiAgdXBkYXRlQ3VzdG9tV2lkZ2V0cygpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElRdWVzdGlvbiBleHRlbmRzIElFbGVtZW50IHtcbiAgaGFzVGl0bGU6IGJvb2xlYW47XG4gIGlzRW1wdHkoKTogYm9vbGVhbjtcbiAgc2V0VmlzaWJsZUluZGV4KHZhbHVlOiBudW1iZXIpOiBudW1iZXI7XG4gIG9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBhbnkpO1xuICBvblJlYWRPbmx5Q2hhbmdlZCgpO1xuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpOiBib29sZWFuO1xuICBjbGVhclVudXNlZFZhbHVlcygpO1xuICBkaXNwbGF5VmFsdWU6IGFueTtcbiAgZ2V0VmFsdWVOYW1lKCk6IHN0cmluZztcbiAgY2xlYXJWYWx1ZSgpO1xuICBjbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgaXNBbnN3ZXJDb3JyZWN0KCk6IGJvb2xlYW47XG59XG5leHBvcnQgaW50ZXJmYWNlIElQYXJlbnRFbGVtZW50IHtcbiAgYWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcik7XG4gIHJlbW92ZUVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQYW5lbCBleHRlbmRzIElTdXJ2ZXlFbGVtZW50LCBJUGFyZW50RWxlbWVudCB7XG4gIGdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmc7XG4gIHBhcmVudDogSVBhbmVsO1xufVxuZXhwb3J0IGludGVyZmFjZSBJUGFnZVxuICBleHRlbmRzIElTdXJ2ZXlFbGVtZW50LFxuICAgIElQYXJlbnRFbGVtZW50LFxuICAgIElDb25kaXRpb25SdW5uZXIge31cbi8qKlxuICogVGhlIGJhc2UgY2xhc3MgZm9yIFN1cnZleUpTIG9iamVjdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBjb21tZW50UHJlZml4OiBzdHJpbmcgPSBcIi1Db21tZW50XCI7XG4gIC8qKlxuICAgKiBBIHN0YXRpYyBtZXRob2RzIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgdW5kZXJmaW5lZCwgbnVsbCwgZW1wdHkgc3RyaW5nIG9yIGVtcHR5IGFycmF5LlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBpc1ZhbHVlRW1wdHkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIElzUHJvcGVydHlFbXB0eSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiICYmIHRoaXMuaXNWYWx1ZUVtcHR5KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvcGVydHlIYXNoID0ge307XG4gIHByaXZhdGUgbG9jYWxpemFibGVTdHJpbmdzID0ge307XG4gIHByaXZhdGUgYXJyYXlzSW5mbyA9IHt9O1xuICBwcml2YXRlIG9uUHJvcENoYW5nZUZ1bmN0aW9ucyA9IFtdO1xuICBwcm90ZWN0ZWQgaXNMb2FkaW5nRnJvbUpzb25WYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgb25Qcm9wZXJ0eUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IEJhc2UsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIHNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcjogKFxuICAgIHByb3BlcnRpZXNIYXNoOiBhbnksXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHZhbDogYW55XG4gICkgPT4gdm9pZDtcbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLmNyZWF0ZVByb3BlcnRpZXModGhpcyk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBhcyBhIHN0cmluZyBhcyBpdCByZXByZXNlbnRzIGluIHRoZSBqc29uLlxuICAgKi9cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJiYXNlXCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVsZW1lbnQgdGVtcGxhdGUgbmFtZSB3aXRob3V0IHByZWZpeC4gVHlwaWNhbGx5IGl0IGVxdWFscyB0byBnZXRUeXBlKClcbiAgICogQHNlZSBnZXRUeXBlXG4gICAqL1xuICBwdWJsaWMgZ2V0VGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUeXBlKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGxvYWRpbmcgZnJvbSBKc29uIGF0IHRoZSBjdXJyZW50IG1vbWVudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNMb2FkaW5nRnJvbUpzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nRnJvbUpzb25WYWx1ZTtcbiAgfVxuICBzdGFydExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uVmFsdWUgPSB0cnVlO1xuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uVmFsdWUgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgb25Mb2NhbGVDaGFuZ2VkKCkge1xuICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmFycmF5c0luZm8pIHtcbiAgICAgIGxldCBpdGVtID0gdGhpcy5hcnJheXNJbmZvW2tleV07XG4gICAgICBpZiAoaXRlbSAmJiBpdGVtLmlzSXRlbVZhbHVlcykge1xuICAgICAgICB2YXIgYXJyID0gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGtleSk7XG4gICAgICAgIGlmIChhcnIpIEl0ZW1WYWx1ZS5Ob3RpZnlBcnJheU9uTG9jYWxlQ2hhbmdlZChhcnIpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3MpIHtcbiAgICAgIGxldCBpdGVtID0gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhrZXkpO1xuICAgICAgaWYgKGl0ZW0pIGl0ZW0ub25DaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBieSBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIHByb3BlcnR5IG5hbWVcbiAgICovXG4gIHB1YmxpYyBnZXRQcm9wZXJ0eVZhbHVlKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBhbnkgPSBudWxsKTogYW55IHtcbiAgICB2YXIgcmVzID0gdGhpcy5wcm9wZXJ0eUhhc2hbbmFtZV07XG4gICAgaWYgKHRoaXMuSXNQcm9wZXJ0eUVtcHR5KHJlcykgJiYgZGVmYXVsdFZhbHVlICE9IG51bGwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcm90ZWN0ZWQgc2V0UHJvcGVydHlWYWx1ZUNvcmUocHJvcGVydGllc0hhc2g6IGFueSwgbmFtZTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgIGlmICh0aGlzLnNldFByb3BlcnR5VmFsdWVDb3JlSGFuZGxlcilcbiAgICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZUNvcmVIYW5kbGVyKHByb3BlcnRpZXNIYXNoLCBuYW1lLCB2YWwpO1xuICAgIGVsc2UgcHJvcGVydGllc0hhc2hbbmFtZV0gPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIHNldCBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAcGFyYW0gbmFtZSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSB2YWwgbmV3IHByb3BlcnR5IHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc2V0UHJvcGVydHlWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbDogYW55KSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5wcm9wZXJ0eUhhc2hbbmFtZV07XG4gICAgaWYgKG9sZFZhbHVlICYmIEFycmF5LmlzQXJyYXkob2xkVmFsdWUpKSB7XG4gICAgICBpZiAodGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG9sZFZhbHVlLCB2YWwpKSByZXR1cm47XG4gICAgICB2YXIgYXJyYXlJbmZvID0gdGhpcy5hcnJheXNJbmZvW25hbWVdO1xuICAgICAgdGhpcy5zZXRBcnJheShcbiAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgIHZhbCxcbiAgICAgICAgYXJyYXlJbmZvID8gYXJyYXlJbmZvLmlzSXRlbVZhbHVlcyA6IGZhbHNlLFxuICAgICAgICBhcnJheUluZm8gPyBhcnJheUluZm8ub25QdXNoIDogbnVsbFxuICAgICAgKTtcbiAgICAgIHRoaXMucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgb2xkVmFsdWUsIG9sZFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZSh0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSwgdmFsKTtcbiAgICAgIGlmICghdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG9sZFZhbHVlLCB2YWwpKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgb2xkVmFsdWUsIHZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgb2xkVmFsdWU6IG9sZFZhbHVlLFxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXG4gICAgfSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zW2ldLm5hbWUgPT0gbmFtZSlcbiAgICAgICAgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnNbaV0uZnVuYygpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGEgcHJvcGVydHkgdmFsdWUgY2hhbmdlZC5cbiAgICogQHBhcmFtIG5hbWUgdGhlIHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIGZ1bmMgdGhlIGZ1bmN0aW9uIHdpdGggbm8gcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIHByb3BlcnR5IGNoYW5nZWQuXG4gICAqIEBwYXJhbSBrZXkgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcmVnaXN0ZXJlZCBmdW5jdGlvbiBmb3IgdGhpcyBwcm9wZXJ0eSB3aXRodCB0aGUgc2FtZSBrZXksIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZ1bmM6IGFueSxcbiAgICBrZXk6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgaWYgKGtleSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbSA9IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zW2ldO1xuICAgICAgICBpZiAoaXRlbS5uYW1lID09IG5hbWUgJiYgaXRlbS5rZXkgPT0ga2V5KSB7XG4gICAgICAgICAgaXRlbS5mdW5jID0gZnVuYztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblByb3BDaGFuZ2VGdW5jdGlvbnMucHVzaCh7IG5hbWU6IG5hbWUsIGZ1bmM6IGZ1bmMsIGtleToga2V5IH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gYSBwcm9wZXJ0eSB2YWx1ZSBjaGFuZ2VkIGZyb20gdGhlIG5hbWVzIGxpc3QuXG4gICAqIEBwYXJhbSBuYW1lcyB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIG5hbWVzXG4gICAqIEBwYXJhbSBmdW5jIHRoZSBmdW5jdGlvbiB3aXRoIG5vIHBhcmFtZXRlcnMgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBwcm9wZXJ0eSBjaGFuZ2VkLlxuICAgKiBAcGFyYW0ga2V5IGFuIG9wdGlvbmFsIHBhcmFtZXRlci4gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlZ2lzdGVyZWQgZnVuY3Rpb24gZm9yIHRoaXMgcHJvcGVydHkgd2l0aHQgdGhlIHNhbWUga2V5LCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnRpZXNWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICAgZnVuYzogYW55LFxuICAgIGtleTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWVzW2ldLCBmdW5jLCBrZXkpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVW5yZWdpc3RlciBub3RpZmljYXRpb24gb24gcHJvcGVydHkgdmFsdWUgY2hhbmdlZFxuICAgKiBAcGFyYW0gbmFtZSB0aGUgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgd2l0aCB3aGljaCB5b3UgaGF2ZSByZWdpc3RlcmVkIHRoZSBub3RpZmljYXRpb24gZm9yIHRoaXMgcHJvcGVydHkuIEl0IGNhbiBiZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGtleTogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IHRoaXMub25Qcm9wQ2hhbmdlRnVuY3Rpb25zW2ldO1xuICAgICAgaWYgKGl0ZW0ubmFtZSA9PSBuYW1lICYmIGl0ZW0ua2V5ID09IGtleSkge1xuICAgICAgICB0aGlzLm9uUHJvcENoYW5nZUZ1bmN0aW9ucy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXIgbm90aWZpY2F0aW9uIG9uIHByb3BlcnR5IHZhbHVlIGNoYW5nZWQgZm9yIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBuYW1lcyBsaXN0LlxuICAgKiBAcGFyYW0gbmFtZXMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBuYW1lc1xuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkgd2l0aCB3aGljaCB5b3UgaGF2ZSByZWdpc3RlcmVkIHRoZSBub3RpZmljYXRpb24gZm9yIHRoaXMgcHJvcGVydHkuIEl0IGNhbiBiZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHVuUmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPixcbiAgICBrZXk6IHN0cmluZyA9IG51bGxcbiAgKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy51blJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWVzW2ldLCBrZXkpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY3JlYXRlQ3VzdG9tTG9jYWxpemFibGVPYmoobmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIGxvY1N0ciA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcobmFtZSk7XG4gICAgaWYgKGxvY1N0ciB8fCAhdGhpc1tcImdldExvY2FsZVwiXSkgcmV0dXJuO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcobmFtZSwgPElMb2NhbGl6YWJsZU93bmVyPig8YW55PnRoaXMpKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG93bmVyOiBJTG9jYWxpemFibGVPd25lcixcbiAgICB1c2VNYXJrRG93bjogYm9vbGVhbiA9IGZhbHNlXG4gICk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICB2YXIgbG9jU3RyID0gbmV3IExvY2FsaXphYmxlU3RyaW5nKG93bmVyLCB1c2VNYXJrRG93bik7XG4gICAgdGhpcy5sb2NhbGl6YWJsZVN0cmluZ3NbbmFtZV0gPSBsb2NTdHI7XG4gICAgcmV0dXJuIGxvY1N0cjtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxpemFibGVTdHJpbmcobmFtZTogc3RyaW5nKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY2FsaXphYmxlU3RyaW5nc1tuYW1lXTtcbiAgfVxuICBwdWJsaWMgZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZWZhdWx0U3RyOiBzdHJpbmcgPSBcIlwiXG4gICk6IHN0cmluZyB7XG4gICAgdmFyIGxvY1N0ciA9IHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcobmFtZSk7XG4gICAgaWYgKCFsb2NTdHIpIHJldHVybiBcIlwiO1xuICAgIHZhciByZXMgPSBsb2NTdHIudGV4dDtcbiAgICByZXR1cm4gcmVzID8gcmVzIDogZGVmYXVsdFN0cjtcbiAgfVxuICBwdWJsaWMgc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHZhciBsb2NTdHIgPSB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKG5hbWUpO1xuICAgIGlmICghbG9jU3RyKSByZXR1cm47XG4gICAgdmFyIG9sZFZhbHVlID0gbG9jU3RyLnRleHQ7XG4gICAgaWYgKG9sZFZhbHVlID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIGxvY1N0ci50ZXh0ID0gdmFsdWU7XG4gICAgdGhpcy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgdmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVJdGVtVmFsdWVzKG5hbWU6IHN0cmluZyk6IEFycmF5PGFueT4ge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5jcmVhdGVOZXdBcnJheShuYW1lLCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICBpdGVtLmxvY093bmVyID0gc2VsZjtcbiAgICB9KTtcbiAgICB0aGlzLmFycmF5c0luZm9bbmFtZV0uaXNJdGVtVmFsdWVzID0gdHJ1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdBcnJheShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb25QdXNoOiBhbnkgPSBudWxsLFxuICAgIG9uUmVtb3ZlOiBhbnkgPSBudWxsXG4gICk6IEFycmF5PGFueT4ge1xuICAgIHZhciBuZXdBcnJheSA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlQ29yZSh0aGlzLnByb3BlcnR5SGFzaCwgbmFtZSwgbmV3QXJyYXkpO1xuICAgIHRoaXMuYXJyYXlzSW5mb1tuYW1lXSA9IHsgb25QdXNoOiBvblB1c2gsIGlzSXRlbVZhbHVlczogZmFsc2UgfTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgbmV3QXJyYXkucHVzaCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKG5ld0FycmF5LCB2YWx1ZSk7XG4gICAgICBpZiAob25QdXNoKSBvblB1c2godmFsdWUpO1xuICAgICAgc2VsZi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBuZXdBcnJheSwgbmV3QXJyYXkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIG5ld0FycmF5LnBvcCA9IGZ1bmN0aW9uKCk6IG51bWJlciB7XG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnBvcC5jYWxsKG5ld0FycmF5KTtcbiAgICAgIGlmIChvblJlbW92ZSkgb25SZW1vdmUocmVzdWx0KTtcbiAgICAgIHNlbGYucHJvcGVydHlWYWx1ZUNoYW5nZWQobmFtZSwgbmV3QXJyYXksIG5ld0FycmF5KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBuZXdBcnJheS5zcGxpY2UgPSBmdW5jdGlvbihcbiAgICAgIHN0YXJ0PzogbnVtYmVyLFxuICAgICAgZGVsZXRlQ291bnQ/OiBudW1iZXIsXG4gICAgICAuLi5pdGVtczogYW55W11cbiAgICApOiBhbnlbXSB7XG4gICAgICBpZiAoIXN0YXJ0KSBzdGFydCA9IDA7XG4gICAgICBpZiAoIWRlbGV0ZUNvdW50KSBkZWxldGVDb3VudCA9IDA7XG4gICAgICB2YXIgcmVzdWx0ID0gQXJyYXkucHJvdG90eXBlLnNwbGljZS5jYWxsKFxuICAgICAgICBuZXdBcnJheSxcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGRlbGV0ZUNvdW50LFxuICAgICAgICAuLi5pdGVtc1xuICAgICAgKTtcbiAgICAgIGlmICghaXRlbXMpIGl0ZW1zID0gW107XG4gICAgICBpZiAob25SZW1vdmUgJiYgcmVzdWx0KSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgb25SZW1vdmUocmVzdWx0W2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG9uUHVzaCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgb25QdXNoKGl0ZW1zW2ldLCBzdGFydCArIGkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZWxmLnByb3BlcnR5VmFsdWVDaGFuZ2VkKG5hbWUsIG5ld0FycmF5LCBuZXdBcnJheSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3QXJyYXk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldEFycmF5KFxuICAgIHNyYzogYW55W10sXG4gICAgZGVzdDogYW55W10sXG4gICAgaXNJdGVtVmFsdWVzOiBib29sZWFuLFxuICAgIG9uUHVzaDogYW55XG4gICkge1xuICAgIHNyYy5sZW5ndGggPSAwO1xuICAgIGlmICghZGVzdCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVzdC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlzSXRlbVZhbHVlcykge1xuICAgICAgICB2YXIgaXRlbSA9IGRlc3RbaV07XG4gICAgICAgIGl0ZW0gPSBuZXcgSXRlbVZhbHVlKG51bGwpO1xuICAgICAgICBpdGVtLnNldERhdGEoZGVzdFtpXSk7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmNhbGwoc3JjLCBpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmNhbGwoc3JjLCBkZXN0W2ldKTtcbiAgICAgIH1cbiAgICAgIGlmIChvblB1c2gpIG9uUHVzaChzcmNbaV0pO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgaXNUd29WYWx1ZUVxdWFscyh4OiBhbnksIHk6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoeCwgeSk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlFcnJvciB7XG4gIHB1YmxpYyBnZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaXMgYWJzdHJhY3RcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1cnZleUVsZW1lbnQgZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSVN1cnZleUVsZW1lbnQge1xuICBwcml2YXRlIHN1cnZleUltcGxWYWx1ZTogSVN1cnZleUltcGw7XG4gIHByaXZhdGUgc3VydmV5RGF0YVZhbHVlOiBJU3VydmV5RGF0YTtcbiAgcHJpdmF0ZSBzdXJ2ZXlWYWx1ZTogSVN1cnZleTtcbiAgcHJpdmF0ZSB0ZXh0UHJvY2Vzc29yVmFsdWU6IElUZXh0UHJvY2Vzc29yO1xuICBwcml2YXRlIHNlbGVjdGVkRWxlbWVudEluRGVzaWduVmFsdWU6IFN1cnZleUVsZW1lbnQgPSB0aGlzO1xuICBwcml2YXRlIGVycm9yc1ZhbHVlOiBBcnJheTxTdXJ2ZXlFcnJvcj4gPSBbXTtcbiAgZXJyb3JzQ2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIHB1YmxpYyBzdGF0aWMgU2Nyb2xsRWxlbWVudFRvVG9wKGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFlbGVtZW50SWQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgIGlmICghZWwgfHwgIWVsLnNjcm9sbEludG9WaWV3KSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGVsZW1Ub3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgaWYgKGVsZW1Ub3AgPCAwKSBlbC5zY3JvbGxJbnRvVmlldygpO1xuICAgIHJldHVybiBlbGVtVG9wIDwgMDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIEdldEZpcnN0Tm9uVGV4dEVsZW1lbnQoZWxlbWVudHM6IGFueSkge1xuICAgIGlmICghZWxlbWVudHMgfHwgIWVsZW1lbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlbGVtZW50c1tpXS5ub2RlTmFtZSAhPSBcIiN0ZXh0XCIgJiYgZWxlbWVudHNbaV0ubm9kZU5hbWUgIT0gXCIjY29tbWVudFwiKVxuICAgICAgICByZXR1cm4gZWxlbWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgRm9jdXNFbGVtZW50KGVsZW1lbnRJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFlbGVtZW50SWQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwuZm9jdXMoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXRWaXNpYmxlSW5kZXgoXG4gICAgcXVlc3Rpb25zOiBBcnJheTxJUXVlc3Rpb24+LFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgc2hvd0luZGV4OiBib29sZWFuXG4gICk6IG51bWJlciB7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSBpbmRleDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICBpZiAoIXNob3dJbmRleCB8fCAhcS52aXNpYmxlIHx8ICFxLmhhc1RpdGxlKSB7XG4gICAgICAgIHEuc2V0VmlzaWJsZUluZGV4KC0xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4ICs9IHEuc2V0VmlzaWJsZUluZGV4KGluZGV4KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4IC0gc3RhcnRJbmRleDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHRoaXMuc3VydmV5SW1wbFZhbHVlID0gdmFsdWU7XG4gICAgaWYgKCF0aGlzLnN1cnZleUltcGxWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuc3VydmV5RGF0YVZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2VTdXJ2ZXlEYXRhKCk7XG4gICAgdGhpcy5zdXJ2ZXlWYWx1ZSA9IHRoaXMuc3VydmV5SW1wbFZhbHVlLmdldFN1cnZleSgpO1xuICAgIHRoaXMudGV4dFByb2Nlc3NvclZhbHVlID0gdGhpcy5zdXJ2ZXlJbXBsVmFsdWUuZ2V0VGV4dFByb2Nlc3NvcigpO1xuICAgIHRoaXMub25TZXREYXRhKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBzdXJ2ZXlJbXBsKCkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleUltcGxWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRhdGEoKTogSVN1cnZleURhdGEge1xuICAgIHJldHVybiB0aGlzLnN1cnZleURhdGFWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3VydmV5IG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleVZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIGluIGRlc2lnbiBtb2RlIHJpZ2h0IG5vdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXNpZ25Nb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5pc0Rlc2lnbk1vZGU7XG4gIH1cbiAgcHVibGljIGdldCBpc0xvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHJldHVybiB0aGlzLnN1cnZleS5pc0xvYWRpbmdGcm9tSnNvbjtcbiAgICByZXR1cm4gdGhpcy5pc0xvYWRpbmdGcm9tSnNvblZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBlcnJvcnMuIEl0IGlzIGNyZWF0ZWQgYnkgY2FsbGlnIGhhc0Vycm9ycyBmdW5jdGlvbnNcbiAgICogQHNlZSBoYXNFcnJvcnNcbiAgICovXG4gIHB1YmxpYyBnZXQgZXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBlcnJvcnModmFsOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICB0aGlzLmVycm9yc1ZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ24oKTogU3VydmV5RWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ25WYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHNlbGVjdGVkRWxlbWVudEluRGVzaWduKHZhbDogU3VydmV5RWxlbWVudCkge1xuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5EZXNpZ25WYWx1ZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgdXBkYXRlQ3VzdG9tV2lkZ2V0cygpIHt9XG5cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHt9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICBpZiAoIXRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLm9uU3VydmV5TG9hZCgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3JWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0UHJvY2Vzc2VkSHRtbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaHRtbCB8fCAhdGhpcy50ZXh0UHJvY2Vzc29yKSByZXR1cm4gaHRtbDtcbiAgICByZXR1cm4gdGhpcy50ZXh0UHJvY2Vzc29yLnByb2Nlc3NUZXh0KGh0bWwsIHRydWUpO1xuICB9XG4gIHByb3RlY3RlZCBvblNldERhdGEoKSB7fVxuICBwcm90ZWN0ZWQgZ2V0UGFnZShwYXJlbnQ6IElQYW5lbCk6IElQYWdlIHtcbiAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5wYXJlbnQpIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuZ2V0VHlwZSgpID09IFwicGFnZVwiKSByZXR1cm4gPElQYWdlPig8YW55PnBhcmVudCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIHNldFBhZ2UocGFyZW50OiBJUGFuZWwsIHZhbDogSVBhZ2UpIHtcbiAgICB2YXIgb2xkUGFnZSA9IHRoaXMuZ2V0UGFnZShwYXJlbnQpO1xuICAgIGlmIChvbGRQYWdlID09PSB2YWwpIHJldHVybjtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlRWxlbWVudCg8SUVsZW1lbnQ+KDxhbnk+dGhpcykpO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHZhbC5hZGRFbGVtZW50KDxJRWxlbWVudD4oPGFueT50aGlzKSwgLTEpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY29weUNzc0NsYXNzZXMoZGVzdDogYW55LCBzb3VyY2U6IGFueSkge1xuICAgIGlmICghc291cmNlKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICBkZXN0W1wicm9vdFwiXSA9IHNvdXJjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBkZXN0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50PFQgZXh0ZW5kcyBGdW5jdGlvbiwgT3B0aW9ucz4ge1xuICBwcml2YXRlIGNhbGxiYWNrczogQXJyYXk8VD47XG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja3MgPT0gbnVsbCB8fCB0aGlzLmNhbGxiYWNrcy5sZW5ndGggPT0gMDtcbiAgfVxuICBwdWJsaWMgZmlyZShzZW5kZXI6IGFueSwgb3B0aW9uczogT3B0aW9ucykge1xuICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNhbGxSZXN1bHQgPSB0aGlzLmNhbGxiYWNrc1tpXShzZW5kZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYWRkKGZ1bmM6IFQpIHtcbiAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkge1xuICAgICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgQXJyYXk8VD4oKTtcbiAgICB9XG4gICAgdGhpcy5jYWxsYmFja3MucHVzaChmdW5jKTtcbiAgfVxuICBwdWJsaWMgcmVtb3ZlKGZ1bmM6IFQpIHtcbiAgICBpZiAodGhpcy5jYWxsYmFja3MgPT0gbnVsbCkgcmV0dXJuO1xuICAgIHZhciBpbmRleCA9IHRoaXMuY2FsbGJhY2tzLmluZGV4T2YoZnVuYywgMCk7XG4gICAgaWYgKGluZGV4ICE9IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jYWxsYmFja3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9iYXNlLnRzIiwiLyohXG4gKiBLbm9ja291dCBKYXZhU2NyaXB0IGxpYnJhcnkgdjMuNC4wXG4gKiAoYykgU3RldmVuIFNhbmRlcnNvbiAtIGh0dHA6Ly9rbm9ja291dGpzLmNvbS9cbiAqIExpY2Vuc2U6IE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHApXG4gKi9cblxuKGZ1bmN0aW9uKCl7XG52YXIgREVCVUc9dHJ1ZTtcbihmdW5jdGlvbih1bmRlZmluZWQpe1xuICAgIC8vICgwLCBldmFsKSgndGhpcycpIGlzIGEgcm9idXN0IHdheSBvZiBnZXR0aW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0XG4gICAgLy8gRm9yIGRldGFpbHMsIHNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE0MTE5OTg4L3JldHVybi10aGlzLTAtZXZhbHRoaXMvMTQxMjAwMjMjMTQxMjAwMjNcbiAgICB2YXIgd2luZG93ID0gdGhpcyB8fCAoMCwgZXZhbCkoJ3RoaXMnKSxcbiAgICAgICAgZG9jdW1lbnQgPSB3aW5kb3dbJ2RvY3VtZW50J10sXG4gICAgICAgIG5hdmlnYXRvciA9IHdpbmRvd1snbmF2aWdhdG9yJ10sXG4gICAgICAgIGpRdWVyeUluc3RhbmNlID0gd2luZG93W1wialF1ZXJ5XCJdLFxuICAgICAgICBKU09OID0gd2luZG93W1wiSlNPTlwiXTtcbihmdW5jdGlvbihmYWN0b3J5KSB7XG4gICAgLy8gU3VwcG9ydCB0aHJlZSBtb2R1bGUgbG9hZGluZyBzY2VuYXJpb3NcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKSB7XG4gICAgICAgIC8vIFsxXSBBTUQgYW5vbnltb3VzIG1vZHVsZVxuICAgICAgICBkZWZpbmUoWydleHBvcnRzJywgJ3JlcXVpcmUnXSwgZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gWzJdIENvbW1vbkpTL05vZGUuanNcbiAgICAgICAgZmFjdG9yeShtb2R1bGVbJ2V4cG9ydHMnXSB8fCBleHBvcnRzKTsgIC8vIG1vZHVsZS5leHBvcnRzIGlzIGZvciBOb2RlLmpzXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gWzNdIE5vIG1vZHVsZSBsb2FkZXIgKHBsYWluIDxzY3JpcHQ+IHRhZykgLSBwdXQgZGlyZWN0bHkgaW4gZ2xvYmFsIG5hbWVzcGFjZVxuICAgICAgICBmYWN0b3J5KHdpbmRvd1sna28nXSA9IHt9KTtcbiAgICB9XG59KGZ1bmN0aW9uKGtvRXhwb3J0cywgYW1kUmVxdWlyZSl7XG4vLyBJbnRlcm5hbGx5LCBhbGwgS08gb2JqZWN0cyBhcmUgYXR0YWNoZWQgdG8ga29FeHBvcnRzIChldmVuIHRoZSBub24tZXhwb3J0ZWQgb25lcyB3aG9zZSBuYW1lcyB3aWxsIGJlIG1pbmlmaWVkIGJ5IHRoZSBjbG9zdXJlIGNvbXBpbGVyKS5cbi8vIEluIHRoZSBmdXR1cmUsIHRoZSBmb2xsb3dpbmcgXCJrb1wiIHZhcmlhYmxlIG1heSBiZSBtYWRlIGRpc3RpbmN0IGZyb20gXCJrb0V4cG9ydHNcIiBzbyB0aGF0IHByaXZhdGUgb2JqZWN0cyBhcmUgbm90IGV4dGVybmFsbHkgcmVhY2hhYmxlLlxudmFyIGtvID0gdHlwZW9mIGtvRXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcgPyBrb0V4cG9ydHMgOiB7fTtcbi8vIEdvb2dsZSBDbG9zdXJlIENvbXBpbGVyIGhlbHBlcnMgKHVzZWQgb25seSB0byBtYWtlIHRoZSBtaW5pZmllZCBmaWxlIHNtYWxsZXIpXG5rby5leHBvcnRTeW1ib2wgPSBmdW5jdGlvbihrb1BhdGgsIG9iamVjdCkge1xuICAgIHZhciB0b2tlbnMgPSBrb1BhdGguc3BsaXQoXCIuXCIpO1xuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSwgXCJrb1wiIG1heSBiZWNvbWUgZGlzdGluY3QgZnJvbSBcImtvRXhwb3J0c1wiIChzbyB0aGF0IG5vbi1leHBvcnRlZCBvYmplY3RzIGFyZSBub3QgcmVhY2hhYmxlKVxuICAgIC8vIEF0IHRoYXQgcG9pbnQsIFwidGFyZ2V0XCIgd291bGQgYmUgc2V0IHRvOiAodHlwZW9mIGtvRXhwb3J0cyAhPT0gXCJ1bmRlZmluZWRcIiA/IGtvRXhwb3J0cyA6IGtvKVxuICAgIHZhciB0YXJnZXQgPSBrbztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aCAtIDE7IGkrKylcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W3Rva2Vuc1tpXV07XG4gICAgdGFyZ2V0W3Rva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV1dID0gb2JqZWN0O1xufTtcbmtvLmV4cG9ydFByb3BlcnR5ID0gZnVuY3Rpb24ob3duZXIsIHB1YmxpY05hbWUsIG9iamVjdCkge1xuICAgIG93bmVyW3B1YmxpY05hbWVdID0gb2JqZWN0O1xufTtcbmtvLnZlcnNpb24gPSBcIjMuNC4wXCI7XG5cbmtvLmV4cG9ydFN5bWJvbCgndmVyc2lvbicsIGtvLnZlcnNpb24pO1xuLy8gRm9yIGFueSBvcHRpb25zIHRoYXQgbWF5IGFmZmVjdCB2YXJpb3VzIGFyZWFzIG9mIEtub2Nrb3V0IGFuZCBhcmVuJ3QgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIGRhdGEgYmluZGluZy5cbmtvLm9wdGlvbnMgPSB7XG4gICAgJ2RlZmVyVXBkYXRlcyc6IGZhbHNlLFxuICAgICd1c2VPbmx5TmF0aXZlRXZlbnRzJzogZmFsc2Vcbn07XG5cbi8va28uZXhwb3J0U3ltYm9sKCdvcHRpb25zJywga28ub3B0aW9ucyk7ICAgLy8gJ29wdGlvbnMnIGlzbid0IG1pbmlmaWVkXG5rby51dGlscyA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gb2JqZWN0Rm9yRWFjaChvYmosIGFjdGlvbikge1xuICAgICAgICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgICAgICAgIGFjdGlvbihwcm9wLCBvYmpbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGZvcih2YXIgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBpZihzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKG9iaiwgcHJvdG8pIHtcbiAgICAgICAgb2JqLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHZhciBjYW5TZXRQcm90b3R5cGUgPSAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgdmFyIGNhblVzZVN5bWJvbHMgPSAhREVCVUcgJiYgdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIC8vIFJlcHJlc2VudCB0aGUga25vd24gZXZlbnQgdHlwZXMgaW4gYSBjb21wYWN0IHdheSwgdGhlbiBhdCBydW50aW1lIHRyYW5zZm9ybSBpdCBpbnRvIGEgaGFzaCB3aXRoIGV2ZW50IG5hbWUgYXMga2V5IChmb3IgZmFzdCBsb29rdXApXG4gICAgdmFyIGtub3duRXZlbnRzID0ge30sIGtub3duRXZlbnRUeXBlc0J5RXZlbnROYW1lID0ge307XG4gICAgdmFyIGtleUV2ZW50VHlwZU5hbWUgPSAobmF2aWdhdG9yICYmIC9GaXJlZm94XFwvMi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpID8gJ0tleWJvYXJkRXZlbnQnIDogJ1VJRXZlbnRzJztcbiAgICBrbm93bkV2ZW50c1trZXlFdmVudFR5cGVOYW1lXSA9IFsna2V5dXAnLCAna2V5ZG93bicsICdrZXlwcmVzcyddO1xuICAgIGtub3duRXZlbnRzWydNb3VzZUV2ZW50cyddID0gWydjbGljaycsICdkYmxjbGljaycsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdtb3VzZW1vdmUnLCAnbW91c2VvdmVyJywgJ21vdXNlb3V0JywgJ21vdXNlZW50ZXInLCAnbW91c2VsZWF2ZSddO1xuICAgIG9iamVjdEZvckVhY2goa25vd25FdmVudHMsIGZ1bmN0aW9uKGV2ZW50VHlwZSwga25vd25FdmVudHNGb3JUeXBlKSB7XG4gICAgICAgIGlmIChrbm93bkV2ZW50c0ZvclR5cGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGtub3duRXZlbnRzRm9yVHlwZS5sZW5ndGg7IGkgPCBqOyBpKyspXG4gICAgICAgICAgICAgICAga25vd25FdmVudFR5cGVzQnlFdmVudE5hbWVba25vd25FdmVudHNGb3JUeXBlW2ldXSA9IGV2ZW50VHlwZTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHZhciBldmVudHNUaGF0TXVzdEJlUmVnaXN0ZXJlZFVzaW5nQXR0YWNoRXZlbnQgPSB7ICdwcm9wZXJ0eWNoYW5nZSc6IHRydWUgfTsgLy8gV29ya2Fyb3VuZCBmb3IgYW4gSUU5IGlzc3VlIC0gaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L2lzc3Vlcy80MDZcblxuICAgIC8vIERldGVjdCBJRSB2ZXJzaW9ucyBmb3IgYnVnIHdvcmthcm91bmRzICh1c2VzIElFIGNvbmRpdGlvbmFscywgbm90IFVBIHN0cmluZywgZm9yIHJvYnVzdG5lc3MpXG4gICAgLy8gTm90ZSB0aGF0LCBzaW5jZSBJRSAxMCBkb2VzIG5vdCBzdXBwb3J0IGNvbmRpdGlvbmFsIGNvbW1lbnRzLCB0aGUgZm9sbG93aW5nIGxvZ2ljIG9ubHkgZGV0ZWN0cyBJRSA8IDEwLlxuICAgIC8vIEN1cnJlbnRseSB0aGlzIGlzIGJ5IGRlc2lnbiwgc2luY2UgSUUgMTArIGJlaGF2ZXMgY29ycmVjdGx5IHdoZW4gdHJlYXRlZCBhcyBhIHN0YW5kYXJkIGJyb3dzZXIuXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBmdXR1cmUgbmVlZCB0byBkZXRlY3Qgc3BlY2lmaWMgdmVyc2lvbnMgb2YgSUUxMCssIHdlIHdpbGwgYW1lbmQgdGhpcy5cbiAgICB2YXIgaWVWZXJzaW9uID0gZG9jdW1lbnQgJiYgKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmVyc2lvbiA9IDMsIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLCBpRWxlbXMgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2knKTtcblxuICAgICAgICAvLyBLZWVwIGNvbnN0cnVjdGluZyBjb25kaXRpb25hbCBIVE1MIGJsb2NrcyB1bnRpbCB3ZSBoaXQgb25lIHRoYXQgcmVzb2x2ZXMgdG8gYW4gZW1wdHkgZnJhZ21lbnRcbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9ICc8IS0tW2lmIGd0IElFICcgKyAoKyt2ZXJzaW9uKSArICddPjxpPjwvaT48IVtlbmRpZl0tLT4nLFxuICAgICAgICAgICAgaUVsZW1zWzBdXG4gICAgICAgICkge31cbiAgICAgICAgcmV0dXJuIHZlcnNpb24gPiA0ID8gdmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgICB9KCkpO1xuICAgIHZhciBpc0llNiA9IGllVmVyc2lvbiA9PT0gNixcbiAgICAgICAgaXNJZTcgPSBpZVZlcnNpb24gPT09IDc7XG5cbiAgICBmdW5jdGlvbiBpc0NsaWNrT25DaGVja2FibGVFbGVtZW50KGVsZW1lbnQsIGV2ZW50VHlwZSkge1xuICAgICAgICBpZiAoKGtvLnV0aWxzLnRhZ05hbWVMb3dlcihlbGVtZW50KSAhPT0gXCJpbnB1dFwiKSB8fCAhZWxlbWVudC50eXBlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChldmVudFR5cGUudG9Mb3dlckNhc2UoKSAhPSBcImNsaWNrXCIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGlucHV0VHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgcmV0dXJuIChpbnB1dFR5cGUgPT0gXCJjaGVja2JveFwiKSB8fCAoaW5wdXRUeXBlID09IFwicmFkaW9cIik7XG4gICAgfVxuXG4gICAgLy8gRm9yIGRldGFpbHMgb24gdGhlIHBhdHRlcm4gZm9yIGNoYW5naW5nIG5vZGUgY2xhc3Nlc1xuICAgIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2tub2Nrb3V0L2tub2Nrb3V0L2lzc3Vlcy8xNTk3XG4gICAgdmFyIGNzc0NsYXNzTmFtZVJlZ2V4ID0gL1xcUysvZztcblxuICAgIGZ1bmN0aW9uIHRvZ2dsZURvbU5vZGVDc3NDbGFzcyhub2RlLCBjbGFzc05hbWVzLCBzaG91bGRIYXZlQ2xhc3MpIHtcbiAgICAgICAgdmFyIGFkZE9yUmVtb3ZlRm47XG4gICAgICAgIGlmIChjbGFzc05hbWVzKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUuY2xhc3NMaXN0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGFkZE9yUmVtb3ZlRm4gPSBub2RlLmNsYXNzTGlzdFtzaG91bGRIYXZlQ2xhc3MgPyAnYWRkJyA6ICdyZW1vdmUnXTtcbiAgICAgICAgICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goY2xhc3NOYW1lcy5tYXRjaChjc3NDbGFzc05hbWVSZWdleCksIGZ1bmN0aW9uKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRPclJlbW92ZUZuLmNhbGwobm9kZS5jbGFzc0xpc3QsIGNsYXNzTmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBub2RlLmNsYXNzTmFtZVsnYmFzZVZhbCddID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIFNWRyB0YWcgLmNsYXNzTmFtZXMgaXMgYW4gU1ZHQW5pbWF0ZWRTdHJpbmcgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB0b2dnbGVPYmplY3RDbGFzc1Byb3BlcnR5U3RyaW5nKG5vZGUuY2xhc3NOYW1lLCAnYmFzZVZhbCcsIGNsYXNzTmFtZXMsIHNob3VsZEhhdmVDbGFzcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIG5vZGUuY2xhc3NOYW1lIG91Z2h0IHRvIGJlIGEgc3RyaW5nLlxuICAgICAgICAgICAgICAgIHRvZ2dsZU9iamVjdENsYXNzUHJvcGVydHlTdHJpbmcobm9kZSwgJ2NsYXNzTmFtZScsIGNsYXNzTmFtZXMsIHNob3VsZEhhdmVDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b2dnbGVPYmplY3RDbGFzc1Byb3BlcnR5U3RyaW5nKG9iaiwgcHJvcCwgY2xhc3NOYW1lcywgc2hvdWxkSGF2ZUNsYXNzKSB7XG4gICAgICAgIC8vIG9iai9wcm9wIGlzIGVpdGhlciBhIG5vZGUvJ2NsYXNzTmFtZScgb3IgYSBTVkdBbmltYXRlZFN0cmluZy8nYmFzZVZhbCcuXG4gICAgICAgIHZhciBjdXJyZW50Q2xhc3NOYW1lcyA9IG9ialtwcm9wXS5tYXRjaChjc3NDbGFzc05hbWVSZWdleCkgfHwgW107XG4gICAgICAgIGtvLnV0aWxzLmFycmF5Rm9yRWFjaChjbGFzc05hbWVzLm1hdGNoKGNzc0NsYXNzTmFtZVJlZ2V4KSwgZnVuY3Rpb24oY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBrby51dGlscy5hZGRPclJlbW92ZUl0ZW0oY3VycmVudENsYXNzTmFtZXMsIGNsYXNzTmFtZSwgc2hvdWxkSGF2ZUNsYXNzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9ialtwcm9wXSA9IGN1cnJlbnRDbGFzc05hbWVzLmpvaW4oXCIgXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkc0luY2x1ZGVkV2l0aEpzb25Qb3N0OiBbJ2F1dGhlbnRpY2l0eV90b2tlbicsIC9eX19SZXF1ZXN0VmVyaWZpY2F0aW9uVG9rZW4oXy4qKT8kL10sXG5cbiAgICAgICAgYXJyYXlGb3JFYWNoOiBmdW5jdGlvbiAoYXJyYXksIGFjdGlvbikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspXG4gICAgICAgICAgICAgICAgYWN0aW9uKGFycmF5W2ldLCBpKTtcbiAgICAgICAgfSxcblxuICAgICAgICBhcnJheUluZGV4T2Y6IGZ1bmN0aW9uIChhcnJheSwgaXRlbSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYXJyYXksIGl0ZW0pO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBhcnJheS5sZW5ndGg7IGkgPCBqOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSxcblxuICAgICAgICBhcnJheUZpcnN0OiBmdW5jdGlvbiAoYXJyYXksIHByZWRpY2F0ZSwgcHJlZGljYXRlT3duZXIpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChwcmVkaWNhdGUuY2FsbChwcmVkaWNhdGVPd25lciwgYXJyYXlbaV0sIGkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlbaV07XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICBhcnJheVJlbW92ZUl0ZW06IGZ1bmN0aW9uIChhcnJheSwgaXRlbVRvUmVtb3ZlKSB7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBrby51dGlscy5hcnJheUluZGV4T2YoYXJyYXksIGl0ZW1Ub1JlbW92ZSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYXJyYXkuc2hpZnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBhcnJheUdldERpc3RpbmN0VmFsdWVzOiBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICAgICAgICAgIGFycmF5ID0gYXJyYXkgfHwgW107XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChrby51dGlscy5hcnJheUluZGV4T2YocmVzdWx0LCBhcnJheVtpXSkgPCAwKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChhcnJheVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIGFycmF5TWFwOiBmdW5jdGlvbiAoYXJyYXksIG1hcHBpbmcpIHtcbiAgICAgICAgICAgIGFycmF5ID0gYXJyYXkgfHwgW107XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtYXBwaW5nKGFycmF5W2ldLCBpKSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIGFycmF5RmlsdGVyOiBmdW5jdGlvbiAoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgICAgICAgYXJyYXkgPSBhcnJheSB8fCBbXTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaV0sIGkpKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChhcnJheVtpXSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIGFycmF5UHVzaEFsbDogZnVuY3Rpb24gKGFycmF5LCB2YWx1ZXNUb1B1c2gpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZXNUb1B1c2ggaW5zdGFuY2VvZiBBcnJheSlcbiAgICAgICAgICAgICAgICBhcnJheS5wdXNoLmFwcGx5KGFycmF5LCB2YWx1ZXNUb1B1c2gpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gdmFsdWVzVG9QdXNoLmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZXNUb1B1c2hbaV0pO1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgICB9LFxuXG4gICAgICAgIGFkZE9yUmVtb3ZlSXRlbTogZnVuY3Rpb24oYXJyYXksIHZhbHVlLCBpbmNsdWRlZCkge1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nRW50cnlJbmRleCA9IGtvLnV0aWxzLmFycmF5SW5kZXhPZihrby51dGlscy5wZWVrT2JzZXJ2YWJsZShhcnJheSksIHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZ0VudHJ5SW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkKVxuICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlZClcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkuc3BsaWNlKGV4aXN0aW5nRW50cnlJbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2FuU2V0UHJvdG90eXBlOiBjYW5TZXRQcm90b3R5cGUsXG5cbiAgICAgICAgZXh0ZW5kOiBleHRlbmQsXG5cbiAgICAgICAgc2V0UHJvdG90eXBlT2Y6IHNldFByb3RvdHlwZU9mLFxuXG4gICAgICAgIHNldFByb3RvdHlwZU9mT3JFeHRlbmQ6IGNhblNldFByb3RvdHlwZSA/IHNldFByb3RvdHlwZU9mIDogZXh0ZW5kLFxuXG4gICAgICAgIG9iamVjdEZvckVhY2g6IG9iamVjdEZvckVhY2gsXG5cbiAgICAgICAgb2JqZWN0TWFwOiBmdW5jdGlvbihzb3VyY2UsIG1hcHBpbmcpIHtcbiAgICAgICAgICAgIGlmICghc291cmNlKVxuICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0ge307XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gbWFwcGluZyhzb3VyY2VbcHJvcF0sIHByb3AsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfSxcblxuICAgICAgICBlbXB0eURvbU5vZGU6IGZ1bmN0aW9uIChkb21Ob2RlKSB7XG4gICAgICAgICAgICB3aGlsZSAoZG9tTm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAga28ucmVtb3ZlTm9kZShkb21Ob2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIG1vdmVDbGVhbmVkTm9kZXNUb0NvbnRhaW5lckVsZW1lbnQ6IGZ1bmN0aW9uKG5vZGVzKSB7XG4gICAgICAgICAgICAvLyBFbnN1cmUgaXQncyBhIHJlYWwgYXJyYXksIGFzIHdlJ3JlIGFib3V0IHRvIHJlcGFyZW50IHRoZSBub2RlcyBhbmRcbiAgICAgICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiB0byBjaGFuZ2Ugd2hpbGUgd2UncmUgZG9pbmcgdGhhdC5cbiAgICAgICAgICAgIHZhciBub2Rlc0FycmF5ID0ga28udXRpbHMubWFrZUFycmF5KG5vZGVzKTtcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURvY3VtZW50ID0gKG5vZGVzQXJyYXlbMF0gJiYgbm9kZXNBcnJheVswXS5vd25lckRvY3VtZW50KSB8fCBkb2N1bWVudDtcblxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRlbXBsYXRlRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IG5vZGVzQXJyYXkubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGtvLmNsZWFuTm9kZShub2Rlc0FycmF5W2ldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNsb25lTm9kZXM6IGZ1bmN0aW9uIChub2Rlc0FycmF5LCBzaG91bGRDbGVhbk5vZGVzKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IG5vZGVzQXJyYXkubGVuZ3RoLCBuZXdOb2Rlc0FycmF5ID0gW107IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY2xvbmVkTm9kZSA9IG5vZGVzQXJyYXlbaV0uY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICAgIG5ld05vZGVzQXJyYXkucHVzaChzaG91bGRDbGVhbk5vZGVzID8ga28uY2xlYW5Ob2RlKGNsb25lZE5vZGUpIDogY2xvbmVkTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3Tm9kZXNBcnJheTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXREb21Ob2RlQ2hpbGRyZW46IGZ1bmN0aW9uIChkb21Ob2RlLCBjaGlsZE5vZGVzKSB7XG4gICAgICAgICAgICBrby51dGlscy5lbXB0eURvbU5vZGUoZG9tTm9kZSk7XG4gICAgICAgICAgICBpZiAoY2hpbGROb2Rlcykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBqOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGRvbU5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2Rlc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVwbGFjZURvbU5vZGVzOiBmdW5jdGlvbiAobm9kZVRvUmVwbGFjZU9yTm9kZUFycmF5LCBuZXdOb2Rlc0FycmF5KSB7XG4gICAgICAgICAgICB2YXIgbm9kZXNUb1JlcGxhY2VBcnJheSA9IG5vZGVUb1JlcGxhY2VPck5vZGVBcnJheS5ub2RlVHlwZSA/IFtub2RlVG9SZXBsYWNlT3JOb2RlQXJyYXldIDogbm9kZVRvUmVwbGFjZU9yTm9kZUFycmF5O1xuICAgICAgICAgICAgaWYgKG5vZGVzVG9SZXBsYWNlQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBpbnNlcnRpb25Qb2ludCA9IG5vZGVzVG9SZXBsYWNlQXJyYXlbMF07XG4gICAgICAgICAgICAgICAgdmFyIHBhcmVudCA9IGluc2VydGlvblBvaW50LnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBuZXdOb2Rlc0FycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdOb2Rlc0FycmF5W2ldLCBpbnNlcnRpb25Qb2ludCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBub2Rlc1RvUmVwbGFjZUFycmF5Lmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBrby5yZW1vdmVOb2RlKG5vZGVzVG9SZXBsYWNlQXJyYXlbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBmaXhVcENvbnRpbnVvdXNOb2RlQXJyYXk6IGZ1bmN0aW9uKGNvbnRpbnVvdXNOb2RlQXJyYXksIHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIC8vIEJlZm9yZSBhY3Rpbmcgb24gYSBzZXQgb2Ygbm9kZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgb3V0cHV0dGVkIGJ5IGEgdGVtcGxhdGUgZnVuY3Rpb24sIHdlIGhhdmUgdG8gcmVjb25jaWxlXG4gICAgICAgICAgICAvLyB0aGVtIGFnYWluc3Qgd2hhdCBpcyBpbiB0aGUgRE9NIHJpZ2h0IG5vdy4gSXQgbWF5IGJlIHRoYXQgc29tZSBvZiB0aGUgbm9kZXMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCwgb3IgdGhhdFxuICAgICAgICAgICAgLy8gbmV3IG5vZGVzIG1pZ2h0IGhhdmUgYmVlbiBpbnNlcnRlZCBpbiB0aGUgbWlkZGxlLCBmb3IgZXhhbXBsZSBieSBhIGJpbmRpbmcuIEFsc28sIHRoZXJlIG1heSBwcmV2aW91c2x5IGhhdmUgYmVlblxuICAgICAgICAgICAgLy8gbGVhZGluZyBjb21tZW50IG5vZGVzIChjcmVhdGVkIGJ5IHJld3JpdHRlbiBzdHJpbmctYmFzZWQgdGVtcGxhdGVzKSB0aGF0IGhhdmUgc2luY2UgYmVlbiByZW1vdmVkIGR1cmluZyBiaW5kaW5nLlxuICAgICAgICAgICAgLy8gU28sIHRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgb2xkIFwibWFwXCIgb3V0cHV0IGFycmF5IGludG8gaXRzIGJlc3QgZ3Vlc3Mgb2YgdGhlIHNldCBvZiBjdXJyZW50IERPTSBub2Rlcy5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBSdWxlczpcbiAgICAgICAgICAgIC8vICAgW0FdIEFueSBsZWFkaW5nIG5vZGVzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2hvdWxkIGJlIGlnbm9yZWRcbiAgICAgICAgICAgIC8vICAgICAgIFRoZXNlIG1vc3QgbGlrZWx5IGNvcnJlc3BvbmQgdG8gbWVtb2l6YXRpb24gbm9kZXMgdGhhdCB3ZXJlIGFscmVhZHkgcmVtb3ZlZCBkdXJpbmcgYmluZGluZ1xuICAgICAgICAgICAgLy8gICAgICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9rbm9ja291dC9rbm9ja291dC9wdWxsLzQ0MFxuICAgICAgICAgICAgLy8gICBbQl0gQW55IHRyYWlsaW5nIG5vZGVzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZSBzaG91bGQgYmUgaWdub3JlZFxuICAgICAgICAgICAgLy8gICAgICAgVGhpcyBwcmV2ZW50cyB0aGUgY29kZSBoZXJlIGZyb20gYWRkaW5nIHVucmVsYXRlZCBub2RlcyB0byB0aGUgYXJyYXkgd2hpbGUgcHJvY2Vzc2luZyBydWxlIFtDXVxuICAgICAgICAgICAgLy8gICAgICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9rbm9ja291dC9rbm9ja291dC9wdWxsLzE5MDNcbiAgICAgICAgICAgIC8vICAgW0NdIFdlIHdhbnQgdG8gb3V0cHV0IGEgY29udGludW91cyBzZXJpZXMgb2Ygbm9kZXMuIFNvLCBpZ25vcmUgYW55IG5vZGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCxcbiAgICAgICAgICAgIC8vICAgICAgIGFuZCBpbmNsdWRlIGFueSBub2RlcyB0aGF0IGhhdmUgYmVlbiBpbnNlcnRlZCBhbW9uZyB0aGUgcHJldmlvdXMgY29sbGVjdGlvblxuXG4gICAgICAgICAgICBpZiAoY29udGludW91c05vZGVBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgcGFyZW50IG5vZGUgY2FuIGJlIGEgdmlydHVhbCBlbGVtZW50OyBzbyBnZXQgdGhlIHJlYWwgcGFyZW50IG5vZGVcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gKHBhcmVudE5vZGUubm9kZVR5cGUgPT09IDggJiYgcGFyZW50Tm9kZS5wYXJlbnROb2RlKSB8fCBwYXJlbnROb2RlO1xuXG4gICAgICAgICAgICAgICAgLy8gUnVsZSBbQV1cbiAgICAgICAgICAgICAgICB3aGlsZSAoY29udGludW91c05vZGVBcnJheS5sZW5ndGggJiYgY29udGludW91c05vZGVBcnJheVswXS5wYXJlbnROb2RlICE9PSBwYXJlbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzTm9kZUFycmF5LnNwbGljZSgwLCAxKTtcblxuICAgICAgICAgICAgICAgIC8vIFJ1bGUgW0JdXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoID4gMSAmJiBjb250aW51b3VzTm9kZUFycmF5W2NvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoIC0gMV0ucGFyZW50Tm9kZSAhPT0gcGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludW91c05vZGVBcnJheS5sZW5ndGgtLTtcblxuICAgICAgICAgICAgICAgIC8vIFJ1bGUgW0NdXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IGNvbnRpbnVvdXNOb2RlQXJyYXlbMF0sIGxhc3QgPSBjb250aW51b3VzTm9kZUFycmF5W2NvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlcGxhY2Ugd2l0aCB0aGUgYWN0dWFsIG5ldyBjb250aW51b3VzIG5vZGUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT09IGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNOb2RlQXJyYXkucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXNOb2RlQXJyYXkucHVzaChsYXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udGludW91c05vZGVBcnJheTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXRPcHRpb25Ob2RlU2VsZWN0aW9uU3RhdGU6IGZ1bmN0aW9uIChvcHRpb25Ob2RlLCBpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAvLyBJRTYgc29tZXRpbWVzIHRocm93cyBcInVua25vd24gZXJyb3JcIiBpZiB5b3UgdHJ5IHRvIHdyaXRlIHRvIC5zZWxlY3RlZCBkaXJlY3RseSwgd2hlcmVhcyBGaXJlZm94IHN0cnVnZ2xlcyB3aXRoIHNldEF0dHJpYnV0ZS4gUGljayBvbmUgYmFzZWQgb24gYnJvd3Nlci5cbiAgICAgICAgICAgIGlmIChpZVZlcnNpb24gPCA3KVxuICAgICAgICAgICAgICAgIG9wdGlvbk5vZGUuc2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIiwgaXNTZWxlY3RlZCk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgb3B0aW9uTm9kZS5zZWxlY3RlZCA9IGlzU2VsZWN0ZWQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3RyaW5nVHJpbTogZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZyA9PT0gbnVsbCB8fCBzdHJpbmcgPT09IHVuZGVmaW5lZCA/ICcnIDpcbiAgICAgICAgICAgICAgICBzdHJpbmcudHJpbSA/XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZy50cmltKCkgOlxuICAgICAgICAgICAgICAgICAgICBzdHJpbmcudG9TdHJpbmcoKS5yZXBsYWNlKC9eW1xcc1xceGEwXSt8W1xcc1xceGEwXSskL2csICcnKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzdHJpbmdTdGFydHNXaXRoOiBmdW5jdGlvbiAoc3RyaW5nLCBzdGFydHNXaXRoKSB7XG4gICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIjtcbiAgICAgICAgICAgIGlmIChzdGFydHNXaXRoLmxlbmd0aCA+IHN0cmluZy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgc3RhcnRzV2l0aC5sZW5ndGgpID09PSBzdGFydHNXaXRoO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRvbU5vZGVJc0NvbnRhaW5lZEJ5OiBmdW5jdGlvbiAobm9kZSwgY29udGFpbmVkQnlOb2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gY29udGFpbmVkQnlOb2RlKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDExKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRml4ZXMgaXNzdWUgIzExNjIgLSBjYW4ndCB1c2Ugbm9kZS5jb250YWlucyBmb3IgZG9jdW1lbnQgZnJhZ21lbnRzIG9uIElFOFxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lZEJ5Tm9kZS5jb250YWlucylcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVkQnlOb2RlLmNvbnRhaW5zKG5vZGUubm9kZVR5cGUgPT09IDMgPyBub2RlLnBhcmVudE5vZGUgOiBub2RlKTtcbiAgICAgICAgICAgIGlmIChjb250YWluZWRCeU5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIChjb250YWluZWRCeU5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obm9kZSkgJiAxNikgPT0gMTY7XG4gICAgICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9IGNvbnRhaW5lZEJ5Tm9kZSkge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gISFub2RlO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRvbU5vZGVJc0F0dGFjaGVkVG9Eb2N1bWVudDogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBrby51dGlscy5kb21Ob2RlSXNDb250YWluZWRCeShub2RlLCBub2RlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhbnlEb21Ob2RlSXNBdHRhY2hlZFRvRG9jdW1lbnQ6IGZ1bmN0aW9uKG5vZGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gISFrby51dGlscy5hcnJheUZpcnN0KG5vZGVzLCBrby51dGlscy5kb21Ob2RlSXNBdHRhY2hlZFRvRG9jdW1lbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRhZ05hbWVMb3dlcjogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgLy8gRm9yIEhUTUwgZWxlbWVudHMsIHRhZ05hbWUgd2lsbCBhbHdheXMgYmUgdXBwZXIgY2FzZTsgZm9yIFhIVE1MIGVsZW1lbnRzLCBpdCdsbCBiZSBsb3dlciBjYXNlLlxuICAgICAgICAgICAgLy8gUG9zc2libGUgZnV0dXJlIG9wdGltaXphdGlvbjogSWYgd2Uga25vdyBpdCdzIGFuIGVsZW1lbnQgZnJvbSBhbiBYSFRNTCBkb2N1bWVudCAobm90IEhUTUwpLFxuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBkbyB0aGUgLnRvTG93ZXJDYXNlKCkgYXMgaXQgd2lsbCBhbHdheXMgYmUgbG93ZXIgY2FzZSBhbnl3YXkuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudCAmJiBlbGVtZW50LnRhZ05hbWUgJiYgZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2F0Y2hGdW5jdGlvbkVycm9yczogZnVuY3Rpb24gKGRlbGVnYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4ga29bJ29uRXJyb3InXSA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGtvWydvbkVycm9yJ10gJiYga29bJ29uRXJyb3InXShlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IDogZGVsZWdhdGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0VGltZW91dDogZnVuY3Rpb24gKGhhbmRsZXIsIHRpbWVvdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGtvLnV0aWxzLmNhdGNoRnVuY3Rpb25FcnJvcnMoaGFuZGxlciksIHRpbWVvdXQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGRlZmVyRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAga29bJ29uRXJyb3InXSAmJiBrb1snb25FcnJvciddKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlZ2lzdGVyRXZlbnRIYW5kbGVyOiBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnRUeXBlLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICB2YXIgd3JhcHBlZEhhbmRsZXIgPSBrby51dGlscy5jYXRjaEZ1bmN0aW9uRXJyb3JzKGhhbmRsZXIpO1xuXG4gICAgICAgICAgICB2YXIgbXVzdFVzZUF0dGFjaEV2ZW50ID0gaWVWZXJzaW9uICYmIGV2ZW50c1RoYXRNdXN0QmVSZWdpc3RlcmVkVXNpbmdBdHRhY2hFdmVudFtldmVudFR5cGVdO1xuICAgICAgICAgICAgaWYgKCFrby5vcHRpb25zWyd1c2VPbmx5TmF0aXZlRXZlbnRzJ10gJiYgIW11c3RVc2VBdHRhY2hFdmVudCAmJiBqUXVlcnlJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIGpRdWVyeUluc3RhbmNlKGVsZW1lbnQpWydiaW5kJ10oZXZlbnRUeXBlLCB3cmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFtdXN0VXNlQXR0YWNoRXZlbnQgJiYgdHlwZW9mIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgd3JhcHBlZEhhbmRsZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50LmF0dGFjaEV2ZW50ICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXR0YWNoRXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7IHdyYXBwZWRIYW5kbGVyLmNhbGwoZWxlbWVudCwgZXZlbnQpOyB9LFxuICAgICAgICAgICAgICAgICAgICBhdHRhY2hFdmVudE5hbWUgPSBcIm9uXCIgKyBldmVudFR5cGU7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hdHRhY2hFdmVudChhdHRhY2hFdmVudE5hbWUsIGF0dGFjaEV2ZW50SGFuZGxlcik7XG5cbiAgICAgICAgICAgICAgICAvLyBJRSBkb2VzIG5vdCBkaXNwb3NlIGF0dGFjaEV2ZW50IGhhbmRsZXJzIGF1dG9tYXRpY2FsbHkgKHVubGlrZSB3aXRoIGFkZEV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgICAgICAgLy8gc28gdG8gYXZvaWQgbGVha3MsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZW0gbWFudWFsbHkuIFNlZSBidWcgIzg1NlxuICAgICAgICAgICAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2soZWxlbWVudCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGV0YWNoRXZlbnQoYXR0YWNoRXZlbnROYW1lLCBhdHRhY2hFdmVudEhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgYWRkRXZlbnRMaXN0ZW5lciBvciBhdHRhY2hFdmVudFwiKTtcbiAgICAgICAgfSxcblxuICAgICAgICB0cmlnZ2VyRXZlbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudFR5cGUpIHtcbiAgICAgICAgICAgIGlmICghKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZWxlbWVudCBtdXN0IGJlIGEgRE9NIG5vZGUgd2hlbiBjYWxsaW5nIHRyaWdnZXJFdmVudFwiKTtcblxuICAgICAgICAgICAgLy8gRm9yIGNsaWNrIGV2ZW50cyBvbiBjaGVja2JveGVzIGFuZCByYWRpbyBidXR0b25zLCBqUXVlcnkgdG9nZ2xlcyB0aGUgZWxlbWVudCBjaGVja2VkIHN0YXRlICphZnRlciogdGhlXG4gICAgICAgICAgICAvLyBldmVudCBoYW5kbGVyIHJ1bnMgaW5zdGVhZCBvZiAqYmVmb3JlKi4gKFRoaXMgd2FzIGZpeGVkIGluIDEuOSBmb3IgY2hlY2tib3hlcyBidXQgbm90IGZvciByYWRpbyBidXR0b25zLilcbiAgICAgICAgICAgIC8vIElFIGRvZXNuJ3QgY2hhbmdlIHRoZSBjaGVja2VkIHN0YXRlIHdoZW4geW91IHRyaWdnZXIgdGhlIGNsaWNrIGV2ZW50IHVzaW5nIFwiZmlyZUV2ZW50XCIuXG4gICAgICAgICAgICAvLyBJbiBib3RoIGNhc2VzLCB3ZSdsbCB1c2UgdGhlIGNsaWNrIG1ldGhvZCBpbnN0ZWFkLlxuICAgICAgICAgICAgdmFyIHVzZUNsaWNrV29ya2Fyb3VuZCA9IGlzQ2xpY2tPbkNoZWNrYWJsZUVsZW1lbnQoZWxlbWVudCwgZXZlbnRUeXBlKTtcblxuICAgICAgICAgICAgaWYgKCFrby5vcHRpb25zWyd1c2VPbmx5TmF0aXZlRXZlbnRzJ10gJiYgalF1ZXJ5SW5zdGFuY2UgJiYgIXVzZUNsaWNrV29ya2Fyb3VuZCkge1xuICAgICAgICAgICAgICAgIGpRdWVyeUluc3RhbmNlKGVsZW1lbnQpWyd0cmlnZ2VyJ10oZXZlbnRUeXBlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5kaXNwYXRjaEV2ZW50ID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXZlbnRDYXRlZ29yeSA9IGtub3duRXZlbnRUeXBlc0J5RXZlbnROYW1lW2V2ZW50VHlwZV0gfHwgXCJIVE1MRXZlbnRzXCI7XG4gICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KGV2ZW50Q2F0ZWdvcnkpO1xuICAgICAgICAgICAgICAgICAgICBldmVudC5pbml0RXZlbnQoZXZlbnRUeXBlLCB0cnVlLCB0cnVlLCB3aW5kb3csIDAsIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAwLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3VwcGxpZWQgZWxlbWVudCBkb2Vzbid0IHN1cHBvcnQgZGlzcGF0Y2hFdmVudFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlQ2xpY2tXb3JrYXJvdW5kICYmIGVsZW1lbnQuY2xpY2spIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsaWNrKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50LmZpcmVFdmVudCAhPSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5maXJlRXZlbnQoXCJvblwiICsgZXZlbnRUeXBlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdHJpZ2dlcmluZyBldmVudHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW53cmFwT2JzZXJ2YWJsZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ga28uaXNPYnNlcnZhYmxlKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBwZWVrT2JzZXJ2YWJsZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ga28uaXNPYnNlcnZhYmxlKHZhbHVlKSA/IHZhbHVlLnBlZWsoKSA6IHZhbHVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvZ2dsZURvbU5vZGVDc3NDbGFzczogdG9nZ2xlRG9tTm9kZUNzc0NsYXNzLFxuXG4gICAgICAgIHNldFRleHRDb250ZW50OiBmdW5jdGlvbihlbGVtZW50LCB0ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh0ZXh0Q29udGVudCk7XG4gICAgICAgICAgICBpZiAoKHZhbHVlID09PSBudWxsKSB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCkpXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBcIlwiO1xuXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRoZXJlIHRvIGJlIGV4YWN0bHkgb25lIGNoaWxkOiBhIHRleHQgbm9kZS5cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBjaGlsZHJlbiwgbW9yZSB0aGFuIG9uZSwgb3IgaWYgaXQncyBub3QgYSB0ZXh0IG5vZGUsXG4gICAgICAgICAgICAvLyB3ZSdsbCBjbGVhciBldmVyeXRoaW5nIGFuZCBjcmVhdGUgYSBzaW5nbGUgdGV4dCBub2RlLlxuICAgICAgICAgICAgdmFyIGlubmVyVGV4dE5vZGUgPSBrby52aXJ0dWFsRWxlbWVudHMuZmlyc3RDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIGlmICghaW5uZXJUZXh0Tm9kZSB8fCBpbm5lclRleHROb2RlLm5vZGVUeXBlICE9IDMgfHwga28udmlydHVhbEVsZW1lbnRzLm5leHRTaWJsaW5nKGlubmVyVGV4dE5vZGUpKSB7XG4gICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLnNldERvbU5vZGVDaGlsZHJlbihlbGVtZW50LCBbZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbm5lclRleHROb2RlLmRhdGEgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAga28udXRpbHMuZm9yY2VSZWZyZXNoKGVsZW1lbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldEVsZW1lbnROYW1lOiBmdW5jdGlvbihlbGVtZW50LCBuYW1lKSB7XG4gICAgICAgICAgICBlbGVtZW50Lm5hbWUgPSBuYW1lO1xuXG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIElFIDYvNyBpc3N1ZVxuICAgICAgICAgICAgLy8gLSBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzE5N1xuICAgICAgICAgICAgLy8gLSBodHRwOi8vd3d3Lm1hdHRzNDExLmNvbS9wb3N0L3NldHRpbmdfdGhlX25hbWVfYXR0cmlidXRlX2luX2llX2RvbS9cbiAgICAgICAgICAgIGlmIChpZVZlcnNpb24gPD0gNykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubWVyZ2VBdHRyaWJ1dGVzKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCI8aW5wdXQgbmFtZT0nXCIgKyBlbGVtZW50Lm5hbWUgKyBcIicvPlwiKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlKSB7fSAvLyBGb3IgSUU5IHdpdGggZG9jIG1vZGUgXCJJRTkgU3RhbmRhcmRzXCIgYW5kIGJyb3dzZXIgbW9kZSBcIklFOSBDb21wYXRpYmlsaXR5IFZpZXdcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGZvcmNlUmVmcmVzaDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgYW4gSUU5IHJlbmRlcmluZyBidWcgLSBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzIwOVxuICAgICAgICAgICAgaWYgKGllVmVyc2lvbiA+PSA5KSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHRleHQgbm9kZXMgYW5kIGNvbW1lbnQgbm9kZXMgKG1vc3QgbGlrZWx5IHZpcnR1YWwgZWxlbWVudHMpLCB3ZSB3aWxsIGhhdmUgdG8gcmVmcmVzaCB0aGUgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgdmFyIGVsZW0gPSBub2RlLm5vZGVUeXBlID09IDEgPyBub2RlIDogbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLnN0eWxlKVxuICAgICAgICAgICAgICAgICAgICBlbGVtLnN0eWxlLnpvb20gPSBlbGVtLnN0eWxlLnpvb207XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW5zdXJlU2VsZWN0RWxlbWVudElzUmVuZGVyZWRDb3JyZWN0bHk6IGZ1bmN0aW9uKHNlbGVjdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIElFOSByZW5kZXJpbmcgYnVnIC0gaXQgZG9lc24ndCByZWxpYWJseSBkaXNwbGF5IGFsbCB0aGUgdGV4dCBpbiBkeW5hbWljYWxseS1hZGRlZCBzZWxlY3QgYm94ZXMgdW5sZXNzIHlvdSBmb3JjZSBpdCB0byByZS1yZW5kZXIgYnkgdXBkYXRpbmcgdGhlIHdpZHRoLlxuICAgICAgICAgICAgLy8gKFNlZSBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzMxMiwgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81OTA4NDk0L3NlbGVjdC1vbmx5LXNob3dzLWZpcnN0LWNoYXItb2Ytc2VsZWN0ZWQtb3B0aW9uKVxuICAgICAgICAgICAgLy8gQWxzbyBmaXhlcyBJRTcgYW5kIElFOCBidWcgdGhhdCBjYXVzZXMgc2VsZWN0cyB0byBiZSB6ZXJvIHdpZHRoIGlmIGVuY2xvc2VkIGJ5ICdpZicgb3IgJ3dpdGgnLiAoU2VlIGlzc3VlICM4MzkpXG4gICAgICAgICAgICBpZiAoaWVWZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsV2lkdGggPSBzZWxlY3RFbGVtZW50LnN0eWxlLndpZHRoO1xuICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuc3R5bGUud2lkdGggPSAwO1xuICAgICAgICAgICAgICAgIHNlbGVjdEVsZW1lbnQuc3R5bGUud2lkdGggPSBvcmlnaW5hbFdpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHJhbmdlOiBmdW5jdGlvbiAobWluLCBtYXgpIHtcbiAgICAgICAgICAgIG1pbiA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUobWluKTtcbiAgICAgICAgICAgIG1heCA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUobWF4KTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBtaW47IGkgPD0gbWF4OyBpKyspXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIG1ha2VBcnJheTogZnVuY3Rpb24oYXJyYXlMaWtlT2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFycmF5TGlrZU9iamVjdC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChhcnJheUxpa2VPYmplY3RbaV0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY3JlYXRlU3ltYm9sT3JTdHJpbmc6IGZ1bmN0aW9uKGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYW5Vc2VTeW1ib2xzID8gU3ltYm9sKGlkZW50aWZpZXIpIDogaWRlbnRpZmllcjtcbiAgICAgICAgfSxcblxuICAgICAgICBpc0llNiA6IGlzSWU2LFxuICAgICAgICBpc0llNyA6IGlzSWU3LFxuICAgICAgICBpZVZlcnNpb24gOiBpZVZlcnNpb24sXG5cbiAgICAgICAgZ2V0Rm9ybUZpZWxkczogZnVuY3Rpb24oZm9ybSwgZmllbGROYW1lKSB7XG4gICAgICAgICAgICB2YXIgZmllbGRzID0ga28udXRpbHMubWFrZUFycmF5KGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKSkuY29uY2F0KGtvLnV0aWxzLm1ha2VBcnJheShmb3JtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGV4dGFyZWFcIikpKTtcbiAgICAgICAgICAgIHZhciBpc01hdGNoaW5nRmllbGQgPSAodHlwZW9mIGZpZWxkTmFtZSA9PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uKGZpZWxkKSB7IHJldHVybiBmaWVsZC5uYW1lID09PSBmaWVsZE5hbWUgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24oZmllbGQpIHsgcmV0dXJuIGZpZWxkTmFtZS50ZXN0KGZpZWxkLm5hbWUpIH07IC8vIFRyZWF0IGZpZWxkTmFtZSBhcyByZWdleCBvciBvYmplY3QgY29udGFpbmluZyBwcmVkaWNhdGVcbiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZmllbGRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdGaWVsZChmaWVsZHNbaV0pKVxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLnB1c2goZmllbGRzW2ldKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcztcbiAgICAgICAgfSxcblxuICAgICAgICBwYXJzZUpzb246IGZ1bmN0aW9uIChqc29uU3RyaW5nKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGpzb25TdHJpbmcgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGpzb25TdHJpbmcgPSBrby51dGlscy5zdHJpbmdUcmltKGpzb25TdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmIChqc29uU3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChKU09OICYmIEpTT04ucGFyc2UpIC8vIFVzZSBuYXRpdmUgcGFyc2luZyB3aGVyZSBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHJpbmcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBGdW5jdGlvbihcInJldHVybiBcIiArIGpzb25TdHJpbmcpKSgpOyAvLyBGYWxsYmFjayBvbiBsZXNzIHNhZmUgcGFyc2luZyBmb3Igb2xkZXIgYnJvd3NlcnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICBzdHJpbmdpZnlKc29uOiBmdW5jdGlvbiAoZGF0YSwgcmVwbGFjZXIsIHNwYWNlKSB7ICAgLy8gcmVwbGFjZXIgYW5kIHNwYWNlIGFyZSBvcHRpb25hbFxuICAgICAgICAgICAgaWYgKCFKU09OIHx8ICFKU09OLnN0cmluZ2lmeSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBKU09OLnN0cmluZ2lmeSgpLiBTb21lIGJyb3dzZXJzIChlLmcuLCBJRSA8IDgpIGRvbid0IHN1cHBvcnQgaXQgbmF0aXZlbHksIGJ1dCB5b3UgY2FuIG92ZXJjb21lIHRoaXMgYnkgYWRkaW5nIGEgc2NyaXB0IHJlZmVyZW5jZSB0byBqc29uMi5qcywgZG93bmxvYWRhYmxlIGZyb20gaHR0cDovL3d3dy5qc29uLm9yZy9qc29uMi5qc1wiKTtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGRhdGEpLCByZXBsYWNlciwgc3BhY2UpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHBvc3RKc29uOiBmdW5jdGlvbiAodXJsT3JGb3JtLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIHZhciBwYXJhbXMgPSBvcHRpb25zWydwYXJhbXMnXSB8fCB7fTtcbiAgICAgICAgICAgIHZhciBpbmNsdWRlRmllbGRzID0gb3B0aW9uc1snaW5jbHVkZUZpZWxkcyddIHx8IHRoaXMuZmllbGRzSW5jbHVkZWRXaXRoSnNvblBvc3Q7XG4gICAgICAgICAgICB2YXIgdXJsID0gdXJsT3JGb3JtO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSB3ZXJlIGdpdmVuIGEgZm9ybSwgdXNlIGl0cyAnYWN0aW9uJyBVUkwgYW5kIHBpY2sgb3V0IGFueSByZXF1ZXN0ZWQgZmllbGQgdmFsdWVzXG4gICAgICAgICAgICBpZigodHlwZW9mIHVybE9yRm9ybSA9PSAnb2JqZWN0JykgJiYgKGtvLnV0aWxzLnRhZ05hbWVMb3dlcih1cmxPckZvcm0pID09PSBcImZvcm1cIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxGb3JtID0gdXJsT3JGb3JtO1xuICAgICAgICAgICAgICAgIHVybCA9IG9yaWdpbmFsRm9ybS5hY3Rpb247XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluY2x1ZGVGaWVsZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkcyA9IGtvLnV0aWxzLmdldEZvcm1GaWVsZHMob3JpZ2luYWxGb3JtLCBpbmNsdWRlRmllbGRzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IGZpZWxkcy5sZW5ndGggLSAxOyBqID49IDA7IGotLSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tmaWVsZHNbal0ubmFtZV0gPSBmaWVsZHNbal0udmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShkYXRhKTtcbiAgICAgICAgICAgIHZhciBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XG4gICAgICAgICAgICBmb3JtLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIGZvcm0uYWN0aW9uID0gdXJsO1xuICAgICAgICAgICAgZm9ybS5tZXRob2QgPSBcInBvc3RcIjtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gU2luY2UgJ2RhdGEnIHRoaXMgaXMgYSBtb2RlbCBvYmplY3QsIHdlIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMgaW5jbHVkaW5nIHRob3NlIGluaGVyaXRlZCBmcm9tIGl0cyBwcm90b3R5cGVcbiAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgICAgICAgICAgICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgICAgICAgaW5wdXQubmFtZSA9IGtleTtcbiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IGtvLnV0aWxzLnN0cmluZ2lmeUpzb24oa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShkYXRhW2tleV0pKTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGlucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9iamVjdEZvckVhY2gocGFyYW1zLCBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgICAgICAgICAgICAgIGlucHV0LnR5cGUgPSBcImhpZGRlblwiO1xuICAgICAgICAgICAgICAgIGlucHV0Lm5hbWUgPSBrZXk7XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGlucHV0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcbiAgICAgICAgICAgIG9wdGlvbnNbJ3N1Ym1pdHRlciddID8gb3B0aW9uc1snc3VibWl0dGVyJ10oZm9ybSkgOiBmb3JtLnN1Ym1pdCgpO1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IGZvcm0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmb3JtKTsgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG59KCkpO1xuXG5rby5leHBvcnRTeW1ib2woJ3V0aWxzJywga28udXRpbHMpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5hcnJheUZvckVhY2gnLCBrby51dGlscy5hcnJheUZvckVhY2gpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5hcnJheUZpcnN0Jywga28udXRpbHMuYXJyYXlGaXJzdCk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmFycmF5RmlsdGVyJywga28udXRpbHMuYXJyYXlGaWx0ZXIpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5hcnJheUdldERpc3RpbmN0VmFsdWVzJywga28udXRpbHMuYXJyYXlHZXREaXN0aW5jdFZhbHVlcyk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmFycmF5SW5kZXhPZicsIGtvLnV0aWxzLmFycmF5SW5kZXhPZik7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmFycmF5TWFwJywga28udXRpbHMuYXJyYXlNYXApO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5hcnJheVB1c2hBbGwnLCBrby51dGlscy5hcnJheVB1c2hBbGwpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5hcnJheVJlbW92ZUl0ZW0nLCBrby51dGlscy5hcnJheVJlbW92ZUl0ZW0pO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5leHRlbmQnLCBrby51dGlscy5leHRlbmQpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5maWVsZHNJbmNsdWRlZFdpdGhKc29uUG9zdCcsIGtvLnV0aWxzLmZpZWxkc0luY2x1ZGVkV2l0aEpzb25Qb3N0KTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuZ2V0Rm9ybUZpZWxkcycsIGtvLnV0aWxzLmdldEZvcm1GaWVsZHMpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5wZWVrT2JzZXJ2YWJsZScsIGtvLnV0aWxzLnBlZWtPYnNlcnZhYmxlKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMucG9zdEpzb24nLCBrby51dGlscy5wb3N0SnNvbik7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLnBhcnNlSnNvbicsIGtvLnV0aWxzLnBhcnNlSnNvbik7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyJywga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5zdHJpbmdpZnlKc29uJywga28udXRpbHMuc3RyaW5naWZ5SnNvbik7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLnJhbmdlJywga28udXRpbHMucmFuZ2UpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy50b2dnbGVEb21Ob2RlQ3NzQ2xhc3MnLCBrby51dGlscy50b2dnbGVEb21Ob2RlQ3NzQ2xhc3MpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy50cmlnZ2VyRXZlbnQnLCBrby51dGlscy50cmlnZ2VyRXZlbnQpO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy51bndyYXBPYnNlcnZhYmxlJywga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLm9iamVjdEZvckVhY2gnLCBrby51dGlscy5vYmplY3RGb3JFYWNoKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuYWRkT3JSZW1vdmVJdGVtJywga28udXRpbHMuYWRkT3JSZW1vdmVJdGVtKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuc2V0VGV4dENvbnRlbnQnLCBrby51dGlscy5zZXRUZXh0Q29udGVudCk7XG5rby5leHBvcnRTeW1ib2woJ3Vud3JhcCcsIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUpOyAvLyBDb252ZW5pZW50IHNob3J0aGFuZCwgYmVjYXVzZSB0aGlzIGlzIHVzZWQgc28gY29tbW9ubHlcblxuaWYgKCFGdW5jdGlvbi5wcm90b3R5cGVbJ2JpbmQnXSkge1xuICAgIC8vIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGlzIGEgc3RhbmRhcmQgcGFydCBvZiBFQ01BU2NyaXB0IDV0aCBFZGl0aW9uIChEZWNlbWJlciAyMDA5LCBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvcHVibGljYXRpb25zL2ZpbGVzL0VDTUEtU1QvRUNNQS0yNjIucGRmKVxuICAgIC8vIEluIGNhc2UgdGhlIGJyb3dzZXIgZG9lc24ndCBpbXBsZW1lbnQgaXQgbmF0aXZlbHksIHByb3ZpZGUgYSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBvbmUgaW4gcHJvdG90eXBlLmpzXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlWydiaW5kJ10gPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIHZhciBvcmlnaW5hbEZ1bmN0aW9uID0gdGhpcztcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb24uYXBwbHkob2JqZWN0LCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwYXJ0aWFsQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gcGFydGlhbEFyZ3Muc2xpY2UoMCk7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb24uYXBwbHkob2JqZWN0LCBhcmdzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5rby51dGlscy5kb21EYXRhID0gbmV3IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHVuaXF1ZUlkID0gMDtcbiAgICB2YXIgZGF0YVN0b3JlS2V5RXhwYW5kb1Byb3BlcnR5TmFtZSA9IFwiX19rb19fXCIgKyAobmV3IERhdGUpLmdldFRpbWUoKTtcbiAgICB2YXIgZGF0YVN0b3JlID0ge307XG5cbiAgICBmdW5jdGlvbiBnZXRBbGwobm9kZSwgY3JlYXRlSWZOb3RGb3VuZCkge1xuICAgICAgICB2YXIgZGF0YVN0b3JlS2V5ID0gbm9kZVtkYXRhU3RvcmVLZXlFeHBhbmRvUHJvcGVydHlOYW1lXTtcbiAgICAgICAgdmFyIGhhc0V4aXN0aW5nRGF0YVN0b3JlID0gZGF0YVN0b3JlS2V5ICYmIChkYXRhU3RvcmVLZXkgIT09IFwibnVsbFwiKSAmJiBkYXRhU3RvcmVbZGF0YVN0b3JlS2V5XTtcbiAgICAgICAgaWYgKCFoYXNFeGlzdGluZ0RhdGFTdG9yZSkge1xuICAgICAgICAgICAgaWYgKCFjcmVhdGVJZk5vdEZvdW5kKVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBkYXRhU3RvcmVLZXkgPSBub2RlW2RhdGFTdG9yZUtleUV4cGFuZG9Qcm9wZXJ0eU5hbWVdID0gXCJrb1wiICsgdW5pcXVlSWQrKztcbiAgICAgICAgICAgIGRhdGFTdG9yZVtkYXRhU3RvcmVLZXldID0ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGFTdG9yZVtkYXRhU3RvcmVLZXldO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKG5vZGUsIGtleSkge1xuICAgICAgICAgICAgdmFyIGFsbERhdGFGb3JOb2RlID0gZ2V0QWxsKG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBhbGxEYXRhRm9yTm9kZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYWxsRGF0YUZvck5vZGVba2V5XTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobm9kZSwga2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgYWN0dWFsbHkgY3JlYXRlIGEgbmV3IGRvbURhdGEga2V5IGlmIHdlIGFyZSBhY3R1YWxseSBkZWxldGluZyBhIHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKGdldEFsbChub2RlLCBmYWxzZSkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFsbERhdGFGb3JOb2RlID0gZ2V0QWxsKG5vZGUsIHRydWUpO1xuICAgICAgICAgICAgYWxsRGF0YUZvck5vZGVba2V5XSA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhcjogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHZhciBkYXRhU3RvcmVLZXkgPSBub2RlW2RhdGFTdG9yZUtleUV4cGFuZG9Qcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKGRhdGFTdG9yZUtleSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhU3RvcmVbZGF0YVN0b3JlS2V5XTtcbiAgICAgICAgICAgICAgICBub2RlW2RhdGFTdG9yZUtleUV4cGFuZG9Qcm9wZXJ0eU5hbWVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRXhwb3NpbmcgXCJkaWQgY2xlYW5cIiBmbGFnIHB1cmVseSBzbyBzcGVjcyBjYW4gaW5mZXIgd2hldGhlciB0aGluZ3MgaGF2ZSBiZWVuIGNsZWFuZWQgdXAgYXMgaW50ZW5kZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBuZXh0S2V5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gKHVuaXF1ZUlkKyspICsgZGF0YVN0b3JlS2V5RXhwYW5kb1Byb3BlcnR5TmFtZTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLmRvbURhdGEnLCBrby51dGlscy5kb21EYXRhKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuZG9tRGF0YS5jbGVhcicsIGtvLnV0aWxzLmRvbURhdGEuY2xlYXIpOyAvLyBFeHBvcnRpbmcgb25seSBzbyBzcGVjcyBjYW4gY2xlYXIgdXAgYWZ0ZXIgdGhlbXNlbHZlcyBmdWxseVxuXG5rby51dGlscy5kb21Ob2RlRGlzcG9zYWwgPSBuZXcgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZG9tRGF0YUtleSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpO1xuICAgIHZhciBjbGVhbmFibGVOb2RlVHlwZXMgPSB7IDE6IHRydWUsIDg6IHRydWUsIDk6IHRydWUgfTsgICAgICAgLy8gRWxlbWVudCwgQ29tbWVudCwgRG9jdW1lbnRcbiAgICB2YXIgY2xlYW5hYmxlTm9kZVR5cGVzV2l0aERlc2NlbmRhbnRzID0geyAxOiB0cnVlLCA5OiB0cnVlIH07IC8vIEVsZW1lbnQsIERvY3VtZW50XG5cbiAgICBmdW5jdGlvbiBnZXREaXNwb3NlQ2FsbGJhY2tzQ29sbGVjdGlvbihub2RlLCBjcmVhdGVJZk5vdEZvdW5kKSB7XG4gICAgICAgIHZhciBhbGxEaXNwb3NlQ2FsbGJhY2tzID0ga28udXRpbHMuZG9tRGF0YS5nZXQobm9kZSwgZG9tRGF0YUtleSk7XG4gICAgICAgIGlmICgoYWxsRGlzcG9zZUNhbGxiYWNrcyA9PT0gdW5kZWZpbmVkKSAmJiBjcmVhdGVJZk5vdEZvdW5kKSB7XG4gICAgICAgICAgICBhbGxEaXNwb3NlQ2FsbGJhY2tzID0gW107XG4gICAgICAgICAgICBrby51dGlscy5kb21EYXRhLnNldChub2RlLCBkb21EYXRhS2V5LCBhbGxEaXNwb3NlQ2FsbGJhY2tzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsRGlzcG9zZUNhbGxiYWNrcztcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzdHJveUNhbGxiYWNrc0NvbGxlY3Rpb24obm9kZSkge1xuICAgICAgICBrby51dGlscy5kb21EYXRhLnNldChub2RlLCBkb21EYXRhS2V5LCB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFuU2luZ2xlTm9kZShub2RlKSB7XG4gICAgICAgIC8vIFJ1biBhbGwgdGhlIGRpc3Bvc2UgY2FsbGJhY2tzXG4gICAgICAgIHZhciBjYWxsYmFja3MgPSBnZXREaXNwb3NlQ2FsbGJhY2tzQ29sbGVjdGlvbihub2RlLCBmYWxzZSk7XG4gICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTsgLy8gQ2xvbmUsIGFzIHRoZSBhcnJheSBtYXkgYmUgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbiAodHlwaWNhbGx5LCBjYWxsYmFja3Mgd2lsbCByZW1vdmUgdGhlbXNlbHZlcylcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGNhbGxiYWNrc1tpXShub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVyYXNlIHRoZSBET00gZGF0YVxuICAgICAgICBrby51dGlscy5kb21EYXRhLmNsZWFyKG5vZGUpO1xuXG4gICAgICAgIC8vIFBlcmZvcm0gY2xlYW51cCBuZWVkZWQgYnkgZXh0ZXJuYWwgbGlicmFyaWVzIChjdXJyZW50bHkgb25seSBqUXVlcnksIGJ1dCBjYW4gYmUgZXh0ZW5kZWQpXG4gICAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbFtcImNsZWFuRXh0ZXJuYWxEYXRhXCJdKG5vZGUpO1xuXG4gICAgICAgIC8vIENsZWFyIGFueSBpbW1lZGlhdGUtY2hpbGQgY29tbWVudCBub2RlcywgYXMgdGhlc2Ugd291bGRuJ3QgaGF2ZSBiZWVuIGZvdW5kIGJ5XG4gICAgICAgIC8vIG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIGluIGNsZWFuTm9kZSgpIChjb21tZW50IG5vZGVzIGFyZW4ndCBlbGVtZW50cylcbiAgICAgICAgaWYgKGNsZWFuYWJsZU5vZGVUeXBlc1dpdGhEZXNjZW5kYW50c1tub2RlLm5vZGVUeXBlXSlcbiAgICAgICAgICAgIGNsZWFuSW1tZWRpYXRlQ29tbWVudFR5cGVDaGlsZHJlbihub2RlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhbkltbWVkaWF0ZUNvbW1lbnRUeXBlQ2hpbGRyZW4obm9kZVdpdGhDaGlsZHJlbikge1xuICAgICAgICB2YXIgY2hpbGQsIG5leHRDaGlsZCA9IG5vZGVXaXRoQ2hpbGRyZW4uZmlyc3RDaGlsZDtcbiAgICAgICAgd2hpbGUgKGNoaWxkID0gbmV4dENoaWxkKSB7XG4gICAgICAgICAgICBuZXh0Q2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gOClcbiAgICAgICAgICAgICAgICBjbGVhblNpbmdsZU5vZGUoY2hpbGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkRGlzcG9zZUNhbGxiYWNrIDogZnVuY3Rpb24obm9kZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgICAgICAgICAgIGdldERpc3Bvc2VDYWxsYmFja3NDb2xsZWN0aW9uKG5vZGUsIHRydWUpLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlbW92ZURpc3Bvc2VDYWxsYmFjayA6IGZ1bmN0aW9uKG5vZGUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgY2FsbGJhY2tzQ29sbGVjdGlvbiA9IGdldERpc3Bvc2VDYWxsYmFja3NDb2xsZWN0aW9uKG5vZGUsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFja3NDb2xsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAga28udXRpbHMuYXJyYXlSZW1vdmVJdGVtKGNhbGxiYWNrc0NvbGxlY3Rpb24sIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzQ29sbGVjdGlvbi5sZW5ndGggPT0gMClcbiAgICAgICAgICAgICAgICAgICAgZGVzdHJveUNhbGxiYWNrc0NvbGxlY3Rpb24obm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2xlYW5Ob2RlIDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgLy8gRmlyc3QgY2xlYW4gdGhpcyBub2RlLCB3aGVyZSBhcHBsaWNhYmxlXG4gICAgICAgICAgICBpZiAoY2xlYW5hYmxlTm9kZVR5cGVzW25vZGUubm9kZVR5cGVdKSB7XG4gICAgICAgICAgICAgICAgY2xlYW5TaW5nbGVOb2RlKG5vZGUpO1xuXG4gICAgICAgICAgICAgICAgLy8gLi4uIHRoZW4gaXRzIGRlc2NlbmRhbnRzLCB3aGVyZSBhcHBsaWNhYmxlXG4gICAgICAgICAgICAgICAgaWYgKGNsZWFuYWJsZU5vZGVUeXBlc1dpdGhEZXNjZW5kYW50c1tub2RlLm5vZGVUeXBlXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbG9uZSB0aGUgZGVzY2VuZGFudHMgbGlzdCBpbiBjYXNlIGl0IGNoYW5nZXMgZHVyaW5nIGl0ZXJhdGlvblxuICAgICAgICAgICAgICAgICAgICB2YXIgZGVzY2VuZGFudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAga28udXRpbHMuYXJyYXlQdXNoQWxsKGRlc2NlbmRhbnRzLCBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gZGVzY2VuZGFudHMubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5TaW5nbGVOb2RlKGRlc2NlbmRhbnRzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmVOb2RlIDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAga28uY2xlYW5Ob2RlKG5vZGUpO1xuICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjbGVhbkV4dGVybmFsRGF0YVwiIDogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIC8vIFNwZWNpYWwgc3VwcG9ydCBmb3IgalF1ZXJ5IGhlcmUgYmVjYXVzZSBpdCdzIHNvIGNvbW1vbmx5IHVzZWQuXG4gICAgICAgICAgICAvLyBNYW55IGpRdWVyeSBwbHVnaW5zIChpbmNsdWRpbmcganF1ZXJ5LnRtcGwpIHN0b3JlIGRhdGEgdXNpbmcgalF1ZXJ5J3MgZXF1aXZhbGVudCBvZiBkb21EYXRhXG4gICAgICAgICAgICAvLyBzbyBub3RpZnkgaXQgdG8gdGVhciBkb3duIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBub2RlICYgZGVzY2VuZGFudHMgaGVyZS5cbiAgICAgICAgICAgIGlmIChqUXVlcnlJbnN0YW5jZSAmJiAodHlwZW9mIGpRdWVyeUluc3RhbmNlWydjbGVhbkRhdGEnXSA9PSBcImZ1bmN0aW9uXCIpKVxuICAgICAgICAgICAgICAgIGpRdWVyeUluc3RhbmNlWydjbGVhbkRhdGEnXShbbm9kZV0pO1xuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5rby5jbGVhbk5vZGUgPSBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuY2xlYW5Ob2RlOyAvLyBTaG9ydGhhbmQgbmFtZSBmb3IgY29udmVuaWVuY2VcbmtvLnJlbW92ZU5vZGUgPSBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwucmVtb3ZlTm9kZTsgLy8gU2hvcnRoYW5kIG5hbWUgZm9yIGNvbnZlbmllbmNlXG5rby5leHBvcnRTeW1ib2woJ2NsZWFuTm9kZScsIGtvLmNsZWFuTm9kZSk7XG5rby5leHBvcnRTeW1ib2woJ3JlbW92ZU5vZGUnLCBrby5yZW1vdmVOb2RlKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuZG9tTm9kZURpc3Bvc2FsJywga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsKTtcbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjaycsIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2spO1xua28uZXhwb3J0U3ltYm9sKCd1dGlscy5kb21Ob2RlRGlzcG9zYWwucmVtb3ZlRGlzcG9zZUNhbGxiYWNrJywga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLnJlbW92ZURpc3Bvc2VDYWxsYmFjayk7XG4oZnVuY3Rpb24gKCkge1xuICAgIHZhciBub25lID0gWzAsIFwiXCIsIFwiXCJdLFxuICAgICAgICB0YWJsZSA9IFsxLCBcIjx0YWJsZT5cIiwgXCI8L3RhYmxlPlwiXSxcbiAgICAgICAgdGJvZHkgPSBbMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIl0sXG4gICAgICAgIHRyID0gWzMsIFwiPHRhYmxlPjx0Ym9keT48dHI+XCIsIFwiPC90cj48L3Rib2R5PjwvdGFibGU+XCJdLFxuICAgICAgICBzZWxlY3QgPSBbMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCJdLFxuICAgICAgICBsb29rdXAgPSB7XG4gICAgICAgICAgICAndGhlYWQnOiB0YWJsZSxcbiAgICAgICAgICAgICd0Ym9keSc6IHRhYmxlLFxuICAgICAgICAgICAgJ3Rmb290JzogdGFibGUsXG4gICAgICAgICAgICAndHInOiB0Ym9keSxcbiAgICAgICAgICAgICd0ZCc6IHRyLFxuICAgICAgICAgICAgJ3RoJzogdHIsXG4gICAgICAgICAgICAnb3B0aW9uJzogc2VsZWN0LFxuICAgICAgICAgICAgJ29wdGdyb3VwJzogc2VsZWN0XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIG9sZCBJRSBpZiB5b3UncmUgKm5vdCogdXNpbmcgZWl0aGVyIGpRdWVyeSBvciBpbm5lclNoaXYuIERvZXNuJ3QgYWZmZWN0IG90aGVyIGNhc2VzLlxuICAgICAgICBtYXlSZXF1aXJlQ3JlYXRlRWxlbWVudEhhY2sgPSBrby51dGlscy5pZVZlcnNpb24gPD0gODtcblxuICAgIGZ1bmN0aW9uIGdldFdyYXAodGFncykge1xuICAgICAgICB2YXIgbSA9IHRhZ3MubWF0Y2goL148KFthLXpdKylbID5dLyk7XG4gICAgICAgIHJldHVybiAobSAmJiBsb29rdXBbbVsxXV0pIHx8IG5vbmU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2ltcGxlSHRtbFBhcnNlKGh0bWwsIGRvY3VtZW50Q29udGV4dCkge1xuICAgICAgICBkb2N1bWVudENvbnRleHQgfHwgKGRvY3VtZW50Q29udGV4dCA9IGRvY3VtZW50KTtcbiAgICAgICAgdmFyIHdpbmRvd0NvbnRleHQgPSBkb2N1bWVudENvbnRleHRbJ3BhcmVudFdpbmRvdyddIHx8IGRvY3VtZW50Q29udGV4dFsnZGVmYXVsdFZpZXcnXSB8fCB3aW5kb3c7XG5cbiAgICAgICAgLy8gQmFzZWQgb24galF1ZXJ5J3MgXCJjbGVhblwiIGZ1bmN0aW9uLCBidXQgb25seSBhY2NvdW50aW5nIGZvciB0YWJsZS1yZWxhdGVkIGVsZW1lbnRzLlxuICAgICAgICAvLyBJZiB5b3UgaGF2ZSByZWZlcmVuY2VkIGpRdWVyeSwgdGhpcyB3b24ndCBiZSB1c2VkIGFueXdheSAtIEtPIHdpbGwgdXNlIGpRdWVyeSdzIFwiY2xlYW5cIiBmdW5jdGlvbiBkaXJlY3RseVxuXG4gICAgICAgIC8vIE5vdGUgdGhhdCB0aGVyZSdzIHN0aWxsIGFuIGlzc3VlIGluIElFIDwgOSB3aGVyZWJ5IGl0IHdpbGwgZGlzY2FyZCBjb21tZW50IG5vZGVzIHRoYXQgYXJlIHRoZSBmaXJzdCBjaGlsZCBvZlxuICAgICAgICAvLyBhIGRlc2NlbmRhbnQgbm9kZS4gRm9yIGV4YW1wbGU6IFwiPGRpdj48IS0tIG15Y29tbWVudCAtLT5hYmM8L2Rpdj5cIiB3aWxsIGdldCBwYXJzZWQgYXMgXCI8ZGl2PmFiYzwvZGl2PlwiXG4gICAgICAgIC8vIFRoaXMgd29uJ3QgYWZmZWN0IGFueW9uZSB3aG8gaGFzIHJlZmVyZW5jZWQgalF1ZXJ5LCBhbmQgdGhlcmUncyBhbHdheXMgdGhlIHdvcmthcm91bmQgb2YgaW5zZXJ0aW5nIGEgZHVtbXkgbm9kZVxuICAgICAgICAvLyAocG9zc2libHkgYSB0ZXh0IG5vZGUpIGluIGZyb250IG9mIHRoZSBjb21tZW50LiBTbywgS08gZG9lcyBub3QgYXR0ZW1wdCB0byB3b3JrYXJvdW5kIHRoaXMgSUUgaXNzdWUgYXV0b21hdGljYWxseSBhdCBwcmVzZW50LlxuXG4gICAgICAgIC8vIFRyaW0gd2hpdGVzcGFjZSwgb3RoZXJ3aXNlIGluZGV4T2Ygd29uJ3Qgd29yayBhcyBleHBlY3RlZFxuICAgICAgICB2YXIgdGFncyA9IGtvLnV0aWxzLnN0cmluZ1RyaW0oaHRtbCkudG9Mb3dlckNhc2UoKSwgZGl2ID0gZG9jdW1lbnRDb250ZXh0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICAgICAgICB3cmFwID0gZ2V0V3JhcCh0YWdzKSxcbiAgICAgICAgICAgIGRlcHRoID0gd3JhcFswXTtcblxuICAgICAgICAvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzXG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBhbHdheXMgcHJlZml4IHdpdGggc29tZSBkdW1teSB0ZXh0LCBiZWNhdXNlIG90aGVyd2lzZSwgSUU8OSB3aWxsIHN0cmlwIG91dCBsZWFkaW5nIGNvbW1lbnQgbm9kZXMgaW4gZGVzY2VuZGFudHMuIFRvdGFsIG1hZG5lc3MuXG4gICAgICAgIHZhciBtYXJrdXAgPSBcImlnbm9yZWQ8ZGl2PlwiICsgd3JhcFsxXSArIGh0bWwgKyB3cmFwWzJdICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3dDb250ZXh0Wydpbm5lclNoaXYnXSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBpbm5lclNoaXYgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaHRtbDVzaGl2LiBXZSBzaG91bGQgY29uc2lkZXIgYWRkaW5nXG4gICAgICAgICAgICAvLyBzdXBwb3J0IGZvciBodG1sNXNoaXYgKGV4Y2VwdCBpZiBubyBleHBsaWNpdCBzdXBwb3J0IGlzIG5lZWRlZCwgZS5nLiwgaWYgaHRtbDVzaGl2XG4gICAgICAgICAgICAvLyBzb21laG93IHNoaW1zIHRoZSBuYXRpdmUgQVBJcyBzbyBpdCBqdXN0IHdvcmtzIGFueXdheSlcbiAgICAgICAgICAgIGRpdi5hcHBlbmRDaGlsZCh3aW5kb3dDb250ZXh0Wydpbm5lclNoaXYnXShtYXJrdXApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChtYXlSZXF1aXJlQ3JlYXRlRWxlbWVudEhhY2spIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbXktZWxlbWVudCcpIHRyaWNrIHRvIGVuYWJsZSBjdXN0b20gZWxlbWVudHMgaW4gSUU2LThcbiAgICAgICAgICAgICAgICAvLyBvbmx5IHdvcmtzIGlmIHdlIGFzc2lnbiBpbm5lckhUTUwgb24gYW4gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhhdCBkb2N1bWVudC5cbiAgICAgICAgICAgICAgICBkb2N1bWVudENvbnRleHQuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IG1hcmt1cDtcblxuICAgICAgICAgICAgaWYgKG1heVJlcXVpcmVDcmVhdGVFbGVtZW50SGFjaykge1xuICAgICAgICAgICAgICAgIGRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRpdik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNb3ZlIHRvIHRoZSByaWdodCBkZXB0aFxuICAgICAgICB3aGlsZSAoZGVwdGgtLSlcbiAgICAgICAgICAgIGRpdiA9IGRpdi5sYXN0Q2hpbGQ7XG5cbiAgICAgICAgcmV0dXJuIGtvLnV0aWxzLm1ha2VBcnJheShkaXYubGFzdENoaWxkLmNoaWxkTm9kZXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGpRdWVyeUh0bWxQYXJzZShodG1sLCBkb2N1bWVudENvbnRleHQpIHtcbiAgICAgICAgLy8galF1ZXJ5J3MgXCJwYXJzZUhUTUxcIiBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCBpbiBqUXVlcnkgMS44LjAgYW5kIGlzIGEgZG9jdW1lbnRlZCBwdWJsaWMgQVBJLlxuICAgICAgICBpZiAoalF1ZXJ5SW5zdGFuY2VbJ3BhcnNlSFRNTCddKSB7XG4gICAgICAgICAgICByZXR1cm4galF1ZXJ5SW5zdGFuY2VbJ3BhcnNlSFRNTCddKGh0bWwsIGRvY3VtZW50Q29udGV4dCkgfHwgW107IC8vIEVuc3VyZSB3ZSBhbHdheXMgcmV0dXJuIGFuIGFycmF5IGFuZCBuZXZlciBudWxsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGb3IgalF1ZXJ5IDwgMS44LjAsIHdlIGZhbGwgYmFjayBvbiB0aGUgdW5kb2N1bWVudGVkIGludGVybmFsIFwiY2xlYW5cIiBmdW5jdGlvbi5cbiAgICAgICAgICAgIHZhciBlbGVtcyA9IGpRdWVyeUluc3RhbmNlWydjbGVhbiddKFtodG1sXSwgZG9jdW1lbnRDb250ZXh0KTtcblxuICAgICAgICAgICAgLy8gQXMgb2YgalF1ZXJ5IDEuNy4xLCBqUXVlcnkgcGFyc2VzIHRoZSBIVE1MIGJ5IGFwcGVuZGluZyBpdCB0byBzb21lIGR1bW15IHBhcmVudCBub2RlcyBoZWxkIGluIGFuIGluLW1lbW9yeSBkb2N1bWVudCBmcmFnbWVudC5cbiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIGl0IG5ldmVyIGNsZWFycyB0aGUgZHVtbXkgcGFyZW50IG5vZGVzIGZyb20gdGhlIGRvY3VtZW50IGZyYWdtZW50LCBzbyBpdCBsZWFrcyBtZW1vcnkgb3ZlciB0aW1lLlxuICAgICAgICAgICAgLy8gRml4IHRoaXMgYnkgZmluZGluZyB0aGUgdG9wLW1vc3QgZHVtbXkgcGFyZW50IGVsZW1lbnQsIGFuZCBkZXRhY2hpbmcgaXQgZnJvbSBpdHMgb3duZXIgZnJhZ21lbnQuXG4gICAgICAgICAgICBpZiAoZWxlbXMgJiYgZWxlbXNbMF0pIHtcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSB0b3AtbW9zdCBwYXJlbnQgZWxlbWVudCB0aGF0J3MgYSBkaXJlY3QgY2hpbGQgb2YgYSBkb2N1bWVudCBmcmFnbWVudFxuICAgICAgICAgICAgICAgIHZhciBlbGVtID0gZWxlbXNbMF07XG4gICAgICAgICAgICAgICAgd2hpbGUgKGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtLnBhcmVudE5vZGUubm9kZVR5cGUgIT09IDExIC8qIGkuZS4sIERvY3VtZW50RnJhZ21lbnQgKi8pXG4gICAgICAgICAgICAgICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgLy8gLi4uIHRoZW4gZGV0YWNoIGl0XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ucGFyZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsZW0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBrby51dGlscy5wYXJzZUh0bWxGcmFnbWVudCA9IGZ1bmN0aW9uKGh0bWwsIGRvY3VtZW50Q29udGV4dCkge1xuICAgICAgICByZXR1cm4galF1ZXJ5SW5zdGFuY2UgP1xuICAgICAgICAgICAgalF1ZXJ5SHRtbFBhcnNlKGh0bWwsIGRvY3VtZW50Q29udGV4dCkgOiAgIC8vIEFzIGJlbG93LCBiZW5lZml0IGZyb20galF1ZXJ5J3Mgb3B0aW1pc2F0aW9ucyB3aGVyZSBwb3NzaWJsZVxuICAgICAgICAgICAgc2ltcGxlSHRtbFBhcnNlKGh0bWwsIGRvY3VtZW50Q29udGV4dCk7ICAvLyAuLi4gb3RoZXJ3aXNlLCB0aGlzIHNpbXBsZSBsb2dpYyB3aWxsIGRvIGluIG1vc3QgY29tbW9uIGNhc2VzLlxuICAgIH07XG5cbiAgICBrby51dGlscy5zZXRIdG1sID0gZnVuY3Rpb24obm9kZSwgaHRtbCkge1xuICAgICAgICBrby51dGlscy5lbXB0eURvbU5vZGUobm9kZSk7XG5cbiAgICAgICAgLy8gVGhlcmUncyBubyBsZWdpdGltYXRlIHJlYXNvbiB0byBkaXNwbGF5IGEgc3RyaW5naWZpZWQgb2JzZXJ2YWJsZSB3aXRob3V0IHVud3JhcHBpbmcgaXQsIHNvIHdlJ2xsIHVud3JhcCBpdFxuICAgICAgICBodG1sID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShodG1sKTtcblxuICAgICAgICBpZiAoKGh0bWwgIT09IG51bGwpICYmIChodG1sICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGh0bWwgIT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgaHRtbCA9IGh0bWwudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgLy8galF1ZXJ5IGNvbnRhaW5zIGEgbG90IG9mIHNvcGhpc3RpY2F0ZWQgY29kZSB0byBwYXJzZSBhcmJpdHJhcnkgSFRNTCBmcmFnbWVudHMsXG4gICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSA8dHI+IGVsZW1lbnRzIHdoaWNoIGFyZSBub3Qgbm9ybWFsbHkgYWxsb3dlZCB0byBleGlzdCBvbiB0aGVpciBvd24uXG4gICAgICAgICAgICAvLyBJZiB5b3UndmUgcmVmZXJlbmNlZCBqUXVlcnkgd2UnbGwgdXNlIHRoYXQgcmF0aGVyIHRoYW4gZHVwbGljYXRpbmcgaXRzIGNvZGUuXG4gICAgICAgICAgICBpZiAoalF1ZXJ5SW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBqUXVlcnlJbnN0YW5jZShub2RlKVsnaHRtbCddKGh0bWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAuLi4gb3RoZXJ3aXNlLCB1c2UgS08ncyBvd24gcGFyc2luZyBsb2dpYy5cbiAgICAgICAgICAgICAgICB2YXIgcGFyc2VkTm9kZXMgPSBrby51dGlscy5wYXJzZUh0bWxGcmFnbWVudChodG1sLCBub2RlLm93bmVyRG9jdW1lbnQpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyc2VkTm9kZXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQocGFyc2VkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMucGFyc2VIdG1sRnJhZ21lbnQnLCBrby51dGlscy5wYXJzZUh0bWxGcmFnbWVudCk7XG5rby5leHBvcnRTeW1ib2woJ3V0aWxzLnNldEh0bWwnLCBrby51dGlscy5zZXRIdG1sKTtcblxua28ubWVtb2l6YXRpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBtZW1vcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gcmFuZG9tTWF4OEhleENoYXJzKCkge1xuICAgICAgICByZXR1cm4gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMDAwMDApIHwgMCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21JZCgpIHtcbiAgICAgICAgcmV0dXJuIHJhbmRvbU1heDhIZXhDaGFycygpICsgcmFuZG9tTWF4OEhleENoYXJzKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRNZW1vTm9kZXMocm9vdE5vZGUsIGFwcGVuZFRvQXJyYXkpIHtcbiAgICAgICAgaWYgKCFyb290Tm9kZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHJvb3ROb2RlLm5vZGVUeXBlID09IDgpIHtcbiAgICAgICAgICAgIHZhciBtZW1vSWQgPSBrby5tZW1vaXphdGlvbi5wYXJzZU1lbW9UZXh0KHJvb3ROb2RlLm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICBpZiAobWVtb0lkICE9IG51bGwpXG4gICAgICAgICAgICAgICAgYXBwZW5kVG9BcnJheS5wdXNoKHsgZG9tTm9kZTogcm9vdE5vZGUsIG1lbW9JZDogbWVtb0lkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHJvb3ROb2RlLm5vZGVUeXBlID09IDEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBjaGlsZE5vZGVzID0gcm9vdE5vZGUuY2hpbGROb2RlcywgaiA9IGNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgIGZpbmRNZW1vTm9kZXMoY2hpbGROb2Rlc1tpXSwgYXBwZW5kVG9BcnJheSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBtZW1vaXplOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBjYW4gb25seSBwYXNzIGEgZnVuY3Rpb24gdG8ga28ubWVtb2l6YXRpb24ubWVtb2l6ZSgpXCIpO1xuICAgICAgICAgICAgdmFyIG1lbW9JZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICAgICAgICAgIG1lbW9zW21lbW9JZF0gPSBjYWxsYmFjaztcbiAgICAgICAgICAgIHJldHVybiBcIjwhLS1ba29fbWVtbzpcIiArIG1lbW9JZCArIFwiXS0tPlwiO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVubWVtb2l6ZTogZnVuY3Rpb24gKG1lbW9JZCwgY2FsbGJhY2tQYXJhbXMpIHtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IG1lbW9zW21lbW9JZF07XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGFueSBtZW1vIHdpdGggSUQgXCIgKyBtZW1vSWQgKyBcIi4gUGVyaGFwcyBpdCdzIGFscmVhZHkgYmVlbiB1bm1lbW9pemVkLlwiKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgY2FsbGJhY2tQYXJhbXMgfHwgW10pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGRlbGV0ZSBtZW1vc1ttZW1vSWRdOyB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW5tZW1vaXplRG9tTm9kZUFuZERlc2NlbmRhbnRzOiBmdW5jdGlvbiAoZG9tTm9kZSwgZXh0cmFDYWxsYmFja1BhcmFtc0FycmF5KSB7XG4gICAgICAgICAgICB2YXIgbWVtb3MgPSBbXTtcbiAgICAgICAgICAgIGZpbmRNZW1vTm9kZXMoZG9tTm9kZSwgbWVtb3MpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBtZW1vcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IG1lbW9zW2ldLmRvbU5vZGU7XG4gICAgICAgICAgICAgICAgdmFyIGNvbWJpbmVkUGFyYW1zID0gW25vZGVdO1xuICAgICAgICAgICAgICAgIGlmIChleHRyYUNhbGxiYWNrUGFyYW1zQXJyYXkpXG4gICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5UHVzaEFsbChjb21iaW5lZFBhcmFtcywgZXh0cmFDYWxsYmFja1BhcmFtc0FycmF5KTtcbiAgICAgICAgICAgICAgICBrby5tZW1vaXphdGlvbi51bm1lbW9pemUobWVtb3NbaV0ubWVtb0lkLCBjb21iaW5lZFBhcmFtcyk7XG4gICAgICAgICAgICAgICAgbm9kZS5ub2RlVmFsdWUgPSBcIlwiOyAvLyBOZXV0ZXIgdGhpcyBub2RlIHNvIHdlIGRvbid0IHRyeSB0byB1bm1lbW9pemUgaXQgYWdhaW5cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7IC8vIElmIHBvc3NpYmxlLCBlcmFzZSBpdCB0b3RhbGx5IChub3QgYWx3YXlzIHBvc3NpYmxlIC0gc29tZW9uZSBlbHNlIG1pZ2h0IGp1c3QgaG9sZCBhIHJlZmVyZW5jZSB0byBpdCB0aGVuIGNhbGwgdW5tZW1vaXplRG9tTm9kZUFuZERlc2NlbmRhbnRzIGFnYWluKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHBhcnNlTWVtb1RleHQ6IGZ1bmN0aW9uIChtZW1vVGV4dCkge1xuICAgICAgICAgICAgdmFyIG1hdGNoID0gbWVtb1RleHQubWF0Y2goL15cXFtrb19tZW1vXFw6KC4qPylcXF0kLyk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCdtZW1vaXphdGlvbicsIGtvLm1lbW9pemF0aW9uKTtcbmtvLmV4cG9ydFN5bWJvbCgnbWVtb2l6YXRpb24ubWVtb2l6ZScsIGtvLm1lbW9pemF0aW9uLm1lbW9pemUpO1xua28uZXhwb3J0U3ltYm9sKCdtZW1vaXphdGlvbi51bm1lbW9pemUnLCBrby5tZW1vaXphdGlvbi51bm1lbW9pemUpO1xua28uZXhwb3J0U3ltYm9sKCdtZW1vaXphdGlvbi5wYXJzZU1lbW9UZXh0Jywga28ubWVtb2l6YXRpb24ucGFyc2VNZW1vVGV4dCk7XG5rby5leHBvcnRTeW1ib2woJ21lbW9pemF0aW9uLnVubWVtb2l6ZURvbU5vZGVBbmREZXNjZW5kYW50cycsIGtvLm1lbW9pemF0aW9uLnVubWVtb2l6ZURvbU5vZGVBbmREZXNjZW5kYW50cyk7XG5rby50YXNrcyA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNjaGVkdWxlcixcbiAgICAgICAgdGFza1F1ZXVlID0gW10sXG4gICAgICAgIHRhc2tRdWV1ZUxlbmd0aCA9IDAsXG4gICAgICAgIG5leHRIYW5kbGUgPSAxLFxuICAgICAgICBuZXh0SW5kZXhUb1Byb2Nlc3MgPSAwO1xuXG4gICAgaWYgKHdpbmRvd1snTXV0YXRpb25PYnNlcnZlciddKSB7XG4gICAgICAgIC8vIENocm9tZSAyNyssIEZpcmVmb3ggMTQrLCBJRSAxMSssIE9wZXJhIDE1KywgU2FmYXJpIDYuMStcbiAgICAgICAgLy8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vcGV0a2FhbnRvbm92L2JsdWViaXJkICogQ29weXJpZ2h0IChjKSAyMDE0IFBldGthIEFudG9ub3YgKiBMaWNlbnNlOiBNSVRcbiAgICAgICAgc2NoZWR1bGVyID0gKGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaykub2JzZXJ2ZShkaXYsIHthdHRyaWJ1dGVzOiB0cnVlfSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyBkaXYuY2xhc3NMaXN0LnRvZ2dsZShcImZvb1wiKTsgfTtcbiAgICAgICAgfSkoc2NoZWR1bGVkUHJvY2Vzcyk7XG4gICAgfSBlbHNlIGlmIChkb2N1bWVudCAmJiBcIm9ucmVhZHlzdGF0ZWNoYW5nZVwiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gSUUgNi0xMFxuICAgICAgICAvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9ZdXp1SlMvc2V0SW1tZWRpYXRlICogQ29weXJpZ2h0IChjKSAyMDEyIEJhcm5lc2FuZG5vYmxlLmNvbSwgbGxjLCBEb25hdm9uIFdlc3QsIGFuZCBEb21lbmljIERlbmljb2xhICogTGljZW5zZTogTUlUXG4gICAgICAgIHNjaGVkdWxlciA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlZHVsZXIgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDApO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByb2Nlc3NUYXNrcygpIHtcbiAgICAgICAgaWYgKHRhc2tRdWV1ZUxlbmd0aCkge1xuICAgICAgICAgICAgLy8gRWFjaCBtYXJrIHJlcHJlc2VudHMgdGhlIGVuZCBvZiBhIGxvZ2ljYWwgZ3JvdXAgb2YgdGFza3MgYW5kIHRoZSBudW1iZXIgb2YgdGhlc2UgZ3JvdXBzIGlzXG4gICAgICAgICAgICAvLyBsaW1pdGVkIHRvIHByZXZlbnQgdW5jaGVja2VkIHJlY3Vyc2lvbi5cbiAgICAgICAgICAgIHZhciBtYXJrID0gdGFza1F1ZXVlTGVuZ3RoLCBjb3VudE1hcmtzID0gMDtcblxuICAgICAgICAgICAgLy8gbmV4dEluZGV4VG9Qcm9jZXNzIGtlZXBzIHRyYWNrIG9mIHdoZXJlIHdlIGFyZSBpbiB0aGUgcXVldWU7IHByb2Nlc3NUYXNrcyBjYW4gYmUgY2FsbGVkIHJlY3Vyc2l2ZWx5IHdpdGhvdXQgaXNzdWVcbiAgICAgICAgICAgIGZvciAodmFyIHRhc2s7IG5leHRJbmRleFRvUHJvY2VzcyA8IHRhc2tRdWV1ZUxlbmd0aDsgKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhc2sgPSB0YXNrUXVldWVbbmV4dEluZGV4VG9Qcm9jZXNzKytdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0SW5kZXhUb1Byb2Nlc3MgPiBtYXJrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytjb3VudE1hcmtzID49IDUwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0SW5kZXhUb1Byb2Nlc3MgPSB0YXNrUXVldWVMZW5ndGg7ICAgLy8gc2tpcCBhbGwgdGFza3MgcmVtYWluaW5nIGluIHRoZSBxdWV1ZSBzaW5jZSBhbnkgb2YgdGhlbSBjb3VsZCBiZSBjYXVzaW5nIHRoZSByZWN1cnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrby51dGlscy5kZWZlckVycm9yKEVycm9yKFwiJ1RvbyBtdWNoIHJlY3Vyc2lvbicgYWZ0ZXIgcHJvY2Vzc2luZyBcIiArIGNvdW50TWFya3MgKyBcIiB0YXNrIGdyb3Vwcy5cIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyayA9IHRhc2tRdWV1ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFzaygpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAga28udXRpbHMuZGVmZXJFcnJvcihleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzY2hlZHVsZWRQcm9jZXNzKCkge1xuICAgICAgICBwcm9jZXNzVGFza3MoKTtcblxuICAgICAgICAvLyBSZXNldCB0aGUgcXVldWVcbiAgICAgICAgbmV4dEluZGV4VG9Qcm9jZXNzID0gdGFza1F1ZXVlTGVuZ3RoID0gdGFza1F1ZXVlLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrUHJvY2Vzc2luZygpIHtcbiAgICAgICAga28udGFza3NbJ3NjaGVkdWxlciddKHNjaGVkdWxlZFByb2Nlc3MpO1xuICAgIH1cblxuICAgIHZhciB0YXNrcyA9IHtcbiAgICAgICAgJ3NjaGVkdWxlcic6IHNjaGVkdWxlciwgICAgIC8vIEFsbG93IG92ZXJyaWRpbmcgdGhlIHNjaGVkdWxlclxuXG4gICAgICAgIHNjaGVkdWxlOiBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICAgICAgaWYgKCF0YXNrUXVldWVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZVRhc2tQcm9jZXNzaW5nKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRhc2tRdWV1ZVt0YXNrUXVldWVMZW5ndGgrK10gPSBmdW5jO1xuICAgICAgICAgICAgcmV0dXJuIG5leHRIYW5kbGUrKztcbiAgICAgICAgfSxcblxuICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIChoYW5kbGUpIHtcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGhhbmRsZSAtIChuZXh0SGFuZGxlIC0gdGFza1F1ZXVlTGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSBuZXh0SW5kZXhUb1Byb2Nlc3MgJiYgaW5kZXggPCB0YXNrUXVldWVMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0YXNrUXVldWVbaW5kZXhdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvLyBGb3IgdGVzdGluZyBvbmx5OiByZXNldCB0aGUgcXVldWUgYW5kIHJldHVybiB0aGUgcHJldmlvdXMgcXVldWUgbGVuZ3RoXG4gICAgICAgICdyZXNldEZvclRlc3RpbmcnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gdGFza1F1ZXVlTGVuZ3RoIC0gbmV4dEluZGV4VG9Qcm9jZXNzO1xuICAgICAgICAgICAgbmV4dEluZGV4VG9Qcm9jZXNzID0gdGFza1F1ZXVlTGVuZ3RoID0gdGFza1F1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICByZXR1cm4gbGVuZ3RoO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJ1bkVhcmx5OiBwcm9jZXNzVGFza3NcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRhc2tzO1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCd0YXNrcycsIGtvLnRhc2tzKTtcbmtvLmV4cG9ydFN5bWJvbCgndGFza3Muc2NoZWR1bGUnLCBrby50YXNrcy5zY2hlZHVsZSk7XG4vL2tvLmV4cG9ydFN5bWJvbCgndGFza3MuY2FuY2VsJywga28udGFza3MuY2FuY2VsKTsgIFwiY2FuY2VsXCIgaXNuJ3QgbWluaWZpZWRcbmtvLmV4cG9ydFN5bWJvbCgndGFza3MucnVuRWFybHknLCBrby50YXNrcy5ydW5FYXJseSk7XG5rby5leHRlbmRlcnMgPSB7XG4gICAgJ3Rocm90dGxlJzogZnVuY3Rpb24odGFyZ2V0LCB0aW1lb3V0KSB7XG4gICAgICAgIC8vIFRocm90dGxpbmcgbWVhbnMgdHdvIHRoaW5nczpcblxuICAgICAgICAvLyAoMSkgRm9yIGRlcGVuZGVudCBvYnNlcnZhYmxlcywgd2UgdGhyb3R0bGUgKmV2YWx1YXRpb25zKiBzbyB0aGF0LCBubyBtYXR0ZXIgaG93IGZhc3QgaXRzIGRlcGVuZGVuY2llc1xuICAgICAgICAvLyAgICAgbm90aWZ5IHVwZGF0ZXMsIHRoZSB0YXJnZXQgZG9lc24ndCByZS1ldmFsdWF0ZSAoYW5kIGhlbmNlIGRvZXNuJ3Qgbm90aWZ5KSBmYXN0ZXIgdGhhbiBhIGNlcnRhaW4gcmF0ZVxuICAgICAgICB0YXJnZXRbJ3Rocm90dGxlRXZhbHVhdGlvbiddID0gdGltZW91dDtcblxuICAgICAgICAvLyAoMikgRm9yIHdyaXRhYmxlIHRhcmdldHMgKG9ic2VydmFibGVzLCBvciB3cml0YWJsZSBkZXBlbmRlbnQgb2JzZXJ2YWJsZXMpLCB3ZSB0aHJvdHRsZSAqd3JpdGVzKlxuICAgICAgICAvLyAgICAgc28gdGhlIHRhcmdldCBjYW5ub3QgY2hhbmdlIHZhbHVlIHN5bmNocm9ub3VzbHkgb3IgZmFzdGVyIHRoYW4gYSBjZXJ0YWluIHJhdGVcbiAgICAgICAgdmFyIHdyaXRlVGltZW91dEluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGtvLmRlcGVuZGVudE9ic2VydmFibGUoe1xuICAgICAgICAgICAgJ3JlYWQnOiB0YXJnZXQsXG4gICAgICAgICAgICAnd3JpdGUnOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh3cml0ZVRpbWVvdXRJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgd3JpdGVUaW1lb3V0SW5zdGFuY2UgPSBrby51dGlscy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgJ3JhdGVMaW1pdCc6IGZ1bmN0aW9uKHRhcmdldCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgdGltZW91dCwgbWV0aG9kLCBsaW1pdEZ1bmN0aW9uO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGltZW91dCA9IG9wdGlvbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gb3B0aW9uc1sndGltZW91dCddO1xuICAgICAgICAgICAgbWV0aG9kID0gb3B0aW9uc1snbWV0aG9kJ107XG4gICAgICAgIH1cblxuICAgICAgICAvLyByYXRlTGltaXQgc3VwZXJzZWRlcyBkZWZlcnJlZCB1cGRhdGVzXG4gICAgICAgIHRhcmdldC5fZGVmZXJVcGRhdGVzID0gZmFsc2U7XG5cbiAgICAgICAgbGltaXRGdW5jdGlvbiA9IG1ldGhvZCA9PSAnbm90aWZ5V2hlbkNoYW5nZXNTdG9wJyA/ICBkZWJvdW5jZSA6IHRocm90dGxlO1xuICAgICAgICB0YXJnZXQubGltaXQoZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBsaW1pdEZ1bmN0aW9uKGNhbGxiYWNrLCB0aW1lb3V0KTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgICdkZWZlcnJlZCc6IGZ1bmN0aW9uKHRhcmdldCwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXFwnZGVmZXJyZWRcXCcgZXh0ZW5kZXIgb25seSBhY2NlcHRzIHRoZSB2YWx1ZSBcXCd0cnVlXFwnLCBiZWNhdXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gdHVybiBkZWZlcnJhbCBvZmYgb25jZSBlbmFibGVkLicpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRhcmdldC5fZGVmZXJVcGRhdGVzKSB7XG4gICAgICAgICAgICB0YXJnZXQuX2RlZmVyVXBkYXRlcyA9IHRydWU7XG4gICAgICAgICAgICB0YXJnZXQubGltaXQoZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBrby50YXNrcy5jYW5jZWwoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0ga28udGFza3Muc2NoZWR1bGUoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRbJ25vdGlmeVN1YnNjcmliZXJzJ10odW5kZWZpbmVkLCAnZGlydHknKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ25vdGlmeSc6IGZ1bmN0aW9uKHRhcmdldCwgbm90aWZ5V2hlbikge1xuICAgICAgICB0YXJnZXRbXCJlcXVhbGl0eUNvbXBhcmVyXCJdID0gbm90aWZ5V2hlbiA9PSBcImFsd2F5c1wiID9cbiAgICAgICAgICAgIG51bGwgOiAgLy8gbnVsbCBlcXVhbGl0eUNvbXBhcmVyIG1lYW5zIHRvIGFsd2F5cyBub3RpZnlcbiAgICAgICAgICAgIHZhbHVlc0FyZVByaW1pdGl2ZUFuZEVxdWFsO1xuICAgIH1cbn07XG5cbnZhciBwcmltaXRpdmVUeXBlcyA9IHsgJ3VuZGVmaW5lZCc6MSwgJ2Jvb2xlYW4nOjEsICdudW1iZXInOjEsICdzdHJpbmcnOjEgfTtcbmZ1bmN0aW9uIHZhbHVlc0FyZVByaW1pdGl2ZUFuZEVxdWFsKGEsIGIpIHtcbiAgICB2YXIgb2xkVmFsdWVJc1ByaW1pdGl2ZSA9IChhID09PSBudWxsKSB8fCAodHlwZW9mKGEpIGluIHByaW1pdGl2ZVR5cGVzKTtcbiAgICByZXR1cm4gb2xkVmFsdWVJc1ByaW1pdGl2ZSA/IChhID09PSBiKSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiB0aHJvdHRsZShjYWxsYmFjaywgdGltZW91dCkge1xuICAgIHZhciB0aW1lb3V0SW5zdGFuY2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aW1lb3V0SW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRpbWVvdXRJbnN0YW5jZSA9IGtvLnV0aWxzLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRpbWVvdXRJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBkZWJvdW5jZShjYWxsYmFjaywgdGltZW91dCkge1xuICAgIHZhciB0aW1lb3V0SW5zdGFuY2U7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJbnN0YW5jZSk7XG4gICAgICAgIHRpbWVvdXRJbnN0YW5jZSA9IGtvLnV0aWxzLnNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQpO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGFwcGx5RXh0ZW5kZXJzKHJlcXVlc3RlZEV4dGVuZGVycykge1xuICAgIHZhciB0YXJnZXQgPSB0aGlzO1xuICAgIGlmIChyZXF1ZXN0ZWRFeHRlbmRlcnMpIHtcbiAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaChyZXF1ZXN0ZWRFeHRlbmRlcnMsIGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBleHRlbmRlckhhbmRsZXIgPSBrby5leHRlbmRlcnNba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXh0ZW5kZXJIYW5kbGVyID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBleHRlbmRlckhhbmRsZXIodGFyZ2V0LCB2YWx1ZSkgfHwgdGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cblxua28uZXhwb3J0U3ltYm9sKCdleHRlbmRlcnMnLCBrby5leHRlbmRlcnMpO1xuXG5rby5zdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAodGFyZ2V0LCBjYWxsYmFjaywgZGlzcG9zZUNhbGxiYWNrKSB7XG4gICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLmRpc3Bvc2VDYWxsYmFjayA9IGRpc3Bvc2VDYWxsYmFjaztcbiAgICB0aGlzLmlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgICBrby5leHBvcnRQcm9wZXJ0eSh0aGlzLCAnZGlzcG9zZScsIHRoaXMuZGlzcG9zZSk7XG59O1xua28uc3Vic2NyaXB0aW9uLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5kaXNwb3NlQ2FsbGJhY2soKTtcbn07XG5cbmtvLnN1YnNjcmliYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBrby51dGlscy5zZXRQcm90b3R5cGVPZk9yRXh0ZW5kKHRoaXMsIGtvX3N1YnNjcmliYWJsZV9mbik7XG4gICAga29fc3Vic2NyaWJhYmxlX2ZuLmluaXQodGhpcyk7XG59XG5cbnZhciBkZWZhdWx0RXZlbnQgPSBcImNoYW5nZVwiO1xuXG4vLyBNb3ZlZCBvdXQgb2YgXCJsaW1pdFwiIHRvIGF2b2lkIHRoZSBleHRyYSBjbG9zdXJlXG5mdW5jdGlvbiBsaW1pdE5vdGlmeVN1YnNjcmliZXJzKHZhbHVlLCBldmVudCkge1xuICAgIGlmICghZXZlbnQgfHwgZXZlbnQgPT09IGRlZmF1bHRFdmVudCkge1xuICAgICAgICB0aGlzLl9saW1pdENoYW5nZSh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2JlZm9yZUNoYW5nZScpIHtcbiAgICAgICAgdGhpcy5fbGltaXRCZWZvcmVDaGFuZ2UodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX29yaWdOb3RpZnlTdWJzY3JpYmVycyh2YWx1ZSwgZXZlbnQpO1xuICAgIH1cbn1cblxudmFyIGtvX3N1YnNjcmliYWJsZV9mbiA9IHtcbiAgICBpbml0OiBmdW5jdGlvbihpbnN0YW5jZSkge1xuICAgICAgICBpbnN0YW5jZS5fc3Vic2NyaXB0aW9ucyA9IHt9O1xuICAgICAgICBpbnN0YW5jZS5fdmVyc2lvbk51bWJlciA9IDE7XG4gICAgfSxcblxuICAgIHN1YnNjcmliZTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjYWxsYmFja1RhcmdldCwgZXZlbnQpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGV2ZW50ID0gZXZlbnQgfHwgZGVmYXVsdEV2ZW50O1xuICAgICAgICB2YXIgYm91bmRDYWxsYmFjayA9IGNhbGxiYWNrVGFyZ2V0ID8gY2FsbGJhY2suYmluZChjYWxsYmFja1RhcmdldCkgOiBjYWxsYmFjaztcblxuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gbmV3IGtvLnN1YnNjcmlwdGlvbihzZWxmLCBib3VuZENhbGxiYWNrLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBrby51dGlscy5hcnJheVJlbW92ZUl0ZW0oc2VsZi5fc3Vic2NyaXB0aW9uc1tldmVudF0sIHN1YnNjcmlwdGlvbik7XG4gICAgICAgICAgICBpZiAoc2VsZi5hZnRlclN1YnNjcmlwdGlvblJlbW92ZSlcbiAgICAgICAgICAgICAgICBzZWxmLmFmdGVyU3Vic2NyaXB0aW9uUmVtb3ZlKGV2ZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNlbGYuYmVmb3JlU3Vic2NyaXB0aW9uQWRkKVxuICAgICAgICAgICAgc2VsZi5iZWZvcmVTdWJzY3JpcHRpb25BZGQoZXZlbnQpO1xuXG4gICAgICAgIGlmICghc2VsZi5fc3Vic2NyaXB0aW9uc1tldmVudF0pXG4gICAgICAgICAgICBzZWxmLl9zdWJzY3JpcHRpb25zW2V2ZW50XSA9IFtdO1xuICAgICAgICBzZWxmLl9zdWJzY3JpcHRpb25zW2V2ZW50XS5wdXNoKHN1YnNjcmlwdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgICB9LFxuXG4gICAgXCJub3RpZnlTdWJzY3JpYmVyc1wiOiBmdW5jdGlvbiAodmFsdWVUb05vdGlmeSwgZXZlbnQpIHtcbiAgICAgICAgZXZlbnQgPSBldmVudCB8fCBkZWZhdWx0RXZlbnQ7XG4gICAgICAgIGlmIChldmVudCA9PT0gZGVmYXVsdEV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZlcnNpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNTdWJzY3JpcHRpb25zRm9yRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uYmVnaW4oKTsgLy8gQmVnaW4gc3VwcHJlc3NpbmcgZGVwZW5kZW5jeSBkZXRlY3Rpb24gKGJ5IHNldHRpbmcgdGhlIHRvcCBmcmFtZSB0byB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IHRoaXMuX3N1YnNjcmlwdGlvbnNbZXZlbnRdLnNsaWNlKDApLCBpID0gMCwgc3Vic2NyaXB0aW9uOyBzdWJzY3JpcHRpb24gPSBhW2ldOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBhIHN1YnNjcmlwdGlvbiB3YXMgZGlzcG9zZWQgZHVyaW5nIHRoZSBhcnJheUZvckVhY2ggY3ljbGUsIGNoZWNrXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBpc0Rpc3Bvc2VkIG9uIGVhY2ggc3Vic2NyaXB0aW9uIGJlZm9yZSBpbnZva2luZyBpdHMgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24uaXNEaXNwb3NlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5jYWxsYmFjayh2YWx1ZVRvTm90aWZ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uZW5kKCk7IC8vIEVuZCBzdXBwcmVzc2luZyBkZXBlbmRlbmN5IGRldGVjdGlvblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFZlcnNpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb25OdW1iZXI7XG4gICAgfSxcblxuICAgIGhhc0NoYW5nZWQ6IGZ1bmN0aW9uICh2ZXJzaW9uVG9DaGVjaykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRWZXJzaW9uKCkgIT09IHZlcnNpb25Ub0NoZWNrO1xuICAgIH0sXG5cbiAgICB1cGRhdGVWZXJzaW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICsrdGhpcy5fdmVyc2lvbk51bWJlcjtcbiAgICB9LFxuXG4gICAgbGltaXQ6IGZ1bmN0aW9uKGxpbWl0RnVuY3Rpb24pIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzLCBzZWxmSXNPYnNlcnZhYmxlID0ga28uaXNPYnNlcnZhYmxlKHNlbGYpLFxuICAgICAgICAgICAgaWdub3JlQmVmb3JlQ2hhbmdlLCBwcmV2aW91c1ZhbHVlLCBwZW5kaW5nVmFsdWUsIGJlZm9yZUNoYW5nZSA9ICdiZWZvcmVDaGFuZ2UnO1xuXG4gICAgICAgIGlmICghc2VsZi5fb3JpZ05vdGlmeVN1YnNjcmliZXJzKSB7XG4gICAgICAgICAgICBzZWxmLl9vcmlnTm90aWZ5U3Vic2NyaWJlcnMgPSBzZWxmW1wibm90aWZ5U3Vic2NyaWJlcnNcIl07XG4gICAgICAgICAgICBzZWxmW1wibm90aWZ5U3Vic2NyaWJlcnNcIl0gPSBsaW1pdE5vdGlmeVN1YnNjcmliZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpbmlzaCA9IGxpbWl0RnVuY3Rpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLl9ub3RpZmljYXRpb25Jc1BlbmRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gSWYgYW4gb2JzZXJ2YWJsZSBwcm92aWRlZCBhIHJlZmVyZW5jZSB0byBpdHNlbGYsIGFjY2VzcyBpdCB0byBnZXQgdGhlIGxhdGVzdCB2YWx1ZS5cbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIGNvbXB1dGVkIG9ic2VydmFibGVzIHRvIGRlbGF5IGNhbGN1bGF0aW5nIHRoZWlyIHZhbHVlIHVudGlsIG5lZWRlZC5cbiAgICAgICAgICAgIGlmIChzZWxmSXNPYnNlcnZhYmxlICYmIHBlbmRpbmdWYWx1ZSA9PT0gc2VsZikge1xuICAgICAgICAgICAgICAgIHBlbmRpbmdWYWx1ZSA9IHNlbGYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlnbm9yZUJlZm9yZUNoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHNlbGYuaXNEaWZmZXJlbnQocHJldmlvdXNWYWx1ZSwgcGVuZGluZ1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHNlbGYuX29yaWdOb3RpZnlTdWJzY3JpYmVycyhwcmV2aW91c1ZhbHVlID0gcGVuZGluZ1ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2VsZi5fbGltaXRDaGFuZ2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgc2VsZi5fbm90aWZpY2F0aW9uSXNQZW5kaW5nID0gaWdub3JlQmVmb3JlQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIHBlbmRpbmdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgZmluaXNoKCk7XG4gICAgICAgIH07XG4gICAgICAgIHNlbGYuX2xpbWl0QmVmb3JlQ2hhbmdlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghaWdub3JlQmVmb3JlQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHNlbGYuX29yaWdOb3RpZnlTdWJzY3JpYmVycyh2YWx1ZSwgYmVmb3JlQ2hhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgaGFzU3Vic2NyaXB0aW9uc0ZvckV2ZW50OiBmdW5jdGlvbihldmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3Vic2NyaXB0aW9uc1tldmVudF0gJiYgdGhpcy5fc3Vic2NyaXB0aW9uc1tldmVudF0ubGVuZ3RoO1xuICAgIH0sXG5cbiAgICBnZXRTdWJzY3JpcHRpb25zQ291bnQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdWJzY3JpcHRpb25zW2V2ZW50XSAmJiB0aGlzLl9zdWJzY3JpcHRpb25zW2V2ZW50XS5sZW5ndGggfHwgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7XG4gICAgICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKHRoaXMuX3N1YnNjcmlwdGlvbnMsIGZ1bmN0aW9uKGV2ZW50TmFtZSwgc3Vic2NyaXB0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChldmVudE5hbWUgIT09ICdkaXJ0eScpXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHN1YnNjcmlwdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaXNEaWZmZXJlbnQ6IGZ1bmN0aW9uKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm4gIXRoaXNbJ2VxdWFsaXR5Q29tcGFyZXInXSB8fCAhdGhpc1snZXF1YWxpdHlDb21wYXJlciddKG9sZFZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgfSxcblxuICAgIGV4dGVuZDogYXBwbHlFeHRlbmRlcnNcbn07XG5cbmtvLmV4cG9ydFByb3BlcnR5KGtvX3N1YnNjcmliYWJsZV9mbiwgJ3N1YnNjcmliZScsIGtvX3N1YnNjcmliYWJsZV9mbi5zdWJzY3JpYmUpO1xua28uZXhwb3J0UHJvcGVydHkoa29fc3Vic2NyaWJhYmxlX2ZuLCAnZXh0ZW5kJywga29fc3Vic2NyaWJhYmxlX2ZuLmV4dGVuZCk7XG5rby5leHBvcnRQcm9wZXJ0eShrb19zdWJzY3JpYmFibGVfZm4sICdnZXRTdWJzY3JpcHRpb25zQ291bnQnLCBrb19zdWJzY3JpYmFibGVfZm4uZ2V0U3Vic2NyaXB0aW9uc0NvdW50KTtcblxuLy8gRm9yIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBwcm90byBhc3NpZ25tZW50LCB3ZSBvdmVyd3JpdGUgdGhlIHByb3RvdHlwZSBvZiBlYWNoXG4vLyBvYnNlcnZhYmxlIGluc3RhbmNlLiBTaW5jZSBvYnNlcnZhYmxlcyBhcmUgZnVuY3Rpb25zLCB3ZSBuZWVkIEZ1bmN0aW9uLnByb3RvdHlwZVxuLy8gdG8gc3RpbGwgYmUgaW4gdGhlIHByb3RvdHlwZSBjaGFpbi5cbmlmIChrby51dGlscy5jYW5TZXRQcm90b3R5cGUpIHtcbiAgICBrby51dGlscy5zZXRQcm90b3R5cGVPZihrb19zdWJzY3JpYmFibGVfZm4sIEZ1bmN0aW9uLnByb3RvdHlwZSk7XG59XG5cbmtvLnN1YnNjcmliYWJsZVsnZm4nXSA9IGtvX3N1YnNjcmliYWJsZV9mbjtcblxuXG5rby5pc1N1YnNjcmliYWJsZSA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBpbnN0YW5jZSAhPSBudWxsICYmIHR5cGVvZiBpbnN0YW5jZS5zdWJzY3JpYmUgPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBpbnN0YW5jZVtcIm5vdGlmeVN1YnNjcmliZXJzXCJdID09IFwiZnVuY3Rpb25cIjtcbn07XG5cbmtvLmV4cG9ydFN5bWJvbCgnc3Vic2NyaWJhYmxlJywga28uc3Vic2NyaWJhYmxlKTtcbmtvLmV4cG9ydFN5bWJvbCgnaXNTdWJzY3JpYmFibGUnLCBrby5pc1N1YnNjcmliYWJsZSk7XG5cbmtvLmNvbXB1dGVkQ29udGV4dCA9IGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24gPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvdXRlckZyYW1lcyA9IFtdLFxuICAgICAgICBjdXJyZW50RnJhbWUsXG4gICAgICAgIGxhc3RJZCA9IDA7XG5cbiAgICAvLyBSZXR1cm4gYSB1bmlxdWUgSUQgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gYW4gb2JzZXJ2YWJsZSBmb3IgZGVwZW5kZW5jeSB0cmFja2luZy5cbiAgICAvLyBUaGVvcmV0aWNhbGx5LCB5b3UgY291bGQgZXZlbnR1YWxseSBvdmVyZmxvdyB0aGUgbnVtYmVyIHN0b3JhZ2Ugc2l6ZSwgcmVzdWx0aW5nXG4gICAgLy8gaW4gZHVwbGljYXRlIElEcy4gQnV0IGluIEphdmFTY3JpcHQsIHRoZSBsYXJnZXN0IGV4YWN0IGludGVncmFsIHZhbHVlIGlzIDJeNTNcbiAgICAvLyBvciA5LDAwNywxOTksMjU0LDc0MCw5OTIuIElmIHlvdSBjcmVhdGVkIDEsMDAwLDAwMCBJRHMgcGVyIHNlY29uZCwgaXQgd291bGRcbiAgICAvLyB0YWtlIG92ZXIgMjg1IHllYXJzIHRvIHJlYWNoIHRoYXQgbnVtYmVyLlxuICAgIC8vIFJlZmVyZW5jZSBodHRwOi8vYmxvZy52amV1eC5jb20vMjAxMC9qYXZhc2NyaXB0L2phdmFzY3JpcHQtbWF4X2ludC1udW1iZXItbGltaXRzLmh0bWxcbiAgICBmdW5jdGlvbiBnZXRJZCgpIHtcbiAgICAgICAgcmV0dXJuICsrbGFzdElkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGJlZ2luKG9wdGlvbnMpIHtcbiAgICAgICAgb3V0ZXJGcmFtZXMucHVzaChjdXJyZW50RnJhbWUpO1xuICAgICAgICBjdXJyZW50RnJhbWUgPSBvcHRpb25zO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZCgpIHtcbiAgICAgICAgY3VycmVudEZyYW1lID0gb3V0ZXJGcmFtZXMucG9wKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYmVnaW46IGJlZ2luLFxuXG4gICAgICAgIGVuZDogZW5kLFxuXG4gICAgICAgIHJlZ2lzdGVyRGVwZW5kZW5jeTogZnVuY3Rpb24gKHN1YnNjcmliYWJsZSkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRGcmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICgha28uaXNTdWJzY3JpYmFibGUoc3Vic2NyaWJhYmxlKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT25seSBzdWJzY3JpYmFibGUgdGhpbmdzIGNhbiBhY3QgYXMgZGVwZW5kZW5jaWVzXCIpO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRGcmFtZS5jYWxsYmFjay5jYWxsKGN1cnJlbnRGcmFtZS5jYWxsYmFja1RhcmdldCwgc3Vic2NyaWJhYmxlLCBzdWJzY3JpYmFibGUuX2lkIHx8IChzdWJzY3JpYmFibGUuX2lkID0gZ2V0SWQoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGlnbm9yZTogZnVuY3Rpb24gKGNhbGxiYWNrLCBjYWxsYmFja1RhcmdldCwgY2FsbGJhY2tBcmdzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGJlZ2luKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KGNhbGxiYWNrVGFyZ2V0LCBjYWxsYmFja0FyZ3MgfHwgW10pO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBlbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBnZXREZXBlbmRlbmNpZXNDb3VudDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRGcmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudEZyYW1lLmNvbXB1dGVkLmdldERlcGVuZGVuY2llc0NvdW50KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaXNJbml0aWFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50RnJhbWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRGcmFtZS5pc0luaXRpYWw7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCdjb21wdXRlZENvbnRleHQnLCBrby5jb21wdXRlZENvbnRleHQpO1xua28uZXhwb3J0U3ltYm9sKCdjb21wdXRlZENvbnRleHQuZ2V0RGVwZW5kZW5jaWVzQ291bnQnLCBrby5jb21wdXRlZENvbnRleHQuZ2V0RGVwZW5kZW5jaWVzQ291bnQpO1xua28uZXhwb3J0U3ltYm9sKCdjb21wdXRlZENvbnRleHQuaXNJbml0aWFsJywga28uY29tcHV0ZWRDb250ZXh0LmlzSW5pdGlhbCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgnaWdub3JlRGVwZW5kZW5jaWVzJywga28uaWdub3JlRGVwZW5kZW5jaWVzID0ga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUpO1xudmFyIG9ic2VydmFibGVMYXRlc3RWYWx1ZSA9IGtvLnV0aWxzLmNyZWF0ZVN5bWJvbE9yU3RyaW5nKCdfbGF0ZXN0VmFsdWUnKTtcblxua28ub2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICBmdW5jdGlvbiBvYnNlcnZhYmxlKCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFdyaXRlXG5cbiAgICAgICAgICAgIC8vIElnbm9yZSB3cml0ZXMgaWYgdGhlIHZhbHVlIGhhc24ndCBjaGFuZ2VkXG4gICAgICAgICAgICBpZiAob2JzZXJ2YWJsZS5pc0RpZmZlcmVudChvYnNlcnZhYmxlW29ic2VydmFibGVMYXRlc3RWYWx1ZV0sIGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlLnZhbHVlV2lsbE11dGF0ZSgpO1xuICAgICAgICAgICAgICAgIG9ic2VydmFibGVbb2JzZXJ2YWJsZUxhdGVzdFZhbHVlXSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlLnZhbHVlSGFzTXV0YXRlZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7IC8vIFBlcm1pdHMgY2hhaW5lZCBhc3NpZ25tZW50c1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVhZFxuICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5yZWdpc3RlckRlcGVuZGVuY3kob2JzZXJ2YWJsZSk7IC8vIFRoZSBjYWxsZXIgb25seSBuZWVkcyB0byBiZSBub3RpZmllZCBvZiBjaGFuZ2VzIGlmIHRoZXkgZGlkIGEgXCJyZWFkXCIgb3BlcmF0aW9uXG4gICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZVtvYnNlcnZhYmxlTGF0ZXN0VmFsdWVdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb2JzZXJ2YWJsZVtvYnNlcnZhYmxlTGF0ZXN0VmFsdWVdID0gaW5pdGlhbFZhbHVlO1xuXG4gICAgLy8gSW5oZXJpdCBmcm9tICdzdWJzY3JpYmFibGUnXG4gICAgaWYgKCFrby51dGlscy5jYW5TZXRQcm90b3R5cGUpIHtcbiAgICAgICAgLy8gJ3N1YnNjcmliYWJsZScgd29uJ3QgYmUgb24gdGhlIHByb3RvdHlwZSBjaGFpbiB1bmxlc3Mgd2UgcHV0IGl0IHRoZXJlIGRpcmVjdGx5XG4gICAgICAgIGtvLnV0aWxzLmV4dGVuZChvYnNlcnZhYmxlLCBrby5zdWJzY3JpYmFibGVbJ2ZuJ10pO1xuICAgIH1cbiAgICBrby5zdWJzY3JpYmFibGVbJ2ZuJ10uaW5pdChvYnNlcnZhYmxlKTtcblxuICAgIC8vIEluaGVyaXQgZnJvbSAnb2JzZXJ2YWJsZSdcbiAgICBrby51dGlscy5zZXRQcm90b3R5cGVPZk9yRXh0ZW5kKG9ic2VydmFibGUsIG9ic2VydmFibGVGbik7XG5cbiAgICBpZiAoa28ub3B0aW9uc1snZGVmZXJVcGRhdGVzJ10pIHtcbiAgICAgICAga28uZXh0ZW5kZXJzWydkZWZlcnJlZCddKG9ic2VydmFibGUsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBvYnNlcnZhYmxlO1xufVxuXG4vLyBEZWZpbmUgcHJvdG90eXBlIGZvciBvYnNlcnZhYmxlc1xudmFyIG9ic2VydmFibGVGbiA9IHtcbiAgICAnZXF1YWxpdHlDb21wYXJlcic6IHZhbHVlc0FyZVByaW1pdGl2ZUFuZEVxdWFsLFxuICAgIHBlZWs6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpc1tvYnNlcnZhYmxlTGF0ZXN0VmFsdWVdOyB9LFxuICAgIHZhbHVlSGFzTXV0YXRlZDogZnVuY3Rpb24gKCkgeyB0aGlzWydub3RpZnlTdWJzY3JpYmVycyddKHRoaXNbb2JzZXJ2YWJsZUxhdGVzdFZhbHVlXSk7IH0sXG4gICAgdmFsdWVXaWxsTXV0YXRlOiBmdW5jdGlvbiAoKSB7IHRoaXNbJ25vdGlmeVN1YnNjcmliZXJzJ10odGhpc1tvYnNlcnZhYmxlTGF0ZXN0VmFsdWVdLCAnYmVmb3JlQ2hhbmdlJyk7IH1cbn07XG5cbi8vIE5vdGUgdGhhdCBmb3IgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHByb3RvIGFzc2lnbm1lbnQsIHRoZVxuLy8gaW5oZXJpdGFuY2UgY2hhaW4gaXMgY3JlYXRlZCBtYW51YWxseSBpbiB0aGUga28ub2JzZXJ2YWJsZSBjb25zdHJ1Y3RvclxuaWYgKGtvLnV0aWxzLmNhblNldFByb3RvdHlwZSkge1xuICAgIGtvLnV0aWxzLnNldFByb3RvdHlwZU9mKG9ic2VydmFibGVGbiwga28uc3Vic2NyaWJhYmxlWydmbiddKTtcbn1cblxudmFyIHByb3RvUHJvcGVydHkgPSBrby5vYnNlcnZhYmxlLnByb3RvUHJvcGVydHkgPSAnX19rb19wcm90b19fJztcbm9ic2VydmFibGVGbltwcm90b1Byb3BlcnR5XSA9IGtvLm9ic2VydmFibGU7XG5cbmtvLmhhc1Byb3RvdHlwZSA9IGZ1bmN0aW9uKGluc3RhbmNlLCBwcm90b3R5cGUpIHtcbiAgICBpZiAoKGluc3RhbmNlID09PSBudWxsKSB8fCAoaW5zdGFuY2UgPT09IHVuZGVmaW5lZCkgfHwgKGluc3RhbmNlW3Byb3RvUHJvcGVydHldID09PSB1bmRlZmluZWQpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGluc3RhbmNlW3Byb3RvUHJvcGVydHldID09PSBwcm90b3R5cGUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBrby5oYXNQcm90b3R5cGUoaW5zdGFuY2VbcHJvdG9Qcm9wZXJ0eV0sIHByb3RvdHlwZSk7IC8vIFdhbGsgdGhlIHByb3RvdHlwZSBjaGFpblxufTtcblxua28uaXNPYnNlcnZhYmxlID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGtvLmhhc1Byb3RvdHlwZShpbnN0YW5jZSwga28ub2JzZXJ2YWJsZSk7XG59XG5rby5pc1dyaXRlYWJsZU9ic2VydmFibGUgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAvLyBPYnNlcnZhYmxlXG4gICAgaWYgKCh0eXBlb2YgaW5zdGFuY2UgPT0gJ2Z1bmN0aW9uJykgJiYgaW5zdGFuY2VbcHJvdG9Qcm9wZXJ0eV0gPT09IGtvLm9ic2VydmFibGUpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIC8vIFdyaXRlYWJsZSBkZXBlbmRlbnQgb2JzZXJ2YWJsZVxuICAgIGlmICgodHlwZW9mIGluc3RhbmNlID09ICdmdW5jdGlvbicpICYmIChpbnN0YW5jZVtwcm90b1Byb3BlcnR5XSA9PT0ga28uZGVwZW5kZW50T2JzZXJ2YWJsZSkgJiYgKGluc3RhbmNlLmhhc1dyaXRlRnVuY3Rpb24pKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBbnl0aGluZyBlbHNlXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5rby5leHBvcnRTeW1ib2woJ29ic2VydmFibGUnLCBrby5vYnNlcnZhYmxlKTtcbmtvLmV4cG9ydFN5bWJvbCgnaXNPYnNlcnZhYmxlJywga28uaXNPYnNlcnZhYmxlKTtcbmtvLmV4cG9ydFN5bWJvbCgnaXNXcml0ZWFibGVPYnNlcnZhYmxlJywga28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKTtcbmtvLmV4cG9ydFN5bWJvbCgnaXNXcml0YWJsZU9ic2VydmFibGUnLCBrby5pc1dyaXRlYWJsZU9ic2VydmFibGUpO1xua28uZXhwb3J0U3ltYm9sKCdvYnNlcnZhYmxlLmZuJywgb2JzZXJ2YWJsZUZuKTtcbmtvLmV4cG9ydFByb3BlcnR5KG9ic2VydmFibGVGbiwgJ3BlZWsnLCBvYnNlcnZhYmxlRm4ucGVlayk7XG5rby5leHBvcnRQcm9wZXJ0eShvYnNlcnZhYmxlRm4sICd2YWx1ZUhhc011dGF0ZWQnLCBvYnNlcnZhYmxlRm4udmFsdWVIYXNNdXRhdGVkKTtcbmtvLmV4cG9ydFByb3BlcnR5KG9ic2VydmFibGVGbiwgJ3ZhbHVlV2lsbE11dGF0ZScsIG9ic2VydmFibGVGbi52YWx1ZVdpbGxNdXRhdGUpO1xua28ub2JzZXJ2YWJsZUFycmF5ID0gZnVuY3Rpb24gKGluaXRpYWxWYWx1ZXMpIHtcbiAgICBpbml0aWFsVmFsdWVzID0gaW5pdGlhbFZhbHVlcyB8fCBbXTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbFZhbHVlcyAhPSAnb2JqZWN0JyB8fCAhKCdsZW5ndGgnIGluIGluaXRpYWxWYWx1ZXMpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgYXJndW1lbnQgcGFzc2VkIHdoZW4gaW5pdGlhbGl6aW5nIGFuIG9ic2VydmFibGUgYXJyYXkgbXVzdCBiZSBhbiBhcnJheSwgb3IgbnVsbCwgb3IgdW5kZWZpbmVkLlwiKTtcblxuICAgIHZhciByZXN1bHQgPSBrby5vYnNlcnZhYmxlKGluaXRpYWxWYWx1ZXMpO1xuICAgIGtvLnV0aWxzLnNldFByb3RvdHlwZU9mT3JFeHRlbmQocmVzdWx0LCBrby5vYnNlcnZhYmxlQXJyYXlbJ2ZuJ10pO1xuICAgIHJldHVybiByZXN1bHQuZXh0ZW5kKHsndHJhY2tBcnJheUNoYW5nZXMnOnRydWV9KTtcbn07XG5cbmtvLm9ic2VydmFibGVBcnJheVsnZm4nXSA9IHtcbiAgICAncmVtb3ZlJzogZnVuY3Rpb24gKHZhbHVlT3JQcmVkaWNhdGUpIHtcbiAgICAgICAgdmFyIHVuZGVybHlpbmdBcnJheSA9IHRoaXMucGVlaygpO1xuICAgICAgICB2YXIgcmVtb3ZlZFZhbHVlcyA9IFtdO1xuICAgICAgICB2YXIgcHJlZGljYXRlID0gdHlwZW9mIHZhbHVlT3JQcmVkaWNhdGUgPT0gXCJmdW5jdGlvblwiICYmICFrby5pc09ic2VydmFibGUodmFsdWVPclByZWRpY2F0ZSkgPyB2YWx1ZU9yUHJlZGljYXRlIDogZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZSA9PT0gdmFsdWVPclByZWRpY2F0ZTsgfTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bmRlcmx5aW5nQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHVuZGVybHlpbmdBcnJheVtpXTtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWRWYWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVXaWxsTXV0YXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlbW92ZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdW5kZXJseWluZ0FycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbW92ZWRWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlSGFzTXV0YXRlZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZW1vdmVkVmFsdWVzO1xuICAgIH0sXG5cbiAgICAncmVtb3ZlQWxsJzogZnVuY3Rpb24gKGFycmF5T2ZWYWx1ZXMpIHtcbiAgICAgICAgLy8gSWYgeW91IHBhc3NlZCB6ZXJvIGFyZ3MsIHdlIHJlbW92ZSBldmVyeXRoaW5nXG4gICAgICAgIGlmIChhcnJheU9mVmFsdWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciB1bmRlcmx5aW5nQXJyYXkgPSB0aGlzLnBlZWsoKTtcbiAgICAgICAgICAgIHZhciBhbGxWYWx1ZXMgPSB1bmRlcmx5aW5nQXJyYXkuc2xpY2UoMCk7XG4gICAgICAgICAgICB0aGlzLnZhbHVlV2lsbE11dGF0ZSgpO1xuICAgICAgICAgICAgdW5kZXJseWluZ0FycmF5LnNwbGljZSgwLCB1bmRlcmx5aW5nQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVIYXNNdXRhdGVkKCk7XG4gICAgICAgICAgICByZXR1cm4gYWxsVmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHlvdSBwYXNzZWQgYW4gYXJnLCB3ZSBpbnRlcnByZXQgaXQgYXMgYW4gYXJyYXkgb2YgZW50cmllcyB0byByZW1vdmVcbiAgICAgICAgaWYgKCFhcnJheU9mVmFsdWVzKVxuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gdGhpc1sncmVtb3ZlJ10oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlJbmRleE9mKGFycmF5T2ZWYWx1ZXMsIHZhbHVlKSA+PSAwO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgJ2Rlc3Ryb3knOiBmdW5jdGlvbiAodmFsdWVPclByZWRpY2F0ZSkge1xuICAgICAgICB2YXIgdW5kZXJseWluZ0FycmF5ID0gdGhpcy5wZWVrKCk7XG4gICAgICAgIHZhciBwcmVkaWNhdGUgPSB0eXBlb2YgdmFsdWVPclByZWRpY2F0ZSA9PSBcImZ1bmN0aW9uXCIgJiYgIWtvLmlzT2JzZXJ2YWJsZSh2YWx1ZU9yUHJlZGljYXRlKSA/IHZhbHVlT3JQcmVkaWNhdGUgOiBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlID09PSB2YWx1ZU9yUHJlZGljYXRlOyB9O1xuICAgICAgICB0aGlzLnZhbHVlV2lsbE11dGF0ZSgpO1xuICAgICAgICBmb3IgKHZhciBpID0gdW5kZXJseWluZ0FycmF5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB1bmRlcmx5aW5nQXJyYXlbaV07XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlKSlcbiAgICAgICAgICAgICAgICB1bmRlcmx5aW5nQXJyYXlbaV1bXCJfZGVzdHJveVwiXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZUhhc011dGF0ZWQoKTtcbiAgICB9LFxuXG4gICAgJ2Rlc3Ryb3lBbGwnOiBmdW5jdGlvbiAoYXJyYXlPZlZhbHVlcykge1xuICAgICAgICAvLyBJZiB5b3UgcGFzc2VkIHplcm8gYXJncywgd2UgZGVzdHJveSBldmVyeXRoaW5nXG4gICAgICAgIGlmIChhcnJheU9mVmFsdWVzID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpc1snZGVzdHJveSddKGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KTtcblxuICAgICAgICAvLyBJZiB5b3UgcGFzc2VkIGFuIGFyZywgd2UgaW50ZXJwcmV0IGl0IGFzIGFuIGFycmF5IG9mIGVudHJpZXMgdG8gZGVzdHJveVxuICAgICAgICBpZiAoIWFycmF5T2ZWYWx1ZXMpXG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIHJldHVybiB0aGlzWydkZXN0cm95J10oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlJbmRleE9mKGFycmF5T2ZWYWx1ZXMsIHZhbHVlKSA+PSAwO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgJ2luZGV4T2YnOiBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICB2YXIgdW5kZXJseWluZ0FycmF5ID0gdGhpcygpO1xuICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlJbmRleE9mKHVuZGVybHlpbmdBcnJheSwgaXRlbSk7XG4gICAgfSxcblxuICAgICdyZXBsYWNlJzogZnVuY3Rpb24ob2xkSXRlbSwgbmV3SXRlbSkge1xuICAgICAgICB2YXIgaW5kZXggPSB0aGlzWydpbmRleE9mJ10ob2xkSXRlbSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlV2lsbE11dGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5wZWVrKClbaW5kZXhdID0gbmV3SXRlbTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVIYXNNdXRhdGVkKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vLyBOb3RlIHRoYXQgZm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBwcm90byBhc3NpZ25tZW50LCB0aGVcbi8vIGluaGVyaXRhbmNlIGNoYWluIGlzIGNyZWF0ZWQgbWFudWFsbHkgaW4gdGhlIGtvLm9ic2VydmFibGVBcnJheSBjb25zdHJ1Y3RvclxuaWYgKGtvLnV0aWxzLmNhblNldFByb3RvdHlwZSkge1xuICAgIGtvLnV0aWxzLnNldFByb3RvdHlwZU9mKGtvLm9ic2VydmFibGVBcnJheVsnZm4nXSwga28ub2JzZXJ2YWJsZVsnZm4nXSk7XG59XG5cbi8vIFBvcHVsYXRlIGtvLm9ic2VydmFibGVBcnJheS5mbiB3aXRoIHJlYWQvd3JpdGUgZnVuY3Rpb25zIGZyb20gbmF0aXZlIGFycmF5c1xuLy8gSW1wb3J0YW50OiBEbyBub3QgYWRkIGFueSBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBoZXJlIHRoYXQgbWF5IHJlYXNvbmFibHkgYmUgdXNlZCB0byAqcmVhZCogZGF0YSBmcm9tIHRoZSBhcnJheVxuLy8gYmVjYXVzZSB3ZSdsbCBldmFsIHRoZW0gd2l0aG91dCBjYXVzaW5nIHN1YnNjcmlwdGlvbnMsIHNvIGtvLmNvbXB1dGVkIG91dHB1dCBjb3VsZCBlbmQgdXAgZ2V0dGluZyBzdGFsZVxua28udXRpbHMuYXJyYXlGb3JFYWNoKFtcInBvcFwiLCBcInB1c2hcIiwgXCJyZXZlcnNlXCIsIFwic2hpZnRcIiwgXCJzb3J0XCIsIFwic3BsaWNlXCIsIFwidW5zaGlmdFwiXSwgZnVuY3Rpb24gKG1ldGhvZE5hbWUpIHtcbiAgICBrby5vYnNlcnZhYmxlQXJyYXlbJ2ZuJ11bbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFVzZSBcInBlZWtcIiB0byBhdm9pZCBjcmVhdGluZyBhIHN1YnNjcmlwdGlvbiBpbiBhbnkgY29tcHV0ZWQgdGhhdCB3ZSdyZSBleGVjdXRpbmcgaW4gdGhlIGNvbnRleHQgb2ZcbiAgICAgICAgLy8gKGZvciBjb25zaXN0ZW5jeSB3aXRoIG11dGF0aW5nIHJlZ3VsYXIgb2JzZXJ2YWJsZXMpXG4gICAgICAgIHZhciB1bmRlcmx5aW5nQXJyYXkgPSB0aGlzLnBlZWsoKTtcbiAgICAgICAgdGhpcy52YWx1ZVdpbGxNdXRhdGUoKTtcbiAgICAgICAgdGhpcy5jYWNoZURpZmZGb3JLbm93bk9wZXJhdGlvbih1bmRlcmx5aW5nQXJyYXksIG1ldGhvZE5hbWUsIGFyZ3VtZW50cyk7XG4gICAgICAgIHZhciBtZXRob2RDYWxsUmVzdWx0ID0gdW5kZXJseWluZ0FycmF5W21ldGhvZE5hbWVdLmFwcGx5KHVuZGVybHlpbmdBcnJheSwgYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy52YWx1ZUhhc011dGF0ZWQoKTtcbiAgICAgICAgLy8gVGhlIG5hdGl2ZSBzb3J0IGFuZCByZXZlcnNlIG1ldGhvZHMgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSwgYnV0IGl0IG1ha2VzIG1vcmUgc2Vuc2UgdG8gcmV0dXJuIHRoZSBvYnNlcnZhYmxlIGFycmF5IGluc3RlYWQuXG4gICAgICAgIHJldHVybiBtZXRob2RDYWxsUmVzdWx0ID09PSB1bmRlcmx5aW5nQXJyYXkgPyB0aGlzIDogbWV0aG9kQ2FsbFJlc3VsdDtcbiAgICB9O1xufSk7XG5cbi8vIFBvcHVsYXRlIGtvLm9ic2VydmFibGVBcnJheS5mbiB3aXRoIHJlYWQtb25seSBmdW5jdGlvbnMgZnJvbSBuYXRpdmUgYXJyYXlzXG5rby51dGlscy5hcnJheUZvckVhY2goW1wic2xpY2VcIl0sIGZ1bmN0aW9uIChtZXRob2ROYW1lKSB7XG4gICAga28ub2JzZXJ2YWJsZUFycmF5WydmbiddW21ldGhvZE5hbWVdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdW5kZXJseWluZ0FycmF5ID0gdGhpcygpO1xuICAgICAgICByZXR1cm4gdW5kZXJseWluZ0FycmF5W21ldGhvZE5hbWVdLmFwcGx5KHVuZGVybHlpbmdBcnJheSwgYXJndW1lbnRzKTtcbiAgICB9O1xufSk7XG5cbmtvLmV4cG9ydFN5bWJvbCgnb2JzZXJ2YWJsZUFycmF5Jywga28ub2JzZXJ2YWJsZUFycmF5KTtcbnZhciBhcnJheUNoYW5nZUV2ZW50TmFtZSA9ICdhcnJheUNoYW5nZSc7XG5rby5leHRlbmRlcnNbJ3RyYWNrQXJyYXlDaGFuZ2VzJ10gPSBmdW5jdGlvbih0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAvLyBVc2UgdGhlIHByb3ZpZGVkIG9wdGlvbnMtLWVhY2ggY2FsbCB0byB0cmFja0FycmF5Q2hhbmdlcyBvdmVyd3JpdGVzIHRoZSBwcmV2aW91c2x5IHNldCBvcHRpb25zXG4gICAgdGFyZ2V0LmNvbXBhcmVBcnJheU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGtvLnV0aWxzLmV4dGVuZCh0YXJnZXQuY29tcGFyZUFycmF5T3B0aW9ucywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHRhcmdldC5jb21wYXJlQXJyYXlPcHRpb25zWydzcGFyc2UnXSA9IHRydWU7XG5cbiAgICAvLyBPbmx5IG1vZGlmeSB0aGUgdGFyZ2V0IG9ic2VydmFibGUgb25jZVxuICAgIGlmICh0YXJnZXQuY2FjaGVEaWZmRm9yS25vd25PcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdHJhY2tpbmdDaGFuZ2VzID0gZmFsc2UsXG4gICAgICAgIGNhY2hlZERpZmYgPSBudWxsLFxuICAgICAgICBhcnJheUNoYW5nZVN1YnNjcmlwdGlvbixcbiAgICAgICAgcGVuZGluZ05vdGlmaWNhdGlvbnMgPSAwLFxuICAgICAgICB1bmRlcmx5aW5nQmVmb3JlU3Vic2NyaXB0aW9uQWRkRnVuY3Rpb24gPSB0YXJnZXQuYmVmb3JlU3Vic2NyaXB0aW9uQWRkLFxuICAgICAgICB1bmRlcmx5aW5nQWZ0ZXJTdWJzY3JpcHRpb25SZW1vdmVGdW5jdGlvbiA9IHRhcmdldC5hZnRlclN1YnNjcmlwdGlvblJlbW92ZTtcblxuICAgIC8vIFdhdGNoIFwic3Vic2NyaWJlXCIgY2FsbHMsIGFuZCBmb3IgYXJyYXkgY2hhbmdlIGV2ZW50cywgZW5zdXJlIGNoYW5nZSB0cmFja2luZyBpcyBlbmFibGVkXG4gICAgdGFyZ2V0LmJlZm9yZVN1YnNjcmlwdGlvbkFkZCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAodW5kZXJseWluZ0JlZm9yZVN1YnNjcmlwdGlvbkFkZEZ1bmN0aW9uKVxuICAgICAgICAgICAgdW5kZXJseWluZ0JlZm9yZVN1YnNjcmlwdGlvbkFkZEZ1bmN0aW9uLmNhbGwodGFyZ2V0LCBldmVudCk7XG4gICAgICAgIGlmIChldmVudCA9PT0gYXJyYXlDaGFuZ2VFdmVudE5hbWUpIHtcbiAgICAgICAgICAgIHRyYWNrQ2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvLyBXYXRjaCBcImRpc3Bvc2VcIiBjYWxscywgYW5kIGZvciBhcnJheSBjaGFuZ2UgZXZlbnRzLCBlbnN1cmUgY2hhbmdlIHRyYWNraW5nIGlzIGRpc2FibGVkIHdoZW4gYWxsIGFyZSBkaXNwb3NlZFxuICAgIHRhcmdldC5hZnRlclN1YnNjcmlwdGlvblJlbW92ZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAodW5kZXJseWluZ0FmdGVyU3Vic2NyaXB0aW9uUmVtb3ZlRnVuY3Rpb24pXG4gICAgICAgICAgICB1bmRlcmx5aW5nQWZ0ZXJTdWJzY3JpcHRpb25SZW1vdmVGdW5jdGlvbi5jYWxsKHRhcmdldCwgZXZlbnQpO1xuICAgICAgICBpZiAoZXZlbnQgPT09IGFycmF5Q2hhbmdlRXZlbnROYW1lICYmICF0YXJnZXQuaGFzU3Vic2NyaXB0aW9uc0ZvckV2ZW50KGFycmF5Q2hhbmdlRXZlbnROYW1lKSkge1xuICAgICAgICAgICAgYXJyYXlDaGFuZ2VTdWJzY3JpcHRpb24uZGlzcG9zZSgpO1xuICAgICAgICAgICAgdHJhY2tpbmdDaGFuZ2VzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdHJhY2tDaGFuZ2VzKCkge1xuICAgICAgICAvLyBDYWxsaW5nICd0cmFja0NoYW5nZXMnIG11bHRpcGxlIHRpbWVzIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgaXQgb25jZVxuICAgICAgICBpZiAodHJhY2tpbmdDaGFuZ2VzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cmFja2luZ0NoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgIC8vIEludGVyY2VwdCBcIm5vdGlmeVN1YnNjcmliZXJzXCIgdG8gdHJhY2sgaG93IG1hbnkgdGltZXMgaXQgd2FzIGNhbGxlZC5cbiAgICAgICAgdmFyIHVuZGVybHlpbmdOb3RpZnlTdWJzY3JpYmVyc0Z1bmN0aW9uID0gdGFyZ2V0Wydub3RpZnlTdWJzY3JpYmVycyddO1xuICAgICAgICB0YXJnZXRbJ25vdGlmeVN1YnNjcmliZXJzJ10gPSBmdW5jdGlvbih2YWx1ZVRvTm90aWZ5LCBldmVudCkge1xuICAgICAgICAgICAgaWYgKCFldmVudCB8fCBldmVudCA9PT0gZGVmYXVsdEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgKytwZW5kaW5nTm90aWZpY2F0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlcmx5aW5nTm90aWZ5U3Vic2NyaWJlcnNGdW5jdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEVhY2ggdGltZSB0aGUgYXJyYXkgY2hhbmdlcyB2YWx1ZSwgY2FwdHVyZSBhIGNsb25lIHNvIHRoYXQgb24gdGhlIG5leHRcbiAgICAgICAgLy8gY2hhbmdlIGl0J3MgcG9zc2libGUgdG8gcHJvZHVjZSBhIGRpZmZcbiAgICAgICAgdmFyIHByZXZpb3VzQ29udGVudHMgPSBbXS5jb25jYXQodGFyZ2V0LnBlZWsoKSB8fCBbXSk7XG4gICAgICAgIGNhY2hlZERpZmYgPSBudWxsO1xuICAgICAgICBhcnJheUNoYW5nZVN1YnNjcmlwdGlvbiA9IHRhcmdldC5zdWJzY3JpYmUoZnVuY3Rpb24oY3VycmVudENvbnRlbnRzKSB7XG4gICAgICAgICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgY3VycmVudCBjb250ZW50cyBhbmQgZW5zdXJlIGl0J3MgYW4gYXJyYXlcbiAgICAgICAgICAgIGN1cnJlbnRDb250ZW50cyA9IFtdLmNvbmNhdChjdXJyZW50Q29udGVudHMgfHwgW10pO1xuXG4gICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBkaWZmIGFuZCBpc3N1ZSBub3RpZmljYXRpb25zLCBidXQgb25seSBpZiBzb21lb25lIGlzIGxpc3RlbmluZ1xuICAgICAgICAgICAgaWYgKHRhcmdldC5oYXNTdWJzY3JpcHRpb25zRm9yRXZlbnQoYXJyYXlDaGFuZ2VFdmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoYW5nZXMgPSBnZXRDaGFuZ2VzKHByZXZpb3VzQ29udGVudHMsIGN1cnJlbnRDb250ZW50cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVsaW1pbmF0ZSByZWZlcmVuY2VzIHRvIHRoZSBvbGQsIHJlbW92ZWQgaXRlbXMsIHNvIHRoZXkgY2FuIGJlIEdDZWRcbiAgICAgICAgICAgIHByZXZpb3VzQ29udGVudHMgPSBjdXJyZW50Q29udGVudHM7XG4gICAgICAgICAgICBjYWNoZWREaWZmID0gbnVsbDtcbiAgICAgICAgICAgIHBlbmRpbmdOb3RpZmljYXRpb25zID0gMDtcblxuICAgICAgICAgICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbJ25vdGlmeVN1YnNjcmliZXJzJ10oY2hhbmdlcywgYXJyYXlDaGFuZ2VFdmVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRDaGFuZ2VzKHByZXZpb3VzQ29udGVudHMsIGN1cnJlbnRDb250ZW50cykge1xuICAgICAgICAvLyBXZSB0cnkgdG8gcmUtdXNlIGNhY2hlZCBkaWZmcy5cbiAgICAgICAgLy8gVGhlIHNjZW5hcmlvcyB3aGVyZSBwZW5kaW5nTm90aWZpY2F0aW9ucyA+IDEgYXJlIHdoZW4gdXNpbmcgcmF0ZS1saW1pdGluZyBvciB0aGUgRGVmZXJyZWQgVXBkYXRlc1xuICAgICAgICAvLyBwbHVnaW4sIHdoaWNoIHdpdGhvdXQgdGhpcyBjaGVjayB3b3VsZCBub3QgYmUgY29tcGF0aWJsZSB3aXRoIGFycmF5Q2hhbmdlIG5vdGlmaWNhdGlvbnMuIE5vcm1hbGx5LFxuICAgICAgICAvLyBub3RpZmljYXRpb25zIGFyZSBpc3N1ZWQgaW1tZWRpYXRlbHkgc28gd2Ugd291bGRuJ3QgYmUgcXVldWVpbmcgdXAgbW9yZSB0aGFuIG9uZS5cbiAgICAgICAgaWYgKCFjYWNoZWREaWZmIHx8IHBlbmRpbmdOb3RpZmljYXRpb25zID4gMSkge1xuICAgICAgICAgICAgY2FjaGVkRGlmZiA9IGtvLnV0aWxzLmNvbXBhcmVBcnJheXMocHJldmlvdXNDb250ZW50cywgY3VycmVudENvbnRlbnRzLCB0YXJnZXQuY29tcGFyZUFycmF5T3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FjaGVkRGlmZjtcbiAgICB9XG5cbiAgICB0YXJnZXQuY2FjaGVEaWZmRm9yS25vd25PcGVyYXRpb24gPSBmdW5jdGlvbihyYXdBcnJheSwgb3BlcmF0aW9uTmFtZSwgYXJncykge1xuICAgICAgICAvLyBPbmx5IHJ1biBpZiB3ZSdyZSBjdXJyZW50bHkgdHJhY2tpbmcgY2hhbmdlcyBmb3IgdGhpcyBvYnNlcnZhYmxlIGFycmF5XG4gICAgICAgIC8vIGFuZCB0aGVyZSBhcmVuJ3QgYW55IHBlbmRpbmcgZGVmZXJyZWQgbm90aWZpY2F0aW9ucy5cbiAgICAgICAgaWYgKCF0cmFja2luZ0NoYW5nZXMgfHwgcGVuZGluZ05vdGlmaWNhdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGlmZiA9IFtdLFxuICAgICAgICAgICAgYXJyYXlMZW5ndGggPSByYXdBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuXG4gICAgICAgIGZ1bmN0aW9uIHB1c2hEaWZmKHN0YXR1cywgdmFsdWUsIGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gZGlmZltkaWZmLmxlbmd0aF0gPSB7ICdzdGF0dXMnOiBzdGF0dXMsICd2YWx1ZSc6IHZhbHVlLCAnaW5kZXgnOiBpbmRleCB9O1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAob3BlcmF0aW9uTmFtZSkge1xuICAgICAgICAgICAgY2FzZSAncHVzaCc6XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gYXJyYXlMZW5ndGg7XG4gICAgICAgICAgICBjYXNlICd1bnNoaWZ0JzpcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgYXJnc0xlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBwdXNoRGlmZignYWRkZWQnLCBhcmdzW2luZGV4XSwgb2Zmc2V0ICsgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAncG9wJzpcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSBhcnJheUxlbmd0aCAtIDE7XG4gICAgICAgICAgICBjYXNlICdzaGlmdCc6XG4gICAgICAgICAgICAgICAgaWYgKGFycmF5TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hEaWZmKCdkZWxldGVkJywgcmF3QXJyYXlbb2Zmc2V0XSwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ3NwbGljZSc6XG4gICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgc3RhcnQgaW5kZXggbWVhbnMgJ2Zyb20gZW5kIG9mIGFycmF5Jy4gQWZ0ZXIgdGhhdCB3ZSBjbGFtcCB0byBbMC4uLmFycmF5TGVuZ3RoXS5cbiAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc3BsaWNlXG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSBNYXRoLm1pbihNYXRoLm1heCgwLCBhcmdzWzBdIDwgMCA/IGFycmF5TGVuZ3RoICsgYXJnc1swXSA6IGFyZ3NbMF0pLCBhcnJheUxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIGVuZERlbGV0ZUluZGV4ID0gYXJnc0xlbmd0aCA9PT0gMSA/IGFycmF5TGVuZ3RoIDogTWF0aC5taW4oc3RhcnRJbmRleCArIChhcmdzWzFdIHx8IDApLCBhcnJheUxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIGVuZEFkZEluZGV4ID0gc3RhcnRJbmRleCArIGFyZ3NMZW5ndGggLSAyLFxuICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCA9IE1hdGgubWF4KGVuZERlbGV0ZUluZGV4LCBlbmRBZGRJbmRleCksXG4gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9ucyA9IFtdLCBkZWxldGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IHN0YXJ0SW5kZXgsIGFyZ3NJbmRleCA9IDI7IGluZGV4IDwgZW5kSW5kZXg7ICsraW5kZXgsICsrYXJnc0luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGVuZERlbGV0ZUluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb25zLnB1c2gocHVzaERpZmYoJ2RlbGV0ZWQnLCByYXdBcnJheVtpbmRleF0sIGluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IGVuZEFkZEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25zLnB1c2gocHVzaERpZmYoJ2FkZGVkJywgYXJnc1thcmdzSW5kZXhdLCBpbmRleCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrby51dGlscy5maW5kTW92ZXNJbkFycmF5Q29tcGFyaXNvbihkZWxldGlvbnMsIGFkZGl0aW9ucyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlZERpZmYgPSBkaWZmO1xuICAgIH07XG59O1xudmFyIGNvbXB1dGVkU3RhdGUgPSBrby51dGlscy5jcmVhdGVTeW1ib2xPclN0cmluZygnX3N0YXRlJyk7XG5cbmtvLmNvbXB1dGVkID0ga28uZGVwZW5kZW50T2JzZXJ2YWJsZSA9IGZ1bmN0aW9uIChldmFsdWF0b3JGdW5jdGlvbk9yT3B0aW9ucywgZXZhbHVhdG9yRnVuY3Rpb25UYXJnZXQsIG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIGV2YWx1YXRvckZ1bmN0aW9uT3JPcHRpb25zID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIC8vIFNpbmdsZS1wYXJhbWV0ZXIgc3ludGF4IC0gZXZlcnl0aGluZyBpcyBvbiB0aGlzIFwib3B0aW9uc1wiIHBhcmFtXG4gICAgICAgIG9wdGlvbnMgPSBldmFsdWF0b3JGdW5jdGlvbk9yT3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNdWx0aS1wYXJhbWV0ZXIgc3ludGF4IC0gY29uc3RydWN0IHRoZSBvcHRpb25zIGFjY29yZGluZyB0byB0aGUgcGFyYW1zIHBhc3NlZFxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKGV2YWx1YXRvckZ1bmN0aW9uT3JPcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zW1wicmVhZFwiXSA9IGV2YWx1YXRvckZ1bmN0aW9uT3JPcHRpb25zO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygb3B0aW9uc1tcInJlYWRcIl0gIT0gXCJmdW5jdGlvblwiKVxuICAgICAgICB0aHJvdyBFcnJvcihcIlBhc3MgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBrby5jb21wdXRlZFwiKTtcblxuICAgIHZhciB3cml0ZUZ1bmN0aW9uID0gb3B0aW9uc1tcIndyaXRlXCJdO1xuICAgIHZhciBzdGF0ZSA9IHtcbiAgICAgICAgbGF0ZXN0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgaXNTdGFsZTogdHJ1ZSxcbiAgICAgICAgaXNCZWluZ0V2YWx1YXRlZDogZmFsc2UsXG4gICAgICAgIHN1cHByZXNzRGlzcG9zYWxVbnRpbERpc3Bvc2VXaGVuUmV0dXJuc0ZhbHNlOiBmYWxzZSxcbiAgICAgICAgaXNEaXNwb3NlZDogZmFsc2UsXG4gICAgICAgIHB1cmU6IGZhbHNlLFxuICAgICAgICBpc1NsZWVwaW5nOiBmYWxzZSxcbiAgICAgICAgcmVhZEZ1bmN0aW9uOiBvcHRpb25zW1wicmVhZFwiXSxcbiAgICAgICAgZXZhbHVhdG9yRnVuY3Rpb25UYXJnZXQ6IGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0IHx8IG9wdGlvbnNbXCJvd25lclwiXSxcbiAgICAgICAgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBvcHRpb25zW1wiZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkXCJdIHx8IG9wdGlvbnMuZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkIHx8IG51bGwsXG4gICAgICAgIGRpc3Bvc2VXaGVuOiBvcHRpb25zW1wiZGlzcG9zZVdoZW5cIl0gfHwgb3B0aW9ucy5kaXNwb3NlV2hlbixcbiAgICAgICAgZG9tTm9kZURpc3Bvc2FsQ2FsbGJhY2s6IG51bGwsXG4gICAgICAgIGRlcGVuZGVuY3lUcmFja2luZzoge30sXG4gICAgICAgIGRlcGVuZGVuY2llc0NvdW50OiAwLFxuICAgICAgICBldmFsdWF0aW9uVGltZW91dEluc3RhbmNlOiBudWxsXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVkT2JzZXJ2YWJsZSgpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdyaXRlRnVuY3Rpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIC8vIFdyaXRpbmcgYSB2YWx1ZVxuICAgICAgICAgICAgICAgIHdyaXRlRnVuY3Rpb24uYXBwbHkoc3RhdGUuZXZhbHVhdG9yRnVuY3Rpb25UYXJnZXQsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB3cml0ZSBhIHZhbHVlIHRvIGEga28uY29tcHV0ZWQgdW5sZXNzIHlvdSBzcGVjaWZ5IGEgJ3dyaXRlJyBvcHRpb24uIElmIHlvdSB3aXNoIHRvIHJlYWQgdGhlIGN1cnJlbnQgdmFsdWUsIGRvbid0IHBhc3MgYW55IHBhcmFtZXRlcnMuXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7IC8vIFBlcm1pdHMgY2hhaW5lZCBhc3NpZ25tZW50c1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVhZGluZyB0aGUgdmFsdWVcbiAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24ucmVnaXN0ZXJEZXBlbmRlbmN5KGNvbXB1dGVkT2JzZXJ2YWJsZSk7XG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNTdGFsZSB8fCAoc3RhdGUuaXNTbGVlcGluZyAmJiBjb21wdXRlZE9ic2VydmFibGUuaGF2ZURlcGVuZGVuY2llc0NoYW5nZWQoKSkpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZE9ic2VydmFibGUuZXZhbHVhdGVJbW1lZGlhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5sYXRlc3RWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXB1dGVkT2JzZXJ2YWJsZVtjb21wdXRlZFN0YXRlXSA9IHN0YXRlO1xuICAgIGNvbXB1dGVkT2JzZXJ2YWJsZS5oYXNXcml0ZUZ1bmN0aW9uID0gdHlwZW9mIHdyaXRlRnVuY3Rpb24gPT09IFwiZnVuY3Rpb25cIjtcblxuICAgIC8vIEluaGVyaXQgZnJvbSAnc3Vic2NyaWJhYmxlJ1xuICAgIGlmICgha28udXRpbHMuY2FuU2V0UHJvdG90eXBlKSB7XG4gICAgICAgIC8vICdzdWJzY3JpYmFibGUnIHdvbid0IGJlIG9uIHRoZSBwcm90b3R5cGUgY2hhaW4gdW5sZXNzIHdlIHB1dCBpdCB0aGVyZSBkaXJlY3RseVxuICAgICAgICBrby51dGlscy5leHRlbmQoY29tcHV0ZWRPYnNlcnZhYmxlLCBrby5zdWJzY3JpYmFibGVbJ2ZuJ10pO1xuICAgIH1cbiAgICBrby5zdWJzY3JpYmFibGVbJ2ZuJ10uaW5pdChjb21wdXRlZE9ic2VydmFibGUpO1xuXG4gICAgLy8gSW5oZXJpdCBmcm9tICdjb21wdXRlZCdcbiAgICBrby51dGlscy5zZXRQcm90b3R5cGVPZk9yRXh0ZW5kKGNvbXB1dGVkT2JzZXJ2YWJsZSwgY29tcHV0ZWRGbik7XG5cbiAgICBpZiAob3B0aW9uc1sncHVyZSddKSB7XG4gICAgICAgIHN0YXRlLnB1cmUgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5pc1NsZWVwaW5nID0gdHJ1ZTsgICAgIC8vIFN0YXJ0cyBvZmYgc2xlZXBpbmc7IHdpbGwgYXdha2Ugb24gdGhlIGZpcnN0IHN1YnNjcmlwdGlvblxuICAgICAgICBrby51dGlscy5leHRlbmQoY29tcHV0ZWRPYnNlcnZhYmxlLCBwdXJlQ29tcHV0ZWRPdmVycmlkZXMpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9uc1snZGVmZXJFdmFsdWF0aW9uJ10pIHtcbiAgICAgICAga28udXRpbHMuZXh0ZW5kKGNvbXB1dGVkT2JzZXJ2YWJsZSwgZGVmZXJFdmFsdWF0aW9uT3ZlcnJpZGVzKTtcbiAgICB9XG5cbiAgICBpZiAoa28ub3B0aW9uc1snZGVmZXJVcGRhdGVzJ10pIHtcbiAgICAgICAga28uZXh0ZW5kZXJzWydkZWZlcnJlZCddKGNvbXB1dGVkT2JzZXJ2YWJsZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKERFQlVHKSB7XG4gICAgICAgIC8vICMxNzMxIC0gQWlkIGRlYnVnZ2luZyBieSBleHBvc2luZyB0aGUgY29tcHV0ZWQncyBvcHRpb25zXG4gICAgICAgIGNvbXB1dGVkT2JzZXJ2YWJsZVtcIl9vcHRpb25zXCJdID0gb3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAoc3RhdGUuZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkKSB7XG4gICAgICAgIC8vIFNpbmNlIHRoaXMgY29tcHV0ZWQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRE9NIG5vZGUsIGFuZCB3ZSBkb24ndCB3YW50IHRvIGRpc3Bvc2UgdGhlIGNvbXB1dGVkXG4gICAgICAgIC8vIHVudGlsIHRoZSBET00gbm9kZSBpcyAqcmVtb3ZlZCogZnJvbSB0aGUgZG9jdW1lbnQgKGFzIG9wcG9zZWQgdG8gbmV2ZXIgaGF2aW5nIGJlZW4gaW4gdGhlIGRvY3VtZW50KSxcbiAgICAgICAgLy8gd2UnbGwgcHJldmVudCBkaXNwb3NhbCB1bnRpbCBcImRpc3Bvc2VXaGVuXCIgZmlyc3QgcmV0dXJucyBmYWxzZS5cbiAgICAgICAgc3RhdGUuc3VwcHJlc3NEaXNwb3NhbFVudGlsRGlzcG9zZVdoZW5SZXR1cm5zRmFsc2UgPSB0cnVlO1xuXG4gICAgICAgIC8vIGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogdHJ1ZSBjYW4gYmUgdXNlZCB0byBvcHQgaW50byB0aGUgXCJvbmx5IGRpc3Bvc2UgYWZ0ZXIgZmlyc3QgZmFsc2UgcmVzdWx0XCJcbiAgICAgICAgLy8gYmVoYXZpb3VyIGV2ZW4gaWYgdGhlcmUncyBubyBzcGVjaWZpYyBub2RlIHRvIHdhdGNoLiBJbiB0aGF0IGNhc2UsIGNsZWFyIHRoZSBvcHRpb24gc28gd2UgZG9uJ3QgdHJ5XG4gICAgICAgIC8vIHRvIHdhdGNoIGZvciBhIG5vbi1ub2RlJ3MgZGlzcG9zYWwuIFRoaXMgdGVjaG5pcXVlIGlzIGludGVuZGVkIGZvciBLTydzIGludGVybmFsIHVzZSBvbmx5IGFuZCBzaG91bGRuJ3RcbiAgICAgICAgLy8gYmUgZG9jdW1lbnRlZCBvciB1c2VkIGJ5IGFwcGxpY2F0aW9uIGNvZGUsIGFzIGl0J3MgbGlrZWx5IHRvIGNoYW5nZSBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEtPLlxuICAgICAgICBpZiAoIXN0YXRlLmRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZC5ub2RlVHlwZSkge1xuICAgICAgICAgICAgc3RhdGUuZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV2YWx1YXRlLCB1bmxlc3Mgc2xlZXBpbmcgb3IgZGVmZXJFdmFsdWF0aW9uIGlzIHRydWVcbiAgICBpZiAoIXN0YXRlLmlzU2xlZXBpbmcgJiYgIW9wdGlvbnNbJ2RlZmVyRXZhbHVhdGlvbiddKSB7XG4gICAgICAgIGNvbXB1dGVkT2JzZXJ2YWJsZS5ldmFsdWF0ZUltbWVkaWF0ZSgpO1xuICAgIH1cblxuICAgIC8vIEF0dGFjaCBhIERPTSBub2RlIGRpc3Bvc2FsIGNhbGxiYWNrIHNvIHRoYXQgdGhlIGNvbXB1dGVkIHdpbGwgYmUgcHJvYWN0aXZlbHkgZGlzcG9zZWQgYXMgc29vbiBhcyB0aGUgbm9kZSBpc1xuICAgIC8vIHJlbW92ZWQgdXNpbmcga28ucmVtb3ZlTm9kZS4gQnV0IHNraXAgaWYgaXNBY3RpdmUgaXMgZmFsc2UgKHRoZXJlIHdpbGwgbmV2ZXIgYmUgYW55IGRlcGVuZGVuY2llcyB0byBkaXNwb3NlKS5cbiAgICBpZiAoc3RhdGUuZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkICYmIGNvbXB1dGVkT2JzZXJ2YWJsZS5pc0FjdGl2ZSgpKSB7XG4gICAgICAgIGtvLnV0aWxzLmRvbU5vZGVEaXNwb3NhbC5hZGREaXNwb3NlQ2FsbGJhY2soc3RhdGUuZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkLCBzdGF0ZS5kb21Ob2RlRGlzcG9zYWxDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbXB1dGVkT2JzZXJ2YWJsZS5kaXNwb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjb21wdXRlZE9ic2VydmFibGU7XG59O1xuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uIHRoYXQgZGlzcG9zZXMgYSBnaXZlbiBkZXBlbmRlbmN5VHJhY2tpbmcgZW50cnlcbmZ1bmN0aW9uIGNvbXB1dGVkRGlzcG9zZURlcGVuZGVuY3lDYWxsYmFjayhpZCwgZW50cnlUb0Rpc3Bvc2UpIHtcbiAgICBpZiAoZW50cnlUb0Rpc3Bvc2UgIT09IG51bGwgJiYgZW50cnlUb0Rpc3Bvc2UuZGlzcG9zZSkge1xuICAgICAgICBlbnRyeVRvRGlzcG9zZS5kaXNwb3NlKCk7XG4gICAgfVxufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGVhY2ggdGltZSBhIGRlcGVuZGVuY3kgaXMgZGV0ZWN0ZWQgd2hpbGUgZXZhbHVhdGluZyBhIGNvbXB1dGVkLlxuLy8gSXQncyBmYWN0b3JlZCBvdXQgYXMgYSBzaGFyZWQgZnVuY3Rpb24gdG8gYXZvaWQgY3JlYXRpbmcgdW5uZWNlc3NhcnkgZnVuY3Rpb24gaW5zdGFuY2VzIGR1cmluZyBldmFsdWF0aW9uLlxuZnVuY3Rpb24gY29tcHV0ZWRCZWdpbkRlcGVuZGVuY3lEZXRlY3Rpb25DYWxsYmFjayhzdWJzY3JpYmFibGUsIGlkKSB7XG4gICAgdmFyIGNvbXB1dGVkT2JzZXJ2YWJsZSA9IHRoaXMuY29tcHV0ZWRPYnNlcnZhYmxlLFxuICAgICAgICBzdGF0ZSA9IGNvbXB1dGVkT2JzZXJ2YWJsZVtjb21wdXRlZFN0YXRlXTtcbiAgICBpZiAoIXN0YXRlLmlzRGlzcG9zZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcG9zYWxDb3VudCAmJiB0aGlzLmRpc3Bvc2FsQ2FuZGlkYXRlc1tpZF0pIHtcbiAgICAgICAgICAgIC8vIERvbid0IHdhbnQgdG8gZGlzcG9zZSB0aGlzIHN1YnNjcmlwdGlvbiwgYXMgaXQncyBzdGlsbCBiZWluZyB1c2VkXG4gICAgICAgICAgICBjb21wdXRlZE9ic2VydmFibGUuYWRkRGVwZW5kZW5jeVRyYWNraW5nKGlkLCBzdWJzY3JpYmFibGUsIHRoaXMuZGlzcG9zYWxDYW5kaWRhdGVzW2lkXSk7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2FsQ2FuZGlkYXRlc1tpZF0gPSBudWxsOyAvLyBObyBuZWVkIHRvIGFjdHVhbGx5IGRlbGV0ZSB0aGUgcHJvcGVydHkgLSBkaXNwb3NhbENhbmRpZGF0ZXMgaXMgYSB0cmFuc2llbnQgb2JqZWN0IGFueXdheVxuICAgICAgICAgICAgLS10aGlzLmRpc3Bvc2FsQ291bnQ7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLmRlcGVuZGVuY3lUcmFja2luZ1tpZF0pIHtcbiAgICAgICAgICAgIC8vIEJyYW5kIG5ldyBzdWJzY3JpcHRpb24gLSBhZGQgaXRcbiAgICAgICAgICAgIGNvbXB1dGVkT2JzZXJ2YWJsZS5hZGREZXBlbmRlbmN5VHJhY2tpbmcoaWQsIHN1YnNjcmliYWJsZSwgc3RhdGUuaXNTbGVlcGluZyA/IHsgX3RhcmdldDogc3Vic2NyaWJhYmxlIH0gOiBjb21wdXRlZE9ic2VydmFibGUuc3Vic2NyaWJlVG9EZXBlbmRlbmN5KHN1YnNjcmliYWJsZSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgY29tcHV0ZWRGbiA9IHtcbiAgICBcImVxdWFsaXR5Q29tcGFyZXJcIjogdmFsdWVzQXJlUHJpbWl0aXZlQW5kRXF1YWwsXG4gICAgZ2V0RGVwZW5kZW5jaWVzQ291bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbY29tcHV0ZWRTdGF0ZV0uZGVwZW5kZW5jaWVzQ291bnQ7XG4gICAgfSxcbiAgICBhZGREZXBlbmRlbmN5VHJhY2tpbmc6IGZ1bmN0aW9uIChpZCwgdGFyZ2V0LCB0cmFja2luZ09iaikge1xuICAgICAgICBpZiAodGhpc1tjb21wdXRlZFN0YXRlXS5wdXJlICYmIHRhcmdldCA9PT0gdGhpcykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJBICdwdXJlJyBjb21wdXRlZCBtdXN0IG5vdCBiZSBjYWxsZWQgcmVjdXJzaXZlbHlcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzW2NvbXB1dGVkU3RhdGVdLmRlcGVuZGVuY3lUcmFja2luZ1tpZF0gPSB0cmFja2luZ09iajtcbiAgICAgICAgdHJhY2tpbmdPYmouX29yZGVyID0gdGhpc1tjb21wdXRlZFN0YXRlXS5kZXBlbmRlbmNpZXNDb3VudCsrO1xuICAgICAgICB0cmFja2luZ09iai5fdmVyc2lvbiA9IHRhcmdldC5nZXRWZXJzaW9uKCk7XG4gICAgfSxcbiAgICBoYXZlRGVwZW5kZW5jaWVzQ2hhbmdlZDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaWQsIGRlcGVuZGVuY3ksIGRlcGVuZGVuY3lUcmFja2luZyA9IHRoaXNbY29tcHV0ZWRTdGF0ZV0uZGVwZW5kZW5jeVRyYWNraW5nO1xuICAgICAgICBmb3IgKGlkIGluIGRlcGVuZGVuY3lUcmFja2luZykge1xuICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3lUcmFja2luZy5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jeVRyYWNraW5nW2lkXTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeS5fdGFyZ2V0Lmhhc0NoYW5nZWQoZGVwZW5kZW5jeS5fdmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBtYXJrRGlydHk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUHJvY2VzcyBcImRpcnR5XCIgZXZlbnRzIGlmIHdlIGNhbiBoYW5kbGUgZGVsYXllZCBub3RpZmljYXRpb25zXG4gICAgICAgIGlmICh0aGlzLl9ldmFsRGVsYXllZCAmJiAhdGhpc1tjb21wdXRlZFN0YXRlXS5pc0JlaW5nRXZhbHVhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9ldmFsRGVsYXllZCgpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBpc0FjdGl2ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpc1tjb21wdXRlZFN0YXRlXS5pc1N0YWxlIHx8IHRoaXNbY29tcHV0ZWRTdGF0ZV0uZGVwZW5kZW5jaWVzQ291bnQgPiAwO1xuICAgIH0sXG4gICAgcmVzcG9uZFRvQ2hhbmdlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElnbm9yZSBcImNoYW5nZVwiIGV2ZW50cyBpZiB3ZSd2ZSBhbHJlYWR5IHNjaGVkdWxlZCBhIGRlbGF5ZWQgbm90aWZpY2F0aW9uXG4gICAgICAgIGlmICghdGhpcy5fbm90aWZpY2F0aW9uSXNQZW5kaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmV2YWx1YXRlUG9zc2libHlBc3luYygpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBzdWJzY3JpYmVUb0RlcGVuZGVuY3k6IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgaWYgKHRhcmdldC5fZGVmZXJVcGRhdGVzICYmICF0aGlzW2NvbXB1dGVkU3RhdGVdLmRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCkge1xuICAgICAgICAgICAgdmFyIGRpcnR5U3ViID0gdGFyZ2V0LnN1YnNjcmliZSh0aGlzLm1hcmtEaXJ0eSwgdGhpcywgJ2RpcnR5JyksXG4gICAgICAgICAgICAgICAgY2hhbmdlU3ViID0gdGFyZ2V0LnN1YnNjcmliZSh0aGlzLnJlc3BvbmRUb0NoYW5nZSwgdGhpcyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIF90YXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgICAgICBkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpcnR5U3ViLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlU3ViLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5zdWJzY3JpYmUodGhpcy5ldmFsdWF0ZVBvc3NpYmx5QXN5bmMsIHRoaXMpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBldmFsdWF0ZVBvc3NpYmx5QXN5bmM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbXB1dGVkT2JzZXJ2YWJsZSA9IHRoaXMsXG4gICAgICAgICAgICB0aHJvdHRsZUV2YWx1YXRpb25UaW1lb3V0ID0gY29tcHV0ZWRPYnNlcnZhYmxlWyd0aHJvdHRsZUV2YWx1YXRpb24nXTtcbiAgICAgICAgaWYgKHRocm90dGxlRXZhbHVhdGlvblRpbWVvdXQgJiYgdGhyb3R0bGVFdmFsdWF0aW9uVGltZW91dCA+PSAwKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpc1tjb21wdXRlZFN0YXRlXS5ldmFsdWF0aW9uVGltZW91dEluc3RhbmNlKTtcbiAgICAgICAgICAgIHRoaXNbY29tcHV0ZWRTdGF0ZV0uZXZhbHVhdGlvblRpbWVvdXRJbnN0YW5jZSA9IGtvLnV0aWxzLnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkT2JzZXJ2YWJsZS5ldmFsdWF0ZUltbWVkaWF0ZSh0cnVlIC8qbm90aWZ5Q2hhbmdlKi8pO1xuICAgICAgICAgICAgfSwgdGhyb3R0bGVFdmFsdWF0aW9uVGltZW91dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcHV0ZWRPYnNlcnZhYmxlLl9ldmFsRGVsYXllZCkge1xuICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlLl9ldmFsRGVsYXllZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlLmV2YWx1YXRlSW1tZWRpYXRlKHRydWUgLypub3RpZnlDaGFuZ2UqLyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGV2YWx1YXRlSW1tZWRpYXRlOiBmdW5jdGlvbiAobm90aWZ5Q2hhbmdlKSB7XG4gICAgICAgIHZhciBjb21wdXRlZE9ic2VydmFibGUgPSB0aGlzLFxuICAgICAgICAgICAgc3RhdGUgPSBjb21wdXRlZE9ic2VydmFibGVbY29tcHV0ZWRTdGF0ZV0sXG4gICAgICAgICAgICBkaXNwb3NlV2hlbiA9IHN0YXRlLmRpc3Bvc2VXaGVuO1xuXG4gICAgICAgIGlmIChzdGF0ZS5pc0JlaW5nRXZhbHVhdGVkKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZXZhbHVhdGlvbiBvZiBhIGtvLmNvbXB1dGVkIGNhdXNlcyBzaWRlIGVmZmVjdHMsIGl0J3MgcG9zc2libGUgdGhhdCBpdCB3aWxsIHRyaWdnZXIgaXRzIG93biByZS1ldmFsdWF0aW9uLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgZGVzaXJhYmxlIChpdCdzIGhhcmQgZm9yIGEgZGV2ZWxvcGVyIHRvIHJlYWxpc2UgYSBjaGFpbiBvZiBkZXBlbmRlbmNpZXMgbWlnaHQgY2F1c2UgdGhpcywgYW5kIHRoZXkgYWxtb3N0XG4gICAgICAgICAgICAvLyBjZXJ0YWlubHkgZGlkbid0IGludGVuZCBpbmZpbml0ZSByZS1ldmFsdWF0aW9ucykuIFNvLCBmb3IgcHJlZGljdGFiaWxpdHksIHdlIHNpbXBseSBwcmV2ZW50IGtvLmNvbXB1dGVkcyBmcm9tIGNhdXNpbmdcbiAgICAgICAgICAgIC8vIHRoZWlyIG93biByZS1ldmFsdWF0aW9uLiBGdXJ0aGVyIGRpc2N1c3Npb24gYXQgaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L3B1bGwvMzg3XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEbyBub3QgZXZhbHVhdGUgKGFuZCBwb3NzaWJseSBjYXB0dXJlIG5ldyBkZXBlbmRlbmNpZXMpIGlmIGRpc3Bvc2VkXG4gICAgICAgIGlmIChzdGF0ZS5pc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUuZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkICYmICFrby51dGlscy5kb21Ob2RlSXNBdHRhY2hlZFRvRG9jdW1lbnQoc3RhdGUuZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkKSB8fCBkaXNwb3NlV2hlbiAmJiBkaXNwb3NlV2hlbigpKSB7XG4gICAgICAgICAgICAvLyBTZWUgY29tbWVudCBhYm92ZSBhYm91dCBzdXBwcmVzc0Rpc3Bvc2FsVW50aWxEaXNwb3NlV2hlblJldHVybnNGYWxzZVxuICAgICAgICAgICAgaWYgKCFzdGF0ZS5zdXBwcmVzc0Rpc3Bvc2FsVW50aWxEaXNwb3NlV2hlblJldHVybnNGYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkT2JzZXJ2YWJsZS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSXQganVzdCBkaWQgcmV0dXJuIGZhbHNlLCBzbyB3ZSBjYW4gc3RvcCBzdXBwcmVzc2luZyBub3dcbiAgICAgICAgICAgIHN0YXRlLnN1cHByZXNzRGlzcG9zYWxVbnRpbERpc3Bvc2VXaGVuUmV0dXJuc0ZhbHNlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5pc0JlaW5nRXZhbHVhdGVkID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVJbW1lZGlhdGVfQ2FsbFJlYWRXaXRoRGVwZW5kZW5jeURldGVjdGlvbihub3RpZnlDaGFuZ2UpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc3RhdGUuaXNCZWluZ0V2YWx1YXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdGF0ZS5kZXBlbmRlbmNpZXNDb3VudCkge1xuICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZXZhbHVhdGVJbW1lZGlhdGVfQ2FsbFJlYWRXaXRoRGVwZW5kZW5jeURldGVjdGlvbjogZnVuY3Rpb24gKG5vdGlmeUNoYW5nZSkge1xuICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHJlYWxseSBqdXN0IHBhcnQgb2YgdGhlIGV2YWx1YXRlSW1tZWRpYXRlIGxvZ2ljLiBZb3Ugd291bGQgbmV2ZXIgY2FsbCBpdCBmcm9tIGFueXdoZXJlIGVsc2UuXG4gICAgICAgIC8vIEZhY3RvcmluZyBpdCBvdXQgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uIG1lYW5zIGl0IGNhbiBiZSBpbmRlcGVuZGVudCBvZiB0aGUgdHJ5L2NhdGNoIGJsb2NrIGluIGV2YWx1YXRlSW1tZWRpYXRlLFxuICAgICAgICAvLyB3aGljaCBjb250cmlidXRlcyB0byBzYXZpbmcgYWJvdXQgNDAlIG9mZiB0aGUgQ1BVIG92ZXJoZWFkIG9mIGNvbXB1dGVkIGV2YWx1YXRpb24gKG9uIFY4IGF0IGxlYXN0KS5cblxuICAgICAgICB2YXIgY29tcHV0ZWRPYnNlcnZhYmxlID0gdGhpcyxcbiAgICAgICAgICAgIHN0YXRlID0gY29tcHV0ZWRPYnNlcnZhYmxlW2NvbXB1dGVkU3RhdGVdO1xuXG4gICAgICAgIC8vIEluaXRpYWxseSwgd2UgYXNzdW1lIHRoYXQgbm9uZSBvZiB0aGUgc3Vic2NyaXB0aW9ucyBhcmUgc3RpbGwgYmVpbmcgdXNlZCAoaS5lLiwgYWxsIGFyZSBjYW5kaWRhdGVzIGZvciBkaXNwb3NhbCkuXG4gICAgICAgIC8vIFRoZW4sIGR1cmluZyBldmFsdWF0aW9uLCB3ZSBjcm9zcyBvZmYgYW55IHRoYXQgYXJlIGluIGZhY3Qgc3RpbGwgYmVpbmcgdXNlZC5cbiAgICAgICAgdmFyIGlzSW5pdGlhbCA9IHN0YXRlLnB1cmUgPyB1bmRlZmluZWQgOiAhc3RhdGUuZGVwZW5kZW5jaWVzQ291bnQsICAgLy8gSWYgd2UncmUgZXZhbHVhdGluZyB3aGVuIHRoZXJlIGFyZSBubyBwcmV2aW91cyBkZXBlbmRlbmNpZXMsIGl0IG11c3QgYmUgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICAgIGRlcGVuZGVuY3lEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkT2JzZXJ2YWJsZTogY29tcHV0ZWRPYnNlcnZhYmxlLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2FsQ2FuZGlkYXRlczogc3RhdGUuZGVwZW5kZW5jeVRyYWNraW5nLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2FsQ291bnQ6IHN0YXRlLmRlcGVuZGVuY2llc0NvdW50XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uYmVnaW4oe1xuICAgICAgICAgICAgY2FsbGJhY2tUYXJnZXQ6IGRlcGVuZGVuY3lEZXRlY3Rpb25Db250ZXh0LFxuICAgICAgICAgICAgY2FsbGJhY2s6IGNvbXB1dGVkQmVnaW5EZXBlbmRlbmN5RGV0ZWN0aW9uQ2FsbGJhY2ssXG4gICAgICAgICAgICBjb21wdXRlZDogY29tcHV0ZWRPYnNlcnZhYmxlLFxuICAgICAgICAgICAgaXNJbml0aWFsOiBpc0luaXRpYWxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3RhdGUuZGVwZW5kZW5jeVRyYWNraW5nID0ge307XG4gICAgICAgIHN0YXRlLmRlcGVuZGVuY2llc0NvdW50ID0gMDtcblxuICAgICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLmV2YWx1YXRlSW1tZWRpYXRlX0NhbGxSZWFkVGhlbkVuZERlcGVuZGVuY3lEZXRlY3Rpb24oc3RhdGUsIGRlcGVuZGVuY3lEZXRlY3Rpb25Db250ZXh0KTtcblxuICAgICAgICBpZiAoY29tcHV0ZWRPYnNlcnZhYmxlLmlzRGlmZmVyZW50KHN0YXRlLmxhdGVzdFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICghc3RhdGUuaXNTbGVlcGluZykge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkT2JzZXJ2YWJsZVtcIm5vdGlmeVN1YnNjcmliZXJzXCJdKHN0YXRlLmxhdGVzdFZhbHVlLCBcImJlZm9yZUNoYW5nZVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RhdGUubGF0ZXN0VmFsdWUgPSBuZXdWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2xlZXBpbmcpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZE9ic2VydmFibGUudXBkYXRlVmVyc2lvbigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub3RpZnlDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZE9ic2VydmFibGVbXCJub3RpZnlTdWJzY3JpYmVyc1wiXShzdGF0ZS5sYXRlc3RWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNJbml0aWFsKSB7XG4gICAgICAgICAgICBjb21wdXRlZE9ic2VydmFibGVbXCJub3RpZnlTdWJzY3JpYmVyc1wiXShzdGF0ZS5sYXRlc3RWYWx1ZSwgXCJhd2FrZVwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgZXZhbHVhdGVJbW1lZGlhdGVfQ2FsbFJlYWRUaGVuRW5kRGVwZW5kZW5jeURldGVjdGlvbjogZnVuY3Rpb24gKHN0YXRlLCBkZXBlbmRlbmN5RGV0ZWN0aW9uQ29udGV4dCkge1xuICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHJlYWxseSBwYXJ0IG9mIHRoZSBldmFsdWF0ZUltbWVkaWF0ZV9DYWxsUmVhZFdpdGhEZXBlbmRlbmN5RGV0ZWN0aW9uIGxvZ2ljLlxuICAgICAgICAvLyBZb3UnZCBuZXZlciBjYWxsIGl0IGZyb20gYW55d2hlcmUgZWxzZS4gRmFjdG9yaW5nIGl0IG91dCBtZWFucyB0aGF0IGV2YWx1YXRlSW1tZWRpYXRlX0NhbGxSZWFkV2l0aERlcGVuZGVuY3lEZXRlY3Rpb25cbiAgICAgICAgLy8gY2FuIGJlIGluZGVwZW5kZW50IG9mIHRyeS9maW5hbGx5IGJsb2Nrcywgd2hpY2ggY29udHJpYnV0ZXMgdG8gc2F2aW5nIGFib3V0IDQwJSBvZmYgdGhlIENQVVxuICAgICAgICAvLyBvdmVyaGVhZCBvZiBjb21wdXRlZCBldmFsdWF0aW9uIChvbiBWOCBhdCBsZWFzdCkuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciByZWFkRnVuY3Rpb24gPSBzdGF0ZS5yZWFkRnVuY3Rpb247XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUuZXZhbHVhdG9yRnVuY3Rpb25UYXJnZXQgPyByZWFkRnVuY3Rpb24uY2FsbChzdGF0ZS5ldmFsdWF0b3JGdW5jdGlvblRhcmdldCkgOiByZWFkRnVuY3Rpb24oKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uZW5kKCk7XG5cbiAgICAgICAgICAgIC8vIEZvciBlYWNoIHN1YnNjcmlwdGlvbiBubyBsb25nZXIgYmVpbmcgdXNlZCwgcmVtb3ZlIGl0IGZyb20gdGhlIGFjdGl2ZSBzdWJzY3JpcHRpb25zIGxpc3QgYW5kIGRpc3Bvc2UgaXRcbiAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5RGV0ZWN0aW9uQ29udGV4dC5kaXNwb3NhbENvdW50ICYmICFzdGF0ZS5pc1NsZWVwaW5nKSB7XG4gICAgICAgICAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaChkZXBlbmRlbmN5RGV0ZWN0aW9uQ29udGV4dC5kaXNwb3NhbENhbmRpZGF0ZXMsIGNvbXB1dGVkRGlzcG9zZURlcGVuZGVuY3lDYWxsYmFjayk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YXRlLmlzU3RhbGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcGVlazogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBQZWVrIHdvbid0IHJlLWV2YWx1YXRlLCBleGNlcHQgd2hpbGUgdGhlIGNvbXB1dGVkIGlzIHNsZWVwaW5nIG9yIHRvIGdldCB0aGUgaW5pdGlhbCB2YWx1ZSB3aGVuIFwiZGVmZXJFdmFsdWF0aW9uXCIgaXMgc2V0LlxuICAgICAgICB2YXIgc3RhdGUgPSB0aGlzW2NvbXB1dGVkU3RhdGVdO1xuICAgICAgICBpZiAoKHN0YXRlLmlzU3RhbGUgJiYgIXN0YXRlLmRlcGVuZGVuY2llc0NvdW50KSB8fCAoc3RhdGUuaXNTbGVlcGluZyAmJiB0aGlzLmhhdmVEZXBlbmRlbmNpZXNDaGFuZ2VkKCkpKSB7XG4gICAgICAgICAgICB0aGlzLmV2YWx1YXRlSW1tZWRpYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXRlLmxhdGVzdFZhbHVlO1xuICAgIH0sXG4gICAgbGltaXQ6IGZ1bmN0aW9uIChsaW1pdEZ1bmN0aW9uKSB7XG4gICAgICAgIC8vIE92ZXJyaWRlIHRoZSBsaW1pdCBmdW5jdGlvbiB3aXRoIG9uZSB0aGF0IGRlbGF5cyBldmFsdWF0aW9uIGFzIHdlbGxcbiAgICAgICAga28uc3Vic2NyaWJhYmxlWydmbiddLmxpbWl0LmNhbGwodGhpcywgbGltaXRGdW5jdGlvbik7XG4gICAgICAgIHRoaXMuX2V2YWxEZWxheWVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fbGltaXRCZWZvcmVDaGFuZ2UodGhpc1tjb21wdXRlZFN0YXRlXS5sYXRlc3RWYWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXNbY29tcHV0ZWRTdGF0ZV0uaXNTdGFsZSA9IHRydWU7IC8vIE1hcmsgYXMgZGlydHlcblxuICAgICAgICAgICAgLy8gUGFzcyB0aGUgb2JzZXJ2YWJsZSB0byB0aGUgXCJsaW1pdFwiIGNvZGUsIHdoaWNoIHdpbGwgYWNjZXNzIGl0IHdoZW5cbiAgICAgICAgICAgIC8vIGl0J3MgdGltZSB0byBkbyB0aGUgbm90aWZpY2F0aW9uLlxuICAgICAgICAgICAgdGhpcy5fbGltaXRDaGFuZ2UodGhpcyk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpc1tjb21wdXRlZFN0YXRlXTtcbiAgICAgICAgaWYgKCFzdGF0ZS5pc1NsZWVwaW5nICYmIHN0YXRlLmRlcGVuZGVuY3lUcmFja2luZykge1xuICAgICAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaChzdGF0ZS5kZXBlbmRlbmN5VHJhY2tpbmcsIGZ1bmN0aW9uIChpZCwgZGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmN5LmRpc3Bvc2UpXG4gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCAmJiBzdGF0ZS5kb21Ob2RlRGlzcG9zYWxDYWxsYmFjaykge1xuICAgICAgICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLnJlbW92ZURpc3Bvc2VDYWxsYmFjayhzdGF0ZS5kaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQsIHN0YXRlLmRvbU5vZGVEaXNwb3NhbENhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZS5kZXBlbmRlbmN5VHJhY2tpbmcgPSBudWxsO1xuICAgICAgICBzdGF0ZS5kZXBlbmRlbmNpZXNDb3VudCA9IDA7XG4gICAgICAgIHN0YXRlLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5pc1N0YWxlID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLmlzU2xlZXBpbmcgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUuZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkID0gbnVsbDtcbiAgICB9XG59O1xuXG52YXIgcHVyZUNvbXB1dGVkT3ZlcnJpZGVzID0ge1xuICAgIGJlZm9yZVN1YnNjcmlwdGlvbkFkZDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIElmIGFzbGVlcCwgd2FrZSB1cCB0aGUgY29tcHV0ZWQgYnkgc3Vic2NyaWJpbmcgdG8gYW55IGRlcGVuZGVuY2llcy5cbiAgICAgICAgdmFyIGNvbXB1dGVkT2JzZXJ2YWJsZSA9IHRoaXMsXG4gICAgICAgICAgICBzdGF0ZSA9IGNvbXB1dGVkT2JzZXJ2YWJsZVtjb21wdXRlZFN0YXRlXTtcbiAgICAgICAgaWYgKCFzdGF0ZS5pc0Rpc3Bvc2VkICYmIHN0YXRlLmlzU2xlZXBpbmcgJiYgZXZlbnQgPT0gJ2NoYW5nZScpIHtcbiAgICAgICAgICAgIHN0YXRlLmlzU2xlZXBpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc1N0YWxlIHx8IGNvbXB1dGVkT2JzZXJ2YWJsZS5oYXZlRGVwZW5kZW5jaWVzQ2hhbmdlZCgpKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuZGVwZW5kZW5jeVRyYWNraW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzdGF0ZS5kZXBlbmRlbmNpZXNDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgc3RhdGUuaXNTdGFsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlLmV2YWx1YXRlSW1tZWRpYXRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZpcnN0IHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluIG9yZGVyXG4gICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVjaWVzT3JkZXIgPSBbXTtcbiAgICAgICAgICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKHN0YXRlLmRlcGVuZGVuY3lUcmFja2luZywgZnVuY3Rpb24gKGlkLCBkZXBlbmRlbmN5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVjaWVzT3JkZXJbZGVwZW5kZW5jeS5fb3JkZXJdID0gaWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gTmV4dCwgc3Vic2NyaWJlIHRvIGVhY2ggb25lXG4gICAgICAgICAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGRlcGVuZGVjaWVzT3JkZXIsIGZ1bmN0aW9uIChpZCwgb3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRlcGVuZGVuY3kgPSBzdGF0ZS5kZXBlbmRlbmN5VHJhY2tpbmdbaWRdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gY29tcHV0ZWRPYnNlcnZhYmxlLnN1YnNjcmliZVRvRGVwZW5kZW5jeShkZXBlbmRlbmN5Ll90YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uX29yZGVyID0gb3JkZXI7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5fdmVyc2lvbiA9IGRlcGVuZGVuY3kuX3ZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmRlcGVuZGVuY3lUcmFja2luZ1tpZF0gPSBzdWJzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmlzRGlzcG9zZWQpIHsgICAgIC8vIHRlc3Qgc2luY2UgZXZhbHVhdGluZyBjb3VsZCB0cmlnZ2VyIGRpc3Bvc2FsXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRPYnNlcnZhYmxlW1wibm90aWZ5U3Vic2NyaWJlcnNcIl0oc3RhdGUubGF0ZXN0VmFsdWUsIFwiYXdha2VcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGFmdGVyU3Vic2NyaXB0aW9uUmVtb3ZlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gdGhpc1tjb21wdXRlZFN0YXRlXTtcbiAgICAgICAgaWYgKCFzdGF0ZS5pc0Rpc3Bvc2VkICYmIGV2ZW50ID09ICdjaGFuZ2UnICYmICF0aGlzLmhhc1N1YnNjcmlwdGlvbnNGb3JFdmVudCgnY2hhbmdlJykpIHtcbiAgICAgICAgICAgIGtvLnV0aWxzLm9iamVjdEZvckVhY2goc3RhdGUuZGVwZW5kZW5jeVRyYWNraW5nLCBmdW5jdGlvbiAoaWQsIGRlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jeS5kaXNwb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLmRlcGVuZGVuY3lUcmFja2luZ1tpZF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGFyZ2V0OiBkZXBlbmRlbmN5Ll90YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBfb3JkZXI6IGRlcGVuZGVuY3kuX29yZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb246IGRlcGVuZGVuY3kuX3ZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeS5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzdGF0ZS5pc1NsZWVwaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXNbXCJub3RpZnlTdWJzY3JpYmVyc1wiXSh1bmRlZmluZWQsIFwiYXNsZWVwXCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBnZXRWZXJzaW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIEJlY2F1c2UgYSBwdXJlIGNvbXB1dGVkIGlzIG5vdCBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgd2hpbGUgaXQgaXMgc2xlZXBpbmcsIHdlIGNhbid0XG4gICAgICAgIC8vIHNpbXBseSByZXR1cm4gdGhlIHZlcnNpb24gbnVtYmVyLiBJbnN0ZWFkLCB3ZSBjaGVjayBpZiBhbnkgb2YgdGhlIGRlcGVuZGVuY2llcyBoYXZlXG4gICAgICAgIC8vIGNoYW5nZWQgYW5kIGNvbmRpdGlvbmFsbHkgcmUtZXZhbHVhdGUgdGhlIGNvbXB1dGVkIG9ic2VydmFibGUuXG4gICAgICAgIHZhciBzdGF0ZSA9IHRoaXNbY29tcHV0ZWRTdGF0ZV07XG4gICAgICAgIGlmIChzdGF0ZS5pc1NsZWVwaW5nICYmIChzdGF0ZS5pc1N0YWxlIHx8IHRoaXMuaGF2ZURlcGVuZGVuY2llc0NoYW5nZWQoKSkpIHtcbiAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVJbW1lZGlhdGUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga28uc3Vic2NyaWJhYmxlWydmbiddLmdldFZlcnNpb24uY2FsbCh0aGlzKTtcbiAgICB9XG59O1xuXG52YXIgZGVmZXJFdmFsdWF0aW9uT3ZlcnJpZGVzID0ge1xuICAgIGJlZm9yZVN1YnNjcmlwdGlvbkFkZDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCBmb3JjZSBhIGNvbXB1dGVkIHdpdGggZGVmZXJFdmFsdWF0aW9uIHRvIGV2YWx1YXRlIHdoZW4gdGhlIGZpcnN0IHN1YnNjcmlwdGlvbiBpcyByZWdpc3RlcmVkLlxuICAgICAgICBpZiAoZXZlbnQgPT0gJ2NoYW5nZScgfHwgZXZlbnQgPT0gJ2JlZm9yZUNoYW5nZScpIHtcbiAgICAgICAgICAgIHRoaXMucGVlaygpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gTm90ZSB0aGF0IGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgcHJvdG8gYXNzaWdubWVudCwgdGhlXG4vLyBpbmhlcml0YW5jZSBjaGFpbiBpcyBjcmVhdGVkIG1hbnVhbGx5IGluIHRoZSBrby5jb21wdXRlZCBjb25zdHJ1Y3RvclxuaWYgKGtvLnV0aWxzLmNhblNldFByb3RvdHlwZSkge1xuICAgIGtvLnV0aWxzLnNldFByb3RvdHlwZU9mKGNvbXB1dGVkRm4sIGtvLnN1YnNjcmliYWJsZVsnZm4nXSk7XG59XG5cbi8vIFNldCB0aGUgcHJvdG8gY2hhaW4gdmFsdWVzIGZvciBrby5oYXNQcm90b3R5cGVcbnZhciBwcm90b1Byb3AgPSBrby5vYnNlcnZhYmxlLnByb3RvUHJvcGVydHk7IC8vID09IFwiX19rb19wcm90b19fXCJcbmtvLmNvbXB1dGVkW3Byb3RvUHJvcF0gPSBrby5vYnNlcnZhYmxlO1xuY29tcHV0ZWRGbltwcm90b1Byb3BdID0ga28uY29tcHV0ZWQ7XG5cbmtvLmlzQ29tcHV0ZWQgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4ga28uaGFzUHJvdG90eXBlKGluc3RhbmNlLCBrby5jb21wdXRlZCk7XG59O1xuXG5rby5pc1B1cmVDb21wdXRlZCA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgIHJldHVybiBrby5oYXNQcm90b3R5cGUoaW5zdGFuY2UsIGtvLmNvbXB1dGVkKVxuICAgICAgICAmJiBpbnN0YW5jZVtjb21wdXRlZFN0YXRlXSAmJiBpbnN0YW5jZVtjb21wdXRlZFN0YXRlXS5wdXJlO1xufTtcblxua28uZXhwb3J0U3ltYm9sKCdjb21wdXRlZCcsIGtvLmNvbXB1dGVkKTtcbmtvLmV4cG9ydFN5bWJvbCgnZGVwZW5kZW50T2JzZXJ2YWJsZScsIGtvLmNvbXB1dGVkKTsgICAgLy8gZXhwb3J0IGtvLmRlcGVuZGVudE9ic2VydmFibGUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICgxLngpXG5rby5leHBvcnRTeW1ib2woJ2lzQ29tcHV0ZWQnLCBrby5pc0NvbXB1dGVkKTtcbmtvLmV4cG9ydFN5bWJvbCgnaXNQdXJlQ29tcHV0ZWQnLCBrby5pc1B1cmVDb21wdXRlZCk7XG5rby5leHBvcnRTeW1ib2woJ2NvbXB1dGVkLmZuJywgY29tcHV0ZWRGbik7XG5rby5leHBvcnRQcm9wZXJ0eShjb21wdXRlZEZuLCAncGVlaycsIGNvbXB1dGVkRm4ucGVlayk7XG5rby5leHBvcnRQcm9wZXJ0eShjb21wdXRlZEZuLCAnZGlzcG9zZScsIGNvbXB1dGVkRm4uZGlzcG9zZSk7XG5rby5leHBvcnRQcm9wZXJ0eShjb21wdXRlZEZuLCAnaXNBY3RpdmUnLCBjb21wdXRlZEZuLmlzQWN0aXZlKTtcbmtvLmV4cG9ydFByb3BlcnR5KGNvbXB1dGVkRm4sICdnZXREZXBlbmRlbmNpZXNDb3VudCcsIGNvbXB1dGVkRm4uZ2V0RGVwZW5kZW5jaWVzQ291bnQpO1xuXG5rby5wdXJlQ29tcHV0ZWQgPSBmdW5jdGlvbiAoZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMsIGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0KSB7XG4gICAgaWYgKHR5cGVvZiBldmFsdWF0b3JGdW5jdGlvbk9yT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4ga28uY29tcHV0ZWQoZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMsIGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0LCB7J3B1cmUnOnRydWV9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBldmFsdWF0b3JGdW5jdGlvbk9yT3B0aW9ucyA9IGtvLnV0aWxzLmV4dGVuZCh7fSwgZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMpOyAgIC8vIG1ha2UgYSBjb3B5IG9mIHRoZSBwYXJhbWV0ZXIgb2JqZWN0XG4gICAgICAgIGV2YWx1YXRvckZ1bmN0aW9uT3JPcHRpb25zWydwdXJlJ10gPSB0cnVlO1xuICAgICAgICByZXR1cm4ga28uY29tcHV0ZWQoZXZhbHVhdG9yRnVuY3Rpb25Pck9wdGlvbnMsIGV2YWx1YXRvckZ1bmN0aW9uVGFyZ2V0KTtcbiAgICB9XG59XG5rby5leHBvcnRTeW1ib2woJ3B1cmVDb21wdXRlZCcsIGtvLnB1cmVDb21wdXRlZCk7XG5cbihmdW5jdGlvbigpIHtcbiAgICB2YXIgbWF4TmVzdGVkT2JzZXJ2YWJsZURlcHRoID0gMTA7IC8vIEVzY2FwZSB0aGUgKHVubGlrZWx5KSBwYXRoYWxvZ2ljYWwgY2FzZSB3aGVyZSBhbiBvYnNlcnZhYmxlJ3MgY3VycmVudCB2YWx1ZSBpcyBpdHNlbGYgKG9yIHNpbWlsYXIgcmVmZXJlbmNlIGN5Y2xlKVxuXG4gICAga28udG9KUyA9IGZ1bmN0aW9uKHJvb3RPYmplY3QpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIldoZW4gY2FsbGluZyBrby50b0pTLCBwYXNzIHRoZSBvYmplY3QgeW91IHdhbnQgdG8gY29udmVydC5cIik7XG5cbiAgICAgICAgLy8gV2UganVzdCB1bndyYXAgZXZlcnl0aGluZyBhdCBldmVyeSBsZXZlbCBpbiB0aGUgb2JqZWN0IGdyYXBoXG4gICAgICAgIHJldHVybiBtYXBKc09iamVjdEdyYXBoKHJvb3RPYmplY3QsIGZ1bmN0aW9uKHZhbHVlVG9NYXApIHtcbiAgICAgICAgICAgIC8vIExvb3AgYmVjYXVzZSBhbiBvYnNlcnZhYmxlJ3MgdmFsdWUgbWlnaHQgaW4gdHVybiBiZSBhbm90aGVyIG9ic2VydmFibGUgd3JhcHBlclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGtvLmlzT2JzZXJ2YWJsZSh2YWx1ZVRvTWFwKSAmJiAoaSA8IG1heE5lc3RlZE9ic2VydmFibGVEZXB0aCk7IGkrKylcbiAgICAgICAgICAgICAgICB2YWx1ZVRvTWFwID0gdmFsdWVUb01hcCgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlVG9NYXA7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBrby50b0pTT04gPSBmdW5jdGlvbihyb290T2JqZWN0LCByZXBsYWNlciwgc3BhY2UpIHsgICAgIC8vIHJlcGxhY2VyIGFuZCBzcGFjZSBhcmUgb3B0aW9uYWxcbiAgICAgICAgdmFyIHBsYWluSmF2YVNjcmlwdE9iamVjdCA9IGtvLnRvSlMocm9vdE9iamVjdCk7XG4gICAgICAgIHJldHVybiBrby51dGlscy5zdHJpbmdpZnlKc29uKHBsYWluSmF2YVNjcmlwdE9iamVjdCwgcmVwbGFjZXIsIHNwYWNlKTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbWFwSnNPYmplY3RHcmFwaChyb290T2JqZWN0LCBtYXBJbnB1dENhbGxiYWNrLCB2aXNpdGVkT2JqZWN0cykge1xuICAgICAgICB2aXNpdGVkT2JqZWN0cyA9IHZpc2l0ZWRPYmplY3RzIHx8IG5ldyBvYmplY3RMb29rdXAoKTtcblxuICAgICAgICByb290T2JqZWN0ID0gbWFwSW5wdXRDYWxsYmFjayhyb290T2JqZWN0KTtcbiAgICAgICAgdmFyIGNhbkhhdmVQcm9wZXJ0aWVzID0gKHR5cGVvZiByb290T2JqZWN0ID09IFwib2JqZWN0XCIpICYmIChyb290T2JqZWN0ICE9PSBudWxsKSAmJiAocm9vdE9iamVjdCAhPT0gdW5kZWZpbmVkKSAmJiAoIShyb290T2JqZWN0IGluc3RhbmNlb2YgUmVnRXhwKSkgJiYgKCEocm9vdE9iamVjdCBpbnN0YW5jZW9mIERhdGUpKSAmJiAoIShyb290T2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSkgJiYgKCEocm9vdE9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikpICYmICghKHJvb3RPYmplY3QgaW5zdGFuY2VvZiBCb29sZWFuKSk7XG4gICAgICAgIGlmICghY2FuSGF2ZVByb3BlcnRpZXMpXG4gICAgICAgICAgICByZXR1cm4gcm9vdE9iamVjdDtcblxuICAgICAgICB2YXIgb3V0cHV0UHJvcGVydGllcyA9IHJvb3RPYmplY3QgaW5zdGFuY2VvZiBBcnJheSA/IFtdIDoge307XG4gICAgICAgIHZpc2l0ZWRPYmplY3RzLnNhdmUocm9vdE9iamVjdCwgb3V0cHV0UHJvcGVydGllcyk7XG5cbiAgICAgICAgdmlzaXRQcm9wZXJ0aWVzT3JBcnJheUVudHJpZXMocm9vdE9iamVjdCwgZnVuY3Rpb24oaW5kZXhlcikge1xuICAgICAgICAgICAgdmFyIHByb3BlcnR5VmFsdWUgPSBtYXBJbnB1dENhbGxiYWNrKHJvb3RPYmplY3RbaW5kZXhlcl0pO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wZXJ0eVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzW2luZGV4ZXJdID0gcHJvcGVydHlWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpb3VzbHlNYXBwZWRWYWx1ZSA9IHZpc2l0ZWRPYmplY3RzLmdldChwcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvcGVydGllc1tpbmRleGVyXSA9IChwcmV2aW91c2x5TWFwcGVkVmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcHJldmlvdXNseU1hcHBlZFZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG1hcEpzT2JqZWN0R3JhcGgocHJvcGVydHlWYWx1ZSwgbWFwSW5wdXRDYWxsYmFjaywgdmlzaXRlZE9iamVjdHMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFByb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmlzaXRQcm9wZXJ0aWVzT3JBcnJheUVudHJpZXMocm9vdE9iamVjdCwgdmlzaXRvckNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm9vdE9iamVjdC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICB2aXNpdG9yQ2FsbGJhY2soaSk7XG5cbiAgICAgICAgICAgIC8vIEZvciBhcnJheXMsIGFsc28gcmVzcGVjdCB0b0pTT04gcHJvcGVydHkgZm9yIGN1c3RvbSBtYXBwaW5ncyAoZml4ZXMgIzI3OClcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygcm9vdE9iamVjdFsndG9KU09OJ10gPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICB2aXNpdG9yQ2FsbGJhY2soJ3RvSlNPTicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHlOYW1lIGluIHJvb3RPYmplY3QpIHtcbiAgICAgICAgICAgICAgICB2aXNpdG9yQ2FsbGJhY2socHJvcGVydHlOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBvYmplY3RMb29rdXAoKSB7XG4gICAgICAgIHRoaXMua2V5cyA9IFtdO1xuICAgICAgICB0aGlzLnZhbHVlcyA9IFtdO1xuICAgIH07XG5cbiAgICBvYmplY3RMb29rdXAucHJvdG90eXBlID0ge1xuICAgICAgICBjb25zdHJ1Y3Rvcjogb2JqZWN0TG9va3VwLFxuICAgICAgICBzYXZlOiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgZXhpc3RpbmdJbmRleCA9IGtvLnV0aWxzLmFycmF5SW5kZXhPZih0aGlzLmtleXMsIGtleSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmdJbmRleCA+PSAwKVxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzW2V4aXN0aW5nSW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgdmFyIGV4aXN0aW5nSW5kZXggPSBrby51dGlscy5hcnJheUluZGV4T2YodGhpcy5rZXlzLCBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIChleGlzdGluZ0luZGV4ID49IDApID8gdGhpcy52YWx1ZXNbZXhpc3RpbmdJbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCd0b0pTJywga28udG9KUyk7XG5rby5leHBvcnRTeW1ib2woJ3RvSlNPTicsIGtvLnRvSlNPTik7XG4oZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYXNEb21EYXRhRXhwYW5kb1Byb3BlcnR5ID0gJ19fa29fX2hhc0RvbURhdGFPcHRpb25WYWx1ZV9fJztcblxuICAgIC8vIE5vcm1hbGx5LCBTRUxFQ1QgZWxlbWVudHMgYW5kIHRoZWlyIE9QVElPTnMgY2FuIG9ubHkgdGFrZSB2YWx1ZSBvZiB0eXBlICdzdHJpbmcnIChiZWNhdXNlIHRoZSB2YWx1ZXNcbiAgICAvLyBhcmUgc3RvcmVkIG9uIERPTSBhdHRyaWJ1dGVzKS4ga28uc2VsZWN0RXh0ZW5zaW9ucyBwcm92aWRlcyBhIHdheSBmb3IgU0VMRUNUcy9PUFRJT05zIHRvIGhhdmUgdmFsdWVzXG4gICAgLy8gdGhhdCBhcmUgYXJiaXRyYXJ5IG9iamVjdHMuIFRoaXMgaXMgdmVyeSBjb252ZW5pZW50IHdoZW4gaW1wbGVtZW50aW5nIHRoaW5ncyBsaWtlIGNhc2NhZGluZyBkcm9wZG93bnMuXG4gICAga28uc2VsZWN0RXh0ZW5zaW9ucyA9IHtcbiAgICAgICAgcmVhZFZhbHVlIDogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFtoYXNEb21EYXRhRXhwYW5kb1Byb3BlcnR5XSA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrby51dGlscy5kb21EYXRhLmdldChlbGVtZW50LCBrby5iaW5kaW5nSGFuZGxlcnMub3B0aW9ucy5vcHRpb25WYWx1ZURvbURhdGFLZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMuaWVWZXJzaW9uIDw9IDdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgndmFsdWUnKSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoJ3ZhbHVlJykuc3BlY2lmaWVkID8gZWxlbWVudC52YWx1ZSA6IGVsZW1lbnQudGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZWxlbWVudC52YWx1ZTtcbiAgICAgICAgICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5zZWxlY3RlZEluZGV4ID49IDAgPyBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShlbGVtZW50Lm9wdGlvbnNbZWxlbWVudC5zZWxlY3RlZEluZGV4XSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgd3JpdGVWYWx1ZTogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWUsIGFsbG93VW5zZXQpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoa28udXRpbHMudGFnTmFtZUxvd2VyKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmRvbURhdGEuc2V0KGVsZW1lbnQsIGtvLmJpbmRpbmdIYW5kbGVycy5vcHRpb25zLm9wdGlvblZhbHVlRG9tRGF0YUtleSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRG9tRGF0YUV4cGFuZG9Qcm9wZXJ0eSBpbiBlbGVtZW50KSB7IC8vIElFIDw9IDggdGhyb3dzIGVycm9ycyBpZiB5b3UgZGVsZXRlIG5vbi1leGlzdGVudCBwcm9wZXJ0aWVzIGZyb20gYSBET00gbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZWxlbWVudFtoYXNEb21EYXRhRXhwYW5kb1Byb3BlcnR5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBhcmJpdHJhcnkgb2JqZWN0IHVzaW5nIERvbURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrby51dGlscy5kb21EYXRhLnNldChlbGVtZW50LCBrby5iaW5kaW5nSGFuZGxlcnMub3B0aW9ucy5vcHRpb25WYWx1ZURvbURhdGFLZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50W2hhc0RvbURhdGFFeHBhbmRvUHJvcGVydHldID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgdHJlYXRtZW50IG9mIG51bWJlcnMgaXMganVzdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gS08gMS4yLjEgd3JvdGUgbnVtZXJpY2FsIHZhbHVlcyB0byBlbGVtZW50LnZhbHVlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBcIlwiIHx8IHZhbHVlID09PSBudWxsKSAgICAgICAvLyBBIGJsYW5rIHN0cmluZyBvciBudWxsIHZhbHVlIHdpbGwgc2VsZWN0IHRoZSBjYXB0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9IC0xO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGVsZW1lbnQub3B0aW9ucy5sZW5ndGgsIG9wdGlvblZhbHVlOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZSA9IGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQub3B0aW9uc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmNsdWRlIHNwZWNpYWwgY2hlY2sgdG8gaGFuZGxlIHNlbGVjdGluZyBhIGNhcHRpb24gd2l0aCBhIGJsYW5rIHN0cmluZyB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvblZhbHVlID09IHZhbHVlIHx8IChvcHRpb25WYWx1ZSA9PSBcIlwiICYmIHZhbHVlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dVbnNldCB8fCBzZWxlY3Rpb24gPj0gMCB8fCAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtZW50LnNpemUgPiAxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZWxlY3RlZEluZGV4ID0gc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPT09IG51bGwpIHx8ICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG5rby5leHBvcnRTeW1ib2woJ3NlbGVjdEV4dGVuc2lvbnMnLCBrby5zZWxlY3RFeHRlbnNpb25zKTtcbmtvLmV4cG9ydFN5bWJvbCgnc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUnLCBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZSk7XG5rby5leHBvcnRTeW1ib2woJ3NlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZScsIGtvLnNlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZSk7XG5rby5leHByZXNzaW9uUmV3cml0aW5nID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgamF2YVNjcmlwdFJlc2VydmVkV29yZHMgPSBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJudWxsXCIsIFwidW5kZWZpbmVkXCJdO1xuXG4gICAgLy8gTWF0Y2hlcyBzb21ldGhpbmcgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8tLWVpdGhlciBhbiBpc29sYXRlZCBpZGVudGlmaWVyIG9yIHNvbWV0aGluZyBlbmRpbmcgd2l0aCBhIHByb3BlcnR5IGFjY2Vzc29yXG4gICAgLy8gVGhpcyBpcyBkZXNpZ25lZCB0byBiZSBzaW1wbGUgYW5kIGF2b2lkIGZhbHNlIG5lZ2F0aXZlcywgYnV0IGNvdWxkIHByb2R1Y2UgZmFsc2UgcG9zaXRpdmVzIChlLmcuLCBhK2IuYykuXG4gICAgLy8gVGhpcyBhbHNvIHdpbGwgbm90IHByb3Blcmx5IGhhbmRsZSBuZXN0ZWQgYnJhY2tldHMgKGUuZy4sIG9iajFbb2JqMlsncHJvcCddXTsgc2VlICM5MTEpLlxuICAgIHZhciBqYXZhU2NyaXB0QXNzaWdubWVudFRhcmdldCA9IC9eKD86WyRfYS16XVskXFx3XSp8KC4rKShcXC5cXHMqWyRfYS16XVskXFx3XSp8XFxbLitcXF0pKSQvaTtcblxuICAgIGZ1bmN0aW9uIGdldFdyaXRlYWJsZVZhbHVlKGV4cHJlc3Npb24pIHtcbiAgICAgICAgaWYgKGtvLnV0aWxzLmFycmF5SW5kZXhPZihqYXZhU2NyaXB0UmVzZXJ2ZWRXb3JkcywgZXhwcmVzc2lvbikgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIG1hdGNoID0gZXhwcmVzc2lvbi5tYXRjaChqYXZhU2NyaXB0QXNzaWdubWVudFRhcmdldCk7XG4gICAgICAgIHJldHVybiBtYXRjaCA9PT0gbnVsbCA/IGZhbHNlIDogbWF0Y2hbMV0gPyAoJ09iamVjdCgnICsgbWF0Y2hbMV0gKyAnKScgKyBtYXRjaFsyXSkgOiBleHByZXNzaW9uO1xuICAgIH1cblxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcmVndWxhciBleHByZXNzaW9ucyB3aWxsIGJlIHVzZWQgdG8gc3BsaXQgYW4gb2JqZWN0LWxpdGVyYWwgc3RyaW5nIGludG8gdG9rZW5zXG5cbiAgICAgICAgLy8gVGhlc2UgdHdvIG1hdGNoIHN0cmluZ3MsIGVpdGhlciB3aXRoIGRvdWJsZSBxdW90ZXMgb3Igc2luZ2xlIHF1b3Rlc1xuICAgIHZhciBzdHJpbmdEb3VibGUgPSAnXCIoPzpbXlwiXFxcXFxcXFxdfFxcXFxcXFxcLikqXCInLFxuICAgICAgICBzdHJpbmdTaW5nbGUgPSBcIicoPzpbXidcXFxcXFxcXF18XFxcXFxcXFwuKSonXCIsXG4gICAgICAgIC8vIE1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gKHRleHQgZW5jbG9zZWQgYnkgc2xhc2hlcyksIGJ1dCB3aWxsIGFsc28gbWF0Y2ggc2V0cyBvZiBkaXZpc2lvbnNcbiAgICAgICAgLy8gYXMgYSByZWd1bGFyIGV4cHJlc3Npb24gKHRoaXMgaXMgaGFuZGxlZCBieSB0aGUgcGFyc2luZyBsb29wIGJlbG93KS5cbiAgICAgICAgc3RyaW5nUmVnZXhwID0gJy8oPzpbXi9cXFxcXFxcXF18XFxcXFxcXFwuKSovXFx3KicsXG4gICAgICAgIC8vIFRoZXNlIGNoYXJhY3RlcnMgaGF2ZSBzcGVjaWFsIG1lYW5pbmcgdG8gdGhlIHBhcnNlciBhbmQgbXVzdCBub3QgYXBwZWFyIGluIHRoZSBtaWRkbGUgb2YgYVxuICAgICAgICAvLyB0b2tlbiwgZXhjZXB0IGFzIHBhcnQgb2YgYSBzdHJpbmcuXG4gICAgICAgIHNwZWNpYWxzID0gJyxcIlxcJ3t9KCkvOltcXFxcXScsXG4gICAgICAgIC8vIE1hdGNoIHRleHQgKGF0IGxlYXN0IHR3byBjaGFyYWN0ZXJzKSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW55IG9mIHRoZSBhYm92ZSBzcGVjaWFsIGNoYXJhY3RlcnMsXG4gICAgICAgIC8vIGFsdGhvdWdoIHNvbWUgb2YgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUgYWxsb3dlZCB0byBzdGFydCBpdCAoYWxsIGJ1dCB0aGUgY29sb24gYW5kIGNvbW1hKS5cbiAgICAgICAgLy8gVGhlIHRleHQgY2FuIGNvbnRhaW4gc3BhY2VzLCBidXQgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYXJlIHNraXBwZWQuXG4gICAgICAgIGV2ZXJ5VGhpbmdFbHNlID0gJ1teXFxcXHM6LC9dW14nICsgc3BlY2lhbHMgKyAnXSpbXlxcXFxzJyArIHNwZWNpYWxzICsgJ10nLFxuICAgICAgICAvLyBNYXRjaCBhbnkgbm9uLXNwYWNlIGNoYXJhY3RlciBub3QgbWF0Y2hlZCBhbHJlYWR5LiBUaGlzIHdpbGwgbWF0Y2ggY29sb25zIGFuZCBjb21tYXMsIHNpbmNlIHRoZXkncmVcbiAgICAgICAgLy8gbm90IG1hdGNoZWQgYnkgXCJldmVyeVRoaW5nRWxzZVwiLCBidXQgd2lsbCBhbHNvIG1hdGNoIGFueSBvdGhlciBzaW5nbGUgY2hhcmFjdGVyIHRoYXQgd2Fzbid0IGFscmVhZHlcbiAgICAgICAgLy8gbWF0Y2hlZCAoZm9yIGV4YW1wbGU6IGluIFwiYTogMSwgYjogMlwiLCBlYWNoIG9mIHRoZSBub24tc3BhY2UgY2hhcmFjdGVycyB3aWxsIGJlIG1hdGNoZWQgYnkgb25lTm90U3BhY2UpLlxuICAgICAgICBvbmVOb3RTcGFjZSA9ICdbXlxcXFxzXScsXG5cbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBhY3R1YWwgcmVndWxhciBleHByZXNzaW9uIGJ5IG9yLWluZyB0aGUgYWJvdmUgc3RyaW5ncy4gVGhlIG9yZGVyIGlzIGltcG9ydGFudC5cbiAgICAgICAgYmluZGluZ1Rva2VuID0gUmVnRXhwKHN0cmluZ0RvdWJsZSArICd8JyArIHN0cmluZ1NpbmdsZSArICd8JyArIHN0cmluZ1JlZ2V4cCArICd8JyArIGV2ZXJ5VGhpbmdFbHNlICsgJ3wnICsgb25lTm90U3BhY2UsICdnJyksXG5cbiAgICAgICAgLy8gTWF0Y2ggZW5kIG9mIHByZXZpb3VzIHRva2VuIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc2xhc2ggaXMgYSBkaXZpc2lvbiBvciByZWdleC5cbiAgICAgICAgZGl2aXNpb25Mb29rQmVoaW5kID0gL1tcXF0pXCInQS1aYS16MC05XyRdKyQvLFxuICAgICAgICBrZXl3b3JkUmVnZXhMb29rQmVoaW5kID0geydpbic6MSwncmV0dXJuJzoxLCd0eXBlb2YnOjF9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2VPYmplY3RMaXRlcmFsKG9iamVjdExpdGVyYWxTdHJpbmcpIHtcbiAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgZnJvbSB0aGUgc3RyaW5nXG4gICAgICAgIHZhciBzdHIgPSBrby51dGlscy5zdHJpbmdUcmltKG9iamVjdExpdGVyYWxTdHJpbmcpO1xuXG4gICAgICAgIC8vIFRyaW0gYnJhY2VzICd7JyBzdXJyb3VuZGluZyB0aGUgd2hvbGUgb2JqZWN0IGxpdGVyYWxcbiAgICAgICAgaWYgKHN0ci5jaGFyQ29kZUF0KDApID09PSAxMjMpIHN0ciA9IHN0ci5zbGljZSgxLCAtMSk7XG5cbiAgICAgICAgLy8gU3BsaXQgaW50byB0b2tlbnNcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdLCB0b2tzID0gc3RyLm1hdGNoKGJpbmRpbmdUb2tlbiksIGtleSwgdmFsdWVzID0gW10sIGRlcHRoID0gMDtcblxuICAgICAgICBpZiAodG9rcykge1xuICAgICAgICAgICAgLy8gQXBwZW5kIGEgY29tbWEgc28gdGhhdCB3ZSBkb24ndCBuZWVkIGEgc2VwYXJhdGUgY29kZSBibG9jayB0byBkZWFsIHdpdGggdGhlIGxhc3QgaXRlbVxuICAgICAgICAgICAgdG9rcy5wdXNoKCcsJyk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCB0b2s7IHRvayA9IHRva3NbaV07ICsraSkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gdG9rLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgLy8gQSBjb21tYSBzaWduYWxzIHRoZSBlbmQgb2YgYSBrZXkvdmFsdWUgcGFpciBpZiBkZXB0aCBpcyB6ZXJvXG4gICAgICAgICAgICAgICAgaWYgKGMgPT09IDQ0KSB7IC8vIFwiLFwiXG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgoa2V5ICYmIHZhbHVlcy5sZW5ndGgpID8ge2tleToga2V5LCB2YWx1ZTogdmFsdWVzLmpvaW4oJycpfSA6IHsndW5rbm93bic6IGtleSB8fCB2YWx1ZXMuam9pbignJyl9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGRlcHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTaW1wbHkgc2tpcCB0aGUgY29sb24gdGhhdCBzZXBhcmF0ZXMgdGhlIG5hbWUgYW5kIHZhbHVlXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09PSA1OCkgeyAvLyBcIjpcIlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcHRoICYmICFrZXkgJiYgdmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gdmFsdWVzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBBIHNldCBvZiBzbGFzaGVzIGlzIGluaXRpYWxseSBtYXRjaGVkIGFzIGEgcmVndWxhciBleHByZXNzaW9uLCBidXQgY291bGQgYmUgZGl2aXNpb25cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09IDQ3ICYmIGkgJiYgdG9rLmxlbmd0aCA+IDEpIHsgIC8vIFwiL1wiXG4gICAgICAgICAgICAgICAgICAgIC8vIExvb2sgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgdG9rZW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBzbGFzaCBpcyBhY3R1YWxseSBkaXZpc2lvblxuICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSB0b2tzW2ktMV0ubWF0Y2goZGl2aXNpb25Mb29rQmVoaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoICYmICFrZXl3b3JkUmVnZXhMb29rQmVoaW5kW21hdGNoWzBdXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNsYXNoIGlzIGFjdHVhbGx5IGEgZGl2aXNpb24gcHVuY3R1YXRvcjsgcmUtcGFyc2UgdGhlIHJlbWFpbmRlciBvZiB0aGUgc3RyaW5nIChub3QgaW5jbHVkaW5nIHRoZSBzbGFzaClcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoc3RyLmluZGV4T2YodG9rKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rcyA9IHN0ci5tYXRjaChiaW5kaW5nVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rcy5wdXNoKCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZSB3aXRoIGp1c3QgdGhlIHNsYXNoXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSAnLyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgZGVwdGggZm9yIHBhcmVudGhlc2VzLCBicmFjZXMsIGFuZCBicmFja2V0cyBzbyB0aGF0IGludGVyaW9yIGNvbW1hcyBhcmUgaWdub3JlZFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gNDAgfHwgYyA9PT0gMTIzIHx8IGMgPT09IDkxKSB7IC8vICcoJywgJ3snLCAnWydcbiAgICAgICAgICAgICAgICAgICAgKytkZXB0aDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT09IDQxIHx8IGMgPT09IDEyNSB8fCBjID09PSA5MykgeyAvLyAnKScsICd9JywgJ10nXG4gICAgICAgICAgICAgICAgICAgIC0tZGVwdGg7XG4gICAgICAgICAgICAgICAgLy8gVGhlIGtleSB3aWxsIGJlIHRoZSBmaXJzdCB0b2tlbjsgaWYgaXQncyBhIHN0cmluZywgdHJpbSB0aGUgcXVvdGVzXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgha2V5ICYmICF2YWx1ZXMubGVuZ3RoICYmIChjID09PSAzNCB8fCBjID09PSAzOSkpIHsgLy8gJ1wiJywgXCInXCJcbiAgICAgICAgICAgICAgICAgICAgdG9rID0gdG9rLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2godG9rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIFR3by13YXkgYmluZGluZ3MgaW5jbHVkZSBhIHdyaXRlIGZ1bmN0aW9uIHRoYXQgYWxsb3cgdGhlIGhhbmRsZXIgdG8gdXBkYXRlIHRoZSB2YWx1ZSBldmVuIGlmIGl0J3Mgbm90IGFuIG9ic2VydmFibGUuXG4gICAgdmFyIHR3b1dheUJpbmRpbmdzID0ge307XG5cbiAgICBmdW5jdGlvbiBwcmVQcm9jZXNzQmluZGluZ3MoYmluZGluZ3NTdHJpbmdPcktleVZhbHVlQXJyYXksIGJpbmRpbmdPcHRpb25zKSB7XG4gICAgICAgIGJpbmRpbmdPcHRpb25zID0gYmluZGluZ09wdGlvbnMgfHwge307XG5cbiAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc0tleVZhbHVlKGtleSwgdmFsKSB7XG4gICAgICAgICAgICB2YXIgd3JpdGFibGVWYWw7XG4gICAgICAgICAgICBmdW5jdGlvbiBjYWxsUHJlcHJvY2Vzc0hvb2sob2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChvYmogJiYgb2JqWydwcmVwcm9jZXNzJ10pID8gKHZhbCA9IG9ialsncHJlcHJvY2VzcyddKHZhbCwga2V5LCBwcm9jZXNzS2V5VmFsdWUpKSA6IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWJpbmRpbmdQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhbGxQcmVwcm9jZXNzSG9vayhrb1snZ2V0QmluZGluZ0hhbmRsZXInXShrZXkpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR3b1dheUJpbmRpbmdzW2tleV0gJiYgKHdyaXRhYmxlVmFsID0gZ2V0V3JpdGVhYmxlVmFsdWUodmFsKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHR3by13YXkgYmluZGluZ3MsIHByb3ZpZGUgYSB3cml0ZSBtZXRob2QgaW4gY2FzZSB0aGUgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLy8gaXNuJ3QgYSB3cml0YWJsZSBvYnNlcnZhYmxlLlxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUFjY2Vzc29yUmVzdWx0U3RyaW5ncy5wdXNoKFwiJ1wiICsga2V5ICsgXCInOmZ1bmN0aW9uKF96KXtcIiArIHdyaXRhYmxlVmFsICsgXCI9X3p9XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFZhbHVlcyBhcmUgd3JhcHBlZCBpbiBhIGZ1bmN0aW9uIHNvIHRoYXQgZWFjaCB2YWx1ZSBjYW4gYmUgYWNjZXNzZWQgaW5kZXBlbmRlbnRseVxuICAgICAgICAgICAgaWYgKG1ha2VWYWx1ZUFjY2Vzc29ycykge1xuICAgICAgICAgICAgICAgIHZhbCA9ICdmdW5jdGlvbigpe3JldHVybiAnICsgdmFsICsgJyB9JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdFN0cmluZ3MucHVzaChcIidcIiArIGtleSArIFwiJzpcIiArIHZhbCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcmVzdWx0U3RyaW5ncyA9IFtdLFxuICAgICAgICAgICAgcHJvcGVydHlBY2Nlc3NvclJlc3VsdFN0cmluZ3MgPSBbXSxcbiAgICAgICAgICAgIG1ha2VWYWx1ZUFjY2Vzc29ycyA9IGJpbmRpbmdPcHRpb25zWyd2YWx1ZUFjY2Vzc29ycyddLFxuICAgICAgICAgICAgYmluZGluZ1BhcmFtcyA9IGJpbmRpbmdPcHRpb25zWydiaW5kaW5nUGFyYW1zJ10sXG4gICAgICAgICAgICBrZXlWYWx1ZUFycmF5ID0gdHlwZW9mIGJpbmRpbmdzU3RyaW5nT3JLZXlWYWx1ZUFycmF5ID09PSBcInN0cmluZ1wiID9cbiAgICAgICAgICAgICAgICBwYXJzZU9iamVjdExpdGVyYWwoYmluZGluZ3NTdHJpbmdPcktleVZhbHVlQXJyYXkpIDogYmluZGluZ3NTdHJpbmdPcktleVZhbHVlQXJyYXk7XG5cbiAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGtleVZhbHVlQXJyYXksIGZ1bmN0aW9uKGtleVZhbHVlKSB7XG4gICAgICAgICAgICBwcm9jZXNzS2V5VmFsdWUoa2V5VmFsdWUua2V5IHx8IGtleVZhbHVlWyd1bmtub3duJ10sIGtleVZhbHVlLnZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5QWNjZXNzb3JSZXN1bHRTdHJpbmdzLmxlbmd0aClcbiAgICAgICAgICAgIHByb2Nlc3NLZXlWYWx1ZSgnX2tvX3Byb3BlcnR5X3dyaXRlcnMnLCBcIntcIiArIHByb3BlcnR5QWNjZXNzb3JSZXN1bHRTdHJpbmdzLmpvaW4oXCIsXCIpICsgXCIgfVwiKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0U3RyaW5ncy5qb2luKFwiLFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBiaW5kaW5nUmV3cml0ZVZhbGlkYXRvcnM6IFtdLFxuXG4gICAgICAgIHR3b1dheUJpbmRpbmdzOiB0d29XYXlCaW5kaW5ncyxcblxuICAgICAgICBwYXJzZU9iamVjdExpdGVyYWw6IHBhcnNlT2JqZWN0TGl0ZXJhbCxcblxuICAgICAgICBwcmVQcm9jZXNzQmluZGluZ3M6IHByZVByb2Nlc3NCaW5kaW5ncyxcblxuICAgICAgICBrZXlWYWx1ZUFycmF5Q29udGFpbnNLZXk6IGZ1bmN0aW9uKGtleVZhbHVlQXJyYXksIGtleSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZUFycmF5Lmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmIChrZXlWYWx1ZUFycmF5W2ldWydrZXknXSA9PSBrZXkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEludGVybmFsLCBwcml2YXRlIEtPIHV0aWxpdHkgZm9yIHVwZGF0aW5nIG1vZGVsIHByb3BlcnRpZXMgZnJvbSB3aXRoaW4gYmluZGluZ3NcbiAgICAgICAgLy8gcHJvcGVydHk6ICAgICAgICAgICAgSWYgdGhlIHByb3BlcnR5IGJlaW5nIHVwZGF0ZWQgaXMgKG9yIG1pZ2h0IGJlKSBhbiBvYnNlcnZhYmxlLCBwYXNzIGl0IGhlcmVcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgSWYgaXQgdHVybnMgb3V0IHRvIGJlIGEgd3JpdGFibGUgb2JzZXJ2YWJsZSwgaXQgd2lsbCBiZSB3cml0dGVuIHRvIGRpcmVjdGx5XG4gICAgICAgIC8vIGFsbEJpbmRpbmdzOiAgICAgICAgIEFuIG9iamVjdCB3aXRoIGEgZ2V0IG1ldGhvZCB0byByZXRyaWV2ZSBiaW5kaW5ncyBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dC5cbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBhICdfa29fcHJvcGVydHlfd3JpdGVycycgcHJvcGVydHkgaW4gY2FzZSB5b3UncmUgd3JpdGluZyB0byBhIG5vbi1vYnNlcnZhYmxlXG4gICAgICAgIC8vIGtleTogICAgICAgICAgICAgICAgIFRoZSBrZXkgaWRlbnRpZnlpbmcgdGhlIHByb3BlcnR5IHRvIGJlIHdyaXR0ZW4uIEV4YW1wbGU6IGZvciB7IGhhc0ZvY3VzOiBteVZhbHVlIH0sIHdyaXRlIHRvICdteVZhbHVlJyBieSBzcGVjaWZ5aW5nIHRoZSBrZXkgJ2hhc0ZvY3VzJ1xuICAgICAgICAvLyB2YWx1ZTogICAgICAgICAgICAgICBUaGUgdmFsdWUgdG8gYmUgd3JpdHRlblxuICAgICAgICAvLyBjaGVja0lmRGlmZmVyZW50OiAgICBJZiB0cnVlLCBhbmQgaWYgdGhlIHByb3BlcnR5IGJlaW5nIHdyaXR0ZW4gaXMgYSB3cml0YWJsZSBvYnNlcnZhYmxlLCB0aGUgdmFsdWUgd2lsbCBvbmx5IGJlIHdyaXR0ZW4gaWZcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgaXQgaXMgIT09IGV4aXN0aW5nIHZhbHVlIG9uIHRoYXQgd3JpdGFibGUgb2JzZXJ2YWJsZVxuICAgICAgICB3cml0ZVZhbHVlVG9Qcm9wZXJ0eTogZnVuY3Rpb24ocHJvcGVydHksIGFsbEJpbmRpbmdzLCBrZXksIHZhbHVlLCBjaGVja0lmRGlmZmVyZW50KSB7XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5IHx8ICFrby5pc09ic2VydmFibGUocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BXcml0ZXJzID0gYWxsQmluZGluZ3MuZ2V0KCdfa29fcHJvcGVydHlfd3JpdGVycycpO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wV3JpdGVycyAmJiBwcm9wV3JpdGVyc1trZXldKVxuICAgICAgICAgICAgICAgICAgICBwcm9wV3JpdGVyc1trZXldKHZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoa28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKHByb3BlcnR5KSAmJiAoIWNoZWNrSWZEaWZmZXJlbnQgfHwgcHJvcGVydHkucGVlaygpICE9PSB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxua28uZXhwb3J0U3ltYm9sKCdleHByZXNzaW9uUmV3cml0aW5nJywga28uZXhwcmVzc2lvblJld3JpdGluZyk7XG5rby5leHBvcnRTeW1ib2woJ2V4cHJlc3Npb25SZXdyaXRpbmcuYmluZGluZ1Jld3JpdGVWYWxpZGF0b3JzJywga28uZXhwcmVzc2lvblJld3JpdGluZy5iaW5kaW5nUmV3cml0ZVZhbGlkYXRvcnMpO1xua28uZXhwb3J0U3ltYm9sKCdleHByZXNzaW9uUmV3cml0aW5nLnBhcnNlT2JqZWN0TGl0ZXJhbCcsIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcucGFyc2VPYmplY3RMaXRlcmFsKTtcbmtvLmV4cG9ydFN5bWJvbCgnZXhwcmVzc2lvblJld3JpdGluZy5wcmVQcm9jZXNzQmluZGluZ3MnLCBrby5leHByZXNzaW9uUmV3cml0aW5nLnByZVByb2Nlc3NCaW5kaW5ncyk7XG5cbi8vIE1ha2luZyBiaW5kaW5ncyBleHBsaWNpdGx5IGRlY2xhcmUgdGhlbXNlbHZlcyBhcyBcInR3byB3YXlcIiBpc24ndCBpZGVhbCBpbiB0aGUgbG9uZyB0ZXJtIChpdCB3b3VsZCBiZSBiZXR0ZXIgaWZcbi8vIGFsbCBiaW5kaW5ncyBjb3VsZCB1c2UgYW4gb2ZmaWNpYWwgJ3Byb3BlcnR5IHdyaXRlcicgQVBJIHdpdGhvdXQgbmVlZGluZyB0byBkZWNsYXJlIHRoYXQgdGhleSBtaWdodCkuIEhvd2V2ZXIsXG4vLyBzaW5jZSB0aGlzIGlzIG5vdCwgYW5kIGhhcyBuZXZlciBiZWVuLCBhIHB1YmxpYyBBUEkgKF9rb19wcm9wZXJ0eV93cml0ZXJzIHdhcyBuZXZlciBkb2N1bWVudGVkKSwgaXQncyBhY2NlcHRhYmxlXG4vLyBhcyBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgaW4gdGhlIHNob3J0IHRlcm0uXG4vLyBGb3IgdGhvc2UgZGV2ZWxvcGVycyB3aG8gcmVseSBvbiBfa29fcHJvcGVydHlfd3JpdGVycyBpbiB0aGVpciBjdXN0b20gYmluZGluZ3MsIHdlIGV4cG9zZSBfdHdvV2F5QmluZGluZ3MgYXMgYW5cbi8vIHVuZG9jdW1lbnRlZCBmZWF0dXJlIHRoYXQgbWFrZXMgaXQgcmVsYXRpdmVseSBlYXN5IHRvIHVwZ3JhZGUgdG8gS08gMy4wLiBIb3dldmVyLCB0aGlzIGlzIHN0aWxsIG5vdCBhbiBvZmZpY2lhbFxuLy8gcHVibGljIEFQSSwgYW5kIHdlIHJlc2VydmUgdGhlIHJpZ2h0IHRvIHJlbW92ZSBpdCBhdCBhbnkgdGltZSBpZiB3ZSBjcmVhdGUgYSByZWFsIHB1YmxpYyBwcm9wZXJ0eSB3cml0ZXJzIEFQSS5cbmtvLmV4cG9ydFN5bWJvbCgnZXhwcmVzc2lvblJld3JpdGluZy5fdHdvV2F5QmluZGluZ3MnLCBrby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzKTtcblxuLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGRlZmluZSB0aGUgZm9sbG93aW5nIGFsaWFzZXMuIChQcmV2aW91c2x5LCB0aGVzZSBmdW5jdGlvbiBuYW1lcyB3ZXJlIG1pc2xlYWRpbmcgYmVjYXVzZVxuLy8gdGhleSByZWZlcnJlZCB0byBKU09OIHNwZWNpZmljYWxseSwgZXZlbiB0aG91Z2ggdGhleSBhY3R1YWxseSB3b3JrIHdpdGggYXJiaXRyYXJ5IEphdmFTY3JpcHQgb2JqZWN0IGxpdGVyYWwgZXhwcmVzc2lvbnMuKVxua28uZXhwb3J0U3ltYm9sKCdqc29uRXhwcmVzc2lvblJld3JpdGluZycsIGtvLmV4cHJlc3Npb25SZXdyaXRpbmcpO1xua28uZXhwb3J0U3ltYm9sKCdqc29uRXhwcmVzc2lvblJld3JpdGluZy5pbnNlcnRQcm9wZXJ0eUFjY2Vzc29yc0ludG9Kc29uJywga28uZXhwcmVzc2lvblJld3JpdGluZy5wcmVQcm9jZXNzQmluZGluZ3MpO1xuKGZ1bmN0aW9uKCkge1xuICAgIC8vIFwiVmlydHVhbCBlbGVtZW50c1wiIGlzIGFuIGFic3RyYWN0aW9uIG9uIHRvcCBvZiB0aGUgdXN1YWwgRE9NIEFQSSB3aGljaCB1bmRlcnN0YW5kcyB0aGUgbm90aW9uIHRoYXQgY29tbWVudCBub2Rlc1xuICAgIC8vIG1heSBiZSB1c2VkIHRvIHJlcHJlc2VudCBoaWVyYXJjaHkgKGluIGFkZGl0aW9uIHRvIHRoZSBET00ncyBuYXR1cmFsIGhpZXJhcmNoeSkuXG4gICAgLy8gSWYgeW91IGNhbGwgdGhlIERPTS1tYW5pcHVsYXRpbmcgZnVuY3Rpb25zIG9uIGtvLnZpcnR1YWxFbGVtZW50cywgeW91IHdpbGwgYmUgYWJsZSB0byByZWFkIGFuZCB3cml0ZSB0aGUgc3RhdGVcbiAgICAvLyBvZiB0aGF0IHZpcnR1YWwgaGllcmFyY2h5XG4gICAgLy9cbiAgICAvLyBUaGUgcG9pbnQgb2YgYWxsIHRoaXMgaXMgdG8gc3VwcG9ydCBjb250YWluZXJsZXNzIHRlbXBsYXRlcyAoZS5nLiwgPCEtLSBrbyBmb3JlYWNoOnNvbWVDb2xsZWN0aW9uIC0tPmJsYWg8IS0tIC9rbyAtLT4pXG4gICAgLy8gd2l0aG91dCBoYXZpbmcgdG8gc2NhdHRlciBzcGVjaWFsIGNhc2VzIGFsbCBvdmVyIHRoZSBiaW5kaW5nIGFuZCB0ZW1wbGF0aW5nIGNvZGUuXG5cbiAgICAvLyBJRSA5IGNhbm5vdCByZWxpYWJseSByZWFkIHRoZSBcIm5vZGVWYWx1ZVwiIHByb3BlcnR5IG9mIGEgY29tbWVudCBub2RlIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L2lzc3Vlcy8xODYpXG4gICAgLy8gYnV0IGl0IGRvZXMgZ2l2ZSB0aGVtIGEgbm9uc3RhbmRhcmQgYWx0ZXJuYXRpdmUgcHJvcGVydHkgY2FsbGVkIFwidGV4dFwiIHRoYXQgaXQgY2FuIHJlYWQgcmVsaWFibHkuIE90aGVyIGJyb3dzZXJzIGRvbid0IGhhdmUgdGhhdCBwcm9wZXJ0eS5cbiAgICAvLyBTbywgdXNlIG5vZGUudGV4dCB3aGVyZSBhdmFpbGFibGUsIGFuZCBub2RlLm5vZGVWYWx1ZSBlbHNld2hlcmVcbiAgICB2YXIgY29tbWVudE5vZGVzSGF2ZVRleHRQcm9wZXJ0eSA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCJ0ZXN0XCIpLnRleHQgPT09IFwiPCEtLXRlc3QtLT5cIjtcblxuICAgIHZhciBzdGFydENvbW1lbnRSZWdleCA9IGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyAvXjwhLS1cXHMqa28oPzpcXHMrKFtcXHNcXFNdKykpP1xccyotLT4kLyA6IC9eXFxzKmtvKD86XFxzKyhbXFxzXFxTXSspKT9cXHMqJC87XG4gICAgdmFyIGVuZENvbW1lbnRSZWdleCA9ICAgY29tbWVudE5vZGVzSGF2ZVRleHRQcm9wZXJ0eSA/IC9ePCEtLVxccypcXC9rb1xccyotLT4kLyA6IC9eXFxzKlxcL2tvXFxzKiQvO1xuICAgIHZhciBodG1sVGFnc1dpdGhPcHRpb25hbGx5Q2xvc2luZ0NoaWxkcmVuID0geyAndWwnOiB0cnVlLCAnb2wnOiB0cnVlIH07XG5cbiAgICBmdW5jdGlvbiBpc1N0YXJ0Q29tbWVudChub2RlKSB7XG4gICAgICAgIHJldHVybiAobm9kZS5ub2RlVHlwZSA9PSA4KSAmJiBzdGFydENvbW1lbnRSZWdleC50ZXN0KGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyBub2RlLnRleHQgOiBub2RlLm5vZGVWYWx1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNFbmRDb21tZW50KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIChub2RlLm5vZGVUeXBlID09IDgpICYmIGVuZENvbW1lbnRSZWdleC50ZXN0KGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyBub2RlLnRleHQgOiBub2RlLm5vZGVWYWx1ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VmlydHVhbENoaWxkcmVuKHN0YXJ0Q29tbWVudCwgYWxsb3dVbmJhbGFuY2VkKSB7XG4gICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHN0YXJ0Q29tbWVudDtcbiAgICAgICAgdmFyIGRlcHRoID0gMTtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gW107XG4gICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBpZiAoaXNFbmRDb21tZW50KGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goY3VycmVudE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoaXNTdGFydENvbW1lbnQoY3VycmVudE5vZGUpKVxuICAgICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhbGxvd1VuYmFsYW5jZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBjbG9zaW5nIGNvbW1lbnQgdGFnIHRvIG1hdGNoOiBcIiArIHN0YXJ0Q29tbWVudC5ub2RlVmFsdWUpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRNYXRjaGluZ0VuZENvbW1lbnQoc3RhcnRDb21tZW50LCBhbGxvd1VuYmFsYW5jZWQpIHtcbiAgICAgICAgdmFyIGFsbFZpcnR1YWxDaGlsZHJlbiA9IGdldFZpcnR1YWxDaGlsZHJlbihzdGFydENvbW1lbnQsIGFsbG93VW5iYWxhbmNlZCk7XG4gICAgICAgIGlmIChhbGxWaXJ0dWFsQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChhbGxWaXJ0dWFsQ2hpbGRyZW4ubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gYWxsVmlydHVhbENoaWxkcmVuW2FsbFZpcnR1YWxDaGlsZHJlbi5sZW5ndGggLSAxXS5uZXh0U2libGluZztcbiAgICAgICAgICAgIHJldHVybiBzdGFydENvbW1lbnQubmV4dFNpYmxpbmc7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIE11c3QgaGF2ZSBubyBtYXRjaGluZyBlbmQgY29tbWVudCwgYW5kIGFsbG93VW5iYWxhbmNlZCBpcyB0cnVlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0VW5iYWxhbmNlZENoaWxkVGFncyhub2RlKSB7XG4gICAgICAgIC8vIGUuZy4sIGZyb20gPGRpdj5PSzwvZGl2PjwhLS0ga28gYmxhaCAtLT48c3Bhbj5Bbm90aGVyPC9zcGFuPiwgcmV0dXJuczogPCEtLSBrbyBibGFoIC0tPjxzcGFuPkFub3RoZXI8L3NwYW4+XG4gICAgICAgIC8vICAgICAgIGZyb20gPGRpdj5PSzwvZGl2PjwhLS0gL2tvIC0tPjwhLS0gL2tvIC0tPiwgICAgICAgICAgICAgcmV0dXJuczogPCEtLSAva28gLS0+PCEtLSAva28gLS0+XG4gICAgICAgIHZhciBjaGlsZE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQsIGNhcHR1cmVSZW1haW5pbmcgPSBudWxsO1xuICAgICAgICBpZiAoY2hpbGROb2RlKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgaWYgKGNhcHR1cmVSZW1haW5pbmcpICAgICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGl0IGFuIHVuYmFsYW5jZWQgbm9kZSBhbmQgYXJlIG5vdyBqdXN0IHNjb29waW5nIHVwIGFsbCBzdWJzZXF1ZW50IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZW1haW5pbmcucHVzaChjaGlsZE5vZGUpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzU3RhcnRDb21tZW50KGNoaWxkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nRW5kQ29tbWVudCA9IGdldE1hdGNoaW5nRW5kQ29tbWVudChjaGlsZE5vZGUsIC8qIGFsbG93VW5iYWxhbmNlZDogKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGluZ0VuZENvbW1lbnQpICAgICAgICAgICAgIC8vIEl0J3MgYSBiYWxhbmNlZCB0YWcsIHNvIHNraXAgaW1tZWRpYXRlbHkgdG8gdGhlIGVuZCBvZiB0aGlzIHZpcnR1YWwgc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUgPSBtYXRjaGluZ0VuZENvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZW1haW5pbmcgPSBbY2hpbGROb2RlXTsgLy8gSXQncyB1bmJhbGFuY2VkLCBzbyBzdGFydCBjYXB0dXJpbmcgZnJvbSB0aGlzIHBvaW50XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0VuZENvbW1lbnQoY2hpbGROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVtYWluaW5nID0gW2NoaWxkTm9kZV07ICAgICAvLyBJdCdzIHVuYmFsYW5jZWQgKGlmIGl0IHdhc24ndCwgd2UnZCBoYXZlIHNraXBwZWQgb3ZlciBpdCBhbHJlYWR5KSwgc28gc3RhcnQgY2FwdHVyaW5nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAoY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FwdHVyZVJlbWFpbmluZztcbiAgICB9XG5cbiAgICBrby52aXJ0dWFsRWxlbWVudHMgPSB7XG4gICAgICAgIGFsbG93ZWRCaW5kaW5nczoge30sXG5cbiAgICAgICAgY2hpbGROb2RlczogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzU3RhcnRDb21tZW50KG5vZGUpID8gZ2V0VmlydHVhbENoaWxkcmVuKG5vZGUpIDogbm9kZS5jaGlsZE5vZGVzO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVtcHR5Tm9kZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgaWYgKCFpc1N0YXJ0Q29tbWVudChub2RlKSlcbiAgICAgICAgICAgICAgICBrby51dGlscy5lbXB0eURvbU5vZGUobm9kZSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmlydHVhbENoaWxkcmVuID0ga28udmlydHVhbEVsZW1lbnRzLmNoaWxkTm9kZXMobm9kZSk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSB2aXJ0dWFsQ2hpbGRyZW4ubGVuZ3RoOyBpIDwgajsgaSsrKVxuICAgICAgICAgICAgICAgICAgICBrby5yZW1vdmVOb2RlKHZpcnR1YWxDaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0RG9tTm9kZUNoaWxkcmVuOiBmdW5jdGlvbihub2RlLCBjaGlsZE5vZGVzKSB7XG4gICAgICAgICAgICBpZiAoIWlzU3RhcnRDb21tZW50KG5vZGUpKVxuICAgICAgICAgICAgICAgIGtvLnV0aWxzLnNldERvbU5vZGVDaGlsZHJlbihub2RlLCBjaGlsZE5vZGVzKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5lbXB0eU5vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgdmFyIGVuZENvbW1lbnROb2RlID0gbm9kZS5uZXh0U2libGluZzsgLy8gTXVzdCBiZSB0aGUgbmV4dCBzaWJsaW5nLCBhcyB3ZSBqdXN0IGVtcHRpZWQgdGhlIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBjaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGo7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgZW5kQ29tbWVudE5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2Rlc1tpXSwgZW5kQ29tbWVudE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHByZXBlbmQ6IGZ1bmN0aW9uKGNvbnRhaW5lck5vZGUsIG5vZGVUb1ByZXBlbmQpIHtcbiAgICAgICAgICAgIGlmICghaXNTdGFydENvbW1lbnQoY29udGFpbmVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyTm9kZS5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJOb2RlLmluc2VydEJlZm9yZShub2RlVG9QcmVwZW5kLCBjb250YWluZXJOb2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChub2RlVG9QcmVwZW5kKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgY29tbWVudHMgbXVzdCBhbHdheXMgaGF2ZSBhIHBhcmVudCBhbmQgYXQgbGVhc3Qgb25lIGZvbGxvd2luZyBzaWJsaW5nICh0aGUgZW5kIGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlVG9QcmVwZW5kLCBjb250YWluZXJOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBpbnNlcnRBZnRlcjogZnVuY3Rpb24oY29udGFpbmVyTm9kZSwgbm9kZVRvSW5zZXJ0LCBpbnNlcnRBZnRlck5vZGUpIHtcbiAgICAgICAgICAgIGlmICghaW5zZXJ0QWZ0ZXJOb2RlKSB7XG4gICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLnByZXBlbmQoY29udGFpbmVyTm9kZSwgbm9kZVRvSW5zZXJ0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzU3RhcnRDb21tZW50KGNvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGFmdGVyIGluc2VydGlvbiBwb2ludFxuICAgICAgICAgICAgICAgIGlmIChpbnNlcnRBZnRlck5vZGUubmV4dFNpYmxpbmcpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lck5vZGUuaW5zZXJ0QmVmb3JlKG5vZGVUb0luc2VydCwgaW5zZXJ0QWZ0ZXJOb2RlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lck5vZGUuYXBwZW5kQ2hpbGQobm9kZVRvSW5zZXJ0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hpbGRyZW4gb2Ygc3RhcnQgY29tbWVudHMgbXVzdCBhbHdheXMgaGF2ZSBhIHBhcmVudCBhbmQgYXQgbGVhc3Qgb25lIGZvbGxvd2luZyBzaWJsaW5nICh0aGUgZW5kIGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlVG9JbnNlcnQsIGluc2VydEFmdGVyTm9kZS5uZXh0U2libGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZmlyc3RDaGlsZDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgaWYgKCFpc1N0YXJ0Q29tbWVudChub2RlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKCFub2RlLm5leHRTaWJsaW5nIHx8IGlzRW5kQ29tbWVudChub2RlLm5leHRTaWJsaW5nKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9LFxuXG4gICAgICAgIG5leHRTaWJsaW5nOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICBpZiAoaXNTdGFydENvbW1lbnQobm9kZSkpXG4gICAgICAgICAgICAgICAgbm9kZSA9IGdldE1hdGNoaW5nRW5kQ29tbWVudChub2RlKTtcbiAgICAgICAgICAgIGlmIChub2RlLm5leHRTaWJsaW5nICYmIGlzRW5kQ29tbWVudChub2RlLm5leHRTaWJsaW5nKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9LFxuXG4gICAgICAgIGhhc0JpbmRpbmdWYWx1ZTogaXNTdGFydENvbW1lbnQsXG5cbiAgICAgICAgdmlydHVhbE5vZGVCaW5kaW5nVmFsdWU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIHZhciByZWdleE1hdGNoID0gKGNvbW1lbnROb2Rlc0hhdmVUZXh0UHJvcGVydHkgPyBub2RlLnRleHQgOiBub2RlLm5vZGVWYWx1ZSkubWF0Y2goc3RhcnRDb21tZW50UmVnZXgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4TWF0Y2ggPyByZWdleE1hdGNoWzFdIDogbnVsbDtcbiAgICAgICAgfSxcblxuICAgICAgICBub3JtYWxpc2VWaXJ0dWFsRWxlbWVudERvbVN0cnVjdHVyZTogZnVuY3Rpb24oZWxlbWVudFZlcmlmaWVkKSB7XG4gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzE1NVxuICAgICAgICAgICAgLy8gKElFIDw9IDggb3IgSUUgOSBxdWlya3MgbW9kZSBwYXJzZXMgeW91ciBIVE1MIHdlaXJkbHksIHRyZWF0aW5nIGNsb3NpbmcgPC9saT4gdGFncyBhcyBpZiB0aGV5IGRvbid0IGV4aXN0LCB0aGVyZWJ5IG1vdmluZyBjb21tZW50IG5vZGVzXG4gICAgICAgICAgICAvLyB0aGF0IGFyZSBkaXJlY3QgZGVzY2VuZGFudHMgb2YgPHVsPiBpbnRvIHRoZSBwcmVjZWRpbmcgPGxpPilcbiAgICAgICAgICAgIGlmICghaHRtbFRhZ3NXaXRoT3B0aW9uYWxseUNsb3NpbmdDaGlsZHJlbltrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudFZlcmlmaWVkKV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBTY2FuIGltbWVkaWF0ZSBjaGlsZHJlbiB0byBzZWUgaWYgdGhleSBjb250YWluIHVuYmFsYW5jZWQgY29tbWVudCB0YWdzLiBJZiB0aGV5IGRvLCB0aG9zZSBjb21tZW50IHRhZ3NcbiAgICAgICAgICAgIC8vIG11c3QgYmUgaW50ZW5kZWQgdG8gYXBwZWFyICphZnRlciogdGhhdCBjaGlsZCwgc28gbW92ZSB0aGVtIHRoZXJlLlxuICAgICAgICAgICAgdmFyIGNoaWxkTm9kZSA9IGVsZW1lbnRWZXJpZmllZC5maXJzdENoaWxkO1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZSkge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVuYmFsYW5jZWRUYWdzID0gZ2V0VW5iYWxhbmNlZENoaWxkVGFncyhjaGlsZE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuYmFsYW5jZWRUYWdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRml4IHVwIHRoZSBET00gYnkgbW92aW5nIHRoZSB1bmJhbGFuY2VkIHRhZ3MgdG8gd2hlcmUgdGhleSBtb3N0IGxpa2VseSB3ZXJlIGludGVuZGVkIHRvIGJlIHBsYWNlZCAtICphZnRlciogdGhlIGNoaWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVUb0luc2VydEJlZm9yZSA9IGNoaWxkTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVuYmFsYW5jZWRUYWdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVG9JbnNlcnRCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmVyaWZpZWQuaW5zZXJ0QmVmb3JlKHVuYmFsYW5jZWRUYWdzW2ldLCBub2RlVG9JbnNlcnRCZWZvcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmVyaWZpZWQuYXBwZW5kQ2hpbGQodW5iYWxhbmNlZFRhZ3NbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNoaWxkTm9kZSA9IGNoaWxkTm9kZS5uZXh0U2libGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmtvLmV4cG9ydFN5bWJvbCgndmlydHVhbEVsZW1lbnRzJywga28udmlydHVhbEVsZW1lbnRzKTtcbmtvLmV4cG9ydFN5bWJvbCgndmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5ncycsIGtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3MpO1xua28uZXhwb3J0U3ltYm9sKCd2aXJ0dWFsRWxlbWVudHMuZW1wdHlOb2RlJywga28udmlydHVhbEVsZW1lbnRzLmVtcHR5Tm9kZSk7XG4vL2tvLmV4cG9ydFN5bWJvbCgndmlydHVhbEVsZW1lbnRzLmZpcnN0Q2hpbGQnLCBrby52aXJ0dWFsRWxlbWVudHMuZmlyc3RDaGlsZCk7ICAgICAvLyBmaXJzdENoaWxkIGlzIG5vdCBtaW5pZmllZFxua28uZXhwb3J0U3ltYm9sKCd2aXJ0dWFsRWxlbWVudHMuaW5zZXJ0QWZ0ZXInLCBrby52aXJ0dWFsRWxlbWVudHMuaW5zZXJ0QWZ0ZXIpO1xuLy9rby5leHBvcnRTeW1ib2woJ3ZpcnR1YWxFbGVtZW50cy5uZXh0U2libGluZycsIGtvLnZpcnR1YWxFbGVtZW50cy5uZXh0U2libGluZyk7ICAgLy8gbmV4dFNpYmxpbmcgaXMgbm90IG1pbmlmaWVkXG5rby5leHBvcnRTeW1ib2woJ3ZpcnR1YWxFbGVtZW50cy5wcmVwZW5kJywga28udmlydHVhbEVsZW1lbnRzLnByZXBlbmQpO1xua28uZXhwb3J0U3ltYm9sKCd2aXJ0dWFsRWxlbWVudHMuc2V0RG9tTm9kZUNoaWxkcmVuJywga28udmlydHVhbEVsZW1lbnRzLnNldERvbU5vZGVDaGlsZHJlbik7XG4oZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRlZmF1bHRCaW5kaW5nQXR0cmlidXRlTmFtZSA9IFwiZGF0YS1iaW5kXCI7XG5cbiAgICBrby5iaW5kaW5nUHJvdmlkZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5iaW5kaW5nQ2FjaGUgPSB7fTtcbiAgICB9O1xuXG4gICAga28udXRpbHMuZXh0ZW5kKGtvLmJpbmRpbmdQcm92aWRlci5wcm90b3R5cGUsIHtcbiAgICAgICAgJ25vZGVIYXNCaW5kaW5ncyc6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoZGVmYXVsdEJpbmRpbmdBdHRyaWJ1dGVOYW1lKSAhPSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCBrby5jb21wb25lbnRzWydnZXRDb21wb25lbnROYW1lRm9yTm9kZSddKG5vZGUpO1xuICAgICAgICAgICAgICAgIGNhc2UgODogLy8gQ29tbWVudCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrby52aXJ0dWFsRWxlbWVudHMuaGFzQmluZGluZ1ZhbHVlKG5vZGUpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAnZ2V0QmluZGluZ3MnOiBmdW5jdGlvbihub2RlLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdzU3RyaW5nID0gdGhpc1snZ2V0QmluZGluZ3NTdHJpbmcnXShub2RlLCBiaW5kaW5nQ29udGV4dCksXG4gICAgICAgICAgICAgICAgcGFyc2VkQmluZGluZ3MgPSBiaW5kaW5nc1N0cmluZyA/IHRoaXNbJ3BhcnNlQmluZGluZ3NTdHJpbmcnXShiaW5kaW5nc1N0cmluZywgYmluZGluZ0NvbnRleHQsIG5vZGUpIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBrby5jb21wb25lbnRzLmFkZEJpbmRpbmdzRm9yQ3VzdG9tRWxlbWVudChwYXJzZWRCaW5kaW5ncywgbm9kZSwgYmluZGluZ0NvbnRleHQsIC8qIHZhbHVlQWNjZXNzb3JzICovIGZhbHNlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnZ2V0QmluZGluZ0FjY2Vzc29ycyc6IGZ1bmN0aW9uKG5vZGUsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgYmluZGluZ3NTdHJpbmcgPSB0aGlzWydnZXRCaW5kaW5nc1N0cmluZyddKG5vZGUsIGJpbmRpbmdDb250ZXh0KSxcbiAgICAgICAgICAgICAgICBwYXJzZWRCaW5kaW5ncyA9IGJpbmRpbmdzU3RyaW5nID8gdGhpc1sncGFyc2VCaW5kaW5nc1N0cmluZyddKGJpbmRpbmdzU3RyaW5nLCBiaW5kaW5nQ29udGV4dCwgbm9kZSwgeyAndmFsdWVBY2Nlc3NvcnMnOiB0cnVlIH0pIDogbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBrby5jb21wb25lbnRzLmFkZEJpbmRpbmdzRm9yQ3VzdG9tRWxlbWVudChwYXJzZWRCaW5kaW5ncywgbm9kZSwgYmluZGluZ0NvbnRleHQsIC8qIHZhbHVlQWNjZXNzb3JzICovIHRydWUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgb25seSB1c2VkIGludGVybmFsbHkgYnkgdGhpcyBkZWZhdWx0IHByb3ZpZGVyLlxuICAgICAgICAvLyBJdCdzIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBnZW5lcmFsIGJpbmRpbmcgcHJvdmlkZXIuXG4gICAgICAgICdnZXRCaW5kaW5nc1N0cmluZyc6IGZ1bmN0aW9uKG5vZGUsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5vZGUubm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBub2RlLmdldEF0dHJpYnV0ZShkZWZhdWx0QmluZGluZ0F0dHJpYnV0ZU5hbWUpOyAgIC8vIEVsZW1lbnRcbiAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBrby52aXJ0dWFsRWxlbWVudHMudmlydHVhbE5vZGVCaW5kaW5nVmFsdWUobm9kZSk7IC8vIENvbW1lbnQgbm9kZVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgb25seSB1c2VkIGludGVybmFsbHkgYnkgdGhpcyBkZWZhdWx0IHByb3ZpZGVyLlxuICAgICAgICAvLyBJdCdzIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBnZW5lcmFsIGJpbmRpbmcgcHJvdmlkZXIuXG4gICAgICAgICdwYXJzZUJpbmRpbmdzU3RyaW5nJzogZnVuY3Rpb24oYmluZGluZ3NTdHJpbmcsIGJpbmRpbmdDb250ZXh0LCBub2RlLCBvcHRpb25zKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBiaW5kaW5nRnVuY3Rpb24gPSBjcmVhdGVCaW5kaW5nc1N0cmluZ0V2YWx1YXRvclZpYUNhY2hlKGJpbmRpbmdzU3RyaW5nLCB0aGlzLmJpbmRpbmdDYWNoZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdGdW5jdGlvbihiaW5kaW5nQ29udGV4dCwgbm9kZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgIGV4Lm1lc3NhZ2UgPSBcIlVuYWJsZSB0byBwYXJzZSBiaW5kaW5ncy5cXG5CaW5kaW5ncyB2YWx1ZTogXCIgKyBiaW5kaW5nc1N0cmluZyArIFwiXFxuTWVzc2FnZTogXCIgKyBleC5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBrby5iaW5kaW5nUHJvdmlkZXJbJ2luc3RhbmNlJ10gPSBuZXcga28uYmluZGluZ1Byb3ZpZGVyKCk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVCaW5kaW5nc1N0cmluZ0V2YWx1YXRvclZpYUNhY2hlKGJpbmRpbmdzU3RyaW5nLCBjYWNoZSwgb3B0aW9ucykge1xuICAgICAgICB2YXIgY2FjaGVLZXkgPSBiaW5kaW5nc1N0cmluZyArIChvcHRpb25zICYmIG9wdGlvbnNbJ3ZhbHVlQWNjZXNzb3JzJ10gfHwgJycpO1xuICAgICAgICByZXR1cm4gY2FjaGVbY2FjaGVLZXldXG4gICAgICAgICAgICB8fCAoY2FjaGVbY2FjaGVLZXldID0gY3JlYXRlQmluZGluZ3NTdHJpbmdFdmFsdWF0b3IoYmluZGluZ3NTdHJpbmcsIG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVCaW5kaW5nc1N0cmluZ0V2YWx1YXRvcihiaW5kaW5nc1N0cmluZywgb3B0aW9ucykge1xuICAgICAgICAvLyBCdWlsZCB0aGUgc291cmNlIGZvciBhIGZ1bmN0aW9uIHRoYXQgZXZhbHVhdGVzIFwiZXhwcmVzc2lvblwiXG4gICAgICAgIC8vIEZvciBlYWNoIHNjb3BlIHZhcmlhYmxlLCBhZGQgYW4gZXh0cmEgbGV2ZWwgb2YgXCJ3aXRoXCIgbmVzdGluZ1xuICAgICAgICAvLyBFeGFtcGxlIHJlc3VsdDogd2l0aChzYzEpIHsgd2l0aChzYzApIHsgcmV0dXJuIChleHByZXNzaW9uKSB9IH1cbiAgICAgICAgdmFyIHJld3JpdHRlbkJpbmRpbmdzID0ga28uZXhwcmVzc2lvblJld3JpdGluZy5wcmVQcm9jZXNzQmluZGluZ3MoYmluZGluZ3NTdHJpbmcsIG9wdGlvbnMpLFxuICAgICAgICAgICAgZnVuY3Rpb25Cb2R5ID0gXCJ3aXRoKCRjb250ZXh0KXt3aXRoKCRkYXRhfHx7fSl7cmV0dXJue1wiICsgcmV3cml0dGVuQmluZGluZ3MgKyBcIn19fVwiO1xuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKFwiJGNvbnRleHRcIiwgXCIkZWxlbWVudFwiLCBmdW5jdGlvbkJvZHkpO1xuICAgIH1cbn0pKCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgnYmluZGluZ1Byb3ZpZGVyJywga28uYmluZGluZ1Byb3ZpZGVyKTtcbihmdW5jdGlvbiAoKSB7XG4gICAga28uYmluZGluZ0hhbmRsZXJzID0ge307XG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnQgdHlwZXMgd2lsbCBub3QgYmUgcmVjdXJzZWQgaW50byBkdXJpbmcgYmluZGluZy5cbiAgICB2YXIgYmluZGluZ0RvZXNOb3RSZWN1cnNlSW50b0VsZW1lbnRUeXBlcyA9IHtcbiAgICAgICAgLy8gRG9uJ3Qgd2FudCBiaW5kaW5ncyB0aGF0IG9wZXJhdGUgb24gdGV4dCBub2RlcyB0byBtdXRhdGUgPHNjcmlwdD4gYW5kIDx0ZXh0YXJlYT4gY29udGVudHMsXG4gICAgICAgIC8vIGJlY2F1c2UgaXQncyB1bmV4cGVjdGVkIGFuZCBhIHBvdGVudGlhbCBYU1MgaXNzdWUuXG4gICAgICAgIC8vIEFsc28gYmluZGluZ3Mgc2hvdWxkIG5vdCBvcGVyYXRlIG9uIDx0ZW1wbGF0ZT4gZWxlbWVudHMgc2luY2UgdGhpcyBicmVha3MgaW4gSW50ZXJuZXQgRXhwbG9yZXJcbiAgICAgICAgLy8gYW5kIGJlY2F1c2Ugc3VjaCBlbGVtZW50cycgY29udGVudHMgYXJlIGFsd2F5cyBpbnRlbmRlZCB0byBiZSBib3VuZCBpbiBhIGRpZmZlcmVudCBjb250ZXh0XG4gICAgICAgIC8vIGZyb20gd2hlcmUgdGhleSBhcHBlYXIgaW4gdGhlIGRvY3VtZW50LlxuICAgICAgICAnc2NyaXB0JzogdHJ1ZSxcbiAgICAgICAgJ3RleHRhcmVhJzogdHJ1ZSxcbiAgICAgICAgJ3RlbXBsYXRlJzogdHJ1ZVxuICAgIH07XG5cbiAgICAvLyBVc2UgYW4gb3ZlcnJpZGFibGUgbWV0aG9kIGZvciByZXRyaWV2aW5nIGJpbmRpbmcgaGFuZGxlcnMgc28gdGhhdCBhIHBsdWdpbnMgbWF5IHN1cHBvcnQgZHluYW1pY2FsbHkgY3JlYXRlZCBoYW5kbGVyc1xuICAgIGtvWydnZXRCaW5kaW5nSGFuZGxlciddID0gZnVuY3Rpb24oYmluZGluZ0tleSkge1xuICAgICAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzW2JpbmRpbmdLZXldO1xuICAgIH07XG5cbiAgICAvLyBUaGUga28uYmluZGluZ0NvbnRleHQgY29uc3RydWN0b3IgaXMgb25seSBjYWxsZWQgZGlyZWN0bHkgdG8gY3JlYXRlIHRoZSByb290IGNvbnRleHQuIEZvciBjaGlsZFxuICAgIC8vIGNvbnRleHRzLCB1c2UgYmluZGluZ0NvbnRleHQuY3JlYXRlQ2hpbGRDb250ZXh0IG9yIGJpbmRpbmdDb250ZXh0LmV4dGVuZC5cbiAgICBrby5iaW5kaW5nQ29udGV4dCA9IGZ1bmN0aW9uKGRhdGFJdGVtT3JBY2Nlc3NvciwgcGFyZW50Q29udGV4dCwgZGF0YUl0ZW1BbGlhcywgZXh0ZW5kQ2FsbGJhY2spIHtcblxuICAgICAgICAvLyBUaGUgYmluZGluZyBjb250ZXh0IG9iamVjdCBpbmNsdWRlcyBzdGF0aWMgcHJvcGVydGllcyBmb3IgdGhlIGN1cnJlbnQsIHBhcmVudCwgYW5kIHJvb3QgdmlldyBtb2RlbHMuXG4gICAgICAgIC8vIElmIGEgdmlldyBtb2RlbCBpcyBhY3R1YWxseSBzdG9yZWQgaW4gYW4gb2JzZXJ2YWJsZSwgdGhlIGNvcnJlc3BvbmRpbmcgYmluZGluZyBjb250ZXh0IG9iamVjdCwgYW5kXG4gICAgICAgIC8vIGFueSBjaGlsZCBjb250ZXh0cywgbXVzdCBiZSB1cGRhdGVkIHdoZW4gdGhlIHZpZXcgbW9kZWwgaXMgY2hhbmdlZC5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQ29udGV4dCgpIHtcbiAgICAgICAgICAgIC8vIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZSBjb250ZXh0IHdpbGwgZGlyZWN0bHkgZ2V0IGEgdmlldyBtb2RlbCBvYmplY3QsIGJ1dCBpZiBhIGZ1bmN0aW9uIGlzIGdpdmVuLFxuICAgICAgICAgICAgLy8gd2UgY2FsbCB0aGUgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIHZpZXcgbW9kZWwuIElmIHRoZSBmdW5jdGlvbiBhY2Nlc3NlcyBhbnkgb2JzZXJ2YWJsZXMgb3IgcmV0dXJuc1xuICAgICAgICAgICAgLy8gYW4gb2JzZXJ2YWJsZSwgdGhlIGRlcGVuZGVuY3kgaXMgdHJhY2tlZCwgYW5kIHRob3NlIG9ic2VydmFibGVzIGNhbiBsYXRlciBjYXVzZSB0aGUgYmluZGluZ1xuICAgICAgICAgICAgLy8gY29udGV4dCB0byBiZSB1cGRhdGVkLlxuICAgICAgICAgICAgdmFyIGRhdGFJdGVtT3JPYnNlcnZhYmxlID0gaXNGdW5jID8gZGF0YUl0ZW1PckFjY2Vzc29yKCkgOiBkYXRhSXRlbU9yQWNjZXNzb3IsXG4gICAgICAgICAgICAgICAgZGF0YUl0ZW0gPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGRhdGFJdGVtT3JPYnNlcnZhYmxlKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAvLyBXaGVuIGEgXCJwYXJlbnRcIiBjb250ZXh0IGlzIGdpdmVuLCByZWdpc3RlciBhIGRlcGVuZGVuY3kgb24gdGhlIHBhcmVudCBjb250ZXh0LiBUaHVzIHdoZW5ldmVyIHRoZVxuICAgICAgICAgICAgICAgIC8vIHBhcmVudCBjb250ZXh0IGlzIHVwZGF0ZWQsIHRoaXMgY29udGV4dCB3aWxsIGFsc28gYmUgdXBkYXRlZC5cbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Q29udGV4dC5fc3Vic2NyaWJhYmxlKVxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZXh0Ll9zdWJzY3JpYmFibGUoKTtcblxuICAgICAgICAgICAgICAgIC8vIENvcHkgJHJvb3QgYW5kIGFueSBjdXN0b20gcHJvcGVydGllcyBmcm9tIHRoZSBwYXJlbnQgY29udGV4dFxuICAgICAgICAgICAgICAgIGtvLnV0aWxzLmV4dGVuZChzZWxmLCBwYXJlbnRDb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIGFib3ZlIGNvcHkgb3ZlcndyaXRlcyBvdXIgb3duIHByb3BlcnRpZXMsIHdlIG5lZWQgdG8gcmVzZXQgdGhlbS5cbiAgICAgICAgICAgICAgICAvLyBEdXJpbmcgdGhlIGZpcnN0IGV4ZWN1dGlvbiwgXCJzdWJzY3JpYmFibGVcIiBpc24ndCBzZXQsIHNvIGRvbid0IGJvdGhlciBkb2luZyB0aGUgdXBkYXRlIHRoZW4uXG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdWJzY3JpYmFibGUgPSBzdWJzY3JpYmFibGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxmWyckcGFyZW50cyddID0gW107XG4gICAgICAgICAgICAgICAgc2VsZlsnJHJvb3QnXSA9IGRhdGFJdGVtO1xuXG4gICAgICAgICAgICAgICAgLy8gRXhwb3J0ICdrbycgaW4gdGhlIGJpbmRpbmcgY29udGV4dCBzbyBpdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiBiaW5kaW5ncyBhbmQgdGVtcGxhdGVzXG4gICAgICAgICAgICAgICAgLy8gZXZlbiBpZiAna28nIGlzbid0IGV4cG9ydGVkIGFzIGEgZ2xvYmFsLCBzdWNoIGFzIHdoZW4gdXNpbmcgYW4gQU1EIGxvYWRlci5cbiAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L2lzc3Vlcy80OTBcbiAgICAgICAgICAgICAgICBzZWxmWydrbyddID0ga287XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmWyckcmF3RGF0YSddID0gZGF0YUl0ZW1Pck9ic2VydmFibGU7XG4gICAgICAgICAgICBzZWxmWyckZGF0YSddID0gZGF0YUl0ZW07XG4gICAgICAgICAgICBpZiAoZGF0YUl0ZW1BbGlhcylcbiAgICAgICAgICAgICAgICBzZWxmW2RhdGFJdGVtQWxpYXNdID0gZGF0YUl0ZW07XG5cbiAgICAgICAgICAgIC8vIFRoZSBleHRlbmRDYWxsYmFjayBmdW5jdGlvbiBpcyBwcm92aWRlZCB3aGVuIGNyZWF0aW5nIGEgY2hpbGQgY29udGV4dCBvciBleHRlbmRpbmcgYSBjb250ZXh0LlxuICAgICAgICAgICAgLy8gSXQgaGFuZGxlcyB0aGUgc3BlY2lmaWMgYWN0aW9ucyBuZWVkZWQgdG8gZmluaXNoIHNldHRpbmcgdXAgdGhlIGJpbmRpbmcgY29udGV4dC4gQWN0aW9ucyBpbiB0aGlzXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiBjb3VsZCBhbHNvIGFkZCBkZXBlbmRlbmNpZXMgdG8gdGhpcyBiaW5kaW5nIGNvbnRleHQuXG4gICAgICAgICAgICBpZiAoZXh0ZW5kQ2FsbGJhY2spXG4gICAgICAgICAgICAgICAgZXh0ZW5kQ2FsbGJhY2soc2VsZiwgcGFyZW50Q29udGV4dCwgZGF0YUl0ZW0pO1xuXG4gICAgICAgICAgICByZXR1cm4gc2VsZlsnJGRhdGEnXTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBkaXNwb3NlV2hlbigpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlcyAmJiAha28udXRpbHMuYW55RG9tTm9kZUlzQXR0YWNoZWRUb0RvY3VtZW50KG5vZGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgICAgIGlzRnVuYyA9IHR5cGVvZihkYXRhSXRlbU9yQWNjZXNzb3IpID09IFwiZnVuY3Rpb25cIiAmJiAha28uaXNPYnNlcnZhYmxlKGRhdGFJdGVtT3JBY2Nlc3NvciksXG4gICAgICAgICAgICBub2RlcyxcbiAgICAgICAgICAgIHN1YnNjcmliYWJsZSA9IGtvLmRlcGVuZGVudE9ic2VydmFibGUodXBkYXRlQ29udGV4dCwgbnVsbCwgeyBkaXNwb3NlV2hlbjogZGlzcG9zZVdoZW4sIGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogdHJ1ZSB9KTtcblxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgYmluZGluZyBjb250ZXh0IGhhcyBiZWVuIGluaXRpYWxpemVkLCBhbmQgdGhlIFwic3Vic2NyaWJhYmxlXCIgY29tcHV0ZWQgb2JzZXJ2YWJsZSBpc1xuICAgICAgICAvLyBzdWJzY3JpYmVkIHRvIGFueSBvYnNlcnZhYmxlcyB0aGF0IHdlcmUgYWNjZXNzZWQgaW4gdGhlIHByb2Nlc3MuIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gdHJhY2ssIHRoZVxuICAgICAgICAvLyBjb21wdXRlZCB3aWxsIGJlIGluYWN0aXZlLCBhbmQgd2UgY2FuIHNhZmVseSB0aHJvdyBpdCBhd2F5LiBJZiBpdCdzIGFjdGl2ZSwgdGhlIGNvbXB1dGVkIGlzIHN0b3JlZCBpblxuICAgICAgICAvLyB0aGUgY29udGV4dCBvYmplY3QuXG4gICAgICAgIGlmIChzdWJzY3JpYmFibGUuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgc2VsZi5fc3Vic2NyaWJhYmxlID0gc3Vic2NyaWJhYmxlO1xuXG4gICAgICAgICAgICAvLyBBbHdheXMgbm90aWZ5IGJlY2F1c2UgZXZlbiBpZiB0aGUgbW9kZWwgKCRkYXRhKSBoYXNuJ3QgY2hhbmdlZCwgb3RoZXIgY29udGV4dCBwcm9wZXJ0aWVzIG1pZ2h0IGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgc3Vic2NyaWJhYmxlWydlcXVhbGl0eUNvbXBhcmVyJ10gPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZGlzcG9zZSBvZiB0aGlzIGNvbXB1dGVkIG9ic2VydmFibGUgd2hlbiBpdCdzIG5vIGxvbmdlciBuZWVkZWQuIFRoaXMgd291bGQgYmVcbiAgICAgICAgICAgIC8vIGVhc3kgaWYgd2UgaGFkIGEgc2luZ2xlIG5vZGUgdG8gd2F0Y2gsIGJ1dCBiaW5kaW5nIGNvbnRleHRzIGNhbiBiZSB1c2VkIGJ5IG1hbnkgZGlmZmVyZW50IG5vZGVzLCBhbmRcbiAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBhc3N1bWUgdGhhdCB0aG9zZSBub2RlcyBoYXZlIGFueSByZWxhdGlvbiB0byBlYWNoIG90aGVyLiBTbyBpbnN0ZWFkIHdlIHRyYWNrIGFueSBub2RlIHRoYXRcbiAgICAgICAgICAgIC8vIHRoZSBjb250ZXh0IGlzIGF0dGFjaGVkIHRvLCBhbmQgZGlzcG9zZSB0aGUgY29tcHV0ZWQgd2hlbiBhbGwgb2YgdGhvc2Ugbm9kZXMgaGF2ZSBiZWVuIGNsZWFuZWQuXG5cbiAgICAgICAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzIHRvICpzdWJzY3JpYmFibGUqIGluc3RlYWQgb2YgKnNlbGYqIGJlY2F1c2UgYW55IHByb3BlcnRpZXMgYWRkZWQgdG8gKnNlbGYqIG1heSBiZSBvdmVyd3JpdHRlbiBvbiB1cGRhdGVzXG4gICAgICAgICAgICBub2RlcyA9IFtdO1xuICAgICAgICAgICAgc3Vic2NyaWJhYmxlLl9hZGROb2RlID0gZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAga28udXRpbHMuZG9tTm9kZURpc3Bvc2FsLmFkZERpc3Bvc2VDYWxsYmFjayhub2RlLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5UmVtb3ZlSXRlbShub2Rlcywgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmFibGUuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3Vic2NyaWJhYmxlID0gc3Vic2NyaWJhYmxlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXh0ZW5kIHRoZSBiaW5kaW5nIGNvbnRleHQgaGllcmFyY2h5IHdpdGggYSBuZXcgdmlldyBtb2RlbCBvYmplY3QuIElmIHRoZSBwYXJlbnQgY29udGV4dCBpcyB3YXRjaGluZ1xuICAgIC8vIGFueSBvYnNlcnZhYmxlcywgdGhlIG5ldyBjaGlsZCBjb250ZXh0IHdpbGwgYXV0b21hdGljYWxseSBnZXQgYSBkZXBlbmRlbmN5IG9uIHRoZSBwYXJlbnQgY29udGV4dC5cbiAgICAvLyBCdXQgdGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlICRkYXRhIHZhbHVlIG9mIHRoZSBjaGlsZCBjb250ZXh0IHdpbGwgYWxzbyBnZXQgdXBkYXRlZC4gSWYgdGhlIGNoaWxkXG4gICAgLy8gdmlldyBtb2RlbCBhbHNvIGRlcGVuZHMgb24gdGhlIHBhcmVudCB2aWV3IG1vZGVsLCB5b3UgbXVzdCBwcm92aWRlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBjb3JyZWN0XG4gICAgLy8gdmlldyBtb2RlbCBvbiBlYWNoIHVwZGF0ZS5cbiAgICBrby5iaW5kaW5nQ29udGV4dC5wcm90b3R5cGVbJ2NyZWF0ZUNoaWxkQ29udGV4dCddID0gZnVuY3Rpb24gKGRhdGFJdGVtT3JBY2Nlc3NvciwgZGF0YUl0ZW1BbGlhcywgZXh0ZW5kQ2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBrby5iaW5kaW5nQ29udGV4dChkYXRhSXRlbU9yQWNjZXNzb3IsIHRoaXMsIGRhdGFJdGVtQWxpYXMsIGZ1bmN0aW9uKHNlbGYsIHBhcmVudENvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEV4dGVuZCB0aGUgY29udGV4dCBoaWVyYXJjaHkgYnkgc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgcG9pbnRlcnNcbiAgICAgICAgICAgIHNlbGZbJyRwYXJlbnRDb250ZXh0J10gPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICAgICAgc2VsZlsnJHBhcmVudCddID0gcGFyZW50Q29udGV4dFsnJGRhdGEnXTtcbiAgICAgICAgICAgIHNlbGZbJyRwYXJlbnRzJ10gPSAocGFyZW50Q29udGV4dFsnJHBhcmVudHMnXSB8fCBbXSkuc2xpY2UoMCk7XG4gICAgICAgICAgICBzZWxmWyckcGFyZW50cyddLnVuc2hpZnQoc2VsZlsnJHBhcmVudCddKTtcbiAgICAgICAgICAgIGlmIChleHRlbmRDYWxsYmFjaylcbiAgICAgICAgICAgICAgICBleHRlbmRDYWxsYmFjayhzZWxmKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB0aGUgYmluZGluZyBjb250ZXh0IHdpdGggbmV3IGN1c3RvbSBwcm9wZXJ0aWVzLiBUaGlzIGRvZXNuJ3QgY2hhbmdlIHRoZSBjb250ZXh0IGhpZXJhcmNoeS5cbiAgICAvLyBTaW1pbGFybHkgdG8gXCJjaGlsZFwiIGNvbnRleHRzLCBwcm92aWRlIGEgZnVuY3Rpb24gaGVyZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY29ycmVjdCB2YWx1ZXMgYXJlIHNldFxuICAgIC8vIHdoZW4gYW4gb2JzZXJ2YWJsZSB2aWV3IG1vZGVsIGlzIHVwZGF0ZWQuXG4gICAga28uYmluZGluZ0NvbnRleHQucHJvdG90eXBlWydleHRlbmQnXSA9IGZ1bmN0aW9uKHByb3BlcnRpZXMpIHtcbiAgICAgICAgLy8gSWYgdGhlIHBhcmVudCBjb250ZXh0IHJlZmVyZW5jZXMgYW4gb2JzZXJ2YWJsZSB2aWV3IG1vZGVsLCBcIl9zdWJzY3JpYmFibGVcIiB3aWxsIGFsd2F5cyBiZSB0aGVcbiAgICAgICAgLy8gbGF0ZXN0IHZpZXcgbW9kZWwgb2JqZWN0LiBJZiBub3QsIFwiX3N1YnNjcmliYWJsZVwiIGlzbid0IHNldCwgYW5kIHdlIGNhbiB1c2UgdGhlIHN0YXRpYyBcIiRkYXRhXCIgdmFsdWUuXG4gICAgICAgIHJldHVybiBuZXcga28uYmluZGluZ0NvbnRleHQodGhpcy5fc3Vic2NyaWJhYmxlIHx8IHRoaXNbJyRkYXRhJ10sIHRoaXMsIG51bGwsIGZ1bmN0aW9uKHNlbGYsIHBhcmVudENvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgXCJjaGlsZFwiIGNvbnRleHQgZG9lc24ndCBkaXJlY3RseSB0cmFjayBhIHBhcmVudCBvYnNlcnZhYmxlIHZpZXcgbW9kZWwsXG4gICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIG1hbnVhbGx5IHNldCB0aGUgJHJhd0RhdGEgdmFsdWUgdG8gbWF0Y2ggdGhlIHBhcmVudC5cbiAgICAgICAgICAgIHNlbGZbJyRyYXdEYXRhJ10gPSBwYXJlbnRDb250ZXh0WyckcmF3RGF0YSddO1xuICAgICAgICAgICAga28udXRpbHMuZXh0ZW5kKHNlbGYsIHR5cGVvZihwcm9wZXJ0aWVzKSA9PSBcImZ1bmN0aW9uXCIgPyBwcm9wZXJ0aWVzKCkgOiBwcm9wZXJ0aWVzKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8vIFJldHVybnMgdGhlIHZhbHVlQWNjZXNvciBmdW5jdGlvbiBmb3IgYSBiaW5kaW5nIHZhbHVlXG4gICAgZnVuY3Rpb24gbWFrZVZhbHVlQWNjZXNzb3IodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgdmFsdWVBY2Nlc3NvciBmdW5jdGlvblxuICAgIGZ1bmN0aW9uIGV2YWx1YXRlVmFsdWVBY2Nlc3Nvcih2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZUFjY2Vzc29yKCk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYmluZGluZ3MsIGNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IG9iamVjdCB0aGF0IGNvbnRhaW5zXG4gICAgLy8gYmluZGluZyB2YWx1ZS1hY2Nlc3NvcnMgZnVuY3Rpb25zLiBFYWNoIGFjY2Vzc29yIGZ1bmN0aW9uIGNhbGxzIHRoZSBvcmlnaW5hbCBmdW5jdGlvblxuICAgIC8vIHNvIHRoYXQgaXQgYWx3YXlzIGdldHMgdGhlIGxhdGVzdCB2YWx1ZSBhbmQgYWxsIGRlcGVuZGVuY2llcyBhcmUgY2FwdHVyZWQuIFRoaXMgaXMgdXNlZFxuICAgIC8vIGJ5IGtvLmFwcGx5QmluZGluZ3NUb05vZGUgYW5kIGdldEJpbmRpbmdzQW5kTWFrZUFjY2Vzc29ycy5cbiAgICBmdW5jdGlvbiBtYWtlQWNjZXNzb3JzRnJvbUZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBrby51dGlscy5vYmplY3RNYXAoa28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoY2FsbGJhY2spLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKClba2V5XTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGEgYmluZGluZ3MgZnVuY3Rpb24gb3Igb2JqZWN0LCBjcmVhdGUgYW5kIHJldHVybiBhIG5ldyBvYmplY3QgdGhhdCBjb250YWluc1xuICAgIC8vIGJpbmRpbmcgdmFsdWUtYWNjZXNzb3JzIGZ1bmN0aW9ucy4gVGhpcyBpcyB1c2VkIGJ5IGtvLmFwcGx5QmluZGluZ3NUb05vZGUuXG4gICAgZnVuY3Rpb24gbWFrZUJpbmRpbmdBY2Nlc3NvcnMoYmluZGluZ3MsIGNvbnRleHQsIG5vZGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiaW5kaW5ncyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIG1ha2VBY2Nlc3NvcnNGcm9tRnVuY3Rpb24oYmluZGluZ3MuYmluZChudWxsLCBjb250ZXh0LCBub2RlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ga28udXRpbHMub2JqZWN0TWFwKGJpbmRpbmdzLCBtYWtlVmFsdWVBY2Nlc3Nvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaWYgdGhlIGJpbmRpbmcgcHJvdmlkZXIgZG9lc24ndCBpbmNsdWRlIGEgZ2V0QmluZGluZ0FjY2Vzc29ycyBmdW5jdGlvbi5cbiAgICAvLyBJdCBtdXN0IGJlIGNhbGxlZCB3aXRoICd0aGlzJyBzZXQgdG8gdGhlIHByb3ZpZGVyIGluc3RhbmNlLlxuICAgIGZ1bmN0aW9uIGdldEJpbmRpbmdzQW5kTWFrZUFjY2Vzc29ycyhub2RlLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBtYWtlQWNjZXNzb3JzRnJvbUZ1bmN0aW9uKHRoaXNbJ2dldEJpbmRpbmdzJ10uYmluZCh0aGlzLCBub2RlLCBjb250ZXh0KSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGVUaGF0QmluZGluZ0lzQWxsb3dlZEZvclZpcnR1YWxFbGVtZW50cyhiaW5kaW5nTmFtZSkge1xuICAgICAgICB2YXIgdmFsaWRhdG9yID0ga28udmlydHVhbEVsZW1lbnRzLmFsbG93ZWRCaW5kaW5nc1tiaW5kaW5nTmFtZV07XG4gICAgICAgIGlmICghdmFsaWRhdG9yKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGJpbmRpbmcgJ1wiICsgYmluZGluZ05hbWUgKyBcIicgY2Fubm90IGJlIHVzZWQgd2l0aCB2aXJ0dWFsIGVsZW1lbnRzXCIpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXBwbHlCaW5kaW5nc1RvRGVzY2VuZGFudHNJbnRlcm5hbCAoYmluZGluZ0NvbnRleHQsIGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBiaW5kaW5nQ29udGV4dHNNYXlEaWZmZXJGcm9tRG9tUGFyZW50RWxlbWVudCkge1xuICAgICAgICB2YXIgY3VycmVudENoaWxkLFxuICAgICAgICAgICAgbmV4dEluUXVldWUgPSBrby52aXJ0dWFsRWxlbWVudHMuZmlyc3RDaGlsZChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCksXG4gICAgICAgICAgICBwcm92aWRlciA9IGtvLmJpbmRpbmdQcm92aWRlclsnaW5zdGFuY2UnXSxcbiAgICAgICAgICAgIHByZXByb2Nlc3NOb2RlID0gcHJvdmlkZXJbJ3ByZXByb2Nlc3NOb2RlJ107XG5cbiAgICAgICAgLy8gUHJlcHJvY2Vzc2luZyBhbGxvd3MgYSBiaW5kaW5nIHByb3ZpZGVyIHRvIG11dGF0ZSBhIG5vZGUgYmVmb3JlIGJpbmRpbmdzIGFyZSBhcHBsaWVkIHRvIGl0LiBGb3IgZXhhbXBsZSBpdCdzXG4gICAgICAgIC8vIHBvc3NpYmxlIHRvIGluc2VydCBuZXcgc2libGluZ3MgYWZ0ZXIgaXQsIGFuZC9vciByZXBsYWNlIHRoZSBub2RlIHdpdGggYSBkaWZmZXJlbnQgb25lLiBUaGlzIGNhbiBiZSB1c2VkIHRvXG4gICAgICAgIC8vIGltcGxlbWVudCBjdXN0b20gYmluZGluZyBzeW50YXhlcywgc3VjaCBhcyB7eyB2YWx1ZSB9fSBmb3Igc3RyaW5nIGludGVycG9sYXRpb24sIG9yIGN1c3RvbSBlbGVtZW50IHR5cGVzIHRoYXRcbiAgICAgICAgLy8gdHJpZ2dlciBpbnNlcnRpb24gb2YgPHRlbXBsYXRlPiBjb250ZW50cyBhdCB0aGF0IHBvaW50IGluIHRoZSBkb2N1bWVudC5cbiAgICAgICAgaWYgKHByZXByb2Nlc3NOb2RlKSB7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudENoaWxkID0gbmV4dEluUXVldWUpIHtcbiAgICAgICAgICAgICAgICBuZXh0SW5RdWV1ZSA9IGtvLnZpcnR1YWxFbGVtZW50cy5uZXh0U2libGluZyhjdXJyZW50Q2hpbGQpO1xuICAgICAgICAgICAgICAgIHByZXByb2Nlc3NOb2RlLmNhbGwocHJvdmlkZXIsIGN1cnJlbnRDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXNldCBuZXh0SW5RdWV1ZSBmb3IgdGhlIG5leHQgbG9vcFxuICAgICAgICAgICAgbmV4dEluUXVldWUgPSBrby52aXJ0dWFsRWxlbWVudHMuZmlyc3RDaGlsZChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoY3VycmVudENoaWxkID0gbmV4dEluUXVldWUpIHtcbiAgICAgICAgICAgIC8vIEtlZXAgYSByZWNvcmQgb2YgdGhlIG5leHQgY2hpbGQgKmJlZm9yZSogYXBwbHlpbmcgYmluZGluZ3MsIGluIGNhc2UgdGhlIGJpbmRpbmcgcmVtb3ZlcyB0aGUgY3VycmVudCBjaGlsZCBmcm9tIGl0cyBwb3NpdGlvblxuICAgICAgICAgICAgbmV4dEluUXVldWUgPSBrby52aXJ0dWFsRWxlbWVudHMubmV4dFNpYmxpbmcoY3VycmVudENoaWxkKTtcbiAgICAgICAgICAgIGFwcGx5QmluZGluZ3NUb05vZGVBbmREZXNjZW5kYW50c0ludGVybmFsKGJpbmRpbmdDb250ZXh0LCBjdXJyZW50Q2hpbGQsIGJpbmRpbmdDb250ZXh0c01heURpZmZlckZyb21Eb21QYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5QmluZGluZ3NUb05vZGVBbmREZXNjZW5kYW50c0ludGVybmFsIChiaW5kaW5nQ29udGV4dCwgbm9kZVZlcmlmaWVkLCBiaW5kaW5nQ29udGV4dE1heURpZmZlckZyb21Eb21QYXJlbnRFbGVtZW50KSB7XG4gICAgICAgIHZhciBzaG91bGRCaW5kRGVzY2VuZGFudHMgPSB0cnVlO1xuXG4gICAgICAgIC8vIFBlcmYgb3B0aW1pc2F0aW9uOiBBcHBseSBiaW5kaW5ncyBvbmx5IGlmLi4uXG4gICAgICAgIC8vICgxKSBXZSBuZWVkIHRvIHN0b3JlIHRoZSBiaW5kaW5nIGNvbnRleHQgb24gdGhpcyBub2RlIChiZWNhdXNlIGl0IG1heSBkaWZmZXIgZnJvbSB0aGUgRE9NIHBhcmVudCBub2RlJ3MgYmluZGluZyBjb250ZXh0KVxuICAgICAgICAvLyAgICAgTm90ZSB0aGF0IHdlIGNhbid0IHN0b3JlIGJpbmRpbmcgY29udGV4dHMgb24gbm9uLWVsZW1lbnRzIChlLmcuLCB0ZXh0IG5vZGVzKSwgYXMgSUUgZG9lc24ndCBhbGxvdyBleHBhbmRvIHByb3BlcnRpZXMgZm9yIHRob3NlXG4gICAgICAgIC8vICgyKSBJdCBtaWdodCBoYXZlIGJpbmRpbmdzIChlLmcuLCBpdCBoYXMgYSBkYXRhLWJpbmQgYXR0cmlidXRlLCBvciBpdCdzIGEgbWFya2VyIGZvciBhIGNvbnRhaW5lcmxlc3MgdGVtcGxhdGUpXG4gICAgICAgIHZhciBpc0VsZW1lbnQgPSAobm9kZVZlcmlmaWVkLm5vZGVUeXBlID09PSAxKTtcbiAgICAgICAgaWYgKGlzRWxlbWVudCkgLy8gV29ya2Fyb3VuZCBJRSA8PSA4IEhUTUwgcGFyc2luZyB3ZWlyZG5lc3NcbiAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5ub3JtYWxpc2VWaXJ0dWFsRWxlbWVudERvbVN0cnVjdHVyZShub2RlVmVyaWZpZWQpO1xuXG4gICAgICAgIHZhciBzaG91bGRBcHBseUJpbmRpbmdzID0gKGlzRWxlbWVudCAmJiBiaW5kaW5nQ29udGV4dE1heURpZmZlckZyb21Eb21QYXJlbnRFbGVtZW50KSAgICAgICAgICAgICAvLyBDYXNlICgxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGtvLmJpbmRpbmdQcm92aWRlclsnaW5zdGFuY2UnXVsnbm9kZUhhc0JpbmRpbmdzJ10obm9kZVZlcmlmaWVkKTsgICAgICAgLy8gQ2FzZSAoMilcbiAgICAgICAgaWYgKHNob3VsZEFwcGx5QmluZGluZ3MpXG4gICAgICAgICAgICBzaG91bGRCaW5kRGVzY2VuZGFudHMgPSBhcHBseUJpbmRpbmdzVG9Ob2RlSW50ZXJuYWwobm9kZVZlcmlmaWVkLCBudWxsLCBiaW5kaW5nQ29udGV4dCwgYmluZGluZ0NvbnRleHRNYXlEaWZmZXJGcm9tRG9tUGFyZW50RWxlbWVudClbJ3Nob3VsZEJpbmREZXNjZW5kYW50cyddO1xuXG4gICAgICAgIGlmIChzaG91bGRCaW5kRGVzY2VuZGFudHMgJiYgIWJpbmRpbmdEb2VzTm90UmVjdXJzZUludG9FbGVtZW50VHlwZXNba28udXRpbHMudGFnTmFtZUxvd2VyKG5vZGVWZXJpZmllZCldKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSByZWN1cnNpbmcgYXV0b21hdGljYWxseSBpbnRvIChyZWFsIG9yIHZpcnR1YWwpIGNoaWxkIG5vZGVzIHdpdGhvdXQgY2hhbmdpbmcgYmluZGluZyBjb250ZXh0cy4gU28sXG4gICAgICAgICAgICAvLyAgKiBGb3IgY2hpbGRyZW4gb2YgYSAqcmVhbCogZWxlbWVudCwgdGhlIGJpbmRpbmcgY29udGV4dCBpcyBjZXJ0YWlubHkgdGhlIHNhbWUgYXMgb24gdGhlaXIgRE9NIC5wYXJlbnROb2RlLFxuICAgICAgICAgICAgLy8gICAgaGVuY2UgYmluZGluZ0NvbnRleHRzTWF5RGlmZmVyRnJvbURvbVBhcmVudEVsZW1lbnQgaXMgZmFsc2VcbiAgICAgICAgICAgIC8vICAqIEZvciBjaGlsZHJlbiBvZiBhICp2aXJ0dWFsKiBlbGVtZW50LCB3ZSBjYW4ndCBiZSBzdXJlLiBFdmFsdWF0aW5nIC5wYXJlbnROb2RlIG9uIHRob3NlIGNoaWxkcmVuIG1heVxuICAgICAgICAgICAgLy8gICAgc2tpcCBvdmVyIGFueSBudW1iZXIgb2YgaW50ZXJtZWRpYXRlIHZpcnR1YWwgZWxlbWVudHMsIGFueSBvZiB3aGljaCBtaWdodCBkZWZpbmUgYSBjdXN0b20gYmluZGluZyBjb250ZXh0LFxuICAgICAgICAgICAgLy8gICAgaGVuY2UgYmluZGluZ0NvbnRleHRzTWF5RGlmZmVyRnJvbURvbVBhcmVudEVsZW1lbnQgaXMgdHJ1ZVxuICAgICAgICAgICAgYXBwbHlCaW5kaW5nc1RvRGVzY2VuZGFudHNJbnRlcm5hbChiaW5kaW5nQ29udGV4dCwgbm9kZVZlcmlmaWVkLCAvKiBiaW5kaW5nQ29udGV4dHNNYXlEaWZmZXJGcm9tRG9tUGFyZW50RWxlbWVudDogKi8gIWlzRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYm91bmRFbGVtZW50RG9tRGF0YUtleSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpO1xuXG5cbiAgICBmdW5jdGlvbiB0b3BvbG9naWNhbFNvcnRCaW5kaW5ncyhiaW5kaW5ncykge1xuICAgICAgICAvLyBEZXB0aC1maXJzdCBzb3J0XG4gICAgICAgIHZhciByZXN1bHQgPSBbXSwgICAgICAgICAgICAgICAgLy8gVGhlIGxpc3Qgb2Yga2V5L2hhbmRsZXIgcGFpcnMgdGhhdCB3ZSB3aWxsIHJldHVyblxuICAgICAgICAgICAgYmluZGluZ3NDb25zaWRlcmVkID0ge30sICAgIC8vIEEgdGVtcG9yYXJ5IHJlY29yZCBvZiB3aGljaCBiaW5kaW5ncyBhcmUgYWxyZWFkeSBpbiAncmVzdWx0J1xuICAgICAgICAgICAgY3ljbGljRGVwZW5kZW5jeVN0YWNrID0gW107IC8vIEtlZXBzIHRyYWNrIG9mIGEgZGVwdGgtc2VhcmNoIHNvIHRoYXQsIGlmIHRoZXJlJ3MgYSBjeWNsZSwgd2Uga25vdyB3aGljaCBiaW5kaW5ncyBjYXVzZWQgaXRcbiAgICAgICAga28udXRpbHMub2JqZWN0Rm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24gcHVzaEJpbmRpbmcoYmluZGluZ0tleSkge1xuICAgICAgICAgICAgaWYgKCFiaW5kaW5nc0NvbnNpZGVyZWRbYmluZGluZ0tleV0pIHtcbiAgICAgICAgICAgICAgICB2YXIgYmluZGluZyA9IGtvWydnZXRCaW5kaW5nSGFuZGxlciddKGJpbmRpbmdLZXkpO1xuICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IGFkZCBkZXBlbmRlbmNpZXMgKGlmIGFueSkgb2YgdGhlIGN1cnJlbnQgYmluZGluZ1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ1snYWZ0ZXInXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGljRGVwZW5kZW5jeVN0YWNrLnB1c2goYmluZGluZ0tleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goYmluZGluZ1snYWZ0ZXInXSwgZnVuY3Rpb24oYmluZGluZ0RlcGVuZGVuY3lLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ3NbYmluZGluZ0RlcGVuZGVuY3lLZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrby51dGlscy5hcnJheUluZGV4T2YoY3ljbGljRGVwZW5kZW5jeVN0YWNrLCBiaW5kaW5nRGVwZW5kZW5jeUtleSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkNhbm5vdCBjb21iaW5lIHRoZSBmb2xsb3dpbmcgYmluZGluZ3MsIGJlY2F1c2UgdGhleSBoYXZlIGEgY3ljbGljIGRlcGVuZGVuY3k6IFwiICsgY3ljbGljRGVwZW5kZW5jeVN0YWNrLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQmluZGluZyhiaW5kaW5nRGVwZW5kZW5jeUtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xpY0RlcGVuZGVuY3lTdGFjay5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBOZXh0IGFkZCB0aGUgY3VycmVudCBiaW5kaW5nXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsga2V5OiBiaW5kaW5nS2V5LCBoYW5kbGVyOiBiaW5kaW5nIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBiaW5kaW5nc0NvbnNpZGVyZWRbYmluZGluZ0tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5QmluZGluZ3NUb05vZGVJbnRlcm5hbChub2RlLCBzb3VyY2VCaW5kaW5ncywgYmluZGluZ0NvbnRleHQsIGJpbmRpbmdDb250ZXh0TWF5RGlmZmVyRnJvbURvbVBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgLy8gUHJldmVudCBtdWx0aXBsZSBhcHBseUJpbmRpbmdzIGNhbGxzIGZvciB0aGUgc2FtZSBub2RlLCBleGNlcHQgd2hlbiBhIGJpbmRpbmcgdmFsdWUgaXMgc3BlY2lmaWVkXG4gICAgICAgIHZhciBhbHJlYWR5Qm91bmQgPSBrby51dGlscy5kb21EYXRhLmdldChub2RlLCBib3VuZEVsZW1lbnREb21EYXRhS2V5KTtcbiAgICAgICAgaWYgKCFzb3VyY2VCaW5kaW5ncykge1xuICAgICAgICAgICAgaWYgKGFscmVhZHlCb3VuZCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiWW91IGNhbm5vdCBhcHBseSBiaW5kaW5ncyBtdWx0aXBsZSB0aW1lcyB0byB0aGUgc2FtZSBlbGVtZW50LlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtvLnV0aWxzLmRvbURhdGEuc2V0KG5vZGUsIGJvdW5kRWxlbWVudERvbURhdGFLZXksIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBEb24ndCBzdG9yZSB0aGUgYmluZGluZyBjb250ZXh0IG9uIHRoaXMgbm9kZSBpZiBpdCdzIGRlZmluaXRlbHkgdGhlIHNhbWUgYXMgb24gbm9kZS5wYXJlbnROb2RlLCBiZWNhdXNlXG4gICAgICAgIC8vIHdlIGNhbiBlYXNpbHkgcmVjb3ZlciBpdCBqdXN0IGJ5IHNjYW5uaW5nIHVwIHRoZSBub2RlJ3MgYW5jZXN0b3JzIGluIHRoZSBET01cbiAgICAgICAgLy8gKG5vdGU6IGhlcmUsIHBhcmVudCBub2RlIG1lYW5zIFwicmVhbCBET00gcGFyZW50XCIgbm90IFwidmlydHVhbCBwYXJlbnRcIiwgYXMgdGhlcmUncyBubyBPKDEpIHdheSB0byBmaW5kIHRoZSB2aXJ0dWFsIHBhcmVudClcbiAgICAgICAgaWYgKCFhbHJlYWR5Qm91bmQgJiYgYmluZGluZ0NvbnRleHRNYXlEaWZmZXJGcm9tRG9tUGFyZW50RWxlbWVudClcbiAgICAgICAgICAgIGtvLnN0b3JlZEJpbmRpbmdDb250ZXh0Rm9yTm9kZShub2RlLCBiaW5kaW5nQ29udGV4dCk7XG5cbiAgICAgICAgLy8gVXNlIGJpbmRpbmdzIGlmIGdpdmVuLCBvdGhlcndpc2UgZmFsbCBiYWNrIG9uIGFza2luZyB0aGUgYmluZGluZ3MgcHJvdmlkZXIgdG8gZ2l2ZSB1cyBzb21lIGJpbmRpbmdzXG4gICAgICAgIHZhciBiaW5kaW5ncztcbiAgICAgICAgaWYgKHNvdXJjZUJpbmRpbmdzICYmIHR5cGVvZiBzb3VyY2VCaW5kaW5ncyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYmluZGluZ3MgPSBzb3VyY2VCaW5kaW5ncztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IGtvLmJpbmRpbmdQcm92aWRlclsnaW5zdGFuY2UnXSxcbiAgICAgICAgICAgICAgICBnZXRCaW5kaW5ncyA9IHByb3ZpZGVyWydnZXRCaW5kaW5nQWNjZXNzb3JzJ10gfHwgZ2V0QmluZGluZ3NBbmRNYWtlQWNjZXNzb3JzO1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGJpbmRpbmcgZnJvbSB0aGUgcHJvdmlkZXIgd2l0aGluIGEgY29tcHV0ZWQgb2JzZXJ2YWJsZSBzbyB0aGF0IHdlIGNhbiB1cGRhdGUgdGhlIGJpbmRpbmdzIHdoZW5ldmVyXG4gICAgICAgICAgICAvLyB0aGUgYmluZGluZyBjb250ZXh0IGlzIHVwZGF0ZWQgb3IgaWYgdGhlIGJpbmRpbmcgcHJvdmlkZXIgYWNjZXNzZXMgb2JzZXJ2YWJsZXMuXG4gICAgICAgICAgICB2YXIgYmluZGluZ3NVcGRhdGVyID0ga28uZGVwZW5kZW50T2JzZXJ2YWJsZShcbiAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgYmluZGluZ3MgPSBzb3VyY2VCaW5kaW5ncyA/IHNvdXJjZUJpbmRpbmdzKGJpbmRpbmdDb250ZXh0LCBub2RlKSA6IGdldEJpbmRpbmdzLmNhbGwocHJvdmlkZXIsIG5vZGUsIGJpbmRpbmdDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgYSBkZXBlbmRlbmN5IG9uIHRoZSBiaW5kaW5nIGNvbnRleHQgdG8gc3VwcG9ydCBvYnNlcnZhYmxlIHZpZXcgbW9kZWxzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGluZ3MgJiYgYmluZGluZ0NvbnRleHQuX3N1YnNjcmliYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDb250ZXh0Ll9zdWJzY3JpYmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IG5vZGUgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKCFiaW5kaW5ncyB8fCAhYmluZGluZ3NVcGRhdGVyLmlzQWN0aXZlKCkpXG4gICAgICAgICAgICAgICAgYmluZGluZ3NVcGRhdGVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBiaW5kaW5nSGFuZGxlclRoYXRDb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncztcbiAgICAgICAgaWYgKGJpbmRpbmdzKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGFjY2Vzc29yIGZvciBhIGdpdmVuIGJpbmRpbmcuIFdoZW4gYmluZGluZ3MgYXJlIHN0YXRpYyAod29uJ3QgYmUgdXBkYXRlZCBiZWNhdXNlIG9mIGEgYmluZGluZ1xuICAgICAgICAgICAgLy8gY29udGV4dCB1cGRhdGUpLCBqdXN0IHJldHVybiB0aGUgdmFsdWUgYWNjZXNzb3IgZnJvbSB0aGUgYmluZGluZy4gT3RoZXJ3aXNlLCByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyBnZXRzXG4gICAgICAgICAgICAvLyB0aGUgbGF0ZXN0IGJpbmRpbmcgdmFsdWUgYW5kIHJlZ2lzdGVycyBhIGRlcGVuZGVuY3kgb24gdGhlIGJpbmRpbmcgdXBkYXRlci5cbiAgICAgICAgICAgIHZhciBnZXRWYWx1ZUFjY2Vzc29yID0gYmluZGluZ3NVcGRhdGVyXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbihiaW5kaW5nS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsdWF0ZVZhbHVlQWNjZXNzb3IoYmluZGluZ3NVcGRhdGVyKClbYmluZGluZ0tleV0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbihiaW5kaW5nS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nc1tiaW5kaW5nS2V5XTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBVc2Ugb2YgYWxsQmluZGluZ3MgYXMgYSBmdW5jdGlvbiBpcyBtYWludGFpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0cyB1c2UgaXMgZGVwcmVjYXRlZFxuICAgICAgICAgICAgZnVuY3Rpb24gYWxsQmluZGluZ3MoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLm9iamVjdE1hcChiaW5kaW5nc1VwZGF0ZXIgPyBiaW5kaW5nc1VwZGF0ZXIoKSA6IGJpbmRpbmdzLCBldmFsdWF0ZVZhbHVlQWNjZXNzb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBpcyB0aGUgMy54IGFsbEJpbmRpbmdzIEFQSVxuICAgICAgICAgICAgYWxsQmluZGluZ3NbJ2dldCddID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzW2tleV0gJiYgZXZhbHVhdGVWYWx1ZUFjY2Vzc29yKGdldFZhbHVlQWNjZXNzb3Ioa2V5KSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYWxsQmluZGluZ3NbJ2hhcyddID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleSBpbiBiaW5kaW5ncztcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEZpcnN0IHB1dCB0aGUgYmluZGluZ3MgaW50byB0aGUgcmlnaHQgb3JkZXJcbiAgICAgICAgICAgIHZhciBvcmRlcmVkQmluZGluZ3MgPSB0b3BvbG9naWNhbFNvcnRCaW5kaW5ncyhiaW5kaW5ncyk7XG5cbiAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIHNvcnRlZCBiaW5kaW5ncywgY2FsbGluZyBpbml0IGFuZCB1cGRhdGUgZm9yIGVhY2hcbiAgICAgICAgICAgIGtvLnV0aWxzLmFycmF5Rm9yRWFjaChvcmRlcmVkQmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmdLZXlBbmRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRvcG9sb2dpY2FsU29ydEJpbmRpbmdzIGhhcyBhbHJlYWR5IGZpbHRlcmVkIG91dCBhbnkgbm9uZXhpc3RlbnQgYmluZGluZyBoYW5kbGVycyxcbiAgICAgICAgICAgICAgICAvLyBzbyBiaW5kaW5nS2V5QW5kSGFuZGxlci5oYW5kbGVyIHdpbGwgYWx3YXlzIGJlIG5vbm51bGwuXG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZXJJbml0Rm4gPSBiaW5kaW5nS2V5QW5kSGFuZGxlci5oYW5kbGVyW1wiaW5pdFwiXSxcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlclVwZGF0ZUZuID0gYmluZGluZ0tleUFuZEhhbmRsZXIuaGFuZGxlcltcInVwZGF0ZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgYmluZGluZ0tleSA9IGJpbmRpbmdLZXlBbmRIYW5kbGVyLmtleTtcblxuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlVGhhdEJpbmRpbmdJc0FsbG93ZWRGb3JWaXJ0dWFsRWxlbWVudHMoYmluZGluZ0tleSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUnVuIGluaXQsIGlnbm9yaW5nIGFueSBkZXBlbmRlbmNpZXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVySW5pdEZuID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRSZXN1bHQgPSBoYW5kbGVySW5pdEZuKG5vZGUsIGdldFZhbHVlQWNjZXNzb3IoYmluZGluZ0tleSksIGFsbEJpbmRpbmdzLCBiaW5kaW5nQ29udGV4dFsnJGRhdGEnXSwgYmluZGluZ0NvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBiaW5kaW5nIGhhbmRsZXIgY2xhaW1zIHRvIGNvbnRyb2wgZGVzY2VuZGFudCBiaW5kaW5ncywgbWFrZSBhIG5vdGUgb2YgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbml0UmVzdWx0ICYmIGluaXRSZXN1bHRbJ2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpbmRpbmdIYW5kbGVyVGhhdENvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdWx0aXBsZSBiaW5kaW5ncyAoXCIgKyBiaW5kaW5nSGFuZGxlclRoYXRDb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncyArIFwiIGFuZCBcIiArIGJpbmRpbmdLZXkgKyBcIikgYXJlIHRyeWluZyB0byBjb250cm9sIGRlc2NlbmRhbnQgYmluZGluZ3Mgb2YgdGhlIHNhbWUgZWxlbWVudC4gWW91IGNhbm5vdCB1c2UgdGhlc2UgYmluZGluZ3MgdG9nZXRoZXIgb24gdGhlIHNhbWUgZWxlbWVudC5cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdIYW5kbGVyVGhhdENvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzID0gYmluZGluZ0tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJ1biB1cGRhdGUgaW4gaXRzIG93biBjb21wdXRlZCB3cmFwcGVyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlclVwZGF0ZUZuID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAga28uZGVwZW5kZW50T2JzZXJ2YWJsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclVwZGF0ZUZuKG5vZGUsIGdldFZhbHVlQWNjZXNzb3IoYmluZGluZ0tleSksIGFsbEJpbmRpbmdzLCBiaW5kaW5nQ29udGV4dFsnJGRhdGEnXSwgYmluZGluZ0NvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogbm9kZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZXgubWVzc2FnZSA9IFwiVW5hYmxlIHRvIHByb2Nlc3MgYmluZGluZyBcXFwiXCIgKyBiaW5kaW5nS2V5ICsgXCI6IFwiICsgYmluZGluZ3NbYmluZGluZ0tleV0gKyBcIlxcXCJcXG5NZXNzYWdlOiBcIiArIGV4Lm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdzaG91bGRCaW5kRGVzY2VuZGFudHMnOiBiaW5kaW5nSGFuZGxlclRoYXRDb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncyA9PT0gdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBzdG9yZWRCaW5kaW5nQ29udGV4dERvbURhdGFLZXkgPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKTtcbiAgICBrby5zdG9yZWRCaW5kaW5nQ29udGV4dEZvck5vZGUgPSBmdW5jdGlvbiAobm9kZSwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikge1xuICAgICAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQobm9kZSwgc3RvcmVkQmluZGluZ0NvbnRleHREb21EYXRhS2V5LCBiaW5kaW5nQ29udGV4dCk7XG4gICAgICAgICAgICBpZiAoYmluZGluZ0NvbnRleHQuX3N1YnNjcmliYWJsZSlcbiAgICAgICAgICAgICAgICBiaW5kaW5nQ29udGV4dC5fc3Vic2NyaWJhYmxlLl9hZGROb2RlKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLmRvbURhdGEuZ2V0KG5vZGUsIHN0b3JlZEJpbmRpbmdDb250ZXh0RG9tRGF0YUtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRCaW5kaW5nQ29udGV4dCh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0ICYmICh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0IGluc3RhbmNlb2Yga28uYmluZGluZ0NvbnRleHQpXG4gICAgICAgICAgICA/IHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHRcbiAgICAgICAgICAgIDogbmV3IGtvLmJpbmRpbmdDb250ZXh0KHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQpO1xuICAgIH1cblxuICAgIGtvLmFwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZSA9IGZ1bmN0aW9uIChub2RlLCBiaW5kaW5ncywgdmlld01vZGVsT3JCaW5kaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgLy8gSWYgaXQncyBhbiBlbGVtZW50LCB3b3JrYXJvdW5kIElFIDw9IDggSFRNTCBwYXJzaW5nIHdlaXJkbmVzc1xuICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLm5vcm1hbGlzZVZpcnR1YWxFbGVtZW50RG9tU3RydWN0dXJlKG5vZGUpO1xuICAgICAgICByZXR1cm4gYXBwbHlCaW5kaW5nc1RvTm9kZUludGVybmFsKG5vZGUsIGJpbmRpbmdzLCBnZXRCaW5kaW5nQ29udGV4dCh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0KSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIGtvLmFwcGx5QmluZGluZ3NUb05vZGUgPSBmdW5jdGlvbiAobm9kZSwgYmluZGluZ3MsIHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSBnZXRCaW5kaW5nQ29udGV4dCh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIGtvLmFwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZShub2RlLCBtYWtlQmluZGluZ0FjY2Vzc29ycyhiaW5kaW5ncywgY29udGV4dCwgbm9kZSksIGNvbnRleHQpO1xuICAgIH07XG5cbiAgICBrby5hcHBseUJpbmRpbmdzVG9EZXNjZW5kYW50cyA9IGZ1bmN0aW9uKHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQsIHJvb3ROb2RlKSB7XG4gICAgICAgIGlmIChyb290Tm9kZS5ub2RlVHlwZSA9PT0gMSB8fCByb290Tm9kZS5ub2RlVHlwZSA9PT0gOClcbiAgICAgICAgICAgIGFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzSW50ZXJuYWwoZ2V0QmluZGluZ0NvbnRleHQodmlld01vZGVsT3JCaW5kaW5nQ29udGV4dCksIHJvb3ROb2RlLCB0cnVlKTtcbiAgICB9O1xuXG4gICAga28uYXBwbHlCaW5kaW5ncyA9IGZ1bmN0aW9uICh2aWV3TW9kZWxPckJpbmRpbmdDb250ZXh0LCByb290Tm9kZSkge1xuICAgICAgICAvLyBJZiBqUXVlcnkgaXMgbG9hZGVkIGFmdGVyIEtub2Nrb3V0LCB3ZSB3b24ndCBpbml0aWFsbHkgaGF2ZSBhY2Nlc3MgdG8gaXQuIFNvIHNhdmUgaXQgaGVyZS5cbiAgICAgICAgaWYgKCFqUXVlcnlJbnN0YW5jZSAmJiB3aW5kb3dbJ2pRdWVyeSddKSB7XG4gICAgICAgICAgICBqUXVlcnlJbnN0YW5jZSA9IHdpbmRvd1snalF1ZXJ5J107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm9vdE5vZGUgJiYgKHJvb3ROb2RlLm5vZGVUeXBlICE9PSAxKSAmJiAocm9vdE5vZGUubm9kZVR5cGUgIT09IDgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwia28uYXBwbHlCaW5kaW5nczogZmlyc3QgcGFyYW1ldGVyIHNob3VsZCBiZSB5b3VyIHZpZXcgbW9kZWw7IHNlY29uZCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgRE9NIG5vZGVcIik7XG4gICAgICAgIHJvb3ROb2RlID0gcm9vdE5vZGUgfHwgd2luZG93LmRvY3VtZW50LmJvZHk7IC8vIE1ha2UgXCJyb290Tm9kZVwiIHBhcmFtZXRlciBvcHRpb25hbFxuXG4gICAgICAgIGFwcGx5QmluZGluZ3NUb05vZGVBbmREZXNjZW5kYW50c0ludGVybmFsKGdldEJpbmRpbmdDb250ZXh0KHZpZXdNb2RlbE9yQmluZGluZ0NvbnRleHQpLCByb290Tm9kZSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8vIFJldHJpZXZpbmcgYmluZGluZyBjb250ZXh0IGZyb20gYXJiaXRyYXJ5IG5vZGVzXG4gICAga28uY29udGV4dEZvciA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgLy8gV2UgY2FuIG9ubHkgZG8gc29tZXRoaW5nIG1lYW5pbmdmdWwgZm9yIGVsZW1lbnRzIGFuZCBjb21tZW50IG5vZGVzIChpbiBwYXJ0aWN1bGFyLCBub3QgdGV4dCBub2RlcywgYXMgSUUgY2FuJ3Qgc3RvcmUgZG9tZGF0YSBmb3IgdGhlbSlcbiAgICAgICAgc3dpdGNoIChub2RlLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBrby5zdG9yZWRCaW5kaW5nQ29udGV4dEZvck5vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQpIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHJldHVybiBrby5jb250ZXh0Rm9yKG5vZGUucGFyZW50Tm9kZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIGtvLmRhdGFGb3IgPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0ga28uY29udGV4dEZvcihub2RlKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQgPyBjb250ZXh0WyckZGF0YSddIDogdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICBrby5leHBvcnRTeW1ib2woJ2JpbmRpbmdIYW5kbGVycycsIGtvLmJpbmRpbmdIYW5kbGVycyk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdhcHBseUJpbmRpbmdzJywga28uYXBwbHlCaW5kaW5ncyk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdhcHBseUJpbmRpbmdzVG9EZXNjZW5kYW50cycsIGtvLmFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzKTtcbiAgICBrby5leHBvcnRTeW1ib2woJ2FwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZScsIGtvLmFwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZSk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdhcHBseUJpbmRpbmdzVG9Ob2RlJywga28uYXBwbHlCaW5kaW5nc1RvTm9kZSk7XG4gICAga28uZXhwb3J0U3ltYm9sKCdjb250ZXh0Rm9yJywga28uY29udGV4dEZvcik7XG4gICAga28uZXhwb3J0U3ltYm9sKCdkYXRhRm9yJywga28uZGF0YUZvcik7XG59KSgpO1xuKGZ1bmN0aW9uKHVuZGVmaW5lZCkge1xuICAgIHZhciBsb2FkaW5nU3Vic2NyaWJhYmxlc0NhY2hlID0ge30sIC8vIFRyYWNrcyBjb21wb25lbnQgbG9hZHMgdGhhdCBhcmUgY3VycmVudGx5IGluIGZsaWdodFxuICAgICAgICBsb2FkZWREZWZpbml0aW9uc0NhY2hlID0ge307ICAgIC8vIFRyYWNrcyBjb21wb25lbnQgbG9hZHMgdGhhdCBoYXZlIGFscmVhZHkgY29tcGxldGVkXG5cbiAgICBrby5jb21wb25lbnRzID0ge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgY2FjaGVkRGVmaW5pdGlvbiA9IGdldE9iamVjdE93blByb3BlcnR5KGxvYWRlZERlZmluaXRpb25zQ2FjaGUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIGFscmVhZHkgbG9hZGVkIGFuZCBjYWNoZWQuIFJldXNlIHRoZSBzYW1lIGRlZmluaXRpb24gb2JqZWN0LlxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBmb3IgQVBJIGNvbnNpc3RlbmN5LCBldmVuIGNhY2hlIGhpdHMgY29tcGxldGUgYXN5bmNocm9ub3VzbHkgYnkgZGVmYXVsdC5cbiAgICAgICAgICAgICAgICAvLyBZb3UgY2FuIGJ5cGFzcyB0aGlzIGJ5IHB1dHRpbmcgc3luY2hyb25vdXM6dHJ1ZSBvbiB5b3VyIGNvbXBvbmVudCBjb25maWcuXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlZERlZmluaXRpb24uaXNTeW5jaHJvbm91c0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZShmdW5jdGlvbigpIHsgLy8gU2VlIGNvbW1lbnQgaW4gbG9hZGVyUmVnaXN0cnlCZWhhdmlvcnMuanMgZm9yIHJlYXNvbmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soY2FjaGVkRGVmaW5pdGlvbi5kZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAga28udGFza3Muc2NoZWR1bGUoZnVuY3Rpb24oKSB7IGNhbGxiYWNrKGNhY2hlZERlZmluaXRpb24uZGVmaW5pdGlvbik7IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSm9pbiB0aGUgbG9hZGluZyBwcm9jZXNzIHRoYXQgaXMgYWxyZWFkeSB1bmRlcndheSwgb3Igc3RhcnQgYSBuZXcgb25lLlxuICAgICAgICAgICAgICAgIGxvYWRDb21wb25lbnRBbmROb3RpZnkoY29tcG9uZW50TmFtZSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGNsZWFyQ2FjaGVkRGVmaW5pdGlvbjogZnVuY3Rpb24oY29tcG9uZW50TmFtZSkge1xuICAgICAgICAgICAgZGVsZXRlIGxvYWRlZERlZmluaXRpb25zQ2FjaGVbY29tcG9uZW50TmFtZV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2dldEZpcnN0UmVzdWx0RnJvbUxvYWRlcnM6IGdldEZpcnN0UmVzdWx0RnJvbUxvYWRlcnNcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gZ2V0T2JqZWN0T3duUHJvcGVydHkob2JqLCBwcm9wTmFtZSkge1xuICAgICAgICByZXR1cm4gb2JqLmhhc093blByb3BlcnR5KHByb3BOYW1lKSA/IG9ialtwcm9wTmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9hZENvbXBvbmVudEFuZE5vdGlmeShjb21wb25lbnROYW1lLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgc3Vic2NyaWJhYmxlID0gZ2V0T2JqZWN0T3duUHJvcGVydHkobG9hZGluZ1N1YnNjcmliYWJsZXNDYWNoZSwgY29tcG9uZW50TmFtZSksXG4gICAgICAgICAgICBjb21wbGV0ZWRBc3luYztcbiAgICAgICAgaWYgKCFzdWJzY3JpYmFibGUpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgbm90IHN0YXJ0ZWQgbG9hZGluZyB5ZXQuIFN0YXJ0IGxvYWRpbmcsIGFuZCB3aGVuIGl0J3MgZG9uZSwgbW92ZSBpdCB0byBsb2FkZWREZWZpbml0aW9uc0NhY2hlLlxuICAgICAgICAgICAgc3Vic2NyaWJhYmxlID0gbG9hZGluZ1N1YnNjcmliYWJsZXNDYWNoZVtjb21wb25lbnROYW1lXSA9IG5ldyBrby5zdWJzY3JpYmFibGUoKTtcbiAgICAgICAgICAgIHN1YnNjcmliYWJsZS5zdWJzY3JpYmUoY2FsbGJhY2spO1xuXG4gICAgICAgICAgICBiZWdpbkxvYWRpbmdDb21wb25lbnQoY29tcG9uZW50TmFtZSwgZnVuY3Rpb24oZGVmaW5pdGlvbiwgY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzU3luY2hyb25vdXNDb21wb25lbnQgPSAhIShjb25maWcgJiYgY29uZmlnWydzeW5jaHJvbm91cyddKTtcbiAgICAgICAgICAgICAgICBsb2FkZWREZWZpbml0aW9uc0NhY2hlW2NvbXBvbmVudE5hbWVdID0geyBkZWZpbml0aW9uOiBkZWZpbml0aW9uLCBpc1N5bmNocm9ub3VzQ29tcG9uZW50OiBpc1N5bmNocm9ub3VzQ29tcG9uZW50IH07XG4gICAgICAgICAgICAgICAgZGVsZXRlIGxvYWRpbmdTdWJzY3JpYmFibGVzQ2FjaGVbY29tcG9uZW50TmFtZV07XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgQVBJIGNvbnNpc3RlbmN5LCBhbGwgbG9hZHMgY29tcGxldGUgYXN5bmNocm9ub3VzbHkuIEhvd2V2ZXIgd2Ugd2FudCB0byBhdm9pZFxuICAgICAgICAgICAgICAgIC8vIGFkZGluZyBhbiBleHRyYSB0YXNrIHNjaGVkdWxlIGlmIGl0J3MgdW5uZWNlc3NhcnkgKGkuZS4sIHRoZSBjb21wbGV0aW9uIGlzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAvLyBhc3luYykuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBZb3UgY2FuIGJ5cGFzcyB0aGUgJ2Fsd2F5cyBhc3luY2hyb25vdXMnIGZlYXR1cmUgYnkgcHV0dGluZyB0aGUgc3luY2hyb25vdXM6dHJ1ZVxuICAgICAgICAgICAgICAgIC8vIGZsYWcgb24geW91ciBjb21wb25lbnQgY29uZmlndXJhdGlvbiB3aGVuIHlvdSByZWdpc3RlciBpdC5cbiAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkQXN5bmMgfHwgaXNTeW5jaHJvbm91c0NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgbm90aWZ5U3Vic2NyaWJlcnMgaWdub3JlcyBhbnkgZGVwZW5kZW5jaWVzIHJlYWQgd2l0aGluIHRoZSBjYWxsYmFjay5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGNvbW1lbnQgaW4gbG9hZGVyUmVnaXN0cnlCZWhhdmlvcnMuanMgZm9yIHJlYXNvbmluZ1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmFibGVbJ25vdGlmeVN1YnNjcmliZXJzJ10oZGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAga28udGFza3Muc2NoZWR1bGUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmFibGVbJ25vdGlmeVN1YnNjcmliZXJzJ10oZGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29tcGxldGVkQXN5bmMgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3Vic2NyaWJhYmxlLnN1YnNjcmliZShjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBiZWdpbkxvYWRpbmdDb21wb25lbnQoY29tcG9uZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgZ2V0Rmlyc3RSZXN1bHRGcm9tTG9hZGVycygnZ2V0Q29uZmlnJywgW2NvbXBvbmVudE5hbWVdLCBmdW5jdGlvbihjb25maWcpIHtcbiAgICAgICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgY29uZmlnLCBzbyBub3cgbG9hZCBpdHMgZGVmaW5pdGlvblxuICAgICAgICAgICAgICAgIGdldEZpcnN0UmVzdWx0RnJvbUxvYWRlcnMoJ2xvYWRDb21wb25lbnQnLCBbY29tcG9uZW50TmFtZSwgY29uZmlnXSwgZnVuY3Rpb24oZGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhkZWZpbml0aW9uLCBjb25maWcpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgY29tcG9uZW50IGhhcyBubyBjb25maWcgLSBpdCdzIHVua25vd24gdG8gYWxsIHRoZSBsb2FkZXJzLlxuICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhbiBlcnJvciAoZS5nLiwgYSBtb2R1bGUgbG9hZGluZyBlcnJvcikgLSB0aGF0IHdvdWxkIGFib3J0IHRoZVxuICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgYW5kIHRoaXMgY2FsbGJhY2sgd291bGQgbm90IHJ1bi4gRm9yIHRoaXMgY2FsbGJhY2sgdG8gcnVuLCBhbGwgbG9hZGVycyBtdXN0XG4gICAgICAgICAgICAgICAgLy8gaGF2ZSBjb25maXJtZWQgdGhleSBkb24ndCBrbm93IGFib3V0IHRoaXMgY29tcG9uZW50LlxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRGaXJzdFJlc3VsdEZyb21Mb2FkZXJzKG1ldGhvZE5hbWUsIGFyZ3NFeGNlcHRDYWxsYmFjaywgY2FsbGJhY2ssIGNhbmRpZGF0ZUxvYWRlcnMpIHtcbiAgICAgICAgLy8gT24gdGhlIGZpcnN0IGNhbGwgaW4gdGhlIHN0YWNrLCBzdGFydCB3aXRoIHRoZSBmdWxsIHNldCBvZiBsb2FkZXJzXG4gICAgICAgIGlmICghY2FuZGlkYXRlTG9hZGVycykge1xuICAgICAgICAgICAgY2FuZGlkYXRlTG9hZGVycyA9IGtvLmNvbXBvbmVudHNbJ2xvYWRlcnMnXS5zbGljZSgwKTsgLy8gVXNlIGEgY29weSwgYmVjYXVzZSB3ZSdsbCBiZSBtdXRhdGluZyB0aGlzIGFycmF5XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgdGhlIG5leHQgY2FuZGlkYXRlXG4gICAgICAgIHZhciBjdXJyZW50Q2FuZGlkYXRlTG9hZGVyID0gY2FuZGlkYXRlTG9hZGVycy5zaGlmdCgpO1xuICAgICAgICBpZiAoY3VycmVudENhbmRpZGF0ZUxvYWRlcikge1xuICAgICAgICAgICAgdmFyIG1ldGhvZEluc3RhbmNlID0gY3VycmVudENhbmRpZGF0ZUxvYWRlclttZXRob2ROYW1lXTtcbiAgICAgICAgICAgIGlmIChtZXRob2RJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIHZhciB3YXNBYm9ydGVkID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHN5bmNocm9ub3VzUmV0dXJuVmFsdWUgPSBtZXRob2RJbnN0YW5jZS5hcHBseShjdXJyZW50Q2FuZGlkYXRlTG9hZGVyLCBhcmdzRXhjZXB0Q2FsbGJhY2suY29uY2F0KGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0Fib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjYW5kaWRhdGUgcmV0dXJuZWQgYSB2YWx1ZS4gVXNlIGl0LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0aGUgbmV4dCBjYW5kaWRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGaXJzdFJlc3VsdEZyb21Mb2FkZXJzKG1ldGhvZE5hbWUsIGFyZ3NFeGNlcHRDYWxsYmFjaywgY2FsbGJhY2ssIGNhbmRpZGF0ZUxvYWRlcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICAvLyBDdXJyZW50bHksIGxvYWRlcnMgbWF5IG5vdCByZXR1cm4gYW55dGhpbmcgc3luY2hyb25vdXNseS4gVGhpcyBsZWF2ZXMgb3BlbiB0aGUgcG9zc2liaWxpdHlcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHdlJ2xsIGV4dGVuZCB0aGUgQVBJIHRvIHN1cHBvcnQgc3luY2hyb25vdXMgcmV0dXJuIHZhbHVlcyBpbiB0aGUgZnV0dXJlLiBJdCB3b24ndCBiZVxuICAgICAgICAgICAgICAgIC8vIGEgYnJlYWtpbmcgY2hhbmdlLCBiZWNhdXNlIGN1cnJlbnRseSBubyBsb2FkZXIgaXMgYWxsb3dlZCB0byByZXR1cm4gYW55dGhpbmcgZXhjZXB0IHVuZGVmaW5lZC5cbiAgICAgICAgICAgICAgICBpZiAoc3luY2hyb25vdXNSZXR1cm5WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhc0Fib3J0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1ldGhvZCB0byBzdXBwcmVzcyBleGNlcHRpb25zIHdpbGwgcmVtYWluIHVuZG9jdW1lbnRlZC4gVGhpcyBpcyBvbmx5IHRvIGtlZXBcbiAgICAgICAgICAgICAgICAgICAgLy8gS08ncyBzcGVjcyBydW5uaW5nIHRpZGlseSwgc2luY2Ugd2UgY2FuIG9ic2VydmUgdGhlIGxvYWRpbmcgZ290IGFib3J0ZWQgd2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAvLyBoYXZpbmcgZXhjZXB0aW9ucyBjbHV0dGVyaW5nIHVwIHRoZSBjb25zb2xlIHRvby5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50Q2FuZGlkYXRlTG9hZGVyWydzdXBwcmVzc0xvYWRlckV4Y2VwdGlvbnMnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnQgbG9hZGVycyBtdXN0IHN1cHBseSB2YWx1ZXMgYnkgaW52b2tpbmcgdGhlIGNhbGxiYWNrLCBub3QgYnkgcmV0dXJuaW5nIHZhbHVlcyBzeW5jaHJvbm91c2x5LicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbmRpZGF0ZSBkb2Vzbid0IGhhdmUgdGhlIHJlbGV2YW50IGhhbmRsZXIuIFN5bmNocm9ub3VzbHkgbW92ZSBvbiB0byB0aGUgbmV4dCBvbmUuXG4gICAgICAgICAgICAgICAgZ2V0Rmlyc3RSZXN1bHRGcm9tTG9hZGVycyhtZXRob2ROYW1lLCBhcmdzRXhjZXB0Q2FsbGJhY2ssIGNhbGxiYWNrLCBjYW5kaWRhdGVMb2FkZXJzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIGNhbmRpZGF0ZXMgcmV0dXJuZWQgYSB2YWx1ZVxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWZlcmVuY2UgdGhlIGxvYWRlcnMgdmlhIHN0cmluZyBuYW1lIHNvIGl0J3MgcG9zc2libGUgZm9yIGRldmVsb3BlcnNcbiAgICAvLyB0byByZXBsYWNlIHRoZSB3aG9sZSBhcnJheSBieSBhc3NpZ25pbmcgdG8ga28uY29tcG9uZW50cy5sb2FkZXJzXG4gICAga28uY29tcG9uZW50c1snbG9hZGVycyddID0gW107XG5cbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMnLCBrby5jb21wb25lbnRzKTtcbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMuZ2V0Jywga28uY29tcG9uZW50cy5nZXQpO1xuICAgIGtvLmV4cG9ydFN5bWJvbCgnY29tcG9uZW50cy5jbGVhckNhY2hlZERlZmluaXRpb24nLCBrby5jb21wb25lbnRzLmNsZWFyQ2FjaGVkRGVmaW5pdGlvbik7XG59KSgpO1xuKGZ1bmN0aW9uKHVuZGVmaW5lZCkge1xuXG4gICAgLy8gVGhlIGRlZmF1bHQgbG9hZGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0d28gdGhpbmdzOlxuICAgIC8vIDEuIE1haW50YWluaW5nIHRoZSBkZWZhdWx0IGluLW1lbW9yeSByZWdpc3RyeSBvZiBjb21wb25lbnQgY29uZmlndXJhdGlvbiBvYmplY3RzXG4gICAgLy8gICAgKGkuZS4sIHRoZSB0aGluZyB5b3UncmUgd3JpdGluZyB0byB3aGVuIHlvdSBjYWxsIGtvLmNvbXBvbmVudHMucmVnaXN0ZXIoc29tZU5hbWUsIC4uLikpXG4gICAgLy8gMi4gQW5zd2VyaW5nIHJlcXVlc3RzIGZvciBjb21wb25lbnRzIGJ5IGZldGNoaW5nIGNvbmZpZ3VyYXRpb24gb2JqZWN0c1xuICAgIC8vICAgIGZyb20gdGhhdCBkZWZhdWx0IGluLW1lbW9yeSByZWdpc3RyeSBhbmQgcmVzb2x2aW5nIHRoZW0gaW50byBzdGFuZGFyZFxuICAgIC8vICAgIGNvbXBvbmVudCBkZWZpbml0aW9uIG9iamVjdHMgKG9mIHRoZSBmb3JtIHsgY3JlYXRlVmlld01vZGVsOiAuLi4sIHRlbXBsYXRlOiAuLi4gfSlcbiAgICAvLyBDdXN0b20gbG9hZGVycyBtYXkgb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZXNlIGZhY2lsaXRpZXMsIGkuZS4sXG4gICAgLy8gMS4gVG8gc3VwcGx5IGNvbmZpZ3VyYXRpb24gb2JqZWN0cyBmcm9tIHNvbWUgb3RoZXIgc291cmNlIChlLmcuLCBjb252ZW50aW9ucylcbiAgICAvLyAyLiBPciwgdG8gcmVzb2x2ZSBjb25maWd1cmF0aW9uIG9iamVjdHMgYnkgbG9hZGluZyB2aWV3bW9kZWxzL3RlbXBsYXRlcyB2aWEgYXJiaXRyYXJ5IGxvZ2ljLlxuXG4gICAgdmFyIGRlZmF1bHRDb25maWdSZWdpc3RyeSA9IHt9O1xuXG4gICAga28uY29tcG9uZW50cy5yZWdpc3RlciA9IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbmZpZ3VyYXRpb24gZm9yICcgKyBjb21wb25lbnROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrby5jb21wb25lbnRzLmlzUmVnaXN0ZXJlZChjb21wb25lbnROYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnQgJyArIGNvbXBvbmVudE5hbWUgKyAnIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdENvbmZpZ1JlZ2lzdHJ5W2NvbXBvbmVudE5hbWVdID0gY29uZmlnO1xuICAgIH07XG5cbiAgICBrby5jb21wb25lbnRzLmlzUmVnaXN0ZXJlZCA9IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRDb25maWdSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShjb21wb25lbnROYW1lKTtcbiAgICB9O1xuXG4gICAga28uY29tcG9uZW50cy51bnJlZ2lzdGVyID0gZnVuY3Rpb24oY29tcG9uZW50TmFtZSkge1xuICAgICAgICBkZWxldGUgZGVmYXVsdENvbmZpZ1JlZ2lzdHJ5W2NvbXBvbmVudE5hbWVdO1xuICAgICAgICBrby5jb21wb25lbnRzLmNsZWFyQ2FjaGVkRGVmaW5pdGlvbihjb21wb25lbnROYW1lKTtcbiAgICB9O1xuXG4gICAga28uY29tcG9uZW50cy5kZWZhdWx0TG9hZGVyID0ge1xuICAgICAgICAnZ2V0Q29uZmlnJzogZnVuY3Rpb24oY29tcG9uZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBkZWZhdWx0Q29uZmlnUmVnaXN0cnkuaGFzT3duUHJvcGVydHkoY29tcG9uZW50TmFtZSlcbiAgICAgICAgICAgICAgICA/IGRlZmF1bHRDb25maWdSZWdpc3RyeVtjb21wb25lbnROYW1lXVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGNhbGxiYWNrKHJlc3VsdCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ2xvYWRDb21wb25lbnQnOiBmdW5jdGlvbihjb21wb25lbnROYW1lLCBjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JDYWxsYmFjayA9IG1ha2VFcnJvckNhbGxiYWNrKGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgICAgcG9zc2libHlHZXRDb25maWdGcm9tQW1kKGVycm9yQ2FsbGJhY2ssIGNvbmZpZywgZnVuY3Rpb24obG9hZGVkQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZUNvbmZpZyhjb21wb25lbnROYW1lLCBlcnJvckNhbGxiYWNrLCBsb2FkZWRDb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgICdsb2FkVGVtcGxhdGUnOiBmdW5jdGlvbihjb21wb25lbnROYW1lLCB0ZW1wbGF0ZUNvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlc29sdmVUZW1wbGF0ZShtYWtlRXJyb3JDYWxsYmFjayhjb21wb25lbnROYW1lKSwgdGVtcGxhdGVDb25maWcsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnbG9hZFZpZXdNb2RlbCc6IGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUsIHZpZXdNb2RlbENvbmZpZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlc29sdmVWaWV3TW9kZWwobWFrZUVycm9yQ2FsbGJhY2soY29tcG9uZW50TmFtZSksIHZpZXdNb2RlbENvbmZpZywgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBjcmVhdGVWaWV3TW9kZWxLZXkgPSAnY3JlYXRlVmlld01vZGVsJztcblxuICAgIC8vIFRha2VzIGEgY29uZmlnIG9iamVjdCBvZiB0aGUgZm9ybSB7IHRlbXBsYXRlOiAuLi4sIHZpZXdNb2RlbDogLi4uIH0sIGFuZCBhc3luY2hyb25vdXNseSBjb252ZXJ0IGl0XG4gICAgLy8gaW50byB0aGUgc3RhbmRhcmQgY29tcG9uZW50IGRlZmluaXRpb24gZm9ybWF0OlxuICAgIC8vICAgIHsgdGVtcGxhdGU6IDxBcnJheU9mRG9tTm9kZXM+LCBjcmVhdGVWaWV3TW9kZWw6IGZ1bmN0aW9uKHBhcmFtcywgY29tcG9uZW50SW5mbykgeyAuLi4gfSB9LlxuICAgIC8vIFNpbmNlIGJvdGggdGVtcGxhdGUgYW5kIHZpZXdNb2RlbCBtYXkgbmVlZCB0byBiZSByZXNvbHZlZCBhc3luY2hyb25vdXNseSwgYm90aCB0YXNrcyBhcmUgcGVyZm9ybWVkXG4gICAgLy8gaW4gcGFyYWxsZWwsIGFuZCB0aGUgcmVzdWx0cyBqb2luZWQgd2hlbiBib3RoIGFyZSByZWFkeS4gV2UgZG9uJ3QgZGVwZW5kIG9uIGFueSBwcm9taXNlcyBpbmZyYXN0cnVjdHVyZSxcbiAgICAvLyBzbyB0aGlzIGlzIGltcGxlbWVudGVkIG1hbnVhbGx5IGJlbG93LlxuICAgIGZ1bmN0aW9uIHJlc29sdmVDb25maWcoY29tcG9uZW50TmFtZSwgZXJyb3JDYWxsYmFjaywgY29uZmlnLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgcmVzdWx0ID0ge30sXG4gICAgICAgICAgICBtYWtlQ2FsbEJhY2tXaGVuWmVybyA9IDIsXG4gICAgICAgICAgICB0cnlJc3N1ZUNhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgaWYgKC0tbWFrZUNhbGxCYWNrV2hlblplcm8gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGVDb25maWcgPSBjb25maWdbJ3RlbXBsYXRlJ10sXG4gICAgICAgICAgICB2aWV3TW9kZWxDb25maWcgPSBjb25maWdbJ3ZpZXdNb2RlbCddO1xuXG4gICAgICAgIGlmICh0ZW1wbGF0ZUNvbmZpZykge1xuICAgICAgICAgICAgcG9zc2libHlHZXRDb25maWdGcm9tQW1kKGVycm9yQ2FsbGJhY2ssIHRlbXBsYXRlQ29uZmlnLCBmdW5jdGlvbihsb2FkZWRDb25maWcpIHtcbiAgICAgICAgICAgICAgICBrby5jb21wb25lbnRzLl9nZXRGaXJzdFJlc3VsdEZyb21Mb2FkZXJzKCdsb2FkVGVtcGxhdGUnLCBbY29tcG9uZW50TmFtZSwgbG9hZGVkQ29uZmlnXSwgZnVuY3Rpb24ocmVzb2x2ZWRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3RlbXBsYXRlJ10gPSByZXNvbHZlZFRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICB0cnlJc3N1ZUNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeUlzc3VlQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2aWV3TW9kZWxDb25maWcpIHtcbiAgICAgICAgICAgIHBvc3NpYmx5R2V0Q29uZmlnRnJvbUFtZChlcnJvckNhbGxiYWNrLCB2aWV3TW9kZWxDb25maWcsIGZ1bmN0aW9uKGxvYWRlZENvbmZpZykge1xuICAgICAgICAgICAgICAgIGtvLmNvbXBvbmVudHMuX2dldEZpcnN0UmVzdWx0RnJvbUxvYWRlcnMoJ2xvYWRWaWV3TW9kZWwnLCBbY29tcG9uZW50TmFtZSwgbG9hZGVkQ29uZmlnXSwgZnVuY3Rpb24ocmVzb2x2ZWRWaWV3TW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2NyZWF0ZVZpZXdNb2RlbEtleV0gPSByZXNvbHZlZFZpZXdNb2RlbDtcbiAgICAgICAgICAgICAgICAgICAgdHJ5SXNzdWVDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnlJc3N1ZUNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlVGVtcGxhdGUoZXJyb3JDYWxsYmFjaywgdGVtcGxhdGVDb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGVDb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvLyBNYXJrdXAgLSBwYXJzZSBpdFxuICAgICAgICAgICAgY2FsbGJhY2soa28udXRpbHMucGFyc2VIdG1sRnJhZ21lbnQodGVtcGxhdGVDb25maWcpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0ZW1wbGF0ZUNvbmZpZyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAvLyBBc3N1bWUgYWxyZWFkeSBhbiBhcnJheSBvZiBET00gbm9kZXMgLSBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkXG4gICAgICAgICAgICBjYWxsYmFjayh0ZW1wbGF0ZUNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEb2N1bWVudEZyYWdtZW50KHRlbXBsYXRlQ29uZmlnKSkge1xuICAgICAgICAgICAgLy8gRG9jdW1lbnQgZnJhZ21lbnQgLSB1c2UgaXRzIGNoaWxkIG5vZGVzXG4gICAgICAgICAgICBjYWxsYmFjayhrby51dGlscy5tYWtlQXJyYXkodGVtcGxhdGVDb25maWcuY2hpbGROb2RlcykpO1xuICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlQ29uZmlnWydlbGVtZW50J10pIHtcbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGVtcGxhdGVDb25maWdbJ2VsZW1lbnQnXTtcbiAgICAgICAgICAgIGlmIChpc0RvbUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAvLyBFbGVtZW50IGluc3RhbmNlIC0gY29weSBpdHMgY2hpbGQgbm9kZXNcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhjbG9uZU5vZGVzRnJvbVRlbXBsYXRlU291cmNlRWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIC8vIEVsZW1lbnQgSUQgLSBmaW5kIGl0LCB0aGVuIGNvcHkgaXRzIGNoaWxkIG5vZGVzXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1JbnN0YW5jZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtSW5zdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soY2xvbmVOb2Rlc0Zyb21UZW1wbGF0ZVNvdXJjZUVsZW1lbnQoZWxlbUluc3RhbmNlKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjaygnQ2Fubm90IGZpbmQgZWxlbWVudCB3aXRoIElEICcgKyBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soJ1Vua25vd24gZWxlbWVudCB0eXBlOiAnICsgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrKCdVbmtub3duIHRlbXBsYXRlIHZhbHVlOiAnICsgdGVtcGxhdGVDb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVZpZXdNb2RlbChlcnJvckNhbGxiYWNrLCB2aWV3TW9kZWxDb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygdmlld01vZGVsQ29uZmlnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBDb25zdHJ1Y3RvciAtIGNvbnZlcnQgdG8gc3RhbmRhcmQgZmFjdG9yeSBmdW5jdGlvbiBmb3JtYXRcbiAgICAgICAgICAgIC8vIEJ5IGRlc2lnbiwgdGhpcyBkb2VzICpub3QqIHN1cHBseSBjb21wb25lbnRJbmZvIHRvIHRoZSBjb25zdHJ1Y3RvciwgYXMgdGhlIGludGVudCBpcyB0aGF0XG4gICAgICAgICAgICAvLyBjb21wb25lbnRJbmZvIGNvbnRhaW5zIG5vbi12aWV3bW9kZWwgZGF0YSAoZS5nLiwgdGhlIGNvbXBvbmVudCdzIGVsZW1lbnQpIHRoYXQgc2hvdWxkIG9ubHlcbiAgICAgICAgICAgIC8vIGJlIHVzZWQgaW4gZmFjdG9yeSBmdW5jdGlvbnMsIG5vdCB2aWV3bW9kZWwgY29uc3RydWN0b3JzLlxuICAgICAgICAgICAgY2FsbGJhY2soZnVuY3Rpb24gKHBhcmFtcyAvKiwgY29tcG9uZW50SW5mbyAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdmlld01vZGVsQ29uZmlnKHBhcmFtcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygdmlld01vZGVsQ29uZmlnW2NyZWF0ZVZpZXdNb2RlbEtleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgYSBmYWN0b3J5IGZ1bmN0aW9uIC0gdXNlIGl0IGFzLWlzXG4gICAgICAgICAgICBjYWxsYmFjayh2aWV3TW9kZWxDb25maWdbY3JlYXRlVmlld01vZGVsS2V5XSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ2luc3RhbmNlJyBpbiB2aWV3TW9kZWxDb25maWcpIHtcbiAgICAgICAgICAgIC8vIEZpeGVkIG9iamVjdCBpbnN0YW5jZSAtIHByb21vdGUgdG8gY3JlYXRlVmlld01vZGVsIGZvcm1hdCBmb3IgQVBJIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICB2YXIgZml4ZWRJbnN0YW5jZSA9IHZpZXdNb2RlbENvbmZpZ1snaW5zdGFuY2UnXTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGZ1bmN0aW9uIChwYXJhbXMsIGNvbXBvbmVudEluZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZml4ZWRJbnN0YW5jZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCd2aWV3TW9kZWwnIGluIHZpZXdNb2RlbENvbmZpZykge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZWQgQU1EIG1vZHVsZSB3aG9zZSB2YWx1ZSBpcyBvZiB0aGUgZm9ybSB7IHZpZXdNb2RlbDogLi4uIH1cbiAgICAgICAgICAgIHJlc29sdmVWaWV3TW9kZWwoZXJyb3JDYWxsYmFjaywgdmlld01vZGVsQ29uZmlnWyd2aWV3TW9kZWwnXSwgY2FsbGJhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXJyb3JDYWxsYmFjaygnVW5rbm93biB2aWV3TW9kZWwgdmFsdWU6ICcgKyB2aWV3TW9kZWxDb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmVOb2Rlc0Zyb21UZW1wbGF0ZVNvdXJjZUVsZW1lbnQoZWxlbUluc3RhbmNlKSB7XG4gICAgICAgIHN3aXRjaCAoa28udXRpbHMudGFnTmFtZUxvd2VyKGVsZW1JbnN0YW5jZSkpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NjcmlwdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLnBhcnNlSHRtbEZyYWdtZW50KGVsZW1JbnN0YW5jZS50ZXh0KTtcbiAgICAgICAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMucGFyc2VIdG1sRnJhZ21lbnQoZWxlbUluc3RhbmNlLnZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgJ3RlbXBsYXRlJzpcbiAgICAgICAgICAgICAgICAvLyBGb3IgYnJvd3NlcnMgd2l0aCBwcm9wZXIgPHRlbXBsYXRlPiBlbGVtZW50IHN1cHBvcnQgKGkuZS4sIHdoZXJlIHRoZSAuY29udGVudCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIC8vIGdpdmVzIGEgZG9jdW1lbnQgZnJhZ21lbnQpLCB1c2UgdGhhdCBkb2N1bWVudCBmcmFnbWVudC5cbiAgICAgICAgICAgICAgICBpZiAoaXNEb2N1bWVudEZyYWdtZW50KGVsZW1JbnN0YW5jZS5jb250ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMuY2xvbmVOb2RlcyhlbGVtSW5zdGFuY2UuY29udGVudC5jaGlsZE5vZGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWd1bGFyIGVsZW1lbnRzIHN1Y2ggYXMgPGRpdj4sIGFuZCA8dGVtcGxhdGU+IGVsZW1lbnRzIG9uIG9sZCBicm93c2VycyB0aGF0IGRvbid0IHJlYWxseVxuICAgICAgICAvLyB1bmRlcnN0YW5kIDx0ZW1wbGF0ZT4gYW5kIGp1c3QgdHJlYXQgaXQgYXMgYSByZWd1bGFyIGNvbnRhaW5lclxuICAgICAgICByZXR1cm4ga28udXRpbHMuY2xvbmVOb2RlcyhlbGVtSW5zdGFuY2UuY2hpbGROb2Rlcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEb21FbGVtZW50KG9iaikge1xuICAgICAgICBpZiAod2luZG93WydIVE1MRWxlbWVudCddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqICYmIG9iai50YWdOYW1lICYmIG9iai5ub2RlVHlwZSA9PT0gMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRG9jdW1lbnRGcmFnbWVudChvYmopIHtcbiAgICAgICAgaWYgKHdpbmRvd1snRG9jdW1lbnRGcmFnbWVudCddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLm5vZGVUeXBlID09PSAxMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvc3NpYmx5R2V0Q29uZmlnRnJvbUFtZChlcnJvckNhbGxiYWNrLCBjb25maWcsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnWydyZXF1aXJlJ10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvLyBUaGUgY29uZmlnIGlzIHRoZSB2YWx1ZSBvZiBhbiBBTUQgbW9kdWxlXG4gICAgICAgICAgICBpZiAoYW1kUmVxdWlyZSB8fCB3aW5kb3dbJ3JlcXVpcmUnXSkge1xuICAgICAgICAgICAgICAgIChhbWRSZXF1aXJlIHx8IHdpbmRvd1sncmVxdWlyZSddKShbY29uZmlnWydyZXF1aXJlJ11dLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVycm9yQ2FsbGJhY2soJ1VzZXMgcmVxdWlyZSwgYnV0IG5vIEFNRCBsb2FkZXIgaXMgcHJlc2VudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VFcnJvckNhbGxiYWNrKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtZXNzYWdlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudCBcXCcnICsgY29tcG9uZW50TmFtZSArICdcXCc6ICcgKyBtZXNzYWdlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMucmVnaXN0ZXInLCBrby5jb21wb25lbnRzLnJlZ2lzdGVyKTtcbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMuaXNSZWdpc3RlcmVkJywga28uY29tcG9uZW50cy5pc1JlZ2lzdGVyZWQpO1xuICAgIGtvLmV4cG9ydFN5bWJvbCgnY29tcG9uZW50cy51bnJlZ2lzdGVyJywga28uY29tcG9uZW50cy51bnJlZ2lzdGVyKTtcblxuICAgIC8vIEV4cG9zZSB0aGUgZGVmYXVsdCBsb2FkZXIgc28gdGhhdCBkZXZlbG9wZXJzIGNhbiBkaXJlY3RseSBhc2sgaXQgZm9yIGNvbmZpZ3VyYXRpb25cbiAgICAvLyBvciB0byByZXNvbHZlIGNvbmZpZ3VyYXRpb25cbiAgICBrby5leHBvcnRTeW1ib2woJ2NvbXBvbmVudHMuZGVmYXVsdExvYWRlcicsIGtvLmNvbXBvbmVudHMuZGVmYXVsdExvYWRlcik7XG5cbiAgICAvLyBCeSBkZWZhdWx0LCB0aGUgZGVmYXVsdCBsb2FkZXIgaXMgdGhlIG9ubHkgcmVnaXN0ZXJlZCBjb21wb25lbnQgbG9hZGVyXG4gICAga28uY29tcG9uZW50c1snbG9hZGVycyddLnB1c2goa28uY29tcG9uZW50cy5kZWZhdWx0TG9hZGVyKTtcblxuICAgIC8vIFByaXZhdGVseSBleHBvc2UgdGhlIHVuZGVybHlpbmcgY29uZmlnIHJlZ2lzdHJ5IGZvciB1c2UgaW4gb2xkLUlFIHNoaW1cbiAgICBrby5jb21wb25lbnRzLl9hbGxSZWdpc3RlcmVkQ29tcG9uZW50cyA9IGRlZmF1bHRDb25maWdSZWdpc3RyeTtcbn0pKCk7XG4oZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuICAgIC8vIE92ZXJyaWRhYmxlIEFQSSBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggY29tcG9uZW50IG5hbWUgYXBwbGllcyB0byBhIGdpdmVuIG5vZGUuIEJ5IG92ZXJyaWRpbmcgdGhpcyxcbiAgICAvLyB5b3UgY2FuIGZvciBleGFtcGxlIG1hcCBzcGVjaWZpYyB0YWdOYW1lcyB0byBjb21wb25lbnRzIHRoYXQgYXJlIG5vdCBwcmVyZWdpc3RlcmVkLlxuICAgIGtvLmNvbXBvbmVudHNbJ2dldENvbXBvbmVudE5hbWVGb3JOb2RlJ10gPSBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHZhciB0YWdOYW1lTG93ZXIgPSBrby51dGlscy50YWdOYW1lTG93ZXIobm9kZSk7XG4gICAgICAgIGlmIChrby5jb21wb25lbnRzLmlzUmVnaXN0ZXJlZCh0YWdOYW1lTG93ZXIpKSB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoYXQgdGhpcyBub2RlIGNhbiBiZSBjb25zaWRlcmVkIGEgKmN1c3RvbSogZWxlbWVudDsgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9rbm9ja291dC9rbm9ja291dC9pc3N1ZXMvMTYwM1xuICAgICAgICAgICAgaWYgKHRhZ05hbWVMb3dlci5pbmRleE9mKCctJykgIT0gLTEgfHwgKCcnICsgbm9kZSkgPT0gXCJbb2JqZWN0IEhUTUxVbmtub3duRWxlbWVudF1cIiB8fCAoa28udXRpbHMuaWVWZXJzaW9uIDw9IDggJiYgbm9kZS50YWdOYW1lID09PSB0YWdOYW1lTG93ZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhZ05hbWVMb3dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBrby5jb21wb25lbnRzLmFkZEJpbmRpbmdzRm9yQ3VzdG9tRWxlbWVudCA9IGZ1bmN0aW9uKGFsbEJpbmRpbmdzLCBub2RlLCBiaW5kaW5nQ29udGV4dCwgdmFsdWVBY2Nlc3NvcnMpIHtcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGl0J3MgcmVhbGx5IGEgY3VzdG9tIGVsZW1lbnQgbWF0Y2hpbmcgYSBjb21wb25lbnRcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIHZhciBjb21wb25lbnROYW1lID0ga28uY29tcG9uZW50c1snZ2V0Q29tcG9uZW50TmFtZUZvck5vZGUnXShub2RlKTtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgLy8gSXQgZG9lcyByZXByZXNlbnQgYSBjb21wb25lbnQsIHNvIGFkZCBhIGNvbXBvbmVudCBiaW5kaW5nIGZvciBpdFxuICAgICAgICAgICAgICAgIGFsbEJpbmRpbmdzID0gYWxsQmluZGluZ3MgfHwge307XG5cbiAgICAgICAgICAgICAgICBpZiAoYWxsQmluZGluZ3NbJ2NvbXBvbmVudCddKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIHNpbGVudGx5IG92ZXJ3cml0aW5nIHNvbWUgb3RoZXIgJ2NvbXBvbmVudCcgYmluZGluZyB0aGF0IG1heSBhbHJlYWR5IGJlIG9uIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHVzZSB0aGUgXCJjb21wb25lbnRcIiBiaW5kaW5nIG9uIGEgY3VzdG9tIGVsZW1lbnQgbWF0Y2hpbmcgYSBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50QmluZGluZ1ZhbHVlID0geyAnbmFtZSc6IGNvbXBvbmVudE5hbWUsICdwYXJhbXMnOiBnZXRDb21wb25lbnRQYXJhbXNGcm9tQ3VzdG9tRWxlbWVudChub2RlLCBiaW5kaW5nQ29udGV4dCkgfTtcblxuICAgICAgICAgICAgICAgIGFsbEJpbmRpbmdzWydjb21wb25lbnQnXSA9IHZhbHVlQWNjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24oKSB7IHJldHVybiBjb21wb25lbnRCaW5kaW5nVmFsdWU7IH1cbiAgICAgICAgICAgICAgICAgICAgOiBjb21wb25lbnRCaW5kaW5nVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWxsQmluZGluZ3M7XG4gICAgfVxuXG4gICAgdmFyIG5hdGl2ZUJpbmRpbmdQcm92aWRlckluc3RhbmNlID0gbmV3IGtvLmJpbmRpbmdQcm92aWRlcigpO1xuXG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50UGFyYW1zRnJvbUN1c3RvbUVsZW1lbnQoZWxlbSwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgdmFyIHBhcmFtc0F0dHJpYnV0ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKCdwYXJhbXMnKTtcblxuICAgICAgICBpZiAocGFyYW1zQXR0cmlidXRlKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW1zID0gbmF0aXZlQmluZGluZ1Byb3ZpZGVySW5zdGFuY2VbJ3BhcnNlQmluZGluZ3NTdHJpbmcnXShwYXJhbXNBdHRyaWJ1dGUsIGJpbmRpbmdDb250ZXh0LCBlbGVtLCB7ICd2YWx1ZUFjY2Vzc29ycyc6IHRydWUsICdiaW5kaW5nUGFyYW1zJzogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICByYXdQYXJhbUNvbXB1dGVkVmFsdWVzID0ga28udXRpbHMub2JqZWN0TWFwKHBhcmFtcywgZnVuY3Rpb24ocGFyYW1WYWx1ZSwgcGFyYW1OYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrby5jb21wdXRlZChwYXJhbVZhbHVlLCBudWxsLCB7IGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogZWxlbSB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBrby51dGlscy5vYmplY3RNYXAocmF3UGFyYW1Db21wdXRlZFZhbHVlcywgZnVuY3Rpb24ocGFyYW1WYWx1ZUNvbXB1dGVkLCBwYXJhbU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmFtVmFsdWUgPSBwYXJhbVZhbHVlQ29tcHV0ZWQucGVlaygpO1xuICAgICAgICAgICAgICAgICAgICAvLyBEb2VzIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgdmFsdWUgdW53cmFwIGFueSBvYnNlcnZhYmxlcz9cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbVZhbHVlQ29tcHV0ZWQuaXNBY3RpdmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gaXQgZG9lc24ndCwgc28gdGhlcmUncyBubyBuZWVkIGZvciBhbnkgY29tcHV0ZWQgd3JhcHBlci4gSnVzdCBwYXNzIHRocm91Z2ggdGhlIHN1cHBsaWVkIHZhbHVlIGRpcmVjdGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhhbXBsZTogXCJzb21lVmFsOiBmaXJzdE5hbWUsIGFnZTogMTIzXCIgKHdoZXRoZXIgb3Igbm90IGZpcnN0TmFtZSBpcyBhbiBvYnNlcnZhYmxlL2NvbXB1dGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBZZXMgaXQgZG9lcy4gU3VwcGx5IGEgY29tcHV0ZWQgcHJvcGVydHkgdGhhdCB1bndyYXBzIGJvdGggdGhlIG91dGVyIChiaW5kaW5nIGV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXZlbCBvZiBvYnNlcnZhYmlsaXR5LCBhbmQgYW55IGlubmVyIChyZXN1bHRpbmcgbW9kZWwgdmFsdWUpIGxldmVsIG9mIG9ic2VydmFiaWxpdHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoZSBjb21wb25lbnQgZG9lc24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IG11bHRpcGxlIHVud3JhcHBpbmcuIElmIHRoZSB2YWx1ZSBpcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0YWJsZSBvYnNlcnZhYmxlLCB0aGUgY29tcHV0ZWQgd2lsbCBhbHNvIGJlIHdyaXRhYmxlIGFuZCBwYXNzIHRoZSB2YWx1ZSBvbiB0byB0aGUgb2JzZXJ2YWJsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrby5jb21wdXRlZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlYWQnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUocGFyYW1WYWx1ZUNvbXB1dGVkKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dyaXRlJzoga28uaXNXcml0ZWFibGVPYnNlcnZhYmxlKHBhcmFtVmFsdWUpICYmIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVDb21wdXRlZCgpKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogZWxlbVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gR2l2ZSBhY2Nlc3MgdG8gdGhlIHJhdyBjb21wdXRlZHMsIGFzIGxvbmcgYXMgdGhhdCB3b3VsZG4ndCBvdmVyd3JpdGUgYW55IGN1c3RvbSBwYXJhbSBhbHNvIGNhbGxlZCAnJHJhdydcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgaW4gY2FzZSB0aGUgZGV2ZWxvcGVyIHdhbnRzIHRvIHJlYWN0IHRvIG91dGVyIChiaW5kaW5nKSBvYnNlcnZhYmlsaXR5IHNlcGFyYXRlbHkgZnJvbSBpbm5lclxuICAgICAgICAgICAgLy8gKG1vZGVsIHZhbHVlKSBvYnNlcnZhYmlsaXR5LCBvciBpbiBjYXNlIHRoZSBtb2RlbCB2YWx1ZSBvYnNlcnZhYmxlIGhhcyBzdWJvYnNlcnZhYmxlcy5cbiAgICAgICAgICAgIGlmICghcmVzdWx0Lmhhc093blByb3BlcnR5KCckcmF3JykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbJyRyYXcnXSA9IHJhd1BhcmFtQ29tcHV0ZWRWYWx1ZXM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGb3IgY29uc2lzdGVuY3ksIGFic2VuY2Ugb2YgYSBcInBhcmFtc1wiIGF0dHJpYnV0ZSBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIHRoZSBwcmVzZW5jZSBvZlxuICAgICAgICAgICAgLy8gYW55IGVtcHR5IG9uZS4gT3RoZXJ3aXNlIGNvbXBvbmVudCB2aWV3bW9kZWxzIG5lZWQgc3BlY2lhbCBjb2RlIHRvIGNoZWNrIHdoZXRoZXIgb3Igbm90XG4gICAgICAgICAgICAvLyAncGFyYW1zJyBvciAncGFyYW1zLiRyYXcnIGlzIG51bGwvdW5kZWZpbmVkIGJlZm9yZSByZWFkaW5nIHN1YnByb3BlcnRpZXMsIHdoaWNoIGlzIGFubm95aW5nLlxuICAgICAgICAgICAgcmV0dXJuIHsgJyRyYXcnOiB7fSB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBDb21wYXRpYmlsaXR5IGNvZGUgZm9yIG9sZGVyIChwcmUtSFRNTDUpIElFIGJyb3dzZXJzXG5cbiAgICBpZiAoa28udXRpbHMuaWVWZXJzaW9uIDwgOSkge1xuICAgICAgICAvLyBXaGVuZXZlciB5b3UgcHJlcmVnaXN0ZXIgYSBjb21wb25lbnQsIGVuYWJsZSBpdCBhcyBhIGN1c3RvbSBlbGVtZW50IGluIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gICAgICAgIGtvLmNvbXBvbmVudHNbJ3JlZ2lzdGVyJ10gPSAoZnVuY3Rpb24ob3JpZ2luYWxGdW5jdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbXBvbmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudE5hbWUpOyAvLyBBbGxvd3MgSUU8OSB0byBwYXJzZSBtYXJrdXAgY29udGFpbmluZyB0aGUgY3VzdG9tIGVsZW1lbnRcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KShrby5jb21wb25lbnRzWydyZWdpc3RlciddKTtcblxuICAgICAgICAvLyBXaGVuZXZlciB5b3UgY3JlYXRlIGEgZG9jdW1lbnQgZnJhZ21lbnQsIGVuYWJsZSBhbGwgcHJlcmVnaXN0ZXJlZCBjb21wb25lbnQgbmFtZXMgYXMgY3VzdG9tIGVsZW1lbnRzXG4gICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgaW5uZXJTaGl2L2pRdWVyeSBIVE1MIHBhcnNpbmcgY29ycmVjdGx5IGhhbmRsZSB0aGUgY3VzdG9tIGVsZW1lbnRzXG4gICAgICAgIGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQgPSAoZnVuY3Rpb24ob3JpZ2luYWxGdW5jdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXdEb2NGcmFnID0gb3JpZ2luYWxGdW5jdGlvbigpLFxuICAgICAgICAgICAgICAgICAgICBhbGxDb21wb25lbnRzID0ga28uY29tcG9uZW50cy5fYWxsUmVnaXN0ZXJlZENvbXBvbmVudHM7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgY29tcG9uZW50TmFtZSBpbiBhbGxDb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxDb21wb25lbnRzLmhhc093blByb3BlcnR5KGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdEb2NGcmFnLmNyZWF0ZUVsZW1lbnQoY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ld0RvY0ZyYWc7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KShkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KTtcbiAgICB9XG59KSgpOyhmdW5jdGlvbih1bmRlZmluZWQpIHtcblxuICAgIHZhciBjb21wb25lbnRMb2FkaW5nT3BlcmF0aW9uVW5pcXVlSWQgPSAwO1xuXG4gICAga28uYmluZGluZ0hhbmRsZXJzWydjb21wb25lbnQnXSA9IHtcbiAgICAgICAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBpZ25vcmVkMSwgaWdub3JlZDIsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFZpZXdNb2RlbCxcbiAgICAgICAgICAgICAgICBjdXJyZW50TG9hZGluZ09wZXJhdGlvbklkLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2VBc3NvY2lhdGVkQ29tcG9uZW50Vmlld01vZGVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZpZXdNb2RlbERpc3Bvc2UgPSBjdXJyZW50Vmlld01vZGVsICYmIGN1cnJlbnRWaWV3TW9kZWxbJ2Rpc3Bvc2UnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50Vmlld01vZGVsRGlzcG9zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZpZXdNb2RlbERpc3Bvc2UuY2FsbChjdXJyZW50Vmlld01vZGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Vmlld01vZGVsID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW55IGluLWZsaWdodCBsb2FkaW5nIG9wZXJhdGlvbiBpcyBubyBsb25nZXIgcmVsZXZhbnQsIHNvIG1ha2Ugc3VyZSB3ZSBpZ25vcmUgaXRzIGNvbXBsZXRpb25cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExvYWRpbmdPcGVyYXRpb25JZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbENoaWxkTm9kZXMgPSBrby51dGlscy5tYWtlQXJyYXkoa28udmlydHVhbEVsZW1lbnRzLmNoaWxkTm9kZXMoZWxlbWVudCkpO1xuXG4gICAgICAgICAgICBrby51dGlscy5kb21Ob2RlRGlzcG9zYWwuYWRkRGlzcG9zZUNhbGxiYWNrKGVsZW1lbnQsIGRpc3Bvc2VBc3NvY2lhdGVkQ29tcG9uZW50Vmlld01vZGVsKTtcblxuICAgICAgICAgICAga28uY29tcHV0ZWQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKSxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwgY29tcG9uZW50UGFyYW1zO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlWyduYW1lJ10pO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQYXJhbXMgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlWydwYXJhbXMnXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29tcG9uZW50IG5hbWUgc3BlY2lmaWVkJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGxvYWRpbmdPcGVyYXRpb25JZCA9IGN1cnJlbnRMb2FkaW5nT3BlcmF0aW9uSWQgPSArK2NvbXBvbmVudExvYWRpbmdPcGVyYXRpb25VbmlxdWVJZDtcbiAgICAgICAgICAgICAgICBrby5jb21wb25lbnRzLmdldChjb21wb25lbnROYW1lLCBmdW5jdGlvbihjb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBjdXJyZW50IGxvYWQgb3BlcmF0aW9uIGZvciB0aGlzIGVsZW1lbnQsIGlnbm9yZSBpdC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMb2FkaW5nT3BlcmF0aW9uSWQgIT09IGxvYWRpbmdPcGVyYXRpb25JZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAgcHJldmlvdXMgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zZUFzc29jaWF0ZWRDb21wb25lbnRWaWV3TW9kZWwoKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBJbnN0YW50aWF0ZSBhbmQgYmluZCBuZXcgY29tcG9uZW50LiBJbXBsaWNpdGx5IHRoaXMgY2xlYW5zIGFueSBvbGQgRE9NIG5vZGVzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBjb21wb25lbnQgXFwnJyArIGNvbXBvbmVudE5hbWUgKyAnXFwnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xvbmVUZW1wbGF0ZUludG9FbGVtZW50KGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudERlZmluaXRpb24sIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29tcG9uZW50Vmlld01vZGVsID0gY3JlYXRlVmlld01vZGVsKGNvbXBvbmVudERlZmluaXRpb24sIGVsZW1lbnQsIG9yaWdpbmFsQ2hpbGROb2RlcywgY29tcG9uZW50UGFyYW1zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQmluZGluZ0NvbnRleHQgPSBiaW5kaW5nQ29udGV4dFsnY3JlYXRlQ2hpbGRDb250ZXh0J10oY29tcG9uZW50Vmlld01vZGVsLCAvKiBkYXRhSXRlbUFsaWFzICovIHVuZGVmaW5lZCwgZnVuY3Rpb24oY3R4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4WyckY29tcG9uZW50J10gPSBjb21wb25lbnRWaWV3TW9kZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4WyckY29tcG9uZW50VGVtcGxhdGVOb2RlcyddID0gb3JpZ2luYWxDaGlsZE5vZGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3TW9kZWwgPSBjb21wb25lbnRWaWV3TW9kZWw7XG4gICAgICAgICAgICAgICAgICAgIGtvLmFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzKGNoaWxkQmluZGluZ0NvbnRleHQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IGVsZW1lbnQgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7ICdjb250cm9sc0Rlc2NlbmRhbnRCaW5kaW5ncyc6IHRydWUgfTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBrby52aXJ0dWFsRWxlbWVudHMuYWxsb3dlZEJpbmRpbmdzWydjb21wb25lbnQnXSA9IHRydWU7XG5cbiAgICBmdW5jdGlvbiBjbG9uZVRlbXBsYXRlSW50b0VsZW1lbnQoY29tcG9uZW50TmFtZSwgY29tcG9uZW50RGVmaW5pdGlvbiwgZWxlbWVudCkge1xuICAgICAgICB2YXIgdGVtcGxhdGUgPSBjb21wb25lbnREZWZpbml0aW9uWyd0ZW1wbGF0ZSddO1xuICAgICAgICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudCBcXCcnICsgY29tcG9uZW50TmFtZSArICdcXCcgaGFzIG5vIHRlbXBsYXRlJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2xvbmVkTm9kZXNBcnJheSA9IGtvLnV0aWxzLmNsb25lTm9kZXModGVtcGxhdGUpO1xuICAgICAgICBrby52aXJ0dWFsRWxlbWVudHMuc2V0RG9tTm9kZUNoaWxkcmVuKGVsZW1lbnQsIGNsb25lZE5vZGVzQXJyYXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVZpZXdNb2RlbChjb21wb25lbnREZWZpbml0aW9uLCBlbGVtZW50LCBvcmlnaW5hbENoaWxkTm9kZXMsIGNvbXBvbmVudFBhcmFtcykge1xuICAgICAgICB2YXIgY29tcG9uZW50Vmlld01vZGVsRmFjdG9yeSA9IGNvbXBvbmVudERlZmluaXRpb25bJ2NyZWF0ZVZpZXdNb2RlbCddO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Vmlld01vZGVsRmFjdG9yeVxuICAgICAgICAgICAgPyBjb21wb25lbnRWaWV3TW9kZWxGYWN0b3J5LmNhbGwoY29tcG9uZW50RGVmaW5pdGlvbiwgY29tcG9uZW50UGFyYW1zLCB7ICdlbGVtZW50JzogZWxlbWVudCwgJ3RlbXBsYXRlTm9kZXMnOiBvcmlnaW5hbENoaWxkTm9kZXMgfSlcbiAgICAgICAgICAgIDogY29tcG9uZW50UGFyYW1zOyAvLyBUZW1wbGF0ZS1vbmx5IGNvbXBvbmVudFxuICAgIH1cblxufSkoKTtcbnZhciBhdHRySHRtbFRvSmF2YXNjcmlwdE1hcCA9IHsgJ2NsYXNzJzogJ2NsYXNzTmFtZScsICdmb3InOiAnaHRtbEZvcicgfTtcbmtvLmJpbmRpbmdIYW5kbGVyc1snYXR0ciddID0ge1xuICAgICd1cGRhdGUnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncykge1xuICAgICAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSkgfHwge307XG4gICAgICAgIGtvLnV0aWxzLm9iamVjdEZvckVhY2godmFsdWUsIGZ1bmN0aW9uKGF0dHJOYW1lLCBhdHRyVmFsdWUpIHtcbiAgICAgICAgICAgIGF0dHJWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYXR0clZhbHVlKTtcblxuICAgICAgICAgICAgLy8gVG8gY292ZXIgY2FzZXMgbGlrZSBcImF0dHI6IHsgY2hlY2tlZDpzb21lUHJvcCB9XCIsIHdlIHdhbnQgdG8gcmVtb3ZlIHRoZSBhdHRyaWJ1dGUgZW50aXJlbHlcbiAgICAgICAgICAgIC8vIHdoZW4gc29tZVByb3AgaXMgYSBcIm5vIHZhbHVlXCItbGlrZSB2YWx1ZSAoc3RyaWN0bHkgbnVsbCwgZmFsc2UsIG9yIHVuZGVmaW5lZClcbiAgICAgICAgICAgIC8vIChiZWNhdXNlIHRoZSBhYnNlbmNlIG9mIHRoZSBcImNoZWNrZWRcIiBhdHRyIGlzIGhvdyB0byBtYXJrIGFuIGVsZW1lbnQgYXMgbm90IGNoZWNrZWQsIGV0Yy4pXG4gICAgICAgICAgICB2YXIgdG9SZW1vdmUgPSAoYXR0clZhbHVlID09PSBmYWxzZSkgfHwgKGF0dHJWYWx1ZSA9PT0gbnVsbCkgfHwgKGF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICh0b1JlbW92ZSlcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG5cbiAgICAgICAgICAgIC8vIEluIElFIDw9IDcgYW5kIElFOCBRdWlya3MgTW9kZSwgeW91IGhhdmUgdG8gdXNlIHRoZSBKYXZhc2NyaXB0IHByb3BlcnR5IG5hbWUgaW5zdGVhZCBvZiB0aGVcbiAgICAgICAgICAgIC8vIEhUTUwgYXR0cmlidXRlIG5hbWUgZm9yIGNlcnRhaW4gYXR0cmlidXRlcy4gSUU4IFN0YW5kYXJkcyBNb2RlIHN1cHBvcnRzIHRoZSBjb3JyZWN0IGJlaGF2aW9yLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgb2YgZmlndXJpbmcgb3V0IHRoZSBtb2RlLCB3ZSdsbCBqdXN0IHNldCB0aGUgYXR0cmlidXRlIHRocm91Z2ggdGhlIEphdmFzY3JpcHRcbiAgICAgICAgICAgIC8vIHByb3BlcnR5IGZvciBJRSA8PSA4LlxuICAgICAgICAgICAgaWYgKGtvLnV0aWxzLmllVmVyc2lvbiA8PSA4ICYmIGF0dHJOYW1lIGluIGF0dHJIdG1sVG9KYXZhc2NyaXB0TWFwKSB7XG4gICAgICAgICAgICAgICAgYXR0ck5hbWUgPSBhdHRySHRtbFRvSmF2YXNjcmlwdE1hcFthdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKHRvUmVtb3ZlKVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50W2F0dHJOYW1lXSA9IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRvUmVtb3ZlKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVHJlYXQgXCJuYW1lXCIgc3BlY2lhbGx5IC0gYWx0aG91Z2ggeW91IGNhbiB0aGluayBvZiBpdCBhcyBhbiBhdHRyaWJ1dGUsIGl0IGFsc28gbmVlZHNcbiAgICAgICAgICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcgb24gb2xkZXIgdmVyc2lvbnMgb2YgSUUgKGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZVNhbmRlcnNvbi9rbm9ja291dC9wdWxsLzMzMylcbiAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBiZWluZyBjYXNlLXNlbnNpdGl2ZSBoZXJlIGJlY2F1c2UgWEhUTUwgd291bGQgcmVnYXJkIFwiTmFtZVwiIGFzIGEgZGlmZmVyZW50IHRoaW5nXG4gICAgICAgICAgICAvLyBlbnRpcmVseSwgYW5kIHRoZXJlJ3Mgbm8gc3Ryb25nIHJlYXNvbiB0byBhbGxvdyBmb3Igc3VjaCBjYXNpbmcgaW4gSFRNTC5cbiAgICAgICAgICAgIGlmIChhdHRyTmFtZSA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgICAgICAgICBrby51dGlscy5zZXRFbGVtZW50TmFtZShlbGVtZW50LCB0b1JlbW92ZSA/IFwiXCIgOiBhdHRyVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG4oZnVuY3Rpb24oKSB7XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1snY2hlY2tlZCddID0ge1xuICAgICdhZnRlcic6IFsndmFsdWUnLCAnYXR0ciddLFxuICAgICdpbml0JzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzKSB7XG4gICAgICAgIHZhciBjaGVja2VkVmFsdWUgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBUcmVhdCBcInZhbHVlXCIgbGlrZSBcImNoZWNrZWRWYWx1ZVwiIHdoZW4gaXQgaXMgaW5jbHVkZWQgd2l0aCBcImNoZWNrZWRcIiBiaW5kaW5nXG4gICAgICAgICAgICBpZiAoYWxsQmluZGluZ3NbJ2hhcyddKCdjaGVja2VkVmFsdWUnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGFsbEJpbmRpbmdzLmdldCgnY2hlY2tlZFZhbHVlJykpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhbGxCaW5kaW5nc1snaGFzJ10oJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShhbGxCaW5kaW5ncy5nZXQoJ3ZhbHVlJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlTW9kZWwoKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZXMgdGhlIG1vZGVsIHZhbHVlIGZyb20gdGhlIHZpZXcgdmFsdWUuXG4gICAgICAgICAgICAvLyBJdCBydW5zIGluIHJlc3BvbnNlIHRvIERPTSBldmVudHMgKGNsaWNrKSBhbmQgY2hhbmdlcyBpbiBjaGVja2VkVmFsdWUuXG4gICAgICAgICAgICB2YXIgaXNDaGVja2VkID0gZWxlbWVudC5jaGVja2VkLFxuICAgICAgICAgICAgICAgIGVsZW1WYWx1ZSA9IHVzZUNoZWNrZWRWYWx1ZSA/IGNoZWNrZWRWYWx1ZSgpIDogaXNDaGVja2VkO1xuXG4gICAgICAgICAgICAvLyBXaGVuIHdlJ3JlIGZpcnN0IHNldHRpbmcgdXAgdGhpcyBjb21wdXRlZCwgZG9uJ3QgY2hhbmdlIGFueSBtb2RlbCBzdGF0ZS5cbiAgICAgICAgICAgIGlmIChrby5jb21wdXRlZENvbnRleHQuaXNJbml0aWFsKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlIGNhbiBpZ25vcmUgdW5jaGVja2VkIHJhZGlvIGJ1dHRvbnMsIGJlY2F1c2Ugc29tZSBvdGhlciByYWRpb1xuICAgICAgICAgICAgLy8gYnV0dG9uIHdpbGwgYmUgZ2V0dGluZyBjaGVja2VkLCBhbmQgdGhhdCBvbmUgY2FuIHRha2UgY2FyZSBvZiB1cGRhdGluZyBzdGF0ZS5cbiAgICAgICAgICAgIGlmIChpc1JhZGlvICYmICFpc0NoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBtb2RlbFZhbHVlID0ga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUodmFsdWVBY2Nlc3Nvcik7XG4gICAgICAgICAgICBpZiAodmFsdWVJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgdmFyIHdyaXRhYmxlVmFsdWUgPSByYXdWYWx1ZUlzTm9uQXJyYXlPYnNlcnZhYmxlID8gbW9kZWxWYWx1ZS5wZWVrKCkgOiBtb2RlbFZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChvbGRFbGVtVmFsdWUgIT09IGVsZW1WYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHdlJ3JlIHJlc3BvbmRpbmcgdG8gdGhlIGNoZWNrZWRWYWx1ZSBjaGFuZ2luZywgYW5kIHRoZSBlbGVtZW50IGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSBjaGVja2VkLCByZXBsYWNlIHRoZSBvbGQgZWxlbSB2YWx1ZSB3aXRoIHRoZSBuZXcgZWxlbSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgbW9kZWwgYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFkZE9yUmVtb3ZlSXRlbSh3cml0YWJsZVZhbHVlLCBlbGVtVmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAga28udXRpbHMuYWRkT3JSZW1vdmVJdGVtKHdyaXRhYmxlVmFsdWUsIG9sZEVsZW1WYWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgb2xkRWxlbVZhbHVlID0gZWxlbVZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UncmUgcmVzcG9uZGluZyB0byB0aGUgdXNlciBoYXZpbmcgY2hlY2tlZC91bmNoZWNrZWQgYSBjaGVja2JveCxcbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkL3JlbW92ZSB0aGUgZWxlbWVudCB2YWx1ZSB0byB0aGUgbW9kZWwgYXJyYXkuXG4gICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmFkZE9yUmVtb3ZlSXRlbSh3cml0YWJsZVZhbHVlLCBlbGVtVmFsdWUsIGlzQ2hlY2tlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyYXdWYWx1ZUlzTm9uQXJyYXlPYnNlcnZhYmxlICYmIGtvLmlzV3JpdGVhYmxlT2JzZXJ2YWJsZShtb2RlbFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBtb2RlbFZhbHVlKHdyaXRhYmxlVmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAga28uZXhwcmVzc2lvblJld3JpdGluZy53cml0ZVZhbHVlVG9Qcm9wZXJ0eShtb2RlbFZhbHVlLCBhbGxCaW5kaW5ncywgJ2NoZWNrZWQnLCBlbGVtVmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVZpZXcoKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZXMgdGhlIHZpZXcgdmFsdWUgZnJvbSB0aGUgbW9kZWwgdmFsdWUuXG4gICAgICAgICAgICAvLyBJdCBydW5zIGluIHJlc3BvbnNlIHRvIGNoYW5nZXMgaW4gdGhlIGJvdW5kIChjaGVja2VkKSB2YWx1ZS5cbiAgICAgICAgICAgIHZhciBtb2RlbFZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWVJc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgLy8gV2hlbiBhIGNoZWNrYm94IGlzIGJvdW5kIHRvIGFuIGFycmF5LCBiZWluZyBjaGVja2VkIHJlcHJlc2VudHMgaXRzIHZhbHVlIGJlaW5nIHByZXNlbnQgaW4gdGhhdCBhcnJheVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IGtvLnV0aWxzLmFycmF5SW5kZXhPZihtb2RlbFZhbHVlLCBjaGVja2VkVmFsdWUoKSkgPj0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDaGVja2JveCkge1xuICAgICAgICAgICAgICAgIC8vIFdoZW4gYSBjaGVja2JveCBpcyBib3VuZCB0byBhbnkgb3RoZXIgdmFsdWUgKG5vdCBhbiBhcnJheSksIGJlaW5nIGNoZWNrZWQgcmVwcmVzZW50cyB0aGUgdmFsdWUgYmVpbmcgdHJ1ZWlzaFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IG1vZGVsVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZvciByYWRpbyBidXR0b25zLCBiZWluZyBjaGVja2VkIG1lYW5zIHRoYXQgdGhlIHJhZGlvIGJ1dHRvbidzIHZhbHVlIGNvcnJlc3BvbmRzIHRvIHRoZSBtb2RlbCB2YWx1ZVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IChjaGVja2VkVmFsdWUoKSA9PT0gbW9kZWxWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGlzQ2hlY2tib3ggPSBlbGVtZW50LnR5cGUgPT0gXCJjaGVja2JveFwiLFxuICAgICAgICAgICAgaXNSYWRpbyA9IGVsZW1lbnQudHlwZSA9PSBcInJhZGlvXCI7XG5cbiAgICAgICAgLy8gT25seSBiaW5kIHRvIGNoZWNrIGJveGVzIGFuZCByYWRpbyBidXR0b25zXG4gICAgICAgIGlmICghaXNDaGVja2JveCAmJiAhaXNSYWRpbykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJhd1ZhbHVlID0gdmFsdWVBY2Nlc3NvcigpLFxuICAgICAgICAgICAgdmFsdWVJc0FycmF5ID0gaXNDaGVja2JveCAmJiAoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShyYXdWYWx1ZSkgaW5zdGFuY2VvZiBBcnJheSksXG4gICAgICAgICAgICByYXdWYWx1ZUlzTm9uQXJyYXlPYnNlcnZhYmxlID0gISh2YWx1ZUlzQXJyYXkgJiYgcmF3VmFsdWUucHVzaCAmJiByYXdWYWx1ZS5zcGxpY2UpLFxuICAgICAgICAgICAgb2xkRWxlbVZhbHVlID0gdmFsdWVJc0FycmF5ID8gY2hlY2tlZFZhbHVlKCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB1c2VDaGVja2VkVmFsdWUgPSBpc1JhZGlvIHx8IHZhbHVlSXNBcnJheTtcblxuICAgICAgICAvLyBJRSA2IHdvbid0IGFsbG93IHJhZGlvIGJ1dHRvbnMgdG8gYmUgc2VsZWN0ZWQgdW5sZXNzIHRoZXkgaGF2ZSBhIG5hbWVcbiAgICAgICAgaWYgKGlzUmFkaW8gJiYgIWVsZW1lbnQubmFtZSlcbiAgICAgICAgICAgIGtvLmJpbmRpbmdIYW5kbGVyc1sndW5pcXVlTmFtZSddWydpbml0J10oZWxlbWVudCwgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIFNldCB1cCB0d28gY29tcHV0ZWRzIHRvIHVwZGF0ZSB0aGUgYmluZGluZzpcblxuICAgICAgICAvLyBUaGUgZmlyc3QgcmVzcG9uZHMgdG8gY2hhbmdlcyBpbiB0aGUgY2hlY2tlZFZhbHVlIHZhbHVlIGFuZCB0byBlbGVtZW50IGNsaWNrc1xuICAgICAgICBrby5jb21wdXRlZCh1cGRhdGVNb2RlbCwgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IGVsZW1lbnQgfSk7XG4gICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwiY2xpY2tcIiwgdXBkYXRlTW9kZWwpO1xuXG4gICAgICAgIC8vIFRoZSBzZWNvbmQgcmVzcG9uZHMgdG8gY2hhbmdlcyBpbiB0aGUgbW9kZWwgdmFsdWUgKHRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjaGVja2VkIGJpbmRpbmcpXG4gICAgICAgIGtvLmNvbXB1dGVkKHVwZGF0ZVZpZXcsIG51bGwsIHsgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBlbGVtZW50IH0pO1xuXG4gICAgICAgIHJhd1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbn07XG5rby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzWydjaGVja2VkJ10gPSB0cnVlO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ2NoZWNrZWRWYWx1ZSddID0ge1xuICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICBlbGVtZW50LnZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuICAgIH1cbn07XG5cbn0pKCk7dmFyIGNsYXNzZXNXcml0dGVuQnlCaW5kaW5nS2V5ID0gJ19fa29fX2Nzc1ZhbHVlJztcbmtvLmJpbmRpbmdIYW5kbGVyc1snY3NzJ10gPSB7XG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKHZhbHVlLCBmdW5jdGlvbihjbGFzc05hbWUsIHNob3VsZEhhdmVDbGFzcykge1xuICAgICAgICAgICAgICAgIHNob3VsZEhhdmVDbGFzcyA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoc2hvdWxkSGF2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICBrby51dGlscy50b2dnbGVEb21Ob2RlQ3NzQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lLCBzaG91bGRIYXZlQ2xhc3MpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGtvLnV0aWxzLnN0cmluZ1RyaW0oU3RyaW5nKHZhbHVlIHx8ICcnKSk7IC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCB0cnkgdG8gc3RvcmUgb3Igc2V0IGEgbm9uLXN0cmluZyB2YWx1ZVxuICAgICAgICAgICAga28udXRpbHMudG9nZ2xlRG9tTm9kZUNzc0NsYXNzKGVsZW1lbnQsIGVsZW1lbnRbY2xhc3Nlc1dyaXR0ZW5CeUJpbmRpbmdLZXldLCBmYWxzZSk7XG4gICAgICAgICAgICBlbGVtZW50W2NsYXNzZXNXcml0dGVuQnlCaW5kaW5nS2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAga28udXRpbHMudG9nZ2xlRG9tTm9kZUNzc0NsYXNzKGVsZW1lbnQsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5rby5iaW5kaW5nSGFuZGxlcnNbJ2VuYWJsZSddID0ge1xuICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSk7XG4gICAgICAgIGlmICh2YWx1ZSAmJiBlbGVtZW50LmRpc2FibGVkKVxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKTtcbiAgICAgICAgZWxzZSBpZiAoKCF2YWx1ZSkgJiYgKCFlbGVtZW50LmRpc2FibGVkKSlcbiAgICAgICAgICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbn07XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1snZGlzYWJsZSddID0ge1xuICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICBrby5iaW5kaW5nSGFuZGxlcnNbJ2VuYWJsZSddWyd1cGRhdGUnXShlbGVtZW50LCBmdW5jdGlvbigpIHsgcmV0dXJuICFrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSkgfSk7XG4gICAgfVxufTtcbi8vIEZvciBjZXJ0YWluIGNvbW1vbiBldmVudHMgKGN1cnJlbnRseSBqdXN0ICdjbGljaycpLCBhbGxvdyBhIHNpbXBsaWZpZWQgZGF0YS1iaW5kaW5nIHN5bnRheFxuLy8gZS5nLiBjbGljazpoYW5kbGVyIGluc3RlYWQgb2YgdGhlIHVzdWFsIGZ1bGwtbGVuZ3RoIGV2ZW50OntjbGljazpoYW5kbGVyfVxuZnVuY3Rpb24gbWFrZUV2ZW50SGFuZGxlclNob3J0Y3V0KGV2ZW50TmFtZSkge1xuICAgIGtvLmJpbmRpbmdIYW5kbGVyc1tldmVudE5hbWVdID0ge1xuICAgICAgICAnaW5pdCc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzLCB2aWV3TW9kZWwsIGJpbmRpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgbmV3VmFsdWVBY2Nlc3NvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2V2ZW50TmFtZV0gPSB2YWx1ZUFjY2Vzc29yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzWydldmVudCddWydpbml0J10uY2FsbCh0aGlzLCBlbGVtZW50LCBuZXdWYWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1snZXZlbnQnXSA9IHtcbiAgICAnaW5pdCcgOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgdmFyIGV2ZW50c1RvSGFuZGxlID0gdmFsdWVBY2Nlc3NvcigpIHx8IHt9O1xuICAgICAgICBrby51dGlscy5vYmplY3RGb3JFYWNoKGV2ZW50c1RvSGFuZGxlLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnROYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBldmVudE5hbWUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlclJldHVyblZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlckZ1bmN0aW9uID0gdmFsdWVBY2Nlc3NvcigpW2V2ZW50TmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlckZ1bmN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWtlIGFsbCB0aGUgZXZlbnQgYXJncywgYW5kIHByZWZpeCB3aXRoIHRoZSB2aWV3bW9kZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzRm9ySGFuZGxlciA9IGtvLnV0aWxzLm1ha2VBcnJheShhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlld01vZGVsID0gYmluZGluZ0NvbnRleHRbJyRkYXRhJ107XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzRm9ySGFuZGxlci51bnNoaWZ0KHZpZXdNb2RlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmV0dXJuVmFsdWUgPSBoYW5kbGVyRnVuY3Rpb24uYXBwbHkodmlld01vZGVsLCBhcmdzRm9ySGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlclJldHVyblZhbHVlICE9PSB0cnVlKSB7IC8vIE5vcm1hbGx5IHdlIHdhbnQgdG8gcHJldmVudCBkZWZhdWx0IGFjdGlvbi4gRGV2ZWxvcGVyIGNhbiBvdmVycmlkZSB0aGlzIGJlIGV4cGxpY2l0bHkgcmV0dXJuaW5nIHRydWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBidWJibGUgPSBhbGxCaW5kaW5ncy5nZXQoZXZlbnROYW1lICsgJ0J1YmJsZScpICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFidWJibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG4vLyBcImZvcmVhY2g6IHNvbWVFeHByZXNzaW9uXCIgaXMgZXF1aXZhbGVudCB0byBcInRlbXBsYXRlOiB7IGZvcmVhY2g6IHNvbWVFeHByZXNzaW9uIH1cIlxuLy8gXCJmb3JlYWNoOiB7IGRhdGE6IHNvbWVFeHByZXNzaW9uLCBhZnRlckFkZDogbXlmbiB9XCIgaXMgZXF1aXZhbGVudCB0byBcInRlbXBsYXRlOiB7IGZvcmVhY2g6IHNvbWVFeHByZXNzaW9uLCBhZnRlckFkZDogbXlmbiB9XCJcbmtvLmJpbmRpbmdIYW5kbGVyc1snZm9yZWFjaCddID0ge1xuICAgIG1ha2VUZW1wbGF0ZVZhbHVlQWNjZXNzb3I6IGZ1bmN0aW9uKHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIG1vZGVsVmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCksXG4gICAgICAgICAgICAgICAgdW53cmFwcGVkVmFsdWUgPSBrby51dGlscy5wZWVrT2JzZXJ2YWJsZShtb2RlbFZhbHVlKTsgICAgLy8gVW53cmFwIHdpdGhvdXQgc2V0dGluZyBhIGRlcGVuZGVuY3kgaGVyZVxuXG4gICAgICAgICAgICAvLyBJZiB1bndyYXBwZWRWYWx1ZSBpcyB0aGUgYXJyYXksIHBhc3MgaW4gdGhlIHdyYXBwZWQgdmFsdWUgb24gaXRzIG93blxuICAgICAgICAgICAgLy8gVGhlIHZhbHVlIHdpbGwgYmUgdW53cmFwcGVkIGFuZCB0cmFja2VkIHdpdGhpbiB0aGUgdGVtcGxhdGUgYmluZGluZ1xuICAgICAgICAgICAgLy8gKFNlZSBodHRwczovL2dpdGh1Yi5jb20vU3RldmVTYW5kZXJzb24va25vY2tvdXQvaXNzdWVzLzUyMylcbiAgICAgICAgICAgIGlmICgoIXVud3JhcHBlZFZhbHVlKSB8fCB0eXBlb2YgdW53cmFwcGVkVmFsdWUubGVuZ3RoID09IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgJ2ZvcmVhY2gnOiBtb2RlbFZhbHVlLCAndGVtcGxhdGVFbmdpbmUnOiBrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZS5pbnN0YW5jZSB9O1xuXG4gICAgICAgICAgICAvLyBJZiB1bndyYXBwZWRWYWx1ZS5kYXRhIGlzIHRoZSBhcnJheSwgcHJlc2VydmUgYWxsIHJlbGV2YW50IG9wdGlvbnMgYW5kIHVud3JhcCBhZ2FpbiB2YWx1ZSBzbyB3ZSBnZXQgdXBkYXRlc1xuICAgICAgICAgICAga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShtb2RlbFZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJ2ZvcmVhY2gnOiB1bndyYXBwZWRWYWx1ZVsnZGF0YSddLFxuICAgICAgICAgICAgICAgICdhcyc6IHVud3JhcHBlZFZhbHVlWydhcyddLFxuICAgICAgICAgICAgICAgICdpbmNsdWRlRGVzdHJveWVkJzogdW53cmFwcGVkVmFsdWVbJ2luY2x1ZGVEZXN0cm95ZWQnXSxcbiAgICAgICAgICAgICAgICAnYWZ0ZXJBZGQnOiB1bndyYXBwZWRWYWx1ZVsnYWZ0ZXJBZGQnXSxcbiAgICAgICAgICAgICAgICAnYmVmb3JlUmVtb3ZlJzogdW53cmFwcGVkVmFsdWVbJ2JlZm9yZVJlbW92ZSddLFxuICAgICAgICAgICAgICAgICdhZnRlclJlbmRlcic6IHVud3JhcHBlZFZhbHVlWydhZnRlclJlbmRlciddLFxuICAgICAgICAgICAgICAgICdiZWZvcmVNb3ZlJzogdW53cmFwcGVkVmFsdWVbJ2JlZm9yZU1vdmUnXSxcbiAgICAgICAgICAgICAgICAnYWZ0ZXJNb3ZlJzogdW53cmFwcGVkVmFsdWVbJ2FmdGVyTW92ZSddLFxuICAgICAgICAgICAgICAgICd0ZW1wbGF0ZUVuZ2luZSc6IGtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lLmluc3RhbmNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICByZXR1cm4ga28uYmluZGluZ0hhbmRsZXJzWyd0ZW1wbGF0ZSddWydpbml0J10oZWxlbWVudCwga28uYmluZGluZ0hhbmRsZXJzWydmb3JlYWNoJ10ubWFrZVRlbXBsYXRlVmFsdWVBY2Nlc3Nvcih2YWx1ZUFjY2Vzc29yKSk7XG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGtvLmJpbmRpbmdIYW5kbGVyc1sndGVtcGxhdGUnXVsndXBkYXRlJ10oZWxlbWVudCwga28uYmluZGluZ0hhbmRsZXJzWydmb3JlYWNoJ10ubWFrZVRlbXBsYXRlVmFsdWVBY2Nlc3Nvcih2YWx1ZUFjY2Vzc29yKSwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpO1xuICAgIH1cbn07XG5rby5leHByZXNzaW9uUmV3cml0aW5nLmJpbmRpbmdSZXdyaXRlVmFsaWRhdG9yc1snZm9yZWFjaCddID0gZmFsc2U7IC8vIENhbid0IHJld3JpdGUgY29udHJvbCBmbG93IGJpbmRpbmdzXG5rby52aXJ0dWFsRWxlbWVudHMuYWxsb3dlZEJpbmRpbmdzWydmb3JlYWNoJ10gPSB0cnVlO1xudmFyIGhhc2ZvY3VzVXBkYXRpbmdQcm9wZXJ0eSA9ICdfX2tvX2hhc2ZvY3VzVXBkYXRpbmcnO1xudmFyIGhhc2ZvY3VzTGFzdFZhbHVlID0gJ19fa29faGFzZm9jdXNMYXN0VmFsdWUnO1xua28uYmluZGluZ0hhbmRsZXJzWydoYXNmb2N1cyddID0ge1xuICAgICdpbml0JzogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MpIHtcbiAgICAgICAgdmFyIGhhbmRsZUVsZW1lbnRGb2N1c0NoYW5nZSA9IGZ1bmN0aW9uKGlzRm9jdXNlZCkge1xuICAgICAgICAgICAgLy8gV2hlcmUgcG9zc2libGUsIGlnbm9yZSB3aGljaCBldmVudCB3YXMgcmFpc2VkIGFuZCBkZXRlcm1pbmUgZm9jdXMgc3RhdGUgdXNpbmcgYWN0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIC8vIGFzIHRoaXMgYXZvaWRzIHBoYW50b20gZm9jdXMvYmx1ciBldmVudHMgcmFpc2VkIHdoZW4gY2hhbmdpbmcgdGFicyBpbiBtb2Rlcm4gYnJvd3NlcnMuXG4gICAgICAgICAgICAvLyBIb3dldmVyLCBub3QgYWxsIEtPLXRhcmdldGVkIGJyb3dzZXJzIChGaXJlZm94IDIpIHN1cHBvcnQgYWN0aXZlRWxlbWVudC4gRm9yIHRob3NlIGJyb3dzZXJzLFxuICAgICAgICAgICAgLy8gcHJldmVudCBhIGxvc3Mgb2YgZm9jdXMgd2hlbiBjaGFuZ2luZyB0YWJzL3dpbmRvd3MgYnkgc2V0dGluZyBhIGZsYWcgdGhhdCBwcmV2ZW50cyBoYXNmb2N1c1xuICAgICAgICAgICAgLy8gZnJvbSBjYWxsaW5nICdibHVyKCknIG9uIHRoZSBlbGVtZW50IHdoZW4gaXQgbG9zZXMgZm9jdXMuXG4gICAgICAgICAgICAvLyBEaXNjdXNzaW9uIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZVNhbmRlcnNvbi9rbm9ja291dC9wdWxsLzM1MlxuICAgICAgICAgICAgZWxlbWVudFtoYXNmb2N1c1VwZGF0aW5nUHJvcGVydHldID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBvd25lckRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgIGlmIChcImFjdGl2ZUVsZW1lbnRcIiBpbiBvd25lckRvYykge1xuICAgICAgICAgICAgICAgIHZhciBhY3RpdmU7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gb3duZXJEb2MuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSUU5IHRocm93cyBpZiB5b3UgYWNjZXNzIGFjdGl2ZUVsZW1lbnQgZHVyaW5nIHBhZ2UgbG9hZCAoc2VlIGlzc3VlICM3MDMpXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZSA9IG93bmVyRG9jLmJvZHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlzRm9jdXNlZCA9IChhY3RpdmUgPT09IGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1vZGVsVmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCk7XG4gICAgICAgICAgICBrby5leHByZXNzaW9uUmV3cml0aW5nLndyaXRlVmFsdWVUb1Byb3BlcnR5KG1vZGVsVmFsdWUsIGFsbEJpbmRpbmdzLCAnaGFzZm9jdXMnLCBpc0ZvY3VzZWQsIHRydWUpO1xuXG4gICAgICAgICAgICAvL2NhY2hlIHRoZSBsYXRlc3QgdmFsdWUsIHNvIHdlIGNhbiBhdm9pZCB1bm5lY2Vzc2FyaWx5IGNhbGxpbmcgZm9jdXMvYmx1ciBpbiB0aGUgdXBkYXRlIGZ1bmN0aW9uXG4gICAgICAgICAgICBlbGVtZW50W2hhc2ZvY3VzTGFzdFZhbHVlXSA9IGlzRm9jdXNlZDtcbiAgICAgICAgICAgIGVsZW1lbnRbaGFzZm9jdXNVcGRhdGluZ1Byb3BlcnR5XSA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgaGFuZGxlRWxlbWVudEZvY3VzSW4gPSBoYW5kbGVFbGVtZW50Rm9jdXNDaGFuZ2UuYmluZChudWxsLCB0cnVlKTtcbiAgICAgICAgdmFyIGhhbmRsZUVsZW1lbnRGb2N1c091dCA9IGhhbmRsZUVsZW1lbnRGb2N1c0NoYW5nZS5iaW5kKG51bGwsIGZhbHNlKTtcblxuICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcImZvY3VzXCIsIGhhbmRsZUVsZW1lbnRGb2N1c0luKTtcbiAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgXCJmb2N1c2luXCIsIGhhbmRsZUVsZW1lbnRGb2N1c0luKTsgLy8gRm9yIElFXG4gICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwiYmx1clwiLCAgaGFuZGxlRWxlbWVudEZvY3VzT3V0KTtcbiAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgXCJmb2N1c291dFwiLCAgaGFuZGxlRWxlbWVudEZvY3VzT3V0KTsgLy8gRm9yIElFXG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24oZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICB2YXIgdmFsdWUgPSAhIWtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcblxuICAgICAgICBpZiAoIWVsZW1lbnRbaGFzZm9jdXNVcGRhdGluZ1Byb3BlcnR5XSAmJiBlbGVtZW50W2hhc2ZvY3VzTGFzdFZhbHVlXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlID8gZWxlbWVudC5mb2N1cygpIDogZWxlbWVudC5ibHVyKCk7XG5cbiAgICAgICAgICAgIC8vIEluIElFLCB0aGUgYmx1ciBtZXRob2QgZG9lc24ndCBhbHdheXMgY2F1c2UgdGhlIGVsZW1lbnQgdG8gbG9zZSBmb2N1cyAoZm9yIGV4YW1wbGUsIGlmIHRoZSB3aW5kb3cgaXMgbm90IGluIGZvY3VzKS5cbiAgICAgICAgICAgIC8vIFNldHRpbmcgZm9jdXMgdG8gdGhlIGJvZHkgZWxlbWVudCBkb2VzIHNlZW0gdG8gYmUgcmVsaWFibGUgaW4gSUUsIGJ1dCBzaG91bGQgb25seSBiZSB1c2VkIGlmIHdlIGtub3cgdGhhdCB0aGUgY3VycmVudFxuICAgICAgICAgICAgLy8gZWxlbWVudCB3YXMgZm9jdXNlZCBhbHJlYWR5LlxuICAgICAgICAgICAgaWYgKCF2YWx1ZSAmJiBlbGVtZW50W2hhc2ZvY3VzTGFzdFZhbHVlXSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvciBJRSwgd2hpY2ggZG9lc24ndCByZWxpYWJseSBmaXJlIFwiZm9jdXNcIiBvciBcImJsdXJcIiBldmVudHMgc3luY2hyb25vdXNseVxuICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoa28udXRpbHMudHJpZ2dlckV2ZW50LCBudWxsLCBbZWxlbWVudCwgdmFsdWUgPyBcImZvY3VzaW5cIiA6IFwiZm9jdXNvdXRcIl0pO1xuICAgICAgICB9XG4gICAgfVxufTtcbmtvLmV4cHJlc3Npb25SZXdyaXRpbmcudHdvV2F5QmluZGluZ3NbJ2hhc2ZvY3VzJ10gPSB0cnVlO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbJ2hhc0ZvY3VzJ10gPSBrby5iaW5kaW5nSGFuZGxlcnNbJ2hhc2ZvY3VzJ107IC8vIE1ha2UgXCJoYXNGb2N1c1wiIGFuIGFsaWFzXG5rby5leHByZXNzaW9uUmV3cml0aW5nLnR3b1dheUJpbmRpbmdzWydoYXNGb2N1cyddID0gdHJ1ZTtcbmtvLmJpbmRpbmdIYW5kbGVyc1snaHRtbCddID0ge1xuICAgICdpbml0JzogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFByZXZlbnQgYmluZGluZyBvbiB0aGUgZHluYW1pY2FsbHktaW5qZWN0ZWQgSFRNTCAoYXMgZGV2ZWxvcGVycyBhcmUgdW5saWtlbHkgdG8gZXhwZWN0IHRoYXQsIGFuZCBpdCBoYXMgc2VjdXJpdHkgaW1wbGljYXRpb25zKVxuICAgICAgICByZXR1cm4geyAnY29udHJvbHNEZXNjZW5kYW50QmluZGluZ3MnOiB0cnVlIH07XG4gICAgfSxcbiAgICAndXBkYXRlJzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgLy8gc2V0SHRtbCB3aWxsIHVud3JhcCB0aGUgdmFsdWUgaWYgbmVlZGVkXG4gICAgICAgIGtvLnV0aWxzLnNldEh0bWwoZWxlbWVudCwgdmFsdWVBY2Nlc3NvcigpKTtcbiAgICB9XG59O1xuLy8gTWFrZXMgYSBiaW5kaW5nIGxpa2Ugd2l0aCBvciBpZlxuZnVuY3Rpb24gbWFrZVdpdGhJZkJpbmRpbmcoYmluZGluZ0tleSwgaXNXaXRoLCBpc05vdCwgbWFrZUNvbnRleHRDYWxsYmFjaykge1xuICAgIGtvLmJpbmRpbmdIYW5kbGVyc1tiaW5kaW5nS2V5XSA9IHtcbiAgICAgICAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdmFyIGRpZERpc3BsYXlPbkxhc3RVcGRhdGUsXG4gICAgICAgICAgICAgICAgc2F2ZWROb2RlcztcbiAgICAgICAgICAgIGtvLmNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBkYXRhVmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSksXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZERpc3BsYXkgPSAhaXNOb3QgIT09ICFkYXRhVmFsdWUsIC8vIGVxdWl2YWxlbnQgdG8gaXNOb3QgPyAhZGF0YVZhbHVlIDogISFkYXRhVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgaXNGaXJzdFJlbmRlciA9ICFzYXZlZE5vZGVzLFxuICAgICAgICAgICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSBpc0ZpcnN0UmVuZGVyIHx8IGlzV2l0aCB8fCAoc2hvdWxkRGlzcGxheSAhPT0gZGlkRGlzcGxheU9uTGFzdFVwZGF0ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobmVlZHNSZWZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgYSBjb3B5IG9mIHRoZSBpbm5lciBub2RlcyBvbiB0aGUgaW5pdGlhbCB1cGRhdGUsIGJ1dCBvbmx5IGlmIHdlIGhhdmUgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdFJlbmRlciAmJiBrby5jb21wdXRlZENvbnRleHQuZ2V0RGVwZW5kZW5jaWVzQ291bnQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWROb2RlcyA9IGtvLnV0aWxzLmNsb25lTm9kZXMoa28udmlydHVhbEVsZW1lbnRzLmNoaWxkTm9kZXMoZWxlbWVudCksIHRydWUgLyogc2hvdWxkQ2xlYW5Ob2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0ZpcnN0UmVuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLnNldERvbU5vZGVDaGlsZHJlbihlbGVtZW50LCBrby51dGlscy5jbG9uZU5vZGVzKHNhdmVkTm9kZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGtvLmFwcGx5QmluZGluZ3NUb0Rlc2NlbmRhbnRzKG1ha2VDb250ZXh0Q2FsbGJhY2sgPyBtYWtlQ29udGV4dENhbGxiYWNrKGJpbmRpbmdDb250ZXh0LCBkYXRhVmFsdWUpIDogYmluZGluZ0NvbnRleHQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAga28udmlydHVhbEVsZW1lbnRzLmVtcHR5Tm9kZShlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRpZERpc3BsYXlPbkxhc3RVcGRhdGUgPSBzaG91bGREaXNwbGF5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIG51bGwsIHsgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBlbGVtZW50IH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgJ2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzJzogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICBrby5leHByZXNzaW9uUmV3cml0aW5nLmJpbmRpbmdSZXdyaXRlVmFsaWRhdG9yc1tiaW5kaW5nS2V5XSA9IGZhbHNlOyAvLyBDYW4ndCByZXdyaXRlIGNvbnRyb2wgZmxvdyBiaW5kaW5nc1xuICAgIGtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3NbYmluZGluZ0tleV0gPSB0cnVlO1xufVxuXG4vLyBDb25zdHJ1Y3QgdGhlIGFjdHVhbCBiaW5kaW5nIGhhbmRsZXJzXG5tYWtlV2l0aElmQmluZGluZygnaWYnKTtcbm1ha2VXaXRoSWZCaW5kaW5nKCdpZm5vdCcsIGZhbHNlIC8qIGlzV2l0aCAqLywgdHJ1ZSAvKiBpc05vdCAqLyk7XG5tYWtlV2l0aElmQmluZGluZygnd2l0aCcsIHRydWUgLyogaXNXaXRoICovLCBmYWxzZSAvKiBpc05vdCAqLyxcbiAgICBmdW5jdGlvbihiaW5kaW5nQ29udGV4dCwgZGF0YVZhbHVlKSB7XG4gICAgICAgIHJldHVybiBiaW5kaW5nQ29udGV4dFsnY3JlYXRlQ2hpbGRDb250ZXh0J10oZGF0YVZhbHVlKTtcbiAgICB9XG4pO1xudmFyIGNhcHRpb25QbGFjZWhvbGRlciA9IHt9O1xua28uYmluZGluZ0hhbmRsZXJzWydvcHRpb25zJ10gPSB7XG4gICAgJ2luaXQnOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgIGlmIChrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCkgIT09IFwic2VsZWN0XCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zIGJpbmRpbmcgYXBwbGllcyBvbmx5IHRvIFNFTEVDVCBlbGVtZW50c1wiKTtcblxuICAgICAgICAvLyBSZW1vdmUgYWxsIGV4aXN0aW5nIDxvcHRpb24+cy5cbiAgICAgICAgd2hpbGUgKGVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmUoMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmVzIHRoYXQgdGhlIGJpbmRpbmcgcHJvY2Vzc29yIGRvZXNuJ3QgdHJ5IHRvIGJpbmQgdGhlIG9wdGlvbnNcbiAgICAgICAgcmV0dXJuIHsgJ2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzJzogdHJ1ZSB9O1xuICAgIH0sXG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncykge1xuICAgICAgICBmdW5jdGlvbiBzZWxlY3RlZE9wdGlvbnMoKSB7XG4gICAgICAgICAgICByZXR1cm4ga28udXRpbHMuYXJyYXlGaWx0ZXIoZWxlbWVudC5vcHRpb25zLCBmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS5zZWxlY3RlZDsgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2VsZWN0V2FzUHJldmlvdXNseUVtcHR5ID0gZWxlbWVudC5sZW5ndGggPT0gMCxcbiAgICAgICAgICAgIG11bHRpcGxlID0gZWxlbWVudC5tdWx0aXBsZSxcbiAgICAgICAgICAgIHByZXZpb3VzU2Nyb2xsVG9wID0gKCFzZWxlY3RXYXNQcmV2aW91c2x5RW1wdHkgJiYgbXVsdGlwbGUpID8gZWxlbWVudC5zY3JvbGxUb3AgOiBudWxsLFxuICAgICAgICAgICAgdW53cmFwcGVkQXJyYXkgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSksXG4gICAgICAgICAgICB2YWx1ZUFsbG93VW5zZXQgPSBhbGxCaW5kaW5ncy5nZXQoJ3ZhbHVlQWxsb3dVbnNldCcpICYmIGFsbEJpbmRpbmdzWydoYXMnXSgndmFsdWUnKSxcbiAgICAgICAgICAgIGluY2x1ZGVEZXN0cm95ZWQgPSBhbGxCaW5kaW5ncy5nZXQoJ29wdGlvbnNJbmNsdWRlRGVzdHJveWVkJyksXG4gICAgICAgICAgICBhcnJheVRvRG9tTm9kZUNoaWxkcmVuT3B0aW9ucyA9IHt9LFxuICAgICAgICAgICAgY2FwdGlvblZhbHVlLFxuICAgICAgICAgICAgZmlsdGVyZWRBcnJheSxcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZXMgPSBbXTtcblxuICAgICAgICBpZiAoIXZhbHVlQWxsb3dVbnNldCkge1xuICAgICAgICAgICAgaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFZhbHVlcyA9IGtvLnV0aWxzLmFycmF5TWFwKHNlbGVjdGVkT3B0aW9ucygpLCBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuc2VsZWN0ZWRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFZhbHVlcy5wdXNoKGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQub3B0aW9uc1tlbGVtZW50LnNlbGVjdGVkSW5kZXhdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW53cmFwcGVkQXJyYXkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdW53cmFwcGVkQXJyYXkubGVuZ3RoID09IFwidW5kZWZpbmVkXCIpIC8vIENvZXJjZSBzaW5nbGUgdmFsdWUgaW50byBhcnJheVxuICAgICAgICAgICAgICAgIHVud3JhcHBlZEFycmF5ID0gW3Vud3JhcHBlZEFycmF5XTtcblxuICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBhbnkgZW50cmllcyBtYXJrZWQgYXMgZGVzdHJveWVkXG4gICAgICAgICAgICBmaWx0ZXJlZEFycmF5ID0ga28udXRpbHMuYXJyYXlGaWx0ZXIodW53cmFwcGVkQXJyYXksIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5jbHVkZURlc3Ryb3llZCB8fCBpdGVtID09PSB1bmRlZmluZWQgfHwgaXRlbSA9PT0gbnVsbCB8fCAha28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShpdGVtWydfZGVzdHJveSddKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBJZiBjYXB0aW9uIGlzIGluY2x1ZGVkLCBhZGQgaXQgdG8gdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAoYWxsQmluZGluZ3NbJ2hhcyddKCdvcHRpb25zQ2FwdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgY2FwdGlvblZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShhbGxCaW5kaW5ncy5nZXQoJ29wdGlvbnNDYXB0aW9uJykpO1xuICAgICAgICAgICAgICAgIC8vIElmIGNhcHRpb24gdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQsIGRvbid0IHNob3cgYSBjYXB0aW9uXG4gICAgICAgICAgICAgICAgaWYgKGNhcHRpb25WYWx1ZSAhPT0gbnVsbCAmJiBjYXB0aW9uVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEFycmF5LnVuc2hpZnQoY2FwdGlvblBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiBhIGZhbHN5IHZhbHVlIGlzIHByb3ZpZGVkIChlLmcuIG51bGwpLCB3ZSdsbCBzaW1wbHkgZW1wdHkgdGhlIHNlbGVjdCBlbGVtZW50XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhcHBseVRvT2JqZWN0KG9iamVjdCwgcHJlZGljYXRlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgIHZhciBwcmVkaWNhdGVUeXBlID0gdHlwZW9mIHByZWRpY2F0ZTtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGVUeXBlID09IFwiZnVuY3Rpb25cIikgICAgLy8gR2l2ZW4gYSBmdW5jdGlvbjsgcnVuIGl0IGFnYWluc3QgdGhlIGRhdGEgdmFsdWVcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlKG9iamVjdCk7XG4gICAgICAgICAgICBlbHNlIGlmIChwcmVkaWNhdGVUeXBlID09IFwic3RyaW5nXCIpIC8vIEdpdmVuIGEgc3RyaW5nOyB0cmVhdCBpdCBhcyBhIHByb3BlcnR5IG5hbWUgb24gdGhlIGRhdGEgdmFsdWVcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0W3ByZWRpY2F0ZV07XG4gICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHaXZlbiBubyBvcHRpb25zVGV4dCBhcmc7IHVzZSB0aGUgZGF0YSB2YWx1ZSBpdHNlbGZcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY2FuIHJ1biBhdCB0d28gZGlmZmVyZW50IHRpbWVzOlxuICAgICAgICAvLyBUaGUgZmlyc3QgaXMgd2hlbiB0aGUgd2hvbGUgYXJyYXkgaXMgYmVpbmcgdXBkYXRlZCBkaXJlY3RseSBmcm9tIHRoaXMgYmluZGluZyBoYW5kbGVyLlxuICAgICAgICAvLyBUaGUgc2Vjb25kIGlzIHdoZW4gYW4gb2JzZXJ2YWJsZSB2YWx1ZSBmb3IgYSBzcGVjaWZpYyBhcnJheSBlbnRyeSBpcyB1cGRhdGVkLlxuICAgICAgICAvLyBvbGRPcHRpb25zIHdpbGwgYmUgZW1wdHkgaW4gdGhlIGZpcnN0IGNhc2UsIGJ1dCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBvcHRpb24gaW4gdGhlIHNlY29uZC5cbiAgICAgICAgdmFyIGl0ZW1VcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgZnVuY3Rpb24gb3B0aW9uRm9yQXJyYXlJdGVtKGFycmF5RW50cnksIGluZGV4LCBvbGRPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob2xkT3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWVzID0gIXZhbHVlQWxsb3dVbnNldCAmJiBvbGRPcHRpb25zWzBdLnNlbGVjdGVkID8gWyBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShvbGRPcHRpb25zWzBdKSBdIDogW107XG4gICAgICAgICAgICAgICAgaXRlbVVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgb3B0aW9uID0gZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICAgICAgICBpZiAoYXJyYXlFbnRyeSA9PT0gY2FwdGlvblBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICAgICAga28udXRpbHMuc2V0VGV4dENvbnRlbnQob3B0aW9uLCBhbGxCaW5kaW5ncy5nZXQoJ29wdGlvbnNDYXB0aW9uJykpO1xuICAgICAgICAgICAgICAgIGtvLnNlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZShvcHRpb24sIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFwcGx5IGEgdmFsdWUgdG8gdGhlIG9wdGlvbiBlbGVtZW50XG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvblZhbHVlID0gYXBwbHlUb09iamVjdChhcnJheUVudHJ5LCBhbGxCaW5kaW5ncy5nZXQoJ29wdGlvbnNWYWx1ZScpLCBhcnJheUVudHJ5KTtcbiAgICAgICAgICAgICAgICBrby5zZWxlY3RFeHRlbnNpb25zLndyaXRlVmFsdWUob3B0aW9uLCBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG9wdGlvblZhbHVlKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBBcHBseSBzb21lIHRleHQgdG8gdGhlIG9wdGlvbiBlbGVtZW50XG4gICAgICAgICAgICAgICAgdmFyIG9wdGlvblRleHQgPSBhcHBseVRvT2JqZWN0KGFycmF5RW50cnksIGFsbEJpbmRpbmdzLmdldCgnb3B0aW9uc1RleHQnKSwgb3B0aW9uVmFsdWUpO1xuICAgICAgICAgICAgICAgIGtvLnV0aWxzLnNldFRleHRDb250ZW50KG9wdGlvbiwgb3B0aW9uVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW29wdGlvbl07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCeSB1c2luZyBhIGJlZm9yZVJlbW92ZSBjYWxsYmFjaywgd2UgZGVsYXkgdGhlIHJlbW92YWwgdW50aWwgYWZ0ZXIgbmV3IGl0ZW1zIGFyZSBhZGRlZC4gVGhpcyBmaXhlcyBhIHNlbGVjdGlvblxuICAgICAgICAvLyBwcm9ibGVtIGluIElFPD04IGFuZCBGaXJlZm94LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2tub2Nrb3V0L2tub2Nrb3V0L2lzc3Vlcy8xMjA4XG4gICAgICAgIGFycmF5VG9Eb21Ob2RlQ2hpbGRyZW5PcHRpb25zWydiZWZvcmVSZW1vdmUnXSA9XG4gICAgICAgICAgICBmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChvcHRpb24pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICBmdW5jdGlvbiBzZXRTZWxlY3Rpb25DYWxsYmFjayhhcnJheUVudHJ5LCBuZXdPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAoaXRlbVVwZGF0ZSAmJiB2YWx1ZUFsbG93VW5zZXQpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgbW9kZWwgdmFsdWUgaXMgYXV0aG9yaXRhdGl2ZSwgc28gbWFrZSBzdXJlIGl0cyB2YWx1ZSBpcyB0aGUgb25lIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUgc2luY2Ugc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyBkb2VzIHNvIGFscmVhZHkuXG4gICAgICAgICAgICAgICAga28uc2VsZWN0RXh0ZW5zaW9ucy53cml0ZVZhbHVlKGVsZW1lbnQsIGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoYWxsQmluZGluZ3MuZ2V0KCd2YWx1ZScpKSwgdHJ1ZSAvKiBhbGxvd1Vuc2V0ICovKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNTZWxlY3RlZFZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBJRTYgZG9lc24ndCBsaWtlIHVzIHRvIGFzc2lnbiBzZWxlY3Rpb24gdG8gT1BUSU9OIG5vZGVzIGJlZm9yZSB0aGV5J3JlIGFkZGVkIHRvIHRoZSBkb2N1bWVudC5cbiAgICAgICAgICAgICAgICAvLyBUaGF0J3Mgd2h5IHdlIGZpcnN0IGFkZGVkIHRoZW0gd2l0aG91dCBzZWxlY3Rpb24uIE5vdyBpdCdzIHRpbWUgdG8gc2V0IHRoZSBzZWxlY3Rpb24uXG4gICAgICAgICAgICAgICAgdmFyIGlzU2VsZWN0ZWQgPSBrby51dGlscy5hcnJheUluZGV4T2YocHJldmlvdXNTZWxlY3RlZFZhbHVlcywga28uc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUobmV3T3B0aW9uc1swXSkpID49IDA7XG4gICAgICAgICAgICAgICAga28udXRpbHMuc2V0T3B0aW9uTm9kZVNlbGVjdGlvblN0YXRlKG5ld09wdGlvbnNbMF0sIGlzU2VsZWN0ZWQpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBvcHRpb24gd2FzIGNoYW5nZWQgZnJvbSBiZWluZyBzZWxlY3RlZCBkdXJpbmcgYSBzaW5nbGUtaXRlbSB1cGRhdGUsIG5vdGlmeSB0aGUgY2hhbmdlXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1VcGRhdGUgJiYgIWlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoa28udXRpbHMudHJpZ2dlckV2ZW50LCBudWxsLCBbZWxlbWVudCwgXCJjaGFuZ2VcIl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjYWxsYmFjayA9IHNldFNlbGVjdGlvbkNhbGxiYWNrO1xuICAgICAgICBpZiAoYWxsQmluZGluZ3NbJ2hhcyddKCdvcHRpb25zQWZ0ZXJSZW5kZXInKSAmJiB0eXBlb2YgYWxsQmluZGluZ3MuZ2V0KCdvcHRpb25zQWZ0ZXJSZW5kZXInKSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gZnVuY3Rpb24oYXJyYXlFbnRyeSwgbmV3T3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHNldFNlbGVjdGlvbkNhbGxiYWNrKGFycmF5RW50cnksIG5ld09wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uaWdub3JlKGFsbEJpbmRpbmdzLmdldCgnb3B0aW9uc0FmdGVyUmVuZGVyJyksIG51bGwsIFtuZXdPcHRpb25zWzBdLCBhcnJheUVudHJ5ICE9PSBjYXB0aW9uUGxhY2Vob2xkZXIgPyBhcnJheUVudHJ5IDogdW5kZWZpbmVkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrby51dGlscy5zZXREb21Ob2RlQ2hpbGRyZW5Gcm9tQXJyYXlNYXBwaW5nKGVsZW1lbnQsIGZpbHRlcmVkQXJyYXksIG9wdGlvbkZvckFycmF5SXRlbSwgYXJyYXlUb0RvbU5vZGVDaGlsZHJlbk9wdGlvbnMsIGNhbGxiYWNrKTtcblxuICAgICAgICBrby5kZXBlbmRlbmN5RGV0ZWN0aW9uLmlnbm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVBbGxvd1Vuc2V0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG1vZGVsIHZhbHVlIGlzIGF1dGhvcml0YXRpdmUsIHNvIG1ha2Ugc3VyZSBpdHMgdmFsdWUgaXMgdGhlIG9uZSBzZWxlY3RlZFxuICAgICAgICAgICAgICAgIGtvLnNlbGVjdEV4dGVuc2lvbnMud3JpdGVWYWx1ZShlbGVtZW50LCBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGFsbEJpbmRpbmdzLmdldCgndmFsdWUnKSksIHRydWUgLyogYWxsb3dVbnNldCAqLyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHVwZGF0aW5nIHRoZSBvcHRpb25zIGxpc3RcbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0aW9uQ2hhbmdlZDtcbiAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGEgbXVsdGlwbGUtc2VsZWN0IGJveCwgY29tcGFyZSB0aGUgbmV3IHNlbGVjdGlvbiBjb3VudCB0byB0aGUgcHJldmlvdXMgb25lXG4gICAgICAgICAgICAgICAgICAgIC8vIEJ1dCBpZiBub3RoaW5nIHdhcyBzZWxlY3RlZCBiZWZvcmUsIHRoZSBzZWxlY3Rpb24gY2FuJ3QgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkNoYW5nZWQgPSBwcmV2aW91c1NlbGVjdGVkVmFsdWVzLmxlbmd0aCAmJiBzZWxlY3RlZE9wdGlvbnMoKS5sZW5ndGggPCBwcmV2aW91c1NlbGVjdGVkVmFsdWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgYSBzaW5nbGUtc2VsZWN0IGJveCwgY29tcGFyZSB0aGUgY3VycmVudCB2YWx1ZSB0byB0aGUgcHJldmlvdXMgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLy8gQnV0IGlmIG5vdGhpbmcgd2FzIHNlbGVjdGVkIGJlZm9yZSBvciBub3RoaW5nIGlzIHNlbGVjdGVkIG5vdywganVzdCBsb29rIGZvciBhIGNoYW5nZSBpbiBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCA9IChwcmV2aW91c1NlbGVjdGVkVmFsdWVzLmxlbmd0aCAmJiBlbGVtZW50LnNlbGVjdGVkSW5kZXggPj0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQub3B0aW9uc1tlbGVtZW50LnNlbGVjdGVkSW5kZXhdKSAhPT0gcHJldmlvdXNTZWxlY3RlZFZhbHVlc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKHByZXZpb3VzU2VsZWN0ZWRWYWx1ZXMubGVuZ3RoIHx8IGVsZW1lbnQuc2VsZWN0ZWRJbmRleCA+PSAwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgY29uc2lzdGVuY3kgYmV0d2VlbiBtb2RlbCB2YWx1ZSBhbmQgc2VsZWN0ZWQgb3B0aW9uLlxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkcm9wZG93biB3YXMgY2hhbmdlZCBzbyB0aGF0IHNlbGVjdGlvbiBpcyBubyBsb25nZXIgdGhlIHNhbWUsXG4gICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSB2YWx1ZSBvciBzZWxlY3RlZE9wdGlvbnMgYmluZGluZy5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICBrby51dGlscy50cmlnZ2VyRXZlbnQoZWxlbWVudCwgXCJjaGFuZ2VcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBJRSBidWdcbiAgICAgICAga28udXRpbHMuZW5zdXJlU2VsZWN0RWxlbWVudElzUmVuZGVyZWRDb3JyZWN0bHkoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzU2Nyb2xsVG9wICYmIE1hdGguYWJzKHByZXZpb3VzU2Nyb2xsVG9wIC0gZWxlbWVudC5zY3JvbGxUb3ApID4gMjApXG4gICAgICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHByZXZpb3VzU2Nyb2xsVG9wO1xuICAgIH1cbn07XG5rby5iaW5kaW5nSGFuZGxlcnNbJ29wdGlvbnMnXS5vcHRpb25WYWx1ZURvbURhdGFLZXkgPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKTtcbmtvLmJpbmRpbmdIYW5kbGVyc1snc2VsZWN0ZWRPcHRpb25zJ10gPSB7XG4gICAgJ2FmdGVyJzogWydvcHRpb25zJywgJ2ZvcmVhY2gnXSxcbiAgICAnaW5pdCc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncykge1xuICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcImNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCksIHZhbHVlVG9Xcml0ZSA9IFtdO1xuICAgICAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJvcHRpb25cIiksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5zZWxlY3RlZClcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVUb1dyaXRlLnB1c2goa28uc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUobm9kZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBrby5leHByZXNzaW9uUmV3cml0aW5nLndyaXRlVmFsdWVUb1Byb3BlcnR5KHZhbHVlLCBhbGxCaW5kaW5ncywgJ3NlbGVjdGVkT3B0aW9ucycsIHZhbHVlVG9Xcml0ZSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIGlmIChrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCkgIT0gXCJzZWxlY3RcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZhbHVlcyBiaW5kaW5nIGFwcGxpZXMgb25seSB0byBTRUxFQ1QgZWxlbWVudHNcIik7XG5cbiAgICAgICAgdmFyIG5ld1ZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpLFxuICAgICAgICAgICAgcHJldmlvdXNTY3JvbGxUb3AgPSBlbGVtZW50LnNjcm9sbFRvcDtcblxuICAgICAgICBpZiAobmV3VmFsdWUgJiYgdHlwZW9mIG5ld1ZhbHVlLmxlbmd0aCA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcIm9wdGlvblwiKSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgICAgIHZhciBpc1NlbGVjdGVkID0ga28udXRpbHMuYXJyYXlJbmRleE9mKG5ld1ZhbHVlLCBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShub2RlKSkgPj0gMDtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5zZWxlY3RlZCAhPSBpc1NlbGVjdGVkKSB7ICAgICAgLy8gVGhpcyBjaGVjayBwcmV2ZW50cyBmbGFzaGluZyBvZiB0aGUgc2VsZWN0IGVsZW1lbnQgaW4gSUVcbiAgICAgICAgICAgICAgICAgICAga28udXRpbHMuc2V0T3B0aW9uTm9kZVNlbGVjdGlvblN0YXRlKG5vZGUsIGlzU2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBwcmV2aW91c1Njcm9sbFRvcDtcbiAgICB9XG59O1xua28uZXhwcmVzc2lvblJld3JpdGluZy50d29XYXlCaW5kaW5nc1snc2VsZWN0ZWRPcHRpb25zJ10gPSB0cnVlO1xua28uYmluZGluZ0hhbmRsZXJzWydzdHlsZSddID0ge1xuICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSB8fCB7fSk7XG4gICAgICAgIGtvLnV0aWxzLm9iamVjdEZvckVhY2godmFsdWUsIGZ1bmN0aW9uKHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgc3R5bGVWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUoc3R5bGVWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmIChzdHlsZVZhbHVlID09PSBudWxsIHx8IHN0eWxlVmFsdWUgPT09IHVuZGVmaW5lZCB8fCBzdHlsZVZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIC8vIEVtcHR5IHN0cmluZyByZW1vdmVzIHRoZSB2YWx1ZSwgd2hlcmVhcyBudWxsL3VuZGVmaW5lZCBoYXZlIG5vIGVmZmVjdFxuICAgICAgICAgICAgICAgIHN0eWxlVmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xua28uYmluZGluZ0hhbmRsZXJzWydzdWJtaXQnXSA9IHtcbiAgICAnaW5pdCc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncywgdmlld01vZGVsLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlQWNjZXNzb3IoKSAhPSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgdmFsdWUgZm9yIGEgc3VibWl0IGJpbmRpbmcgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcInN1Ym1pdFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGVyUmV0dXJuVmFsdWU7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCk7XG4gICAgICAgICAgICB0cnkgeyBoYW5kbGVyUmV0dXJuVmFsdWUgPSB2YWx1ZS5jYWxsKGJpbmRpbmdDb250ZXh0WyckZGF0YSddLCBlbGVtZW50KTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJSZXR1cm5WYWx1ZSAhPT0gdHJ1ZSkgeyAvLyBOb3JtYWxseSB3ZSB3YW50IHRvIHByZXZlbnQgZGVmYXVsdCBhY3Rpb24uIERldmVsb3BlciBjYW4gb3ZlcnJpZGUgdGhpcyBiZSBleHBsaWNpdGx5IHJldHVybmluZyB0cnVlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufTtcbmtvLmJpbmRpbmdIYW5kbGVyc1sndGV4dCddID0ge1xuICAgICdpbml0JzogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFByZXZlbnQgYmluZGluZyBvbiB0aGUgZHluYW1pY2FsbHktaW5qZWN0ZWQgdGV4dCBub2RlIChhcyBkZXZlbG9wZXJzIGFyZSB1bmxpa2VseSB0byBleHBlY3QgdGhhdCwgYW5kIGl0IGhhcyBzZWN1cml0eSBpbXBsaWNhdGlvbnMpLlxuICAgICAgICAvLyBJdCBzaG91bGQgYWxzbyBtYWtlIHRoaW5ncyBmYXN0ZXIsIGFzIHdlIG5vIGxvbmdlciBoYXZlIHRvIGNvbnNpZGVyIHdoZXRoZXIgdGhlIHRleHQgbm9kZSBtaWdodCBiZSBiaW5kYWJsZS5cbiAgICAgICAgcmV0dXJuIHsgJ2NvbnRyb2xzRGVzY2VuZGFudEJpbmRpbmdzJzogdHJ1ZSB9O1xuICAgIH0sXG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yKSB7XG4gICAgICAgIGtvLnV0aWxzLnNldFRleHRDb250ZW50KGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IoKSk7XG4gICAgfVxufTtcbmtvLnZpcnR1YWxFbGVtZW50cy5hbGxvd2VkQmluZGluZ3NbJ3RleHQnXSA9IHRydWU7XG4oZnVuY3Rpb24gKCkge1xuXG5pZiAod2luZG93ICYmIHdpbmRvdy5uYXZpZ2F0b3IpIHtcbiAgICB2YXIgcGFyc2VWZXJzaW9uID0gZnVuY3Rpb24gKG1hdGNoZXMpIHtcbiAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KG1hdGNoZXNbMV0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIERldGVjdCB2YXJpb3VzIGJyb3dzZXIgdmVyc2lvbnMgYmVjYXVzZSBzb21lIG9sZCB2ZXJzaW9ucyBkb24ndCBmdWxseSBzdXBwb3J0IHRoZSAnaW5wdXQnIGV2ZW50XG4gICAgdmFyIG9wZXJhVmVyc2lvbiA9IHdpbmRvdy5vcGVyYSAmJiB3aW5kb3cub3BlcmEudmVyc2lvbiAmJiBwYXJzZUludCh3aW5kb3cub3BlcmEudmVyc2lvbigpKSxcbiAgICAgICAgdXNlckFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgICAgIHNhZmFyaVZlcnNpb24gPSBwYXJzZVZlcnNpb24odXNlckFnZW50Lm1hdGNoKC9eKD86KD8hY2hyb21lKS4pKnZlcnNpb25cXC8oW14gXSopIHNhZmFyaS9pKSksXG4gICAgICAgIGZpcmVmb3hWZXJzaW9uID0gcGFyc2VWZXJzaW9uKHVzZXJBZ2VudC5tYXRjaCgvRmlyZWZveFxcLyhbXiBdKikvKSk7XG59XG5cbi8vIElFIDggYW5kIDkgaGF2ZSBidWdzIHRoYXQgcHJldmVudCB0aGUgbm9ybWFsIGV2ZW50cyBmcm9tIGZpcmluZyB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzLlxuLy8gQnV0IGl0IGRvZXMgZmlyZSB0aGUgJ3NlbGVjdGlvbmNoYW5nZScgZXZlbnQgb24gbWFueSBvZiB0aG9zZSwgcHJlc3VtYWJseSBiZWNhdXNlIHRoZVxuLy8gY3Vyc29yIGlzIG1vdmluZyBhbmQgdGhhdCBjb3VudHMgYXMgdGhlIHNlbGVjdGlvbiBjaGFuZ2luZy4gVGhlICdzZWxlY3Rpb25jaGFuZ2UnIGV2ZW50IGlzXG4vLyBmaXJlZCBhdCB0aGUgZG9jdW1lbnQgbGV2ZWwgb25seSBhbmQgZG9lc24ndCBkaXJlY3RseSBpbmRpY2F0ZSB3aGljaCBlbGVtZW50IGNoYW5nZWQuIFdlXG4vLyBzZXQgdXAganVzdCBvbmUgZXZlbnQgaGFuZGxlciBmb3IgdGhlIGRvY3VtZW50IGFuZCB1c2UgJ2FjdGl2ZUVsZW1lbnQnIHRvIGRldGVybWluZSB3aGljaFxuLy8gZWxlbWVudCB3YXMgY2hhbmdlZC5cbmlmIChrby51dGlscy5pZVZlcnNpb24gPCAxMCkge1xuICAgIHZhciBzZWxlY3Rpb25DaGFuZ2VSZWdpc3RlcmVkTmFtZSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpLFxuICAgICAgICBzZWxlY3Rpb25DaGFuZ2VIYW5kbGVyTmFtZSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpO1xuICAgIHZhciBzZWxlY3Rpb25DaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMuYWN0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIGhhbmRsZXIgPSB0YXJnZXQgJiYga28udXRpbHMuZG9tRGF0YS5nZXQodGFyZ2V0LCBzZWxlY3Rpb25DaGFuZ2VIYW5kbGVyTmFtZSk7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIHJlZ2lzdGVyRm9yU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgaGFuZGxlcikge1xuICAgICAgICB2YXIgb3duZXJEb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICgha28udXRpbHMuZG9tRGF0YS5nZXQob3duZXJEb2MsIHNlbGVjdGlvbkNoYW5nZVJlZ2lzdGVyZWROYW1lKSkge1xuICAgICAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQob3duZXJEb2MsIHNlbGVjdGlvbkNoYW5nZVJlZ2lzdGVyZWROYW1lLCB0cnVlKTtcbiAgICAgICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKG93bmVyRG9jLCAnc2VsZWN0aW9uY2hhbmdlJywgc2VsZWN0aW9uQ2hhbmdlSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAga28udXRpbHMuZG9tRGF0YS5zZXQoZWxlbWVudCwgc2VsZWN0aW9uQ2hhbmdlSGFuZGxlck5hbWUsIGhhbmRsZXIpO1xuICAgIH07XG59XG5cbmtvLmJpbmRpbmdIYW5kbGVyc1sndGV4dElucHV0J10gPSB7XG4gICAgJ2luaXQnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MpIHtcblxuICAgICAgICB2YXIgcHJldmlvdXNFbGVtZW50VmFsdWUgPSBlbGVtZW50LnZhbHVlLFxuICAgICAgICAgICAgdGltZW91dEhhbmRsZSxcbiAgICAgICAgICAgIGVsZW1lbnRWYWx1ZUJlZm9yZUV2ZW50O1xuXG4gICAgICAgIHZhciB1cGRhdGVNb2RlbCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICAgICAgZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQgPSB0aW1lb3V0SGFuZGxlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICB2YXIgZWxlbWVudFZhbHVlID0gZWxlbWVudC52YWx1ZTtcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnRWYWx1ZSAhPT0gZWxlbWVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJvdmlkZSBhIHdheSBmb3IgdGVzdHMgdG8ga25vdyBleGFjdGx5IHdoaWNoIGV2ZW50IHdhcyBwcm9jZXNzZWRcbiAgICAgICAgICAgICAgICBpZiAoREVCVUcgJiYgZXZlbnQpIGVsZW1lbnRbJ19rb190ZXh0SW5wdXRQcm9jZXNzZWRFdmVudCddID0gZXZlbnQudHlwZTtcbiAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnRWYWx1ZSA9IGVsZW1lbnRWYWx1ZTtcbiAgICAgICAgICAgICAgICBrby5leHByZXNzaW9uUmV3cml0aW5nLndyaXRlVmFsdWVUb1Byb3BlcnR5KHZhbHVlQWNjZXNzb3IoKSwgYWxsQmluZGluZ3MsICd0ZXh0SW5wdXQnLCBlbGVtZW50VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBkZWZlclVwZGF0ZU1vZGVsID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoIXRpbWVvdXRIYW5kbGUpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQgdmFyaWFibGUgaXMgc2V0ICpvbmx5KiBkdXJpbmcgdGhlIGJyaWVmIGdhcCBiZXR3ZWVuIGFuXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQgZmlyaW5nIGFuZCB0aGUgdXBkYXRlTW9kZWwgZnVuY3Rpb24gcnVubmluZy4gVGhpcyBhbGxvd3MgdXMgdG8gaWdub3JlIG1vZGVsXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlcyB0aGF0IGFyZSBmcm9tIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgZWxlbWVudCwgdXN1YWxseSBkdWUgdG8gdGVjaG5pcXVlc1xuICAgICAgICAgICAgICAgIC8vIHN1Y2ggYXMgcmF0ZUxpbWl0LiBTdWNoIHVwZGF0ZXMsIGlmIG5vdCBpZ25vcmVkLCBjYW4gY2F1c2Uga2V5c3Ryb2tlcyB0byBiZSBsb3N0LlxuICAgICAgICAgICAgICAgIGVsZW1lbnRWYWx1ZUJlZm9yZUV2ZW50ID0gZWxlbWVudC52YWx1ZTtcbiAgICAgICAgICAgICAgICB2YXIgaGFuZGxlciA9IERFQlVHID8gdXBkYXRlTW9kZWwuYmluZChlbGVtZW50LCB7dHlwZTogZXZlbnQudHlwZX0pIDogdXBkYXRlTW9kZWw7XG4gICAgICAgICAgICAgICAgdGltZW91dEhhbmRsZSA9IGtvLnV0aWxzLnNldFRpbWVvdXQoaGFuZGxlciwgNCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSUU5IHdpbGwgbWVzcyB1cCB0aGUgRE9NIGlmIHlvdSBoYW5kbGUgZXZlbnRzIHN5bmNocm9ub3VzbHkgd2hpY2ggcmVzdWx0cyBpbiBET00gY2hhbmdlcyAoc3VjaCBhcyBvdGhlciBiaW5kaW5ncyk7XG4gICAgICAgIC8vIHNvIHdlJ2xsIG1ha2Ugc3VyZSBhbGwgdXBkYXRlcyBhcmUgYXN5bmNocm9ub3VzXG4gICAgICAgIHZhciBpZVVwZGF0ZU1vZGVsID0ga28udXRpbHMuaWVWZXJzaW9uID09IDkgPyBkZWZlclVwZGF0ZU1vZGVsIDogdXBkYXRlTW9kZWw7XG5cbiAgICAgICAgdmFyIHVwZGF0ZVZpZXcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbW9kZWxWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcblxuICAgICAgICAgICAgaWYgKG1vZGVsVmFsdWUgPT09IG51bGwgfHwgbW9kZWxWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxWYWx1ZSA9ICcnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQgIT09IHVuZGVmaW5lZCAmJiBtb2RlbFZhbHVlID09PSBlbGVtZW50VmFsdWVCZWZvcmVFdmVudCkge1xuICAgICAgICAgICAgICAgIGtvLnV0aWxzLnNldFRpbWVvdXQodXBkYXRlVmlldywgNCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGVsZW1lbnQgb25seSBpZiB0aGUgZWxlbWVudCBhbmQgbW9kZWwgYXJlIGRpZmZlcmVudC4gT24gc29tZSBicm93c2VycywgdXBkYXRpbmcgdGhlIHZhbHVlXG4gICAgICAgICAgICAvLyB3aWxsIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgd2hpY2ggd291bGQgYmUgYmFkIHdoaWxlIHRoZSB1c2VyIGlzIHR5cGluZy5cbiAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbHVlICE9PSBtb2RlbFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNFbGVtZW50VmFsdWUgPSBtb2RlbFZhbHVlOyAgLy8gTWFrZSBzdXJlIHdlIGlnbm9yZSBldmVudHMgKHByb3BlcnR5Y2hhbmdlKSB0aGF0IHJlc3VsdCBmcm9tIHVwZGF0aW5nIHRoZSB2YWx1ZVxuICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSBtb2RlbFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBvbkV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBldmVudCwgaGFuZGxlcik7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKERFQlVHICYmIGtvLmJpbmRpbmdIYW5kbGVyc1sndGV4dElucHV0J11bJ19mb3JjZVVwZGF0ZU9uJ10pIHtcbiAgICAgICAgICAgIC8vIFByb3ZpZGUgYSB3YXkgZm9yIHRlc3RzIHRvIHNwZWNpZnkgZXhhY3RseSB3aGljaCBldmVudHMgYXJlIGJvdW5kXG4gICAgICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goa28uYmluZGluZ0hhbmRsZXJzWyd0ZXh0SW5wdXQnXVsnX2ZvcmNlVXBkYXRlT24nXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50TmFtZS5zbGljZSgwLDUpID09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgb25FdmVudChldmVudE5hbWUuc2xpY2UoNSksIGRlZmVyVXBkYXRlTW9kZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoZXZlbnROYW1lLCB1cGRhdGVNb2RlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoa28udXRpbHMuaWVWZXJzaW9uIDwgMTApIHtcbiAgICAgICAgICAgICAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciA8PSA4IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgJ2lucHV0JyBldmVudCwgYnV0IGRvZXMgaW5jbHVkZSAncHJvcGVydHljaGFuZ2UnIHRoYXQgZmlyZXMgd2hlbmV2ZXJcbiAgICAgICAgICAgICAgICAvLyBhbnkgcHJvcGVydHkgb2YgYW4gZWxlbWVudCBjaGFuZ2VzLiBVbmxpa2UgJ2lucHV0JywgaXQgYWxzbyBmaXJlcyBpZiBhIHByb3BlcnR5IGlzIGNoYW5nZWQgZnJvbSBKYXZhU2NyaXB0IGNvZGUsXG4gICAgICAgICAgICAgICAgLy8gYnV0IHRoYXQncyBhbiBhY2NlcHRhYmxlIGNvbXByb21pc2UgZm9yIHRoaXMgYmluZGluZy4gSUUgOSBkb2VzIHN1cHBvcnQgJ2lucHV0JywgYnV0IHNpbmNlIGl0IGRvZXNuJ3QgZmlyZSBpdFxuICAgICAgICAgICAgICAgIC8vIHdoZW4gdXNpbmcgYXV0b2NvbXBsZXRlLCB3ZSdsbCB1c2UgJ3Byb3BlcnR5Y2hhbmdlJyBmb3IgaXQgYWxzby5cbiAgICAgICAgICAgICAgICBvbkV2ZW50KCdwcm9wZXJ0eWNoYW5nZScsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5wcm9wZXJ0eU5hbWUgPT09ICd2YWx1ZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGllVXBkYXRlTW9kZWwoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoa28udXRpbHMuaWVWZXJzaW9uID09IDgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSUUgOCBoYXMgYSBidWcgd2hlcmUgaXQgZmFpbHMgdG8gZmlyZSAncHJvcGVydHljaGFuZ2UnIG9uIHRoZSBmaXJzdCB1cGRhdGUgZm9sbG93aW5nIGEgdmFsdWUgY2hhbmdlIGZyb21cbiAgICAgICAgICAgICAgICAgICAgLy8gSmF2YVNjcmlwdCBjb2RlLiBJdCBhbHNvIGRvZXNuJ3QgZmlyZSBpZiB5b3UgY2xlYXIgdGhlIGVudGlyZSB2YWx1ZS4gVG8gZml4IHRoaXMsIHdlIGJpbmQgdG8gdGhlIGZvbGxvd2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyBldmVudHMgdG9vLlxuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdrZXl1cCcsIHVwZGF0ZU1vZGVsKTsgICAgICAvLyBBIHNpbmdsZSBrZXlzdG9rZVxuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdrZXlkb3duJywgdXBkYXRlTW9kZWwpOyAgICAvLyBUaGUgZmlyc3QgY2hhcmFjdGVyIHdoZW4gYSBrZXkgaXMgaGVsZCBkb3duXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrby51dGlscy5pZVZlcnNpb24gPj0gOCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciA5IGRvZXNuJ3QgZmlyZSB0aGUgJ2lucHV0JyBldmVudCB3aGVuIGRlbGV0aW5nIHRleHQsIGluY2x1ZGluZyB1c2luZ1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYmFja3NwYWNlLCBkZWxldGUsIG9yIGN0cmwteCBrZXlzLCBjbGlja2luZyB0aGUgJ3gnIHRvIGNsZWFyIHRoZSBpbnB1dCwgZHJhZ2dpbmcgdGV4dFxuICAgICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgdGhlIGZpZWxkLCBhbmQgY3V0dGluZyBvciBkZWxldGluZyB0ZXh0IHVzaW5nIHRoZSBjb250ZXh0IG1lbnUuICdzZWxlY3Rpb25jaGFuZ2UnXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBkZXRlY3QgYWxsIG9mIHRob3NlIGV4Y2VwdCBkcmFnZ2luZyB0ZXh0IG91dCBvZiB0aGUgZmllbGQsIGZvciB3aGljaCB3ZSB1c2UgJ2RyYWdlbmQnLlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgYWxzbyBuZWVkZWQgaW4gSUU4IGJlY2F1c2Ugb2YgdGhlIGJ1ZyBkZXNjcmliZWQgYWJvdmUuXG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRm9yU2VsZWN0aW9uQ2hhbmdlRXZlbnQoZWxlbWVudCwgaWVVcGRhdGVNb2RlbCk7ICAvLyAnc2VsZWN0aW9uY2hhbmdlJyBjb3ZlcnMgY3V0LCBwYXN0ZSwgZHJvcCwgZGVsZXRlLCBldGMuXG4gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoJ2RyYWdlbmQnLCBkZWZlclVwZGF0ZU1vZGVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFsbCBvdGhlciBzdXBwb3J0ZWQgYnJvd3NlcnMgc3VwcG9ydCB0aGUgJ2lucHV0JyBldmVudCwgd2hpY2ggZmlyZXMgd2hlbmV2ZXIgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgaXMgY2hhbmdlZFxuICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHVzZXIgaW50ZXJmYWNlLlxuICAgICAgICAgICAgICAgIG9uRXZlbnQoJ2lucHV0JywgdXBkYXRlTW9kZWwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNhZmFyaVZlcnNpb24gPCA1ICYmIGtvLnV0aWxzLnRhZ05hbWVMb3dlcihlbGVtZW50KSA9PT0gXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhZmFyaSA8NSBkb2Vzbid0IGZpcmUgdGhlICdpbnB1dCcgZXZlbnQgZm9yIDx0ZXh0YXJlYT4gZWxlbWVudHMgKGl0IGRvZXMgZmlyZSAndGV4dElucHV0J1xuICAgICAgICAgICAgICAgICAgICAvLyBidXQgb25seSB3aGVuIHR5cGluZykuIFNvIHdlJ2xsIGp1c3QgY2F0Y2ggYXMgbXVjaCBhcyB3ZSBjYW4gd2l0aCBrZXlkb3duLCBjdXQsIGFuZCBwYXN0ZS5cbiAgICAgICAgICAgICAgICAgICAgb25FdmVudCgna2V5ZG93bicsIGRlZmVyVXBkYXRlTW9kZWwpO1xuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdwYXN0ZScsIGRlZmVyVXBkYXRlTW9kZWwpO1xuICAgICAgICAgICAgICAgICAgICBvbkV2ZW50KCdjdXQnLCBkZWZlclVwZGF0ZU1vZGVsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wZXJhVmVyc2lvbiA8IDExKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9wZXJhIDEwIGRvZXNuJ3QgYWx3YXlzIGZpcmUgdGhlICdpbnB1dCcgZXZlbnQgZm9yIGN1dCwgcGFzdGUsIHVuZG8gJiBkcm9wIG9wZXJhdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbiB0cnkgdG8gY2F0Y2ggc29tZSBvZiB0aG9zZSB1c2luZyAna2V5ZG93bicuXG4gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoJ2tleWRvd24nLCBkZWZlclVwZGF0ZU1vZGVsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcmVmb3hWZXJzaW9uIDwgNC4wKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggPD0gMy42IGRvZXNuJ3QgZmlyZSB0aGUgJ2lucHV0JyBldmVudCB3aGVuIHRleHQgaXMgZmlsbGVkIGluIHRocm91Z2ggYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgIG9uRXZlbnQoJ0RPTUF1dG9Db21wbGV0ZScsIHVwZGF0ZU1vZGVsKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBGaXJlZm94IDw9My41IGRvZXNuJ3QgZmlyZSB0aGUgJ2lucHV0JyBldmVudCB3aGVuIHRleHQgaXMgZHJvcHBlZCBpbnRvIHRoZSBpbnB1dC5cbiAgICAgICAgICAgICAgICAgICAgb25FdmVudCgnZHJhZ2Ryb3AnLCB1cGRhdGVNb2RlbCk7ICAgICAgIC8vIDwzLjVcbiAgICAgICAgICAgICAgICAgICAgb25FdmVudCgnZHJvcCcsIHVwZGF0ZU1vZGVsKTsgICAgICAgICAgIC8vIDMuNVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJpbmQgdG8gdGhlIGNoYW5nZSBldmVudCBzbyB0aGF0IHdlIGNhbiBjYXRjaCBwcm9ncmFtbWF0aWMgdXBkYXRlcyBvZiB0aGUgdmFsdWUgdGhhdCBmaXJlIHRoaXMgZXZlbnQuXG4gICAgICAgIG9uRXZlbnQoJ2NoYW5nZScsIHVwZGF0ZU1vZGVsKTtcblxuICAgICAgICBrby5jb21wdXRlZCh1cGRhdGVWaWV3LCBudWxsLCB7IGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogZWxlbWVudCB9KTtcbiAgICB9XG59O1xua28uZXhwcmVzc2lvblJld3JpdGluZy50d29XYXlCaW5kaW5nc1sndGV4dElucHV0J10gPSB0cnVlO1xuXG4vLyB0ZXh0aW5wdXQgaXMgYW4gYWxpYXMgZm9yIHRleHRJbnB1dFxua28uYmluZGluZ0hhbmRsZXJzWyd0ZXh0aW5wdXQnXSA9IHtcbiAgICAvLyBwcmVwcm9jZXNzIGlzIHRoZSBvbmx5IHdheSB0byBzZXQgdXAgYSBmdWxsIGFsaWFzXG4gICAgJ3ByZXByb2Nlc3MnOiBmdW5jdGlvbiAodmFsdWUsIG5hbWUsIGFkZEJpbmRpbmcpIHtcbiAgICAgICAgYWRkQmluZGluZygndGV4dElucHV0JywgdmFsdWUpO1xuICAgIH1cbn07XG5cbn0pKCk7a28uYmluZGluZ0hhbmRsZXJzWyd1bmlxdWVOYW1lJ10gPSB7XG4gICAgJ2luaXQnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3Nvcikge1xuICAgICAgICBpZiAodmFsdWVBY2Nlc3NvcigpKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IFwia29fdW5pcXVlX1wiICsgKCsra28uYmluZGluZ0hhbmRsZXJzWyd1bmlxdWVOYW1lJ10uY3VycmVudEluZGV4KTtcbiAgICAgICAgICAgIGtvLnV0aWxzLnNldEVsZW1lbnROYW1lKGVsZW1lbnQsIG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxufTtcbmtvLmJpbmRpbmdIYW5kbGVyc1sndW5pcXVlTmFtZSddLmN1cnJlbnRJbmRleCA9IDA7XG5rby5iaW5kaW5nSGFuZGxlcnNbJ3ZhbHVlJ10gPSB7XG4gICAgJ2FmdGVyJzogWydvcHRpb25zJywgJ2ZvcmVhY2gnXSxcbiAgICAnaW5pdCc6IGZ1bmN0aW9uIChlbGVtZW50LCB2YWx1ZUFjY2Vzc29yLCBhbGxCaW5kaW5ncykge1xuICAgICAgICAvLyBJZiB0aGUgdmFsdWUgYmluZGluZyBpcyBwbGFjZWQgb24gYSByYWRpby9jaGVja2JveCwgdGhlbiBqdXN0IHBhc3MgdGhyb3VnaCB0byBjaGVja2VkVmFsdWUgYW5kIHF1aXRcbiAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiAoZWxlbWVudC50eXBlID09IFwiY2hlY2tib3hcIiB8fCBlbGVtZW50LnR5cGUgPT0gXCJyYWRpb1wiKSkge1xuICAgICAgICAgICAga28uYXBwbHlCaW5kaW5nQWNjZXNzb3JzVG9Ob2RlKGVsZW1lbnQsIHsgJ2NoZWNrZWRWYWx1ZSc6IHZhbHVlQWNjZXNzb3IgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBbHdheXMgY2F0Y2ggXCJjaGFuZ2VcIiBldmVudDsgcG9zc2libHkgb3RoZXIgZXZlbnRzIHRvbyBpZiBhc2tlZFxuICAgICAgICB2YXIgZXZlbnRzVG9DYXRjaCA9IFtcImNoYW5nZVwiXTtcbiAgICAgICAgdmFyIHJlcXVlc3RlZEV2ZW50c1RvQ2F0Y2ggPSBhbGxCaW5kaW5ncy5nZXQoXCJ2YWx1ZVVwZGF0ZVwiKTtcbiAgICAgICAgdmFyIHByb3BlcnR5Q2hhbmdlZEZpcmVkID0gZmFsc2U7XG4gICAgICAgIHZhciBlbGVtZW50VmFsdWVCZWZvcmVFdmVudCA9IG51bGw7XG5cbiAgICAgICAgaWYgKHJlcXVlc3RlZEV2ZW50c1RvQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVxdWVzdGVkRXZlbnRzVG9DYXRjaCA9PSBcInN0cmluZ1wiKSAvLyBBbGxvdyBib3RoIGluZGl2aWR1YWwgZXZlbnQgbmFtZXMsIGFuZCBhcnJheXMgb2YgZXZlbnQgbmFtZXNcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRFdmVudHNUb0NhdGNoID0gW3JlcXVlc3RlZEV2ZW50c1RvQ2F0Y2hdO1xuICAgICAgICAgICAga28udXRpbHMuYXJyYXlQdXNoQWxsKGV2ZW50c1RvQ2F0Y2gsIHJlcXVlc3RlZEV2ZW50c1RvQ2F0Y2gpO1xuICAgICAgICAgICAgZXZlbnRzVG9DYXRjaCA9IGtvLnV0aWxzLmFycmF5R2V0RGlzdGluY3RWYWx1ZXMoZXZlbnRzVG9DYXRjaCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmFsdWVVcGRhdGVIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBlbGVtZW50VmFsdWVCZWZvcmVFdmVudCA9IG51bGw7XG4gICAgICAgICAgICBwcm9wZXJ0eUNoYW5nZWRGaXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIG1vZGVsVmFsdWUgPSB2YWx1ZUFjY2Vzc29yKCk7XG4gICAgICAgICAgICB2YXIgZWxlbWVudFZhbHVlID0ga28uc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUoZWxlbWVudCk7XG4gICAgICAgICAgICBrby5leHByZXNzaW9uUmV3cml0aW5nLndyaXRlVmFsdWVUb1Byb3BlcnR5KG1vZGVsVmFsdWUsIGFsbEJpbmRpbmdzLCAndmFsdWUnLCBlbGVtZW50VmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL1N0ZXZlU2FuZGVyc29uL2tub2Nrb3V0L2lzc3Vlcy8xMjJcbiAgICAgICAgLy8gSUUgZG9lc24ndCBmaXJlIFwiY2hhbmdlXCIgZXZlbnRzIG9uIHRleHRib3hlcyBpZiB0aGUgdXNlciBzZWxlY3RzIGEgdmFsdWUgZnJvbSBpdHMgYXV0b2NvbXBsZXRlIGxpc3RcbiAgICAgICAgdmFyIGllQXV0b0NvbXBsZXRlSGFja05lZWRlZCA9IGtvLnV0aWxzLmllVmVyc2lvbiAmJiBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgZWxlbWVudC50eXBlID09IFwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50LmF1dG9jb21wbGV0ZSAhPSBcIm9mZlwiICYmICghZWxlbWVudC5mb3JtIHx8IGVsZW1lbnQuZm9ybS5hdXRvY29tcGxldGUgIT0gXCJvZmZcIik7XG4gICAgICAgIGlmIChpZUF1dG9Db21wbGV0ZUhhY2tOZWVkZWQgJiYga28udXRpbHMuYXJyYXlJbmRleE9mKGV2ZW50c1RvQ2F0Y2gsIFwicHJvcGVydHljaGFuZ2VcIikgPT0gLTEpIHtcbiAgICAgICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwicHJvcGVydHljaGFuZ2VcIiwgZnVuY3Rpb24gKCkgeyBwcm9wZXJ0eUNoYW5nZWRGaXJlZCA9IHRydWUgfSk7XG4gICAgICAgICAgICBrby51dGlscy5yZWdpc3RlckV2ZW50SGFuZGxlcihlbGVtZW50LCBcImZvY3VzXCIsIGZ1bmN0aW9uICgpIHsgcHJvcGVydHlDaGFuZ2VkRmlyZWQgPSBmYWxzZSB9KTtcbiAgICAgICAgICAgIGtvLnV0aWxzLnJlZ2lzdGVyRXZlbnRIYW5kbGVyKGVsZW1lbnQsIFwiYmx1clwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlDaGFuZ2VkRmlyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVVcGRhdGVIYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBrby51dGlscy5hcnJheUZvckVhY2goZXZlbnRzVG9DYXRjaCwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICAgICAgICAvLyBUaGUgc3ludGF4IFwiYWZ0ZXI8ZXZlbnRuYW1lPlwiIG1lYW5zIFwicnVuIHRoZSBoYW5kbGVyIGFzeW5jaHJvbm91c2x5IGFmdGVyIHRoZSBldmVudFwiXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHRvIGNhdGNoIFwia2V5ZG93blwiIGV2ZW50cyBhZnRlciB0aGUgYnJvd3NlciBoYXMgdXBkYXRlZCB0aGUgY29udHJvbFxuICAgICAgICAgICAgLy8gKG90aGVyd2lzZSwga28uc2VsZWN0RXh0ZW5zaW9ucy5yZWFkVmFsdWUodGhpcykgd2lsbCByZWNlaXZlIHRoZSBjb250cm9sJ3MgdmFsdWUgKmJlZm9yZSogdGhlIGtleSBldmVudClcbiAgICAgICAgICAgIHZhciBoYW5kbGVyID0gdmFsdWVVcGRhdGVIYW5kbGVyO1xuICAgICAgICAgICAgaWYgKGtvLnV0aWxzLnN0cmluZ1N0YXJ0c1dpdGgoZXZlbnROYW1lLCBcImFmdGVyXCIpKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudFZhbHVlQmVmb3JlRXZlbnQgdmFyaWFibGUgaXMgbm9uLW51bGwgKm9ubHkqIGR1cmluZyB0aGUgYnJpZWYgZ2FwIGJldHdlZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSBrZXlYIGV2ZW50IGZpcmluZyBhbmQgdGhlIHZhbHVlVXBkYXRlSGFuZGxlciBydW5uaW5nLCB3aGljaCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuXG4gICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlYXJsaWVzdCBhc3luY2hyb25vdXMgb3Bwb3J0dW5pdHkuIFdlIHN0b3JlIHRoaXMgdGVtcG9yYXJ5IGluZm9ybWF0aW9uIHNvIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYsIGJldHdlZW4ga2V5WCBhbmQgdmFsdWVVcGRhdGVIYW5kbGVyLCB0aGUgdW5kZXJseWluZyBtb2RlbCB2YWx1ZSBjaGFuZ2VzIHNlcGFyYXRlbHksXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBvdmVyd3JpdGUgdGhhdCBtb2RlbCB2YWx1ZSBjaGFuZ2Ugd2l0aCB0aGUgdmFsdWUgdGhlIHVzZXIganVzdCB0eXBlZC4gT3RoZXJ3aXNlLFxuICAgICAgICAgICAgICAgICAgICAvLyB0ZWNobmlxdWVzIGxpa2UgcmF0ZUxpbWl0IGNhbiB0cmlnZ2VyIG1vZGVsIGNoYW5nZXMgYXQgY3JpdGljYWwgbW9tZW50cyB0aGF0IHdpbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIHVzZXIncyBpbnB1dHMsIGNhdXNpbmcga2V5c3Ryb2tlcyB0byBiZSBsb3N0LlxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50VmFsdWVCZWZvcmVFdmVudCA9IGtvLnNlbGVjdEV4dGVuc2lvbnMucmVhZFZhbHVlKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBrby51dGlscy5zZXRUaW1lb3V0KHZhbHVlVXBkYXRlSGFuZGxlciwgMCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBldmVudE5hbWUuc3Vic3RyaW5nKFwiYWZ0ZXJcIi5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga28udXRpbHMucmVnaXN0ZXJFdmVudEhhbmRsZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIHVwZGF0ZUZyb21Nb2RlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcbiAgICAgICAgICAgIHZhciBlbGVtZW50VmFsdWUgPSBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShlbGVtZW50KTtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRWYWx1ZUJlZm9yZUV2ZW50ICE9PSBudWxsICYmIG5ld1ZhbHVlID09PSBlbGVtZW50VmFsdWVCZWZvcmVFdmVudCkge1xuICAgICAgICAgICAgICAgIGtvLnV0aWxzLnNldFRpbWVvdXQodXBkYXRlRnJvbU1vZGVsLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB2YWx1ZUhhc0NoYW5nZWQgPSAobmV3VmFsdWUgIT09IGVsZW1lbnRWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZUhhc0NoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoa28udXRpbHMudGFnTmFtZUxvd2VyKGVsZW1lbnQpID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhbGxvd1Vuc2V0ID0gYWxsQmluZGluZ3MuZ2V0KCd2YWx1ZUFsbG93VW5zZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGx5VmFsdWVBY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrby5zZWxlY3RFeHRlbnNpb25zLndyaXRlVmFsdWUoZWxlbWVudCwgbmV3VmFsdWUsIGFsbG93VW5zZXQpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhcHBseVZhbHVlQWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvd1Vuc2V0ICYmIG5ld1ZhbHVlICE9PSBrby5zZWxlY3RFeHRlbnNpb25zLnJlYWRWYWx1ZShlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgeW91IHRyeSB0byBzZXQgYSBtb2RlbCB2YWx1ZSB0aGF0IGNhbid0IGJlIHJlcHJlc2VudGVkIGluIGFuIGFscmVhZHktcG9wdWxhdGVkIGRyb3Bkb3duLCByZWplY3QgdGhhdCBjaGFuZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHlvdSdyZSBub3QgYWxsb3dlZCB0byBoYXZlIGEgbW9kZWwgdmFsdWUgdGhhdCBkaXNhZ3JlZXMgd2l0aCBhIHZpc2libGUgVUkgc2VsZWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoa28udXRpbHMudHJpZ2dlckV2ZW50LCBudWxsLCBbZWxlbWVudCwgXCJjaGFuZ2VcIl0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgSUU2IGJ1ZzogSXQgd29uJ3QgcmVsaWFibHkgYXBwbHkgdmFsdWVzIHRvIFNFTEVDVCBub2RlcyBkdXJpbmcgdGhlIHNhbWUgZXhlY3V0aW9uIHRocmVhZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHQgYWZ0ZXIgeW91J3ZlIGNoYW5nZWQgdGhlIHNldCBvZiBPUFRJT04gbm9kZXMgb24gaXQuIFNvIGZvciB0aGF0IG5vZGUgdHlwZSwgd2UnbGwgc2NoZWR1bGUgYSBzZWNvbmQgdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhcHBseSB0aGUgdmFsdWUgYXMgd2VsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLnNldFRpbWVvdXQoYXBwbHlWYWx1ZUFjdGlvbiwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBrby5zZWxlY3RFeHRlbnNpb25zLndyaXRlVmFsdWUoZWxlbWVudCwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBrby5jb21wdXRlZCh1cGRhdGVGcm9tTW9kZWwsIG51bGwsIHsgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBlbGVtZW50IH0pO1xuICAgIH0sXG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uKCkge30gLy8gS2VlcCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBjb2RlIHRoYXQgbWF5IGhhdmUgd3JhcHBlZCB2YWx1ZSBiaW5kaW5nXG59O1xua28uZXhwcmVzc2lvblJld3JpdGluZy50d29XYXlCaW5kaW5nc1sndmFsdWUnXSA9IHRydWU7XG5rby5iaW5kaW5nSGFuZGxlcnNbJ3Zpc2libGUnXSA9IHtcbiAgICAndXBkYXRlJzogZnVuY3Rpb24gKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgdmFyIHZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZUFjY2Vzc29yKCkpO1xuICAgICAgICB2YXIgaXNDdXJyZW50bHlWaXNpYmxlID0gIShlbGVtZW50LnN0eWxlLmRpc3BsYXkgPT0gXCJub25lXCIpO1xuICAgICAgICBpZiAodmFsdWUgJiYgIWlzQ3VycmVudGx5VmlzaWJsZSlcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG4gICAgICAgIGVsc2UgaWYgKCghdmFsdWUpICYmIGlzQ3VycmVudGx5VmlzaWJsZSlcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIH1cbn07XG4vLyAnY2xpY2snIGlzIGp1c3QgYSBzaG9ydGhhbmQgZm9yIHRoZSB1c3VhbCBmdWxsLWxlbmd0aCBldmVudDp7Y2xpY2s6aGFuZGxlcn1cbm1ha2VFdmVudEhhbmRsZXJTaG9ydGN1dCgnY2xpY2snKTtcbi8vIElmIHlvdSB3YW50IHRvIG1ha2UgYSBjdXN0b20gdGVtcGxhdGUgZW5naW5lLFxuLy9cbi8vIFsxXSBJbmhlcml0IGZyb20gdGhpcyBjbGFzcyAobGlrZSBrby5uYXRpdmVUZW1wbGF0ZUVuZ2luZSBkb2VzKVxuLy8gWzJdIE92ZXJyaWRlICdyZW5kZXJUZW1wbGF0ZVNvdXJjZScsIHN1cHBseWluZyBhIGZ1bmN0aW9uIHdpdGggdGhpcyBzaWduYXR1cmU6XG4vL1xuLy8gICAgICAgIGZ1bmN0aW9uICh0ZW1wbGF0ZVNvdXJjZSwgYmluZGluZ0NvbnRleHQsIG9wdGlvbnMpIHtcbi8vICAgICAgICAgICAgLy8gLSB0ZW1wbGF0ZVNvdXJjZS50ZXh0KCkgaXMgdGhlIHRleHQgb2YgdGhlIHRlbXBsYXRlIHlvdSBzaG91bGQgcmVuZGVyXG4vLyAgICAgICAgICAgIC8vIC0gYmluZGluZ0NvbnRleHQuJGRhdGEgaXMgdGhlIGRhdGEgeW91IHNob3VsZCBwYXNzIGludG8gdGhlIHRlbXBsYXRlXG4vLyAgICAgICAgICAgIC8vICAgLSB5b3UgbWlnaHQgYWxzbyB3YW50IHRvIG1ha2UgYmluZGluZ0NvbnRleHQuJHBhcmVudCwgYmluZGluZ0NvbnRleHQuJHBhcmVudHMsXG4vLyAgICAgICAgICAgIC8vICAgICBhbmQgYmluZGluZ0NvbnRleHQuJHJvb3QgYXZhaWxhYmxlIGluIHRoZSB0ZW1wbGF0ZSB0b29cbi8vICAgICAgICAgICAgLy8gLSBvcHRpb25zIGdpdmVzIHlvdSBhY2Nlc3MgdG8gYW55IG90aGVyIHByb3BlcnRpZXMgc2V0IG9uIFwiZGF0YS1iaW5kOiB7IHRlbXBsYXRlOiBvcHRpb25zIH1cIlxuLy8gICAgICAgICAgICAvLyAtIHRlbXBsYXRlRG9jdW1lbnQgaXMgdGhlIGRvY3VtZW50IG9iamVjdCBvZiB0aGUgdGVtcGxhdGVcbi8vICAgICAgICAgICAgLy9cbi8vICAgICAgICAgICAgLy8gUmV0dXJuIHZhbHVlOiBhbiBhcnJheSBvZiBET00gbm9kZXNcbi8vICAgICAgICB9XG4vL1xuLy8gWzNdIE92ZXJyaWRlICdjcmVhdGVKYXZhU2NyaXB0RXZhbHVhdG9yQmxvY2snLCBzdXBwbHlpbmcgYSBmdW5jdGlvbiB3aXRoIHRoaXMgc2lnbmF0dXJlOlxuLy9cbi8vICAgICAgICBmdW5jdGlvbiAoc2NyaXB0KSB7XG4vLyAgICAgICAgICAgIC8vIFJldHVybiB2YWx1ZTogV2hhdGV2ZXIgc3ludGF4IG1lYW5zIFwiRXZhbHVhdGUgdGhlIEphdmFTY3JpcHQgc3RhdGVtZW50ICdzY3JpcHQnIGFuZCBvdXRwdXQgdGhlIHJlc3VsdFwiXG4vLyAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBqcXVlcnkudG1wbCB0ZW1wbGF0ZSBlbmdpbmUgY29udmVydHMgJ3NvbWVTY3JpcHQnIHRvICckeyBzb21lU2NyaXB0IH0nXG4vLyAgICAgICAgfVxuLy9cbi8vICAgICBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSB3YW50IHRvIGFsbG93IGRhdGEtYmluZCBhdHRyaWJ1dGVzIHRvIHJlZmVyZW5jZSBhcmJpdHJhcnkgdGVtcGxhdGUgdmFyaWFibGVzLlxuLy8gICAgIElmIHlvdSBkb24ndCB3YW50IHRvIGFsbG93IHRoYXQsIHlvdSBjYW4gc2V0IHRoZSBwcm9wZXJ0eSAnYWxsb3dUZW1wbGF0ZVJld3JpdGluZycgdG8gZmFsc2UgKGxpa2Uga28ubmF0aXZlVGVtcGxhdGVFbmdpbmUgZG9lcylcbi8vICAgICBhbmQgdGhlbiB5b3UgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSAnY3JlYXRlSmF2YVNjcmlwdEV2YWx1YXRvckJsb2NrJy5cblxua28udGVtcGxhdGVFbmdpbmUgPSBmdW5jdGlvbiAoKSB7IH07XG5cbmtvLnRlbXBsYXRlRW5naW5lLnByb3RvdHlwZVsncmVuZGVyVGVtcGxhdGVTb3VyY2UnXSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZVNvdXJjZSwgYmluZGluZ0NvbnRleHQsIG9wdGlvbnMsIHRlbXBsYXRlRG9jdW1lbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJPdmVycmlkZSByZW5kZXJUZW1wbGF0ZVNvdXJjZVwiKTtcbn07XG5cbmtvLnRlbXBsYXRlRW5naW5lLnByb3RvdHlwZVsnY3JlYXRlSmF2YVNjcmlwdEV2YWx1YXRvckJsb2NrJ10gPSBmdW5jdGlvbiAoc2NyaXB0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiT3ZlcnJpZGUgY3JlYXRlSmF2YVNjcmlwdEV2YWx1YXRvckJsb2NrXCIpO1xufTtcblxua28udGVtcGxhdGVFbmdpbmUucHJvdG90eXBlWydtYWtlVGVtcGxhdGVTb3VyY2UnXSA9IGZ1bmN0aW9uKHRlbXBsYXRlLCB0ZW1wbGF0ZURvY3VtZW50KSB7XG4gICAgLy8gTmFtZWQgdGVtcGxhdGVcbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGVtcGxhdGVEb2N1bWVudCA9IHRlbXBsYXRlRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gICAgICAgIHZhciBlbGVtID0gdGVtcGxhdGVEb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0ZW1wbGF0ZSk7XG4gICAgICAgIGlmICghZWxlbSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIHRlbXBsYXRlIHdpdGggSUQgXCIgKyB0ZW1wbGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcga28udGVtcGxhdGVTb3VyY2VzLmRvbUVsZW1lbnQoZWxlbSk7XG4gICAgfSBlbHNlIGlmICgodGVtcGxhdGUubm9kZVR5cGUgPT0gMSkgfHwgKHRlbXBsYXRlLm5vZGVUeXBlID09IDgpKSB7XG4gICAgICAgIC8vIEFub255bW91cyB0ZW1wbGF0ZVxuICAgICAgICByZXR1cm4gbmV3IGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgfSBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gdGVtcGxhdGUgdHlwZTogXCIgKyB0ZW1wbGF0ZSk7XG59O1xuXG5rby50ZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGVbJ3JlbmRlclRlbXBsYXRlJ10gPSBmdW5jdGlvbiAodGVtcGxhdGUsIGJpbmRpbmdDb250ZXh0LCBvcHRpb25zLCB0ZW1wbGF0ZURvY3VtZW50KSB7XG4gICAgdmFyIHRlbXBsYXRlU291cmNlID0gdGhpc1snbWFrZVRlbXBsYXRlU291cmNlJ10odGVtcGxhdGUsIHRlbXBsYXRlRG9jdW1lbnQpO1xuICAgIHJldHVybiB0aGlzWydyZW5kZXJUZW1wbGF0ZVNvdXJjZSddKHRlbXBsYXRlU291cmNlLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgdGVtcGxhdGVEb2N1bWVudCk7XG59O1xuXG5rby50ZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGVbJ2lzVGVtcGxhdGVSZXdyaXR0ZW4nXSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgdGVtcGxhdGVEb2N1bWVudCkge1xuICAgIC8vIFNraXAgcmV3cml0aW5nIGlmIHJlcXVlc3RlZFxuICAgIGlmICh0aGlzWydhbGxvd1RlbXBsYXRlUmV3cml0aW5nJ10gPT09IGZhbHNlKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpc1snbWFrZVRlbXBsYXRlU291cmNlJ10odGVtcGxhdGUsIHRlbXBsYXRlRG9jdW1lbnQpWydkYXRhJ10oXCJpc1Jld3JpdHRlblwiKTtcbn07XG5cbmtvLnRlbXBsYXRlRW5naW5lLnByb3RvdHlwZVsncmV3cml0ZVRlbXBsYXRlJ10gPSBmdW5jdGlvbiAodGVtcGxhdGUsIHJld3JpdGVyQ2FsbGJhY2ssIHRlbXBsYXRlRG9jdW1lbnQpIHtcbiAgICB2YXIgdGVtcGxhdGVTb3VyY2UgPSB0aGlzWydtYWtlVGVtcGxhdGVTb3VyY2UnXSh0ZW1wbGF0ZSwgdGVtcGxhdGVEb2N1bWVudCk7XG4gICAgdmFyIHJld3JpdHRlbiA9IHJld3JpdGVyQ2FsbGJhY2sodGVtcGxhdGVTb3VyY2VbJ3RleHQnXSgpKTtcbiAgICB0ZW1wbGF0ZVNvdXJjZVsndGV4dCddKHJld3JpdHRlbik7XG4gICAgdGVtcGxhdGVTb3VyY2VbJ2RhdGEnXShcImlzUmV3cml0dGVuXCIsIHRydWUpO1xufTtcblxua28uZXhwb3J0U3ltYm9sKCd0ZW1wbGF0ZUVuZ2luZScsIGtvLnRlbXBsYXRlRW5naW5lKTtcblxua28udGVtcGxhdGVSZXdyaXRpbmcgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBtZW1vaXplRGF0YUJpbmRpbmdBdHRyaWJ1dGVTeW50YXhSZWdleCA9IC8oPChbYS16XStcXGQqKSg/OlxccysoPyFkYXRhLWJpbmRcXHMqPVxccyopW2EtejAtOVxcLV0rKD86PSg/OlxcXCJbXlxcXCJdKlxcXCJ8XFwnW15cXCddKlxcJ3xbXj5dKikpPykqXFxzKylkYXRhLWJpbmRcXHMqPVxccyooW1wiJ10pKFtcXHNcXFNdKj8pXFwzL2dpO1xuICAgIHZhciBtZW1vaXplVmlydHVhbENvbnRhaW5lckJpbmRpbmdTeW50YXhSZWdleCA9IC88IS0tXFxzKmtvXFxiXFxzKihbXFxzXFxTXSo/KVxccyotLT4vZztcblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlRGF0YUJpbmRWYWx1ZXNGb3JSZXdyaXRpbmcoa2V5VmFsdWVBcnJheSkge1xuICAgICAgICB2YXIgYWxsVmFsaWRhdG9ycyA9IGtvLmV4cHJlc3Npb25SZXdyaXRpbmcuYmluZGluZ1Jld3JpdGVWYWxpZGF0b3JzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleVZhbHVlQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBrZXlWYWx1ZUFycmF5W2ldWydrZXknXTtcbiAgICAgICAgICAgIGlmIChhbGxWYWxpZGF0b3JzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsaWRhdG9yID0gYWxsVmFsaWRhdG9yc1trZXldO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWxpZGF0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcG9zc2libGVFcnJvck1lc3NhZ2UgPSB2YWxpZGF0b3Ioa2V5VmFsdWVBcnJheVtpXVsndmFsdWUnXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwb3NzaWJsZUVycm9yTWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihwb3NzaWJsZUVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoaXMgdGVtcGxhdGUgZW5naW5lIGRvZXMgbm90IHN1cHBvcnQgdGhlICdcIiArIGtleSArIFwiJyBiaW5kaW5nIHdpdGhpbiBpdHMgdGVtcGxhdGVzXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbnN0cnVjdE1lbW9pemVkVGFnUmVwbGFjZW1lbnQoZGF0YUJpbmRBdHRyaWJ1dGVWYWx1ZSwgdGFnVG9SZXRhaW4sIG5vZGVOYW1lLCB0ZW1wbGF0ZUVuZ2luZSkge1xuICAgICAgICB2YXIgZGF0YUJpbmRLZXlWYWx1ZUFycmF5ID0ga28uZXhwcmVzc2lvblJld3JpdGluZy5wYXJzZU9iamVjdExpdGVyYWwoZGF0YUJpbmRBdHRyaWJ1dGVWYWx1ZSk7XG4gICAgICAgIHZhbGlkYXRlRGF0YUJpbmRWYWx1ZXNGb3JSZXdyaXRpbmcoZGF0YUJpbmRLZXlWYWx1ZUFycmF5KTtcbiAgICAgICAgdmFyIHJld3JpdHRlbkRhdGFCaW5kQXR0cmlidXRlVmFsdWUgPSBrby5leHByZXNzaW9uUmV3cml0aW5nLnByZVByb2Nlc3NCaW5kaW5ncyhkYXRhQmluZEtleVZhbHVlQXJyYXksIHsndmFsdWVBY2Nlc3NvcnMnOnRydWV9KTtcblxuICAgICAgICAvLyBGb3Igbm8gb2J2aW91cyByZWFzb24sIE9wZXJhIGZhaWxzIHRvIGV2YWx1YXRlIHJld3JpdHRlbkRhdGFCaW5kQXR0cmlidXRlVmFsdWUgdW5sZXNzIGl0J3Mgd3JhcHBlZCBpbiBhbiBhZGRpdGlvbmFsXG4gICAgICAgIC8vIGFub255bW91cyBmdW5jdGlvbiwgZXZlbiB0aG91Z2ggT3BlcmEncyBidWlsdC1pbiBkZWJ1Z2dlciBjYW4gZXZhbHVhdGUgaXQgYW55d2F5LiBObyBvdGhlciBicm93c2VyIHJlcXVpcmVzIHRoaXNcbiAgICAgICAgLy8gZXh0cmEgaW5kaXJlY3Rpb24uXG4gICAgICAgIHZhciBhcHBseUJpbmRpbmdzVG9OZXh0U2libGluZ1NjcmlwdCA9XG4gICAgICAgICAgICBcImtvLl9fdHJfYW1idG5zKGZ1bmN0aW9uKCRjb250ZXh0LCRlbGVtZW50KXtyZXR1cm4oZnVuY3Rpb24oKXtyZXR1cm57IFwiICsgcmV3cml0dGVuRGF0YUJpbmRBdHRyaWJ1dGVWYWx1ZSArIFwiIH0gfSkoKX0sJ1wiICsgbm9kZU5hbWUudG9Mb3dlckNhc2UoKSArIFwiJylcIjtcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlRW5naW5lWydjcmVhdGVKYXZhU2NyaXB0RXZhbHVhdG9yQmxvY2snXShhcHBseUJpbmRpbmdzVG9OZXh0U2libGluZ1NjcmlwdCkgKyB0YWdUb1JldGFpbjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBlbnN1cmVUZW1wbGF0ZUlzUmV3cml0dGVuOiBmdW5jdGlvbiAodGVtcGxhdGUsIHRlbXBsYXRlRW5naW5lLCB0ZW1wbGF0ZURvY3VtZW50KSB7XG4gICAgICAgICAgICBpZiAoIXRlbXBsYXRlRW5naW5lWydpc1RlbXBsYXRlUmV3cml0dGVuJ10odGVtcGxhdGUsIHRlbXBsYXRlRG9jdW1lbnQpKVxuICAgICAgICAgICAgICAgIHRlbXBsYXRlRW5naW5lWydyZXdyaXRlVGVtcGxhdGUnXSh0ZW1wbGF0ZSwgZnVuY3Rpb24gKGh0bWxTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtvLnRlbXBsYXRlUmV3cml0aW5nLm1lbW9pemVCaW5kaW5nQXR0cmlidXRlU3ludGF4KGh0bWxTdHJpbmcsIHRlbXBsYXRlRW5naW5lKTtcbiAgICAgICAgICAgICAgICB9LCB0ZW1wbGF0ZURvY3VtZW50KTtcbiAgICAgICAgfSxcblxuICAgICAgICBtZW1vaXplQmluZGluZ0F0dHJpYnV0ZVN5bnRheDogZnVuY3Rpb24gKGh0bWxTdHJpbmcsIHRlbXBsYXRlRW5naW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gaHRtbFN0cmluZy5yZXBsYWNlKG1lbW9pemVEYXRhQmluZGluZ0F0dHJpYnV0ZVN5bnRheFJlZ2V4LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdE1lbW9pemVkVGFnUmVwbGFjZW1lbnQoLyogZGF0YUJpbmRBdHRyaWJ1dGVWYWx1ZTogKi8gYXJndW1lbnRzWzRdLCAvKiB0YWdUb1JldGFpbjogKi8gYXJndW1lbnRzWzFdLCAvKiBub2RlTmFtZTogKi8gYXJndW1lbnRzWzJdLCB0ZW1wbGF0ZUVuZ2luZSk7XG4gICAgICAgICAgICB9KS5yZXBsYWNlKG1lbW9pemVWaXJ0dWFsQ29udGFpbmVyQmluZGluZ1N5bnRheFJlZ2V4LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0TWVtb2l6ZWRUYWdSZXBsYWNlbWVudCgvKiBkYXRhQmluZEF0dHJpYnV0ZVZhbHVlOiAqLyBhcmd1bWVudHNbMV0sIC8qIHRhZ1RvUmV0YWluOiAqLyBcIjwhLS0ga28gLS0+XCIsIC8qIG5vZGVOYW1lOiAqLyBcIiNjb21tZW50XCIsIHRlbXBsYXRlRW5naW5lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFwcGx5TWVtb2l6ZWRCaW5kaW5nc1RvTmV4dFNpYmxpbmc6IGZ1bmN0aW9uIChiaW5kaW5ncywgbm9kZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBrby5tZW1vaXphdGlvbi5tZW1vaXplKGZ1bmN0aW9uIChkb21Ob2RlLCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIHZhciBub2RlVG9CaW5kID0gZG9tTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBpZiAobm9kZVRvQmluZCAmJiBub2RlVG9CaW5kLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGtvLmFwcGx5QmluZGluZ0FjY2Vzc29yc1RvTm9kZShub2RlVG9CaW5kLCBiaW5kaW5ncywgYmluZGluZ0NvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufSkoKTtcblxuXG4vLyBFeHBvcnRlZCBvbmx5IGJlY2F1c2UgaXQgaGFzIHRvIGJlIHJlZmVyZW5jZWQgYnkgc3RyaW5nIGxvb2t1cCBmcm9tIHdpdGhpbiByZXdyaXR0ZW4gdGVtcGxhdGVcbmtvLmV4cG9ydFN5bWJvbCgnX190cl9hbWJ0bnMnLCBrby50ZW1wbGF0ZVJld3JpdGluZy5hcHBseU1lbW9pemVkQmluZGluZ3NUb05leHRTaWJsaW5nKTtcbihmdW5jdGlvbigpIHtcbiAgICAvLyBBIHRlbXBsYXRlIHNvdXJjZSByZXByZXNlbnRzIGEgcmVhZC93cml0ZSB3YXkgb2YgYWNjZXNzaW5nIGEgdGVtcGxhdGUuIFRoaXMgaXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciB0ZW1wbGF0ZSBsb2FkaW5nL3NhdmluZ1xuICAgIC8vIGxvZ2ljIHRvIGJlIGR1cGxpY2F0ZWQgaW4gZXZlcnkgdGVtcGxhdGUgZW5naW5lIChhbmQgbWVhbnMgdGhleSBjYW4gYWxsIHdvcmsgd2l0aCBhbm9ueW1vdXMgdGVtcGxhdGVzLCBldGMuKVxuICAgIC8vXG4gICAgLy8gVHdvIGFyZSBwcm92aWRlZCBieSBkZWZhdWx0OlxuICAgIC8vICAxLiBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudCAgICAgICAtIHJlYWRzL3dyaXRlcyB0aGUgdGV4dCBjb250ZW50IG9mIGFuIGFyYml0cmFyeSBET00gZWxlbWVudFxuICAgIC8vICAyLiBrby50ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzRWxlbWVudCAtIHVzZXMga28udXRpbHMuZG9tRGF0YSB0byByZWFkL3dyaXRlIHRleHQgKmFzc29jaWF0ZWQqIHdpdGggdGhlIERPTSBlbGVtZW50LCBidXRcbiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHJlYWRpbmcvd3JpdGluZyB0aGUgYWN0dWFsIGVsZW1lbnQgdGV4dCBjb250ZW50LCBzaW5jZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgcmVuZGVyZWQgdGVtcGxhdGUgb3V0cHV0LlxuICAgIC8vIFlvdSBjYW4gaW1wbGVtZW50IHlvdXIgb3duIHRlbXBsYXRlIHNvdXJjZSBpZiB5b3Ugd2FudCB0byBmZXRjaC9zdG9yZSB0ZW1wbGF0ZXMgc29tZXdoZXJlIG90aGVyIHRoYW4gaW4gRE9NIGVsZW1lbnRzLlxuICAgIC8vIFRlbXBsYXRlIHNvdXJjZXMgbmVlZCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOlxuICAgIC8vICAgdGV4dCgpIFx0XHRcdC0gcmV0dXJucyB0aGUgdGVtcGxhdGUgdGV4dCBmcm9tIHlvdXIgc3RvcmFnZSBsb2NhdGlvblxuICAgIC8vICAgdGV4dCh2YWx1ZSlcdFx0LSB3cml0ZXMgdGhlIHN1cHBsaWVkIHRlbXBsYXRlIHRleHQgdG8geW91ciBzdG9yYWdlIGxvY2F0aW9uXG4gICAgLy8gICBkYXRhKGtleSlcdFx0XHQtIHJlYWRzIHZhbHVlcyBzdG9yZWQgdXNpbmcgZGF0YShrZXksIHZhbHVlKSAtIHNlZSBiZWxvd1xuICAgIC8vICAgZGF0YShrZXksIHZhbHVlKVx0LSBhc3NvY2lhdGVzIFwidmFsdWVcIiB3aXRoIHRoaXMgdGVtcGxhdGUgYW5kIHRoZSBrZXkgXCJrZXlcIi4gSXMgdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBsaWtlIFwiaXNSZXdyaXR0ZW5cIi5cbiAgICAvL1xuICAgIC8vIE9wdGlvbmFsbHksIHRlbXBsYXRlIHNvdXJjZXMgY2FuIGFsc28gaGF2ZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczpcbiAgICAvLyAgIG5vZGVzKCkgICAgICAgICAgICAtIHJldHVybnMgYSBET00gZWxlbWVudCBjb250YWluaW5nIHRoZSBub2RlcyBvZiB0aGlzIHRlbXBsYXRlLCB3aGVyZSBhdmFpbGFibGVcbiAgICAvLyAgIG5vZGVzKHZhbHVlKSAgICAgICAtIHdyaXRlcyB0aGUgZ2l2ZW4gRE9NIGVsZW1lbnQgdG8geW91ciBzdG9yYWdlIGxvY2F0aW9uXG4gICAgLy8gSWYgYSBET00gZWxlbWVudCBpcyBhdmFpbGFibGUgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUgc291cmNlLCB0ZW1wbGF0ZSBlbmdpbmVzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBpdCBpbiBwcmVmZXJlbmNlIG92ZXIgdGV4dCgpXG4gICAgLy8gZm9yIGltcHJvdmVkIHNwZWVkLiBIb3dldmVyLCBhbGwgdGVtcGxhdGVTb3VyY2VzIG11c3Qgc3VwcGx5IHRleHQoKSBldmVuIGlmIHRoZXkgZG9uJ3Qgc3VwcGx5IG5vZGVzKCkuXG4gICAgLy9cbiAgICAvLyBPbmNlIHlvdSd2ZSBpbXBsZW1lbnRlZCBhIHRlbXBsYXRlU291cmNlLCBtYWtlIHlvdXIgdGVtcGxhdGUgZW5naW5lIHVzZSBpdCBieSBzdWJjbGFzc2luZyB3aGF0ZXZlciB0ZW1wbGF0ZSBlbmdpbmUgeW91IHdlcmVcbiAgICAvLyB1c2luZyBhbmQgb3ZlcnJpZGluZyBcIm1ha2VUZW1wbGF0ZVNvdXJjZVwiIHRvIHJldHVybiBhbiBpbnN0YW5jZSBvZiB5b3VyIGN1c3RvbSB0ZW1wbGF0ZSBzb3VyY2UuXG5cbiAgICBrby50ZW1wbGF0ZVNvdXJjZXMgPSB7fTtcblxuICAgIC8vIC0tLS0ga28udGVtcGxhdGVTb3VyY2VzLmRvbUVsZW1lbnQgLS0tLS1cblxuICAgIC8vIHRlbXBsYXRlIHR5cGVzXG4gICAgdmFyIHRlbXBsYXRlU2NyaXB0ID0gMSxcbiAgICAgICAgdGVtcGxhdGVUZXh0QXJlYSA9IDIsXG4gICAgICAgIHRlbXBsYXRlVGVtcGxhdGUgPSAzLFxuICAgICAgICB0ZW1wbGF0ZUVsZW1lbnQgPSA0O1xuXG4gICAga28udGVtcGxhdGVTb3VyY2VzLmRvbUVsZW1lbnQgPSBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZG9tRWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHZhciB0YWdOYW1lTG93ZXIgPSBrby51dGlscy50YWdOYW1lTG93ZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlVHlwZSA9XG4gICAgICAgICAgICAgICAgdGFnTmFtZUxvd2VyID09PSBcInNjcmlwdFwiID8gdGVtcGxhdGVTY3JpcHQgOlxuICAgICAgICAgICAgICAgIHRhZ05hbWVMb3dlciA9PT0gXCJ0ZXh0YXJlYVwiID8gdGVtcGxhdGVUZXh0QXJlYSA6XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvciBicm93c2VycyB3aXRoIHByb3BlciA8dGVtcGxhdGU+IGVsZW1lbnQgc3VwcG9ydCwgd2hlcmUgdGhlIC5jb250ZW50IHByb3BlcnR5IGdpdmVzIGEgZG9jdW1lbnQgZnJhZ21lbnRcbiAgICAgICAgICAgICAgICB0YWdOYW1lTG93ZXIgPT0gXCJ0ZW1wbGF0ZVwiICYmIGVsZW1lbnQuY29udGVudCAmJiBlbGVtZW50LmNvbnRlbnQubm9kZVR5cGUgPT09IDExID8gdGVtcGxhdGVUZW1wbGF0ZSA6XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVFbGVtZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAga28udGVtcGxhdGVTb3VyY2VzLmRvbUVsZW1lbnQucHJvdG90eXBlWyd0ZXh0J10gPSBmdW5jdGlvbigvKiB2YWx1ZVRvV3JpdGUgKi8pIHtcbiAgICAgICAgdmFyIGVsZW1Db250ZW50c1Byb3BlcnR5ID0gdGhpcy50ZW1wbGF0ZVR5cGUgPT09IHRlbXBsYXRlU2NyaXB0ID8gXCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy50ZW1wbGF0ZVR5cGUgPT09IHRlbXBsYXRlVGV4dEFyZWEgPyBcInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJpbm5lckhUTUxcIjtcblxuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb21FbGVtZW50W2VsZW1Db250ZW50c1Byb3BlcnR5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZVRvV3JpdGUgPSBhcmd1bWVudHNbMF07XG4gICAgICAgICAgICBpZiAoZWxlbUNvbnRlbnRzUHJvcGVydHkgPT09IFwiaW5uZXJIVE1MXCIpXG4gICAgICAgICAgICAgICAga28udXRpbHMuc2V0SHRtbCh0aGlzLmRvbUVsZW1lbnQsIHZhbHVlVG9Xcml0ZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5kb21FbGVtZW50W2VsZW1Db250ZW50c1Byb3BlcnR5XSA9IHZhbHVlVG9Xcml0ZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgZGF0YURvbURhdGFQcmVmaXggPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKSArIFwiX1wiO1xuICAgIGtvLnRlbXBsYXRlU291cmNlcy5kb21FbGVtZW50LnByb3RvdHlwZVsnZGF0YSddID0gZnVuY3Rpb24oa2V5IC8qLCB2YWx1ZVRvV3JpdGUgKi8pIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBrby51dGlscy5kb21EYXRhLmdldCh0aGlzLmRvbUVsZW1lbnQsIGRhdGFEb21EYXRhUHJlZml4ICsga2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtvLnV0aWxzLmRvbURhdGEuc2V0KHRoaXMuZG9tRWxlbWVudCwgZGF0YURvbURhdGFQcmVmaXggKyBrZXksIGFyZ3VtZW50c1sxXSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIHRlbXBsYXRlc0RvbURhdGFLZXkgPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKTtcbiAgICBmdW5jdGlvbiBnZXRUZW1wbGF0ZURvbURhdGEoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4ga28udXRpbHMuZG9tRGF0YS5nZXQoZWxlbWVudCwgdGVtcGxhdGVzRG9tRGF0YUtleSkgfHwge307XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFRlbXBsYXRlRG9tRGF0YShlbGVtZW50LCBkYXRhKSB7XG4gICAgICAgIGtvLnV0aWxzLmRvbURhdGEuc2V0KGVsZW1lbnQsIHRlbXBsYXRlc0RvbURhdGFLZXksIGRhdGEpO1xuICAgIH1cblxuICAgIGtvLnRlbXBsYXRlU291cmNlcy5kb21FbGVtZW50LnByb3RvdHlwZVsnbm9kZXMnXSA9IGZ1bmN0aW9uKC8qIHZhbHVlVG9Xcml0ZSAqLykge1xuICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZG9tRWxlbWVudDtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdmFyIHRlbXBsYXRlRGF0YSA9IGdldFRlbXBsYXRlRG9tRGF0YShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICBjb250YWluZXJEYXRhID0gdGVtcGxhdGVEYXRhLmNvbnRhaW5lckRhdGE7XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyRGF0YSB8fCAoXG4gICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVR5cGUgPT09IHRlbXBsYXRlVGVtcGxhdGUgPyBlbGVtZW50LmNvbnRlbnQgOlxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVUeXBlID09PSB0ZW1wbGF0ZUVsZW1lbnQgPyBlbGVtZW50IDpcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHZhbHVlVG9Xcml0ZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgIHNldFRlbXBsYXRlRG9tRGF0YShlbGVtZW50LCB7Y29udGFpbmVyRGF0YTogdmFsdWVUb1dyaXRlfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gLS0tLSBrby50ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzVGVtcGxhdGUgLS0tLS1cbiAgICAvLyBBbm9ueW1vdXMgdGVtcGxhdGVzIGFyZSBub3JtYWxseSBzYXZlZC9yZXRyaWV2ZWQgYXMgRE9NIG5vZGVzIHRocm91Z2ggXCJub2Rlc1wiLlxuICAgIC8vIEZvciBjb21wYXRpYmlsaXR5LCB5b3UgY2FuIGFsc28gcmVhZCBcInRleHRcIjsgaXQgd2lsbCBiZSBzZXJpYWxpemVkIGZyb20gdGhlIG5vZGVzIG9uIGRlbWFuZC5cbiAgICAvLyBXcml0aW5nIHRvIFwidGV4dFwiIGlzIHN0aWxsIHN1cHBvcnRlZCwgYnV0IHRoZW4gdGhlIHRlbXBsYXRlIGRhdGEgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGFzIERPTSBub2Rlcy5cblxuICAgIGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZSA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5kb21FbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG4gICAga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c1RlbXBsYXRlLnByb3RvdHlwZSA9IG5ldyBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudCgpO1xuICAgIGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBrby50ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzVGVtcGxhdGU7XG4gICAga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c1RlbXBsYXRlLnByb3RvdHlwZVsndGV4dCddID0gZnVuY3Rpb24oLyogdmFsdWVUb1dyaXRlICovKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZURhdGEgPSBnZXRUZW1wbGF0ZURvbURhdGEodGhpcy5kb21FbGVtZW50KTtcbiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZURhdGEudGV4dERhdGEgPT09IHVuZGVmaW5lZCAmJiB0ZW1wbGF0ZURhdGEuY29udGFpbmVyRGF0YSlcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZURhdGEudGV4dERhdGEgPSB0ZW1wbGF0ZURhdGEuY29udGFpbmVyRGF0YS5pbm5lckhUTUw7XG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVEYXRhLnRleHREYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHZhbHVlVG9Xcml0ZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgIHNldFRlbXBsYXRlRG9tRGF0YSh0aGlzLmRvbUVsZW1lbnQsIHt0ZXh0RGF0YTogdmFsdWVUb1dyaXRlfSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAga28uZXhwb3J0U3ltYm9sKCd0ZW1wbGF0ZVNvdXJjZXMnLCBrby50ZW1wbGF0ZVNvdXJjZXMpO1xuICAgIGtvLmV4cG9ydFN5bWJvbCgndGVtcGxhdGVTb3VyY2VzLmRvbUVsZW1lbnQnLCBrby50ZW1wbGF0ZVNvdXJjZXMuZG9tRWxlbWVudCk7XG4gICAga28uZXhwb3J0U3ltYm9sKCd0ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzVGVtcGxhdGUnLCBrby50ZW1wbGF0ZVNvdXJjZXMuYW5vbnltb3VzVGVtcGxhdGUpO1xufSkoKTtcbihmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF90ZW1wbGF0ZUVuZ2luZTtcbiAgICBrby5zZXRUZW1wbGF0ZUVuZ2luZSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZUVuZ2luZSkge1xuICAgICAgICBpZiAoKHRlbXBsYXRlRW5naW5lICE9IHVuZGVmaW5lZCkgJiYgISh0ZW1wbGF0ZUVuZ2luZSBpbnN0YW5jZW9mIGtvLnRlbXBsYXRlRW5naW5lKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRlbXBsYXRlRW5naW5lIG11c3QgaW5oZXJpdCBmcm9tIGtvLnRlbXBsYXRlRW5naW5lXCIpO1xuICAgICAgICBfdGVtcGxhdGVFbmdpbmUgPSB0ZW1wbGF0ZUVuZ2luZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnZva2VGb3JFYWNoTm9kZUluQ29udGludW91c1JhbmdlKGZpcnN0Tm9kZSwgbGFzdE5vZGUsIGFjdGlvbikge1xuICAgICAgICB2YXIgbm9kZSwgbmV4dEluUXVldWUgPSBmaXJzdE5vZGUsIGZpcnN0T3V0T2ZSYW5nZU5vZGUgPSBrby52aXJ0dWFsRWxlbWVudHMubmV4dFNpYmxpbmcobGFzdE5vZGUpO1xuICAgICAgICB3aGlsZSAobmV4dEluUXVldWUgJiYgKChub2RlID0gbmV4dEluUXVldWUpICE9PSBmaXJzdE91dE9mUmFuZ2VOb2RlKSkge1xuICAgICAgICAgICAgbmV4dEluUXVldWUgPSBrby52aXJ0dWFsRWxlbWVudHMubmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgICBhY3Rpb24obm9kZSwgbmV4dEluUXVldWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWN0aXZhdGVCaW5kaW5nc09uQ29udGludW91c05vZGVBcnJheShjb250aW51b3VzTm9kZUFycmF5LCBiaW5kaW5nQ29udGV4dCkge1xuICAgICAgICAvLyBUbyBiZSB1c2VkIG9uIGFueSBub2RlcyB0aGF0IGhhdmUgYmVlbiByZW5kZXJlZCBieSBhIHRlbXBsYXRlIGFuZCBoYXZlIGJlZW4gaW5zZXJ0ZWQgaW50byBzb21lIHBhcmVudCBlbGVtZW50XG4gICAgICAgIC8vIFdhbGtzIHRocm91Z2ggY29udGludW91c05vZGVBcnJheSAod2hpY2ggKm11c3QqIGJlIGNvbnRpbnVvdXMsIGkuZS4sIGFuIHVuaW50ZXJydXB0ZWQgc2VxdWVuY2Ugb2Ygc2libGluZyBub2RlcywgYmVjYXVzZVxuICAgICAgICAvLyB0aGUgYWxnb3JpdGhtIGZvciB3YWxraW5nIHRoZW0gcmVsaWVzIG9uIHRoaXMpLCBhbmQgZm9yIGVhY2ggdG9wLWxldmVsIGl0ZW0gaW4gdGhlIHZpcnR1YWwtZWxlbWVudCBzZW5zZSxcbiAgICAgICAgLy8gKDEpIERvZXMgYSByZWd1bGFyIFwiYXBwbHlCaW5kaW5nc1wiIHRvIGFzc29jaWF0ZSBiaW5kaW5nQ29udGV4dCB3aXRoIHRoaXMgbm9kZSBhbmQgdG8gYWN0aXZhdGUgYW55IG5vbi1tZW1vaXplZCBiaW5kaW5nc1xuICAgICAgICAvLyAoMikgVW5tZW1vaXplcyBhbnkgbWVtb3MgaW4gdGhlIERPTSBzdWJ0cmVlIChlLmcuLCB0byBhY3RpdmF0ZSBiaW5kaW5ncyB0aGF0IGhhZCBiZWVuIG1lbW9pemVkIGR1cmluZyB0ZW1wbGF0ZSByZXdyaXRpbmcpXG5cbiAgICAgICAgaWYgKGNvbnRpbnVvdXNOb2RlQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgZmlyc3ROb2RlID0gY29udGludW91c05vZGVBcnJheVswXSxcbiAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IGNvbnRpbnVvdXNOb2RlQXJyYXlbY29udGludW91c05vZGVBcnJheS5sZW5ndGggLSAxXSxcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gZmlyc3ROb2RlLnBhcmVudE5vZGUsXG4gICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBrby5iaW5kaW5nUHJvdmlkZXJbJ2luc3RhbmNlJ10sXG4gICAgICAgICAgICAgICAgcHJlcHJvY2Vzc05vZGUgPSBwcm92aWRlclsncHJlcHJvY2Vzc05vZGUnXTtcblxuICAgICAgICAgICAgaWYgKHByZXByb2Nlc3NOb2RlKSB7XG4gICAgICAgICAgICAgICAgaW52b2tlRm9yRWFjaE5vZGVJbkNvbnRpbnVvdXNSYW5nZShmaXJzdE5vZGUsIGxhc3ROb2RlLCBmdW5jdGlvbihub2RlLCBuZXh0Tm9kZUluUmFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVQcmV2aW91c1NpYmxpbmcgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld05vZGVzID0gcHJlcHJvY2Vzc05vZGUuY2FsbChwcm92aWRlciwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdOb2Rlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgPT09IGZpcnN0Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE5vZGUgPSBuZXdOb2Rlc1swXSB8fCBuZXh0Tm9kZUluUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PT0gbGFzdE5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBuZXdOb2Rlc1tuZXdOb2Rlcy5sZW5ndGggLSAxXSB8fCBub2RlUHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHByZXByb2Nlc3NOb2RlIGNhbiBjaGFuZ2UgdGhlIG5vZGVzLCBpbmNsdWRpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IG5vZGVzLCB1cGRhdGUgY29udGludW91c05vZGVBcnJheSB0byBtYXRjaC5cbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRoZSBmdWxsIHNldCwgaW5jbHVkaW5nIGlubmVyIG5vZGVzLCBiZWNhdXNlIHRoZSB1bm1lbW9pemUgc3RlcCBtaWdodCByZW1vdmUgdGhlIGZpcnN0IG5vZGUgKGFuZCBzbyB0aGUgcmVhbFxuICAgICAgICAgICAgICAgIC8vIGZpcnN0IG5vZGUgbmVlZHMgdG8gYmUgaW4gdGhlIGFycmF5KS5cbiAgICAgICAgICAgICAgICBjb250aW51b3VzTm9kZUFycmF5Lmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKCFmaXJzdE5vZGUpIHsgLy8gcHJlcHJvY2Vzc05vZGUgbWlnaHQgaGF2ZSByZW1vdmVkIGFsbCB0aGUgbm9kZXMsIGluIHdoaWNoIGNhc2UgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG9cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZmlyc3ROb2RlID09PSBsYXN0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzTm9kZUFycmF5LnB1c2goZmlyc3ROb2RlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzTm9kZUFycmF5LnB1c2goZmlyc3ROb2RlLCBsYXN0Tm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGtvLnV0aWxzLmZpeFVwQ29udGludW91c05vZGVBcnJheShjb250aW51b3VzTm9kZUFycmF5LCBwYXJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE5lZWQgdG8gYXBwbHlCaW5kaW5ncyAqYmVmb3JlKiB1bm1lbW96aWF0aW9uLCBiZWNhdXNlIHVubWVtb2l6YXRpb24gbWlnaHQgaW50cm9kdWNlIGV4dHJhIG5vZGVzICh0aGF0IHdlIGRvbid0IHdhbnQgdG8gcmUtYmluZClcbiAgICAgICAgICAgIC8vIHdoZXJlYXMgYSByZWd1bGFyIGFwcGx5QmluZGluZ3Mgd29uJ3QgaW50cm9kdWNlIG5ldyBtZW1vaXplZCBub2Rlc1xuICAgICAgICAgICAgaW52b2tlRm9yRWFjaE5vZGVJbkNvbnRpbnVvdXNSYW5nZShmaXJzdE5vZGUsIGxhc3ROb2RlLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEgfHwgbm9kZS5ub2RlVHlwZSA9PT0gOClcbiAgICAgICAgICAgICAgICAgICAga28uYXBwbHlCaW5kaW5ncyhiaW5kaW5nQ29udGV4dCwgbm9kZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGludm9rZUZvckVhY2hOb2RlSW5Db250aW51b3VzUmFuZ2UoZmlyc3ROb2RlLCBsYXN0Tm9kZSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxIHx8IG5vZGUubm9kZVR5cGUgPT09IDgpXG4gICAgICAgICAgICAgICAgICAgIGtvLm1lbW9pemF0aW9uLnVubWVtb2l6ZURvbU5vZGVBbmREZXNjZW5kYW50cyhub2RlLCBbYmluZGluZ0NvbnRleHRdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgYW55IGNoYW5nZXMgZG9uZSBieSBhcHBseUJpbmRpbmdzIG9yIHVubWVtb2l6ZSBhcmUgcmVmbGVjdGVkIGluIHRoZSBhcnJheVxuICAgICAgICAgICAga28udXRpbHMuZml4VXBDb250aW51b3VzTm9kZUFycmF5KGNvbnRpbnVvdXNOb2RlQXJyYXksIHBhcmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Rmlyc3ROb2RlRnJvbVBvc3NpYmxlQXJyYXkobm9kZU9yTm9kZUFycmF5KSB7XG4gICAgICAgIHJldHVybiBub2RlT3JOb2RlQXJyYXkubm9kZVR5cGUgPyBub2RlT3JOb2RlQXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5vZGVPck5vZGVBcnJheS5sZW5ndGggPiAwID8gbm9kZU9yTm9kZUFycmF5WzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWN1dGVUZW1wbGF0ZSh0YXJnZXROb2RlT3JOb2RlQXJyYXksIHJlbmRlck1vZGUsIHRlbXBsYXRlLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgdmFyIGZpcnN0VGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGVPck5vZGVBcnJheSAmJiBnZXRGaXJzdE5vZGVGcm9tUG9zc2libGVBcnJheSh0YXJnZXROb2RlT3JOb2RlQXJyYXkpO1xuICAgICAgICB2YXIgdGVtcGxhdGVEb2N1bWVudCA9IChmaXJzdFRhcmdldE5vZGUgfHwgdGVtcGxhdGUgfHwge30pLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIHZhciB0ZW1wbGF0ZUVuZ2luZVRvVXNlID0gKG9wdGlvbnNbJ3RlbXBsYXRlRW5naW5lJ10gfHwgX3RlbXBsYXRlRW5naW5lKTtcbiAgICAgICAga28udGVtcGxhdGVSZXdyaXRpbmcuZW5zdXJlVGVtcGxhdGVJc1Jld3JpdHRlbih0ZW1wbGF0ZSwgdGVtcGxhdGVFbmdpbmVUb1VzZSwgdGVtcGxhdGVEb2N1bWVudCk7XG4gICAgICAgIHZhciByZW5kZXJlZE5vZGVzQXJyYXkgPSB0ZW1wbGF0ZUVuZ2luZVRvVXNlWydyZW5kZXJUZW1wbGF0ZSddKHRlbXBsYXRlLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgdGVtcGxhdGVEb2N1bWVudCk7XG5cbiAgICAgICAgLy8gTG9vc2VseSBjaGVjayByZXN1bHQgaXMgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gICAgICAgIGlmICgodHlwZW9mIHJlbmRlcmVkTm9kZXNBcnJheS5sZW5ndGggIT0gXCJudW1iZXJcIikgfHwgKHJlbmRlcmVkTm9kZXNBcnJheS5sZW5ndGggPiAwICYmIHR5cGVvZiByZW5kZXJlZE5vZGVzQXJyYXlbMF0ubm9kZVR5cGUgIT0gXCJudW1iZXJcIikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUZW1wbGF0ZSBlbmdpbmUgbXVzdCByZXR1cm4gYW4gYXJyYXkgb2YgRE9NIG5vZGVzXCIpO1xuXG4gICAgICAgIHZhciBoYXZlQWRkZWROb2Rlc1RvUGFyZW50ID0gZmFsc2U7XG4gICAgICAgIHN3aXRjaCAocmVuZGVyTW9kZSkge1xuICAgICAgICAgICAgY2FzZSBcInJlcGxhY2VDaGlsZHJlblwiOlxuICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5zZXREb21Ob2RlQ2hpbGRyZW4odGFyZ2V0Tm9kZU9yTm9kZUFycmF5LCByZW5kZXJlZE5vZGVzQXJyYXkpO1xuICAgICAgICAgICAgICAgIGhhdmVBZGRlZE5vZGVzVG9QYXJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJlcGxhY2VOb2RlXCI6XG4gICAgICAgICAgICAgICAga28udXRpbHMucmVwbGFjZURvbU5vZGVzKHRhcmdldE5vZGVPck5vZGVBcnJheSwgcmVuZGVyZWROb2Rlc0FycmF5KTtcbiAgICAgICAgICAgICAgICBoYXZlQWRkZWROb2Rlc1RvUGFyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJpZ25vcmVUYXJnZXROb2RlXCI6IGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHJlbmRlck1vZGU6IFwiICsgcmVuZGVyTW9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGF2ZUFkZGVkTm9kZXNUb1BhcmVudCkge1xuICAgICAgICAgICAgYWN0aXZhdGVCaW5kaW5nc09uQ29udGludW91c05vZGVBcnJheShyZW5kZXJlZE5vZGVzQXJyYXksIGJpbmRpbmdDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zWydhZnRlclJlbmRlciddKVxuICAgICAgICAgICAgICAgIGtvLmRlcGVuZGVuY3lEZXRlY3Rpb24uaWdub3JlKG9wdGlvbnNbJ2FmdGVyUmVuZGVyJ10sIG51bGwsIFtyZW5kZXJlZE5vZGVzQXJyYXksIGJpbmRpbmdDb250ZXh0WyckZGF0YSddXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyZWROb2Rlc0FycmF5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVUZW1wbGF0ZU5hbWUodGVtcGxhdGUsIGRhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gVGhlIHRlbXBsYXRlIGNhbiBiZSBzcGVjaWZpZWQgYXM6XG4gICAgICAgIGlmIChrby5pc09ic2VydmFibGUodGVtcGxhdGUpKSB7XG4gICAgICAgICAgICAvLyAxLiBBbiBvYnNlcnZhYmxlLCB3aXRoIHN0cmluZyB2YWx1ZVxuICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyAyLiBBIGZ1bmN0aW9uIG9mIChkYXRhLCBjb250ZXh0KSByZXR1cm5pbmcgYSBzdHJpbmdcbiAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZShkYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIDMuIEEgc3RyaW5nXG4gICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBrby5yZW5kZXJUZW1wbGF0ZSA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgZGF0YU9yQmluZGluZ0NvbnRleHQsIG9wdGlvbnMsIHRhcmdldE5vZGVPck5vZGVBcnJheSwgcmVuZGVyTW9kZSkge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKChvcHRpb25zWyd0ZW1wbGF0ZUVuZ2luZSddIHx8IF90ZW1wbGF0ZUVuZ2luZSkgPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2V0IGEgdGVtcGxhdGUgZW5naW5lIGJlZm9yZSBjYWxsaW5nIHJlbmRlclRlbXBsYXRlXCIpO1xuICAgICAgICByZW5kZXJNb2RlID0gcmVuZGVyTW9kZSB8fCBcInJlcGxhY2VDaGlsZHJlblwiO1xuXG4gICAgICAgIGlmICh0YXJnZXROb2RlT3JOb2RlQXJyYXkpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdFRhcmdldE5vZGUgPSBnZXRGaXJzdE5vZGVGcm9tUG9zc2libGVBcnJheSh0YXJnZXROb2RlT3JOb2RlQXJyYXkpO1xuXG4gICAgICAgICAgICB2YXIgd2hlblRvRGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICghZmlyc3RUYXJnZXROb2RlKSB8fCAha28udXRpbHMuZG9tTm9kZUlzQXR0YWNoZWRUb0RvY3VtZW50KGZpcnN0VGFyZ2V0Tm9kZSk7IH07IC8vIFBhc3NpdmUgZGlzcG9zYWwgKG9uIG5leHQgZXZhbHVhdGlvbilcbiAgICAgICAgICAgIHZhciBhY3RpdmVseURpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZCA9IChmaXJzdFRhcmdldE5vZGUgJiYgcmVuZGVyTW9kZSA9PSBcInJlcGxhY2VOb2RlXCIpID8gZmlyc3RUYXJnZXROb2RlLnBhcmVudE5vZGUgOiBmaXJzdFRhcmdldE5vZGU7XG5cbiAgICAgICAgICAgIHJldHVybiBrby5kZXBlbmRlbnRPYnNlcnZhYmxlKCAvLyBTbyB0aGUgRE9NIGlzIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB3aGVuIGFueSBkZXBlbmRlbmN5IGNoYW5nZXNcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB3ZSd2ZSBnb3QgYSBwcm9wZXIgYmluZGluZyBjb250ZXh0IHRvIHdvcmsgd2l0aFxuICAgICAgICAgICAgICAgICAgICB2YXIgYmluZGluZ0NvbnRleHQgPSAoZGF0YU9yQmluZGluZ0NvbnRleHQgJiYgKGRhdGFPckJpbmRpbmdDb250ZXh0IGluc3RhbmNlb2Yga28uYmluZGluZ0NvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBkYXRhT3JCaW5kaW5nQ29udGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcga28uYmluZGluZ0NvbnRleHQoa28udXRpbHMudW53cmFwT2JzZXJ2YWJsZShkYXRhT3JCaW5kaW5nQ29udGV4dCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSByZXNvbHZlVGVtcGxhdGVOYW1lKHRlbXBsYXRlLCBiaW5kaW5nQ29udGV4dFsnJGRhdGEnXSwgYmluZGluZ0NvbnRleHQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWROb2Rlc0FycmF5ID0gZXhlY3V0ZVRlbXBsYXRlKHRhcmdldE5vZGVPck5vZGVBcnJheSwgcmVuZGVyTW9kZSwgdGVtcGxhdGVOYW1lLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbmRlck1vZGUgPT0gXCJyZXBsYWNlTm9kZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlT3JOb2RlQXJyYXkgPSByZW5kZXJlZE5vZGVzQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRhcmdldE5vZGUgPSBnZXRGaXJzdE5vZGVGcm9tUG9zc2libGVBcnJheSh0YXJnZXROb2RlT3JOb2RlQXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHsgZGlzcG9zZVdoZW46IHdoZW5Ub0Rpc3Bvc2UsIGRpc3Bvc2VXaGVuTm9kZUlzUmVtb3ZlZDogYWN0aXZlbHlEaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHlldCBoYXZlIGEgRE9NIG5vZGUgdG8gZXZhbHVhdGUsIHNvIHVzZSBhIG1lbW8gYW5kIHJlbmRlciB0aGUgdGVtcGxhdGUgbGF0ZXIgd2hlbiB0aGVyZSBpcyBhIERPTSBub2RlXG4gICAgICAgICAgICByZXR1cm4ga28ubWVtb2l6YXRpb24ubWVtb2l6ZShmdW5jdGlvbiAoZG9tTm9kZSkge1xuICAgICAgICAgICAgICAgIGtvLnJlbmRlclRlbXBsYXRlKHRlbXBsYXRlLCBkYXRhT3JCaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgZG9tTm9kZSwgXCJyZXBsYWNlTm9kZVwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGtvLnJlbmRlclRlbXBsYXRlRm9yRWFjaCA9IGZ1bmN0aW9uICh0ZW1wbGF0ZSwgYXJyYXlPck9ic2VydmFibGVBcnJheSwgb3B0aW9ucywgdGFyZ2V0Tm9kZSwgcGFyZW50QmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgLy8gU2luY2Ugc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyBhbHdheXMgY2FsbHMgZXhlY3V0ZVRlbXBsYXRlRm9yQXJyYXlJdGVtIGFuZCB0aGVuXG4gICAgICAgIC8vIGFjdGl2YXRlQmluZGluZ3NDYWxsYmFjayBmb3IgYWRkZWQgaXRlbXMsIHdlIGNhbiBzdG9yZSB0aGUgYmluZGluZyBjb250ZXh0IGluIHRoZSBmb3JtZXIgdG8gdXNlIGluIHRoZSBsYXR0ZXIuXG4gICAgICAgIHZhciBhcnJheUl0ZW1Db250ZXh0O1xuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyB0byBnZXQgdGhlIG5vZGVzIHRvIGFkZCB0byB0YXJnZXROb2RlXG4gICAgICAgIHZhciBleGVjdXRlVGVtcGxhdGVGb3JBcnJheUl0ZW0gPSBmdW5jdGlvbiAoYXJyYXlWYWx1ZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIC8vIFN1cHBvcnQgc2VsZWN0aW5nIHRlbXBsYXRlIGFzIGEgZnVuY3Rpb24gb2YgdGhlIGRhdGEgYmVpbmcgcmVuZGVyZWRcbiAgICAgICAgICAgIGFycmF5SXRlbUNvbnRleHQgPSBwYXJlbnRCaW5kaW5nQ29udGV4dFsnY3JlYXRlQ2hpbGRDb250ZXh0J10oYXJyYXlWYWx1ZSwgb3B0aW9uc1snYXMnXSwgZnVuY3Rpb24oY29udGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHRbJyRpbmRleCddID0gaW5kZXg7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIHRlbXBsYXRlTmFtZSA9IHJlc29sdmVUZW1wbGF0ZU5hbWUodGVtcGxhdGUsIGFycmF5VmFsdWUsIGFycmF5SXRlbUNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVUZW1wbGF0ZShudWxsLCBcImlnbm9yZVRhcmdldE5vZGVcIiwgdGVtcGxhdGVOYW1lLCBhcnJheUl0ZW1Db250ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZyBoYXMgYWRkZWQgbm9kZXMgdG8gdGFyZ2V0Tm9kZVxuICAgICAgICB2YXIgYWN0aXZhdGVCaW5kaW5nc0NhbGxiYWNrID0gZnVuY3Rpb24oYXJyYXlWYWx1ZSwgYWRkZWROb2Rlc0FycmF5LCBpbmRleCkge1xuICAgICAgICAgICAgYWN0aXZhdGVCaW5kaW5nc09uQ29udGludW91c05vZGVBcnJheShhZGRlZE5vZGVzQXJyYXksIGFycmF5SXRlbUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnNbJ2FmdGVyUmVuZGVyJ10pXG4gICAgICAgICAgICAgICAgb3B0aW9uc1snYWZ0ZXJSZW5kZXInXShhZGRlZE5vZGVzQXJyYXksIGFycmF5VmFsdWUpO1xuXG4gICAgICAgICAgICAvLyByZWxlYXNlIHRoZSBcImNhY2hlXCIgdmFyaWFibGUsIHNvIHRoYXQgaXQgY2FuIGJlIGNvbGxlY3RlZCBieVxuICAgICAgICAgICAgLy8gdGhlIEdDIHdoZW4gaXRzIHZhbHVlIGlzbid0IHVzZWQgZnJvbSB3aXRoaW4gdGhlIGJpbmRpbmdzIGFueW1vcmUuXG4gICAgICAgICAgICBhcnJheUl0ZW1Db250ZXh0ID0gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ga28uZGVwZW5kZW50T2JzZXJ2YWJsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdW53cmFwcGVkQXJyYXkgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGFycmF5T3JPYnNlcnZhYmxlQXJyYXkpIHx8IFtdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB1bndyYXBwZWRBcnJheS5sZW5ndGggPT0gXCJ1bmRlZmluZWRcIikgLy8gQ29lcmNlIHNpbmdsZSB2YWx1ZSBpbnRvIGFycmF5XG4gICAgICAgICAgICAgICAgdW53cmFwcGVkQXJyYXkgPSBbdW53cmFwcGVkQXJyYXldO1xuXG4gICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGFueSBlbnRyaWVzIG1hcmtlZCBhcyBkZXN0cm95ZWRcbiAgICAgICAgICAgIHZhciBmaWx0ZXJlZEFycmF5ID0ga28udXRpbHMuYXJyYXlGaWx0ZXIodW53cmFwcGVkQXJyYXksIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uc1snaW5jbHVkZURlc3Ryb3llZCddIHx8IGl0ZW0gPT09IHVuZGVmaW5lZCB8fCBpdGVtID09PSBudWxsIHx8ICFrby51dGlscy51bndyYXBPYnNlcnZhYmxlKGl0ZW1bJ19kZXN0cm95J10pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIENhbGwgc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZywgaWdub3JpbmcgYW55IG9ic2VydmFibGVzIHVud3JhcHBlZCB3aXRoaW4gKG1vc3QgbGlrZWx5IGZyb20gYSBjYWxsYmFjayBmdW5jdGlvbikuXG4gICAgICAgICAgICAvLyBJZiB0aGUgYXJyYXkgaXRlbXMgYXJlIG9ic2VydmFibGVzLCB0aG91Z2gsIHRoZXkgd2lsbCBiZSB1bndyYXBwZWQgaW4gZXhlY3V0ZVRlbXBsYXRlRm9yQXJyYXlJdGVtIGFuZCBtYW5hZ2VkIHdpdGhpbiBzZXREb21Ob2RlQ2hpbGRyZW5Gcm9tQXJyYXlNYXBwaW5nLlxuICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoa28udXRpbHMuc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZywgbnVsbCwgW3RhcmdldE5vZGUsIGZpbHRlcmVkQXJyYXksIGV4ZWN1dGVUZW1wbGF0ZUZvckFycmF5SXRlbSwgb3B0aW9ucywgYWN0aXZhdGVCaW5kaW5nc0NhbGxiYWNrXSk7XG5cbiAgICAgICAgfSwgbnVsbCwgeyBkaXNwb3NlV2hlbk5vZGVJc1JlbW92ZWQ6IHRhcmdldE5vZGUgfSk7XG4gICAgfTtcblxuICAgIHZhciB0ZW1wbGF0ZUNvbXB1dGVkRG9tRGF0YUtleSA9IGtvLnV0aWxzLmRvbURhdGEubmV4dEtleSgpO1xuICAgIGZ1bmN0aW9uIGRpc3Bvc2VPbGRDb21wdXRlZEFuZFN0b3JlTmV3T25lKGVsZW1lbnQsIG5ld0NvbXB1dGVkKSB7XG4gICAgICAgIHZhciBvbGRDb21wdXRlZCA9IGtvLnV0aWxzLmRvbURhdGEuZ2V0KGVsZW1lbnQsIHRlbXBsYXRlQ29tcHV0ZWREb21EYXRhS2V5KTtcbiAgICAgICAgaWYgKG9sZENvbXB1dGVkICYmICh0eXBlb2Yob2xkQ29tcHV0ZWQuZGlzcG9zZSkgPT0gJ2Z1bmN0aW9uJykpXG4gICAgICAgICAgICBvbGRDb21wdXRlZC5kaXNwb3NlKCk7XG4gICAgICAgIGtvLnV0aWxzLmRvbURhdGEuc2V0KGVsZW1lbnQsIHRlbXBsYXRlQ29tcHV0ZWREb21EYXRhS2V5LCAobmV3Q29tcHV0ZWQgJiYgbmV3Q29tcHV0ZWQuaXNBY3RpdmUoKSkgPyBuZXdDb21wdXRlZCA6IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAga28uYmluZGluZ0hhbmRsZXJzWyd0ZW1wbGF0ZSddID0ge1xuICAgICAgICAnaW5pdCc6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IpIHtcbiAgICAgICAgICAgIC8vIFN1cHBvcnQgYW5vbnltb3VzIHRlbXBsYXRlc1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdWYWx1ZSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWVBY2Nlc3NvcigpKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYmluZGluZ1ZhbHVlID09IFwic3RyaW5nXCIgfHwgYmluZGluZ1ZhbHVlWyduYW1lJ10pIHtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIGEgbmFtZWQgdGVtcGxhdGUgLSBjbGVhciB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5lbXB0eU5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCdub2RlcycgaW4gYmluZGluZ1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UndmUgYmVlbiBnaXZlbiBhbiBhcnJheSBvZiBET00gbm9kZXMuIFNhdmUgdGhlbSBhcyB0aGUgdGVtcGxhdGUgc291cmNlLlxuICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGtub3duIHVzZSBjYXNlIGZvciB0aGUgbm9kZSBhcnJheSBiZWluZyBhbiBvYnNlcnZhYmxlIGFycmF5IChpZiB0aGUgb3V0cHV0XG4gICAgICAgICAgICAgICAgLy8gdmFyaWVzLCBwdXQgdGhhdCBiZWhhdmlvciAqaW50byogeW91ciB0ZW1wbGF0ZSAtIHRoYXQncyB3aGF0IHRlbXBsYXRlcyBhcmUgZm9yKSwgYW5kXG4gICAgICAgICAgICAgICAgLy8gdGhlIGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIGEgbWVzcywgc28gYXNzZXJ0IHRoYXQgaXQncyBub3Qgb2JzZXJ2YWJsZS5cbiAgICAgICAgICAgICAgICB2YXIgbm9kZXMgPSBiaW5kaW5nVmFsdWVbJ25vZGVzJ10gfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKGtvLmlzT2JzZXJ2YWJsZShub2RlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJub2Rlc1wiIG9wdGlvbiBtdXN0IGJlIGEgcGxhaW4sIG5vbi1vYnNlcnZhYmxlIGFycmF5LicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0ga28udXRpbHMubW92ZUNsZWFuZWROb2Rlc1RvQ29udGFpbmVyRWxlbWVudChub2Rlcyk7IC8vIFRoaXMgYWxzbyByZW1vdmVzIHRoZSBub2RlcyBmcm9tIHRoZWlyIGN1cnJlbnQgcGFyZW50XG4gICAgICAgICAgICAgICAgbmV3IGtvLnRlbXBsYXRlU291cmNlcy5hbm9ueW1vdXNUZW1wbGF0ZShlbGVtZW50KVsnbm9kZXMnXShjb250YWluZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJdCdzIGFuIGFub255bW91cyB0ZW1wbGF0ZSAtIHN0b3JlIHRoZSBlbGVtZW50IGNvbnRlbnRzLCB0aGVuIGNsZWFyIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgdmFyIHRlbXBsYXRlTm9kZXMgPSBrby52aXJ0dWFsRWxlbWVudHMuY2hpbGROb2RlcyhlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0ga28udXRpbHMubW92ZUNsZWFuZWROb2Rlc1RvQ29udGFpbmVyRWxlbWVudCh0ZW1wbGF0ZU5vZGVzKTsgLy8gVGhpcyBhbHNvIHJlbW92ZXMgdGhlIG5vZGVzIGZyb20gdGhlaXIgY3VycmVudCBwYXJlbnRcbiAgICAgICAgICAgICAgICBuZXcga28udGVtcGxhdGVTb3VyY2VzLmFub255bW91c1RlbXBsYXRlKGVsZW1lbnQpWydub2RlcyddKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyAnY29udHJvbHNEZXNjZW5kYW50QmluZGluZ3MnOiB0cnVlIH07XG4gICAgICAgIH0sXG4gICAgICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZWxlbWVudCwgdmFsdWVBY2Nlc3NvciwgYWxsQmluZGluZ3MsIHZpZXdNb2RlbCwgYmluZGluZ0NvbnRleHQpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlQWNjZXNzb3IoKSxcbiAgICAgICAgICAgICAgICBkYXRhVmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNob3VsZERpc3BsYXkgPSB0cnVlLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29tcHV0ZWQgPSBudWxsLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlTmFtZTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZU5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlTmFtZSA9IG9wdGlvbnNbJ25hbWUnXTtcblxuICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgXCJpZlwiL1wiaWZub3RcIiBjb25kaXRpb25zXG4gICAgICAgICAgICAgICAgaWYgKCdpZicgaW4gb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkRGlzcGxheSA9IGtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUob3B0aW9uc1snaWYnXSk7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZERpc3BsYXkgJiYgJ2lmbm90JyBpbiBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICBzaG91bGREaXNwbGF5ID0gIWtvLnV0aWxzLnVud3JhcE9ic2VydmFibGUob3B0aW9uc1snaWZub3QnXSk7XG5cbiAgICAgICAgICAgICAgICBkYXRhVmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKG9wdGlvbnNbJ2RhdGEnXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgnZm9yZWFjaCcgaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIC8vIFJlbmRlciBvbmNlIGZvciBlYWNoIGRhdGEgcG9pbnQgKHRyZWF0aW5nIGRhdGEgc2V0IGFzIGVtcHR5IGlmIHNob3VsZERpc3BsYXk9PWZhbHNlKVxuICAgICAgICAgICAgICAgIHZhciBkYXRhQXJyYXkgPSAoc2hvdWxkRGlzcGxheSAmJiBvcHRpb25zWydmb3JlYWNoJ10pIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29tcHV0ZWQgPSBrby5yZW5kZXJUZW1wbGF0ZUZvckVhY2godGVtcGxhdGVOYW1lIHx8IGVsZW1lbnQsIGRhdGFBcnJheSwgb3B0aW9ucywgZWxlbWVudCwgYmluZGluZ0NvbnRleHQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc2hvdWxkRGlzcGxheSkge1xuICAgICAgICAgICAgICAgIGtvLnZpcnR1YWxFbGVtZW50cy5lbXB0eU5vZGUoZWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJlbmRlciBvbmNlIGZvciB0aGlzIHNpbmdsZSBkYXRhIHBvaW50IChvciB1c2UgdGhlIHZpZXdNb2RlbCBpZiBubyBkYXRhIHdhcyBwcm92aWRlZClcbiAgICAgICAgICAgICAgICB2YXIgaW5uZXJCaW5kaW5nQ29udGV4dCA9ICgnZGF0YScgaW4gb3B0aW9ucykgP1xuICAgICAgICAgICAgICAgICAgICBiaW5kaW5nQ29udGV4dFsnY3JlYXRlQ2hpbGRDb250ZXh0J10oZGF0YVZhbHVlLCBvcHRpb25zWydhcyddKSA6ICAvLyBHaXZlbiBhbiBleHBsaXRpdCAnZGF0YScgdmFsdWUsIHdlIGNyZWF0ZSBhIGNoaWxkIGJpbmRpbmcgY29udGV4dCBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgYmluZGluZ0NvbnRleHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHaXZlbiBubyBleHBsaWNpdCAnZGF0YScgdmFsdWUsIHdlIHJldGFpbiB0aGUgc2FtZSBiaW5kaW5nIGNvbnRleHRcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbXB1dGVkID0ga28ucmVuZGVyVGVtcGxhdGUodGVtcGxhdGVOYW1lIHx8IGVsZW1lbnQsIGlubmVyQmluZGluZ0NvbnRleHQsIG9wdGlvbnMsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGhhdmUgYSBzaW5nbGUgdGVtcGxhdGUgY29tcHV0ZWQgcGVyIGVsZW1lbnQgKG90aGVyd2lzZSB3aGljaCBvbmUgc2hvdWxkIGhhdmUgaXRzIG91dHB1dCBkaXNwbGF5ZWQ/KVxuICAgICAgICAgICAgZGlzcG9zZU9sZENvbXB1dGVkQW5kU3RvcmVOZXdPbmUoZWxlbWVudCwgdGVtcGxhdGVDb21wdXRlZCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQW5vbnltb3VzIHRlbXBsYXRlcyBjYW4ndCBiZSByZXdyaXR0ZW4uIEdpdmUgYSBuaWNlIGVycm9yIG1lc3NhZ2UgaWYgeW91IHRyeSB0byBkbyBpdC5cbiAgICBrby5leHByZXNzaW9uUmV3cml0aW5nLmJpbmRpbmdSZXdyaXRlVmFsaWRhdG9yc1sndGVtcGxhdGUnXSA9IGZ1bmN0aW9uKGJpbmRpbmdWYWx1ZSkge1xuICAgICAgICB2YXIgcGFyc2VkQmluZGluZ1ZhbHVlID0ga28uZXhwcmVzc2lvblJld3JpdGluZy5wYXJzZU9iamVjdExpdGVyYWwoYmluZGluZ1ZhbHVlKTtcblxuICAgICAgICBpZiAoKHBhcnNlZEJpbmRpbmdWYWx1ZS5sZW5ndGggPT0gMSkgJiYgcGFyc2VkQmluZGluZ1ZhbHVlWzBdWyd1bmtub3duJ10pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gSXQgbG9va3MgbGlrZSBhIHN0cmluZyBsaXRlcmFsLCBub3QgYW4gb2JqZWN0IGxpdGVyYWwsIHNvIHRyZWF0IGl0IGFzIGEgbmFtZWQgdGVtcGxhdGUgKHdoaWNoIGlzIGFsbG93ZWQgZm9yIHJld3JpdGluZylcblxuICAgICAgICBpZiAoa28uZXhwcmVzc2lvblJld3JpdGluZy5rZXlWYWx1ZUFycmF5Q29udGFpbnNLZXkocGFyc2VkQmluZGluZ1ZhbHVlLCBcIm5hbWVcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTmFtZWQgdGVtcGxhdGVzIGNhbiBiZSByZXdyaXR0ZW4sIHNvIHJldHVybiBcIm5vIGVycm9yXCJcbiAgICAgICAgcmV0dXJuIFwiVGhpcyB0ZW1wbGF0ZSBlbmdpbmUgZG9lcyBub3Qgc3VwcG9ydCBhbm9ueW1vdXMgdGVtcGxhdGVzIG5lc3RlZCB3aXRoaW4gaXRzIHRlbXBsYXRlc1wiO1xuICAgIH07XG5cbiAgICBrby52aXJ0dWFsRWxlbWVudHMuYWxsb3dlZEJpbmRpbmdzWyd0ZW1wbGF0ZSddID0gdHJ1ZTtcbn0pKCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgnc2V0VGVtcGxhdGVFbmdpbmUnLCBrby5zZXRUZW1wbGF0ZUVuZ2luZSk7XG5rby5leHBvcnRTeW1ib2woJ3JlbmRlclRlbXBsYXRlJywga28ucmVuZGVyVGVtcGxhdGUpO1xuLy8gR28gdGhyb3VnaCB0aGUgaXRlbXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgYW5kIGRlbGV0ZWQgYW5kIHRyeSB0byBmaW5kIG1hdGNoZXMgYmV0d2VlbiB0aGVtLlxua28udXRpbHMuZmluZE1vdmVzSW5BcnJheUNvbXBhcmlzb24gPSBmdW5jdGlvbiAobGVmdCwgcmlnaHQsIGxpbWl0RmFpbGVkQ29tcGFyZXMpIHtcbiAgICBpZiAobGVmdC5sZW5ndGggJiYgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgIHZhciBmYWlsZWRDb21wYXJlcywgbCwgciwgbGVmdEl0ZW0sIHJpZ2h0SXRlbTtcbiAgICAgICAgZm9yIChmYWlsZWRDb21wYXJlcyA9IGwgPSAwOyAoIWxpbWl0RmFpbGVkQ29tcGFyZXMgfHwgZmFpbGVkQ29tcGFyZXMgPCBsaW1pdEZhaWxlZENvbXBhcmVzKSAmJiAobGVmdEl0ZW0gPSBsZWZ0W2xdKTsgKytsKSB7XG4gICAgICAgICAgICBmb3IgKHIgPSAwOyByaWdodEl0ZW0gPSByaWdodFtyXTsgKytyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnRJdGVtWyd2YWx1ZSddID09PSByaWdodEl0ZW1bJ3ZhbHVlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1bJ21vdmVkJ10gPSByaWdodEl0ZW1bJ2luZGV4J107XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0SXRlbVsnbW92ZWQnXSA9IGxlZnRJdGVtWydpbmRleCddO1xuICAgICAgICAgICAgICAgICAgICByaWdodC5zcGxpY2UociwgMSk7ICAgICAgICAgLy8gVGhpcyBpdGVtIGlzIG1hcmtlZCBhcyBtb3ZlZDsgc28gcmVtb3ZlIGl0IGZyb20gcmlnaHQgbGlzdFxuICAgICAgICAgICAgICAgICAgICBmYWlsZWRDb21wYXJlcyA9IHIgPSAwOyAgICAgLy8gUmVzZXQgZmFpbGVkIGNvbXBhcmVzIGNvdW50IGJlY2F1c2Ugd2UncmUgY2hlY2tpbmcgZm9yIGNvbnNlY3V0aXZlIGZhaWx1cmVzXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZhaWxlZENvbXBhcmVzICs9IHI7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5rby51dGlscy5jb21wYXJlQXJyYXlzID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhdHVzTm90SW5PbGQgPSAnYWRkZWQnLCBzdGF0dXNOb3RJbk5ldyA9ICdkZWxldGVkJztcblxuICAgIC8vIFNpbXBsZSBjYWxjdWxhdGlvbiBiYXNlZCBvbiBMZXZlbnNodGVpbiBkaXN0YW5jZS5cbiAgICBmdW5jdGlvbiBjb21wYXJlQXJyYXlzKG9sZEFycmF5LCBuZXdBcnJheSwgb3B0aW9ucykge1xuICAgICAgICAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgaWYgdGhlIHRoaXJkIGFyZyBpcyBhY3R1YWxseSBhIGJvb2wsIGludGVycHJldFxuICAgICAgICAvLyBpdCBhcyB0aGUgb2xkIHBhcmFtZXRlciAnZG9udExpbWl0TW92ZXMnLiBOZXdlciBjb2RlIHNob3VsZCB1c2UgeyBkb250TGltaXRNb3ZlczogdHJ1ZSB9LlxuICAgICAgICBvcHRpb25zID0gKHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicpID8geyAnZG9udExpbWl0TW92ZXMnOiBvcHRpb25zIH0gOiAob3B0aW9ucyB8fCB7fSk7XG4gICAgICAgIG9sZEFycmF5ID0gb2xkQXJyYXkgfHwgW107XG4gICAgICAgIG5ld0FycmF5ID0gbmV3QXJyYXkgfHwgW107XG5cbiAgICAgICAgaWYgKG9sZEFycmF5Lmxlbmd0aCA8IG5ld0FycmF5Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlU21hbGxBcnJheVRvQmlnQXJyYXkob2xkQXJyYXksIG5ld0FycmF5LCBzdGF0dXNOb3RJbk9sZCwgc3RhdHVzTm90SW5OZXcsIG9wdGlvbnMpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gY29tcGFyZVNtYWxsQXJyYXlUb0JpZ0FycmF5KG5ld0FycmF5LCBvbGRBcnJheSwgc3RhdHVzTm90SW5OZXcsIHN0YXR1c05vdEluT2xkLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wYXJlU21hbGxBcnJheVRvQmlnQXJyYXkoc21sQXJyYXksIGJpZ0FycmF5LCBzdGF0dXNOb3RJblNtbCwgc3RhdHVzTm90SW5CaWcsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIG15TWluID0gTWF0aC5taW4sXG4gICAgICAgICAgICBteU1heCA9IE1hdGgubWF4LFxuICAgICAgICAgICAgZWRpdERpc3RhbmNlTWF0cml4ID0gW10sXG4gICAgICAgICAgICBzbWxJbmRleCwgc21sSW5kZXhNYXggPSBzbWxBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICBiaWdJbmRleCwgYmlnSW5kZXhNYXggPSBiaWdBcnJheS5sZW5ndGgsXG4gICAgICAgICAgICBjb21wYXJlUmFuZ2UgPSAoYmlnSW5kZXhNYXggLSBzbWxJbmRleE1heCkgfHwgMSxcbiAgICAgICAgICAgIG1heERpc3RhbmNlID0gc21sSW5kZXhNYXggKyBiaWdJbmRleE1heCArIDEsXG4gICAgICAgICAgICB0aGlzUm93LCBsYXN0Um93LFxuICAgICAgICAgICAgYmlnSW5kZXhNYXhGb3JSb3csIGJpZ0luZGV4TWluRm9yUm93O1xuXG4gICAgICAgIGZvciAoc21sSW5kZXggPSAwOyBzbWxJbmRleCA8PSBzbWxJbmRleE1heDsgc21sSW5kZXgrKykge1xuICAgICAgICAgICAgbGFzdFJvdyA9IHRoaXNSb3c7XG4gICAgICAgICAgICBlZGl0RGlzdGFuY2VNYXRyaXgucHVzaCh0aGlzUm93ID0gW10pO1xuICAgICAgICAgICAgYmlnSW5kZXhNYXhGb3JSb3cgPSBteU1pbihiaWdJbmRleE1heCwgc21sSW5kZXggKyBjb21wYXJlUmFuZ2UpO1xuICAgICAgICAgICAgYmlnSW5kZXhNaW5Gb3JSb3cgPSBteU1heCgwLCBzbWxJbmRleCAtIDEpO1xuICAgICAgICAgICAgZm9yIChiaWdJbmRleCA9IGJpZ0luZGV4TWluRm9yUm93OyBiaWdJbmRleCA8PSBiaWdJbmRleE1heEZvclJvdzsgYmlnSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmICghYmlnSW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXNSb3dbYmlnSW5kZXhdID0gc21sSW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzbWxJbmRleCkgIC8vIFRvcCByb3cgLSB0cmFuc2Zvcm0gZW1wdHkgYXJyYXkgaW50byBuZXcgYXJyYXkgdmlhIGFkZGl0aW9uc1xuICAgICAgICAgICAgICAgICAgICB0aGlzUm93W2JpZ0luZGV4XSA9IGJpZ0luZGV4ICsgMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzbWxBcnJheVtzbWxJbmRleCAtIDFdID09PSBiaWdBcnJheVtiaWdJbmRleCAtIDFdKVxuICAgICAgICAgICAgICAgICAgICB0aGlzUm93W2JpZ0luZGV4XSA9IGxhc3RSb3dbYmlnSW5kZXggLSAxXTsgICAgICAgICAgICAgICAgICAvLyBjb3B5IHZhbHVlIChubyBlZGl0KVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbm9ydGhEaXN0YW5jZSA9IGxhc3RSb3dbYmlnSW5kZXhdIHx8IG1heERpc3RhbmNlOyAgICAgICAvLyBub3QgaW4gYmlnIChkZWxldGlvbilcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdlc3REaXN0YW5jZSA9IHRoaXNSb3dbYmlnSW5kZXggLSAxXSB8fCBtYXhEaXN0YW5jZTsgICAgLy8gbm90IGluIHNtYWxsIChhZGRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgdGhpc1Jvd1tiaWdJbmRleF0gPSBteU1pbihub3J0aERpc3RhbmNlLCB3ZXN0RGlzdGFuY2UpICsgMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZWRpdFNjcmlwdCA9IFtdLCBtZU1pbnVzT25lLCBub3RJblNtbCA9IFtdLCBub3RJbkJpZyA9IFtdO1xuICAgICAgICBmb3IgKHNtbEluZGV4ID0gc21sSW5kZXhNYXgsIGJpZ0luZGV4ID0gYmlnSW5kZXhNYXg7IHNtbEluZGV4IHx8IGJpZ0luZGV4Oykge1xuICAgICAgICAgICAgbWVNaW51c09uZSA9IGVkaXREaXN0YW5jZU1hdHJpeFtzbWxJbmRleF1bYmlnSW5kZXhdIC0gMTtcbiAgICAgICAgICAgIGlmIChiaWdJbmRleCAmJiBtZU1pbnVzT25lID09PSBlZGl0RGlzdGFuY2VNYXRyaXhbc21sSW5kZXhdW2JpZ0luZGV4LTFdKSB7XG4gICAgICAgICAgICAgICAgbm90SW5TbWwucHVzaChlZGl0U2NyaXB0W2VkaXRTY3JpcHQubGVuZ3RoXSA9IHsgICAgIC8vIGFkZGVkXG4gICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiBzdGF0dXNOb3RJblNtbCxcbiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogYmlnQXJyYXlbLS1iaWdJbmRleF0sXG4gICAgICAgICAgICAgICAgICAgICdpbmRleCc6IGJpZ0luZGV4IH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzbWxJbmRleCAmJiBtZU1pbnVzT25lID09PSBlZGl0RGlzdGFuY2VNYXRyaXhbc21sSW5kZXggLSAxXVtiaWdJbmRleF0pIHtcbiAgICAgICAgICAgICAgICBub3RJbkJpZy5wdXNoKGVkaXRTY3JpcHRbZWRpdFNjcmlwdC5sZW5ndGhdID0geyAgICAgLy8gZGVsZXRlZFxuICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJzogc3RhdHVzTm90SW5CaWcsXG4gICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6IHNtbEFycmF5Wy0tc21sSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAnaW5kZXgnOiBzbWxJbmRleCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLS1iaWdJbmRleDtcbiAgICAgICAgICAgICAgICAtLXNtbEluZGV4O1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc1snc3BhcnNlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgZWRpdFNjcmlwdC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiBcInJldGFpbmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiBiaWdBcnJheVtiaWdJbmRleF0gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBub24tbWF0Y2hpbmcgY29tcGFyaXNvbnM7IGhhdmluZyBpdCBhIG11bHRpcGxlIG9mXG4gICAgICAgIC8vIHNtbEluZGV4TWF4IGtlZXBzIHRoZSB0aW1lIGNvbXBsZXhpdHkgb2YgdGhpcyBhbGdvcml0aG0gbGluZWFyLlxuICAgICAgICBrby51dGlscy5maW5kTW92ZXNJbkFycmF5Q29tcGFyaXNvbihub3RJbkJpZywgbm90SW5TbWwsICFvcHRpb25zWydkb250TGltaXRNb3ZlcyddICYmIHNtbEluZGV4TWF4ICogMTApO1xuXG4gICAgICAgIHJldHVybiBlZGl0U2NyaXB0LnJldmVyc2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGFyZUFycmF5cztcbn0pKCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuY29tcGFyZUFycmF5cycsIGtvLnV0aWxzLmNvbXBhcmVBcnJheXMpO1xuKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBPYmplY3RpdmU6XG4gICAgLy8gKiBHaXZlbiBhbiBpbnB1dCBhcnJheSwgYSBjb250YWluZXIgRE9NIG5vZGUsIGFuZCBhIGZ1bmN0aW9uIGZyb20gYXJyYXkgZWxlbWVudHMgdG8gYXJyYXlzIG9mIERPTSBub2RlcyxcbiAgICAvLyAgIG1hcCB0aGUgYXJyYXkgZWxlbWVudHMgdG8gYXJyYXlzIG9mIERPTSBub2RlcywgY29uY2F0ZW5hdGUgdG9nZXRoZXIgYWxsIHRoZXNlIGFycmF5cywgYW5kIHVzZSB0aGVtIHRvIHBvcHVsYXRlIHRoZSBjb250YWluZXIgRE9NIG5vZGVcbiAgICAvLyAqIE5leHQgdGltZSB3ZSdyZSBnaXZlbiB0aGUgc2FtZSBjb21iaW5hdGlvbiBvZiB0aGluZ3MgKHdpdGggdGhlIGFycmF5IHBvc3NpYmx5IGhhdmluZyBtdXRhdGVkKSwgdXBkYXRlIHRoZSBjb250YWluZXIgRE9NIG5vZGVcbiAgICAvLyAgIHNvIHRoYXQgaXRzIGNoaWxkcmVuIGlzIGFnYWluIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBtYXBwaW5ncyBvZiB0aGUgYXJyYXkgZWxlbWVudHMsIGJ1dCBkb24ndCByZS1tYXAgYW55IGFycmF5IGVsZW1lbnRzIHRoYXQgd2VcbiAgICAvLyAgIHByZXZpb3VzbHkgbWFwcGVkIC0gcmV0YWluIHRob3NlIG5vZGVzLCBhbmQganVzdCBpbnNlcnQvZGVsZXRlIG90aGVyIG9uZXNcblxuICAgIC8vIFwiY2FsbGJhY2tBZnRlckFkZGluZ05vZGVzXCIgd2lsbCBiZSBpbnZva2VkIGFmdGVyIGFueSBcIm1hcHBpbmdcIi1nZW5lcmF0ZWQgbm9kZXMgYXJlIGluc2VydGVkIGludG8gdGhlIGNvbnRhaW5lciBub2RlXG4gICAgLy8gWW91IGNhbiB1c2UgdGhpcywgZm9yIGV4YW1wbGUsIHRvIGFjdGl2YXRlIGJpbmRpbmdzIG9uIHRob3NlIG5vZGVzLlxuXG4gICAgZnVuY3Rpb24gbWFwTm9kZUFuZFJlZnJlc2hXaGVuQ2hhbmdlZChjb250YWluZXJOb2RlLCBtYXBwaW5nLCB2YWx1ZVRvTWFwLCBjYWxsYmFja0FmdGVyQWRkaW5nTm9kZXMsIGluZGV4KSB7XG4gICAgICAgIC8vIE1hcCB0aGlzIGFycmF5IHZhbHVlIGluc2lkZSBhIGRlcGVuZGVudE9ic2VydmFibGUgc28gd2UgcmUtbWFwIHdoZW4gYW55IGRlcGVuZGVuY3kgY2hhbmdlc1xuICAgICAgICB2YXIgbWFwcGVkTm9kZXMgPSBbXTtcbiAgICAgICAgdmFyIGRlcGVuZGVudE9ic2VydmFibGUgPSBrby5kZXBlbmRlbnRPYnNlcnZhYmxlKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIG5ld01hcHBlZE5vZGVzID0gbWFwcGluZyh2YWx1ZVRvTWFwLCBpbmRleCwga28udXRpbHMuZml4VXBDb250aW51b3VzTm9kZUFycmF5KG1hcHBlZE5vZGVzLCBjb250YWluZXJOb2RlKSkgfHwgW107XG5cbiAgICAgICAgICAgIC8vIE9uIHN1YnNlcXVlbnQgZXZhbHVhdGlvbnMsIGp1c3QgcmVwbGFjZSB0aGUgcHJldmlvdXNseS1pbnNlcnRlZCBET00gbm9kZXNcbiAgICAgICAgICAgIGlmIChtYXBwZWROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAga28udXRpbHMucmVwbGFjZURvbU5vZGVzKG1hcHBlZE5vZGVzLCBuZXdNYXBwZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrQWZ0ZXJBZGRpbmdOb2RlcylcbiAgICAgICAgICAgICAgICAgICAga28uZGVwZW5kZW5jeURldGVjdGlvbi5pZ25vcmUoY2FsbGJhY2tBZnRlckFkZGluZ05vZGVzLCBudWxsLCBbdmFsdWVUb01hcCwgbmV3TWFwcGVkTm9kZXMsIGluZGV4XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBtYXBwZWROb2RlcyBhcnJheSwgdGhlcmVieSB1cGRhdGluZyB0aGUgcmVjb3JkXG4gICAgICAgICAgICAvLyBvZiB3aGljaCBub2RlcyB3b3VsZCBiZSBkZWxldGVkIGlmIHZhbHVlVG9NYXAgd2FzIGl0c2VsZiBsYXRlciByZW1vdmVkXG4gICAgICAgICAgICBtYXBwZWROb2Rlcy5sZW5ndGggPSAwO1xuICAgICAgICAgICAga28udXRpbHMuYXJyYXlQdXNoQWxsKG1hcHBlZE5vZGVzLCBuZXdNYXBwZWROb2Rlcyk7XG4gICAgICAgIH0sIG51bGwsIHsgZGlzcG9zZVdoZW5Ob2RlSXNSZW1vdmVkOiBjb250YWluZXJOb2RlLCBkaXNwb3NlV2hlbjogZnVuY3Rpb24oKSB7IHJldHVybiAha28udXRpbHMuYW55RG9tTm9kZUlzQXR0YWNoZWRUb0RvY3VtZW50KG1hcHBlZE5vZGVzKTsgfSB9KTtcbiAgICAgICAgcmV0dXJuIHsgbWFwcGVkTm9kZXMgOiBtYXBwZWROb2RlcywgZGVwZW5kZW50T2JzZXJ2YWJsZSA6IChkZXBlbmRlbnRPYnNlcnZhYmxlLmlzQWN0aXZlKCkgPyBkZXBlbmRlbnRPYnNlcnZhYmxlIDogdW5kZWZpbmVkKSB9O1xuICAgIH1cblxuICAgIHZhciBsYXN0TWFwcGluZ1Jlc3VsdERvbURhdGFLZXkgPSBrby51dGlscy5kb21EYXRhLm5leHRLZXkoKSxcbiAgICAgICAgZGVsZXRlZEl0ZW1EdW1teVZhbHVlID0ga28udXRpbHMuZG9tRGF0YS5uZXh0S2V5KCk7XG5cbiAgICBrby51dGlscy5zZXREb21Ob2RlQ2hpbGRyZW5Gcm9tQXJyYXlNYXBwaW5nID0gZnVuY3Rpb24gKGRvbU5vZGUsIGFycmF5LCBtYXBwaW5nLCBvcHRpb25zLCBjYWxsYmFja0FmdGVyQWRkaW5nTm9kZXMpIHtcbiAgICAgICAgLy8gQ29tcGFyZSB0aGUgcHJvdmlkZWQgYXJyYXkgYWdhaW5zdCB0aGUgcHJldmlvdXMgb25lXG4gICAgICAgIGFycmF5ID0gYXJyYXkgfHwgW107XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICB2YXIgaXNGaXJzdEV4ZWN1dGlvbiA9IGtvLnV0aWxzLmRvbURhdGEuZ2V0KGRvbU5vZGUsIGxhc3RNYXBwaW5nUmVzdWx0RG9tRGF0YUtleSkgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIGxhc3RNYXBwaW5nUmVzdWx0ID0ga28udXRpbHMuZG9tRGF0YS5nZXQoZG9tTm9kZSwgbGFzdE1hcHBpbmdSZXN1bHREb21EYXRhS2V5KSB8fCBbXTtcbiAgICAgICAgdmFyIGxhc3RBcnJheSA9IGtvLnV0aWxzLmFycmF5TWFwKGxhc3RNYXBwaW5nUmVzdWx0LCBmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5hcnJheUVudHJ5OyB9KTtcbiAgICAgICAgdmFyIGVkaXRTY3JpcHQgPSBrby51dGlscy5jb21wYXJlQXJyYXlzKGxhc3RBcnJheSwgYXJyYXksIG9wdGlvbnNbJ2RvbnRMaW1pdE1vdmVzJ10pO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBuZXcgbWFwcGluZyByZXN1bHRcbiAgICAgICAgdmFyIG5ld01hcHBpbmdSZXN1bHQgPSBbXTtcbiAgICAgICAgdmFyIGxhc3RNYXBwaW5nUmVzdWx0SW5kZXggPSAwO1xuICAgICAgICB2YXIgbmV3TWFwcGluZ1Jlc3VsdEluZGV4ID0gMDtcblxuICAgICAgICB2YXIgbm9kZXNUb0RlbGV0ZSA9IFtdO1xuICAgICAgICB2YXIgaXRlbXNUb1Byb2Nlc3MgPSBbXTtcbiAgICAgICAgdmFyIGl0ZW1zRm9yQmVmb3JlUmVtb3ZlQ2FsbGJhY2tzID0gW107XG4gICAgICAgIHZhciBpdGVtc0Zvck1vdmVDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgdmFyIGl0ZW1zRm9yQWZ0ZXJBZGRDYWxsYmFja3MgPSBbXTtcbiAgICAgICAgdmFyIG1hcERhdGE7XG5cbiAgICAgICAgZnVuY3Rpb24gaXRlbU1vdmVkT3JSZXRhaW5lZChlZGl0U2NyaXB0SW5kZXgsIG9sZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBtYXBEYXRhID0gbGFzdE1hcHBpbmdSZXN1bHRbb2xkUG9zaXRpb25dO1xuICAgICAgICAgICAgaWYgKG5ld01hcHBpbmdSZXN1bHRJbmRleCAhPT0gb2xkUG9zaXRpb24pXG4gICAgICAgICAgICAgICAgaXRlbXNGb3JNb3ZlQ2FsbGJhY2tzW2VkaXRTY3JpcHRJbmRleF0gPSBtYXBEYXRhO1xuICAgICAgICAgICAgLy8gU2luY2UgdXBkYXRpbmcgdGhlIGluZGV4IG1pZ2h0IGNoYW5nZSB0aGUgbm9kZXMsIGRvIHNvIGJlZm9yZSBjYWxsaW5nIGZpeFVwQ29udGludW91c05vZGVBcnJheVxuICAgICAgICAgICAgbWFwRGF0YS5pbmRleE9ic2VydmFibGUobmV3TWFwcGluZ1Jlc3VsdEluZGV4KyspO1xuICAgICAgICAgICAga28udXRpbHMuZml4VXBDb250aW51b3VzTm9kZUFycmF5KG1hcERhdGEubWFwcGVkTm9kZXMsIGRvbU5vZGUpO1xuICAgICAgICAgICAgbmV3TWFwcGluZ1Jlc3VsdC5wdXNoKG1hcERhdGEpO1xuICAgICAgICAgICAgaXRlbXNUb1Byb2Nlc3MucHVzaChtYXBEYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNhbGxDYWxsYmFjayhjYWxsYmFjaywgaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gaXRlbXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKGl0ZW1zW2ldLm1hcHBlZE5vZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobm9kZSwgaSwgaXRlbXNbaV0uYXJyYXlFbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBlZGl0U2NyaXB0SXRlbSwgbW92ZWRJbmRleDsgZWRpdFNjcmlwdEl0ZW0gPSBlZGl0U2NyaXB0W2ldOyBpKyspIHtcbiAgICAgICAgICAgIG1vdmVkSW5kZXggPSBlZGl0U2NyaXB0SXRlbVsnbW92ZWQnXTtcbiAgICAgICAgICAgIHN3aXRjaCAoZWRpdFNjcmlwdEl0ZW1bJ3N0YXR1cyddKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRlbGV0ZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVkSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwRGF0YSA9IGxhc3RNYXBwaW5nUmVzdWx0W2xhc3RNYXBwaW5nUmVzdWx0SW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIHRyYWNraW5nIGNoYW5nZXMgdG8gdGhlIG1hcHBpbmcgZm9yIHRoZXNlIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwRGF0YS5kZXBlbmRlbnRPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwRGF0YS5kZXBlbmRlbnRPYnNlcnZhYmxlLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBEYXRhLmRlcGVuZGVudE9ic2VydmFibGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFF1ZXVlIHRoZXNlIG5vZGVzIGZvciBsYXRlciByZW1vdmFsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa28udXRpbHMuZml4VXBDb250aW51b3VzTm9kZUFycmF5KG1hcERhdGEubWFwcGVkTm9kZXMsIGRvbU5vZGUpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zWydiZWZvcmVSZW1vdmUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNYXBwaW5nUmVzdWx0LnB1c2gobWFwRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zVG9Qcm9jZXNzLnB1c2gobWFwRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBEYXRhLmFycmF5RW50cnkgPT09IGRlbGV0ZWRJdGVtRHVtbXlWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwRGF0YSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0ZvckJlZm9yZVJlbW92ZUNhbGxiYWNrc1tpXSA9IG1hcERhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb0RlbGV0ZS5wdXNoLmFwcGx5KG5vZGVzVG9EZWxldGUsIG1hcERhdGEubWFwcGVkTm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXN0TWFwcGluZ1Jlc3VsdEluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSBcInJldGFpbmVkXCI6XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1Nb3ZlZE9yUmV0YWluZWQoaSwgbGFzdE1hcHBpbmdSZXN1bHRJbmRleCsrKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFwiYWRkZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU1vdmVkT3JSZXRhaW5lZChpLCBtb3ZlZEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcERhdGEgPSB7IGFycmF5RW50cnk6IGVkaXRTY3JpcHRJdGVtWyd2YWx1ZSddLCBpbmRleE9ic2VydmFibGU6IGtvLm9ic2VydmFibGUobmV3TWFwcGluZ1Jlc3VsdEluZGV4KyspIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdNYXBwaW5nUmVzdWx0LnB1c2gobWFwRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1RvUHJvY2Vzcy5wdXNoKG1hcERhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0ZpcnN0RXhlY3V0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRm9yQWZ0ZXJBZGRDYWxsYmFja3NbaV0gPSBtYXBEYXRhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgYSBjb3B5IG9mIHRoZSBhcnJheSBpdGVtcyB3ZSBqdXN0IGNvbnNpZGVyZWQgc28gd2UgY2FuIGRpZmZlcmVuY2UgaXQgbmV4dCB0aW1lXG4gICAgICAgIGtvLnV0aWxzLmRvbURhdGEuc2V0KGRvbU5vZGUsIGxhc3RNYXBwaW5nUmVzdWx0RG9tRGF0YUtleSwgbmV3TWFwcGluZ1Jlc3VsdCk7XG5cbiAgICAgICAgLy8gQ2FsbCBiZWZvcmVNb3ZlIGZpcnN0IGJlZm9yZSBhbnkgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgRE9NXG4gICAgICAgIGNhbGxDYWxsYmFjayhvcHRpb25zWydiZWZvcmVNb3ZlJ10sIGl0ZW1zRm9yTW92ZUNhbGxiYWNrcyk7XG5cbiAgICAgICAgLy8gTmV4dCByZW1vdmUgbm9kZXMgZm9yIGRlbGV0ZWQgaXRlbXMgKG9yIGp1c3QgY2xlYW4gaWYgdGhlcmUncyBhIGJlZm9yZVJlbW92ZSBjYWxsYmFjaylcbiAgICAgICAga28udXRpbHMuYXJyYXlGb3JFYWNoKG5vZGVzVG9EZWxldGUsIG9wdGlvbnNbJ2JlZm9yZVJlbW92ZSddID8ga28uY2xlYW5Ob2RlIDoga28ucmVtb3ZlTm9kZSk7XG5cbiAgICAgICAgLy8gTmV4dCBhZGQvcmVvcmRlciB0aGUgcmVtYWluaW5nIGl0ZW1zICh3aWxsIGluY2x1ZGUgZGVsZXRlZCBpdGVtcyBpZiB0aGVyZSdzIGEgYmVmb3JlUmVtb3ZlIGNhbGxiYWNrKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbmV4dE5vZGUgPSBrby52aXJ0dWFsRWxlbWVudHMuZmlyc3RDaGlsZChkb21Ob2RlKSwgbGFzdE5vZGUsIG5vZGU7IG1hcERhdGEgPSBpdGVtc1RvUHJvY2Vzc1tpXTsgaSsrKSB7XG4gICAgICAgICAgICAvLyBHZXQgbm9kZXMgZm9yIG5ld2x5IGFkZGVkIGl0ZW1zXG4gICAgICAgICAgICBpZiAoIW1hcERhdGEubWFwcGVkTm9kZXMpXG4gICAgICAgICAgICAgICAga28udXRpbHMuZXh0ZW5kKG1hcERhdGEsIG1hcE5vZGVBbmRSZWZyZXNoV2hlbkNoYW5nZWQoZG9tTm9kZSwgbWFwcGluZywgbWFwRGF0YS5hcnJheUVudHJ5LCBjYWxsYmFja0FmdGVyQWRkaW5nTm9kZXMsIG1hcERhdGEuaW5kZXhPYnNlcnZhYmxlKSk7XG5cbiAgICAgICAgICAgIC8vIFB1dCBub2RlcyBpbiB0aGUgcmlnaHQgcGxhY2UgaWYgdGhleSBhcmVuJ3QgdGhlcmUgYWxyZWFkeVxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IG5vZGUgPSBtYXBEYXRhLm1hcHBlZE5vZGVzW2pdOyBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmcsIGxhc3ROb2RlID0gbm9kZSwgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgIT09IG5leHROb2RlKVxuICAgICAgICAgICAgICAgICAgICBrby52aXJ0dWFsRWxlbWVudHMuaW5zZXJ0QWZ0ZXIoZG9tTm9kZSwgbm9kZSwgbGFzdE5vZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSdW4gdGhlIGNhbGxiYWNrcyBmb3IgbmV3bHkgYWRkZWQgbm9kZXMgKGZvciBleGFtcGxlLCB0byBhcHBseSBiaW5kaW5ncywgZXRjLilcbiAgICAgICAgICAgIGlmICghbWFwRGF0YS5pbml0aWFsaXplZCAmJiBjYWxsYmFja0FmdGVyQWRkaW5nTm9kZXMpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja0FmdGVyQWRkaW5nTm9kZXMobWFwRGF0YS5hcnJheUVudHJ5LCBtYXBEYXRhLm1hcHBlZE5vZGVzLCBtYXBEYXRhLmluZGV4T2JzZXJ2YWJsZSk7XG4gICAgICAgICAgICAgICAgbWFwRGF0YS5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGVyZSdzIGEgYmVmb3JlUmVtb3ZlIGNhbGxiYWNrLCBjYWxsIGl0IGFmdGVyIHJlb3JkZXJpbmcuXG4gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBhc3N1bWUgdGhhdCB0aGUgYmVmb3JlUmVtb3ZlIGNhbGxiYWNrIHdpbGwgdXN1YWxseSBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgbm9kZXMgdXNpbmdcbiAgICAgICAgLy8gc29tZSBzb3J0IG9mIGFuaW1hdGlvbiwgd2hpY2ggaXMgd2h5IHdlIGZpcnN0IHJlb3JkZXIgdGhlIG5vZGVzIHRoYXQgd2lsbCBiZSByZW1vdmVkLiBJZiB0aGVcbiAgICAgICAgLy8gY2FsbGJhY2sgaW5zdGVhZCByZW1vdmVzIHRoZSBub2RlcyByaWdodCBhd2F5LCBpdCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCB0byBza2lwIHJlb3JkZXJpbmcgdGhlbS5cbiAgICAgICAgLy8gUGVyaGFwcyB3ZSdsbCBtYWtlIHRoYXQgY2hhbmdlIGluIHRoZSBmdXR1cmUgaWYgdGhpcyBzY2VuYXJpbyBiZWNvbWVzIG1vcmUgY29tbW9uLlxuICAgICAgICBjYWxsQ2FsbGJhY2sob3B0aW9uc1snYmVmb3JlUmVtb3ZlJ10sIGl0ZW1zRm9yQmVmb3JlUmVtb3ZlQ2FsbGJhY2tzKTtcblxuICAgICAgICAvLyBSZXBsYWNlIHRoZSBzdG9yZWQgdmFsdWVzIG9mIGRlbGV0ZWQgaXRlbXMgd2l0aCBhIGR1bW15IHZhbHVlLiBUaGlzIHByb3ZpZGVzIHR3byBiZW5lZml0czogaXQgbWFya3MgdGhpcyBpdGVtXG4gICAgICAgIC8vIGFzIGFscmVhZHkgXCJyZW1vdmVkXCIgc28gd2Ugd29uJ3QgY2FsbCBiZWZvcmVSZW1vdmUgZm9yIGl0IGFnYWluLCBhbmQgaXQgZW5zdXJlcyB0aGF0IHRoZSBpdGVtIHdvbid0IG1hdGNoIHVwXG4gICAgICAgIC8vIHdpdGggYW4gYWN0dWFsIGl0ZW0gaW4gdGhlIGFycmF5IGFuZCBhcHBlYXIgYXMgXCJyZXRhaW5lZFwiIG9yIFwibW92ZWRcIi5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zRm9yQmVmb3JlUmVtb3ZlQ2FsbGJhY2tzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaXRlbXNGb3JCZWZvcmVSZW1vdmVDYWxsYmFja3NbaV0pIHtcbiAgICAgICAgICAgICAgICBpdGVtc0ZvckJlZm9yZVJlbW92ZUNhbGxiYWNrc1tpXS5hcnJheUVudHJ5ID0gZGVsZXRlZEl0ZW1EdW1teVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluYWxseSBjYWxsIGFmdGVyTW92ZSBhbmQgYWZ0ZXJBZGQgY2FsbGJhY2tzXG4gICAgICAgIGNhbGxDYWxsYmFjayhvcHRpb25zWydhZnRlck1vdmUnXSwgaXRlbXNGb3JNb3ZlQ2FsbGJhY2tzKTtcbiAgICAgICAgY2FsbENhbGxiYWNrKG9wdGlvbnNbJ2FmdGVyQWRkJ10sIGl0ZW1zRm9yQWZ0ZXJBZGRDYWxsYmFja3MpO1xuICAgIH1cbn0pKCk7XG5cbmtvLmV4cG9ydFN5bWJvbCgndXRpbHMuc2V0RG9tTm9kZUNoaWxkcmVuRnJvbUFycmF5TWFwcGluZycsIGtvLnV0aWxzLnNldERvbU5vZGVDaGlsZHJlbkZyb21BcnJheU1hcHBpbmcpO1xua28ubmF0aXZlVGVtcGxhdGVFbmdpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpc1snYWxsb3dUZW1wbGF0ZVJld3JpdGluZyddID0gZmFsc2U7XG59XG5cbmtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lLnByb3RvdHlwZSA9IG5ldyBrby50ZW1wbGF0ZUVuZ2luZSgpO1xua28ubmF0aXZlVGVtcGxhdGVFbmdpbmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0ga28ubmF0aXZlVGVtcGxhdGVFbmdpbmU7XG5rby5uYXRpdmVUZW1wbGF0ZUVuZ2luZS5wcm90b3R5cGVbJ3JlbmRlclRlbXBsYXRlU291cmNlJ10gPSBmdW5jdGlvbiAodGVtcGxhdGVTb3VyY2UsIGJpbmRpbmdDb250ZXh0LCBvcHRpb25zLCB0ZW1wbGF0ZURvY3VtZW50KSB7XG4gICAgdmFyIHVzZU5vZGVzSWZBdmFpbGFibGUgPSAhKGtvLnV0aWxzLmllVmVyc2lvbiA8IDkpLCAvLyBJRTw5IGNsb25lTm9kZSBkb2Vzbid0IHdvcmsgcHJvcGVybHlcbiAgICAgICAgdGVtcGxhdGVOb2Rlc0Z1bmMgPSB1c2VOb2Rlc0lmQXZhaWxhYmxlID8gdGVtcGxhdGVTb3VyY2VbJ25vZGVzJ10gOiBudWxsLFxuICAgICAgICB0ZW1wbGF0ZU5vZGVzID0gdGVtcGxhdGVOb2Rlc0Z1bmMgPyB0ZW1wbGF0ZVNvdXJjZVsnbm9kZXMnXSgpIDogbnVsbDtcblxuICAgIGlmICh0ZW1wbGF0ZU5vZGVzKSB7XG4gICAgICAgIHJldHVybiBrby51dGlscy5tYWtlQXJyYXkodGVtcGxhdGVOb2Rlcy5jbG9uZU5vZGUodHJ1ZSkuY2hpbGROb2Rlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHRlbXBsYXRlVGV4dCA9IHRlbXBsYXRlU291cmNlWyd0ZXh0J10oKTtcbiAgICAgICAgcmV0dXJuIGtvLnV0aWxzLnBhcnNlSHRtbEZyYWdtZW50KHRlbXBsYXRlVGV4dCwgdGVtcGxhdGVEb2N1bWVudCk7XG4gICAgfVxufTtcblxua28ubmF0aXZlVGVtcGxhdGVFbmdpbmUuaW5zdGFuY2UgPSBuZXcga28ubmF0aXZlVGVtcGxhdGVFbmdpbmUoKTtcbmtvLnNldFRlbXBsYXRlRW5naW5lKGtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lLmluc3RhbmNlKTtcblxua28uZXhwb3J0U3ltYm9sKCduYXRpdmVUZW1wbGF0ZUVuZ2luZScsIGtvLm5hdGl2ZVRlbXBsYXRlRW5naW5lKTtcbihmdW5jdGlvbigpIHtcbiAgICBrby5qcXVlcnlUbXBsVGVtcGxhdGVFbmdpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIERldGVjdCB3aGljaCB2ZXJzaW9uIG9mIGpxdWVyeS10bXBsIHlvdSdyZSB1c2luZy4gVW5mb3J0dW5hdGVseSBqcXVlcnktdG1wbFxuICAgICAgICAvLyBkb2Vzbid0IGV4cG9zZSBhIHZlcnNpb24gbnVtYmVyLCBzbyB3ZSBoYXZlIHRvIGluZmVyIGl0LlxuICAgICAgICAvLyBOb3RlIHRoYXQgYXMgb2YgS25vY2tvdXQgMS4zLCB3ZSBvbmx5IHN1cHBvcnQgalF1ZXJ5LnRtcGwgMS4wLjBwcmUgYW5kIGxhdGVyLFxuICAgICAgICAvLyB3aGljaCBLTyBpbnRlcm5hbGx5IHJlZmVycyB0byBhcyB2ZXJzaW9uIFwiMlwiLCBzbyBvbGRlciB2ZXJzaW9ucyBhcmUgbm8gbG9uZ2VyIGRldGVjdGVkLlxuICAgICAgICB2YXIgalF1ZXJ5VG1wbFZlcnNpb24gPSB0aGlzLmpRdWVyeVRtcGxWZXJzaW9uID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCFqUXVlcnlJbnN0YW5jZSB8fCAhKGpRdWVyeUluc3RhbmNlWyd0bXBsJ10pKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgLy8gU2luY2UgaXQgZXhwb3NlcyBubyBvZmZpY2lhbCB2ZXJzaW9uIG51bWJlciwgd2UgdXNlIG91ciBvd24gbnVtYmVyaW5nIHN5c3RlbS4gVG8gYmUgdXBkYXRlZCBhcyBqcXVlcnktdG1wbCBldm9sdmVzLlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoalF1ZXJ5SW5zdGFuY2VbJ3RtcGwnXVsndGFnJ11bJ3RtcGwnXVsnb3BlbiddLnRvU3RyaW5nKCkuaW5kZXhPZignX18nKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIDEuMC4wcHJlLCBjdXN0b20gdGFncyBzaG91bGQgYXBwZW5kIG1hcmt1cCB0byBhbiBhcnJheSBjYWxsZWQgXCJfX1wiXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAyOyAvLyBGaW5hbCB2ZXJzaW9uIG9mIGpxdWVyeS50bXBsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaChleCkgeyAvKiBBcHBhcmVudGx5IG5vdCB0aGUgdmVyc2lvbiB3ZSB3ZXJlIGxvb2tpbmcgZm9yICovIH1cblxuICAgICAgICAgICAgcmV0dXJuIDE7IC8vIEFueSBvbGRlciB2ZXJzaW9uIHRoYXQgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgICB9KSgpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGVuc3VyZUhhc1JlZmVyZW5jZWRKUXVlcnlUZW1wbGF0ZXMoKSB7XG4gICAgICAgICAgICBpZiAoalF1ZXJ5VG1wbFZlcnNpb24gPCAyKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIllvdXIgdmVyc2lvbiBvZiBqUXVlcnkudG1wbCBpcyB0b28gb2xkLiBQbGVhc2UgdXBncmFkZSB0byBqUXVlcnkudG1wbCAxLjAuMHByZSBvciBsYXRlci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBleGVjdXRlVGVtcGxhdGUoY29tcGlsZWRUZW1wbGF0ZSwgZGF0YSwgalF1ZXJ5VGVtcGxhdGVPcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4galF1ZXJ5SW5zdGFuY2VbJ3RtcGwnXShjb21waWxlZFRlbXBsYXRlLCBkYXRhLCBqUXVlcnlUZW1wbGF0ZU9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpc1sncmVuZGVyVGVtcGxhdGVTb3VyY2UnXSA9IGZ1bmN0aW9uKHRlbXBsYXRlU291cmNlLCBiaW5kaW5nQ29udGV4dCwgb3B0aW9ucywgdGVtcGxhdGVEb2N1bWVudCkge1xuICAgICAgICAgICAgdGVtcGxhdGVEb2N1bWVudCA9IHRlbXBsYXRlRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIGVuc3VyZUhhc1JlZmVyZW5jZWRKUXVlcnlUZW1wbGF0ZXMoKTtcblxuICAgICAgICAgICAgLy8gRW5zdXJlIHdlIGhhdmUgc3RvcmVkIGEgcHJlY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIHRlbXBsYXRlIChkb24ndCB3YW50IHRvIHJlcGFyc2Ugb24gZXZlcnkgcmVuZGVyKVxuICAgICAgICAgICAgdmFyIHByZWNvbXBpbGVkID0gdGVtcGxhdGVTb3VyY2VbJ2RhdGEnXSgncHJlY29tcGlsZWQnKTtcbiAgICAgICAgICAgIGlmICghcHJlY29tcGlsZWQpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGVtcGxhdGVUZXh0ID0gdGVtcGxhdGVTb3VyY2VbJ3RleHQnXSgpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgLy8gV3JhcCBpbiBcIndpdGgoJHdoYXRldmVyLmtvQmluZGluZ0NvbnRleHQpIHsgLi4uIH1cIlxuICAgICAgICAgICAgICAgIHRlbXBsYXRlVGV4dCA9IFwie3trb193aXRoICRpdGVtLmtvQmluZGluZ0NvbnRleHR9fVwiICsgdGVtcGxhdGVUZXh0ICsgXCJ7ey9rb193aXRofX1cIjtcblxuICAgICAgICAgICAgICAgIHByZWNvbXBpbGVkID0galF1ZXJ5SW5zdGFuY2VbJ3RlbXBsYXRlJ10obnVsbCwgdGVtcGxhdGVUZXh0KTtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVNvdXJjZVsnZGF0YSddKCdwcmVjb21waWxlZCcsIHByZWNvbXBpbGVkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGRhdGEgPSBbYmluZGluZ0NvbnRleHRbJyRkYXRhJ11dOyAvLyBQcmV3cmFwIHRoZSBkYXRhIGluIGFuIGFycmF5IHRvIHN0b3AganF1ZXJ5LnRtcGwgZnJvbSB0cnlpbmcgdG8gdW53cmFwIGFueSBhcnJheXNcbiAgICAgICAgICAgIHZhciBqUXVlcnlUZW1wbGF0ZU9wdGlvbnMgPSBqUXVlcnlJbnN0YW5jZVsnZXh0ZW5kJ10oeyAna29CaW5kaW5nQ29udGV4dCc6IGJpbmRpbmdDb250ZXh0IH0sIG9wdGlvbnNbJ3RlbXBsYXRlT3B0aW9ucyddKTtcblxuICAgICAgICAgICAgdmFyIHJlc3VsdE5vZGVzID0gZXhlY3V0ZVRlbXBsYXRlKHByZWNvbXBpbGVkLCBkYXRhLCBqUXVlcnlUZW1wbGF0ZU9wdGlvbnMpO1xuICAgICAgICAgICAgcmVzdWx0Tm9kZXNbJ2FwcGVuZFRvJ10odGVtcGxhdGVEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTsgLy8gVXNpbmcgXCJhcHBlbmRUb1wiIGZvcmNlcyBqUXVlcnkvalF1ZXJ5LnRtcGwgdG8gcGVyZm9ybSBuZWNlc3NhcnkgY2xlYW51cCB3b3JrXG5cbiAgICAgICAgICAgIGpRdWVyeUluc3RhbmNlWydmcmFnbWVudHMnXSA9IHt9OyAvLyBDbGVhciBqUXVlcnkncyBmcmFnbWVudCBjYWNoZSB0byBhdm9pZCBhIG1lbW9yeSBsZWFrIGFmdGVyIGEgbGFyZ2UgbnVtYmVyIG9mIHRlbXBsYXRlIHJlbmRlcnNcbiAgICAgICAgICAgIHJldHVybiByZXN1bHROb2RlcztcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzWydjcmVhdGVKYXZhU2NyaXB0RXZhbHVhdG9yQmxvY2snXSA9IGZ1bmN0aW9uKHNjcmlwdCkge1xuICAgICAgICAgICAgcmV0dXJuIFwie3trb19jb2RlICgoZnVuY3Rpb24oKSB7IHJldHVybiBcIiArIHNjcmlwdCArIFwiIH0pKCkpIH19XCI7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpc1snYWRkVGVtcGxhdGUnXSA9IGZ1bmN0aW9uKHRlbXBsYXRlTmFtZSwgdGVtcGxhdGVNYXJrdXApIHtcbiAgICAgICAgICAgIGRvY3VtZW50LndyaXRlKFwiPHNjcmlwdCB0eXBlPSd0ZXh0L2h0bWwnIGlkPSdcIiArIHRlbXBsYXRlTmFtZSArIFwiJz5cIiArIHRlbXBsYXRlTWFya3VwICsgXCI8XCIgKyBcIi9zY3JpcHQ+XCIpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChqUXVlcnlUbXBsVmVyc2lvbiA+IDApIHtcbiAgICAgICAgICAgIGpRdWVyeUluc3RhbmNlWyd0bXBsJ11bJ3RhZyddWydrb19jb2RlJ10gPSB7XG4gICAgICAgICAgICAgICAgb3BlbjogXCJfXy5wdXNoKCQxIHx8ICcnKTtcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGpRdWVyeUluc3RhbmNlWyd0bXBsJ11bJ3RhZyddWydrb193aXRoJ10gPSB7XG4gICAgICAgICAgICAgICAgb3BlbjogXCJ3aXRoKCQxKSB7XCIsXG4gICAgICAgICAgICAgICAgY2xvc2U6IFwifSBcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBrby5qcXVlcnlUbXBsVGVtcGxhdGVFbmdpbmUucHJvdG90eXBlID0gbmV3IGtvLnRlbXBsYXRlRW5naW5lKCk7XG4gICAga28uanF1ZXJ5VG1wbFRlbXBsYXRlRW5naW5lLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGtvLmpxdWVyeVRtcGxUZW1wbGF0ZUVuZ2luZTtcblxuICAgIC8vIFVzZSB0aGlzIG9uZSBieSBkZWZhdWx0ICpvbmx5IGlmIGpxdWVyeS50bXBsIGlzIHJlZmVyZW5jZWQqXG4gICAgdmFyIGpxdWVyeVRtcGxUZW1wbGF0ZUVuZ2luZUluc3RhbmNlID0gbmV3IGtvLmpxdWVyeVRtcGxUZW1wbGF0ZUVuZ2luZSgpO1xuICAgIGlmIChqcXVlcnlUbXBsVGVtcGxhdGVFbmdpbmVJbnN0YW5jZS5qUXVlcnlUbXBsVmVyc2lvbiA+IDApXG4gICAgICAgIGtvLnNldFRlbXBsYXRlRW5naW5lKGpxdWVyeVRtcGxUZW1wbGF0ZUVuZ2luZUluc3RhbmNlKTtcblxuICAgIGtvLmV4cG9ydFN5bWJvbCgnanF1ZXJ5VG1wbFRlbXBsYXRlRW5naW5lJywga28uanF1ZXJ5VG1wbFRlbXBsYXRlRW5naW5lKTtcbn0pKCk7XG59KSk7XG59KCkpO1xufSkoKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9rbm9ja291dC9idWlsZC9vdXRwdXQva25vY2tvdXQtbGF0ZXN0LmRlYnVnLmpzXG4vLyBtb2R1bGUgaWQgPSA1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvckJhc2UgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uYmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFN1cnZleUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25JbXBsZW1lbnRvckJhc2Uge1xuICBwcml2YXRlIGtvRHVtbXk6IGFueTtcbiAga29WYWx1ZTogYW55O1xuICBrb0NvbW1lbnQ6IGFueTtcbiAga29Jc1JlYWRPbmx5OiBhbnk7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHF1ZXN0aW9uLnZhbHVlQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uVmFsdWVDaGFuZ2VkKCk7XG4gICAgfTtcbiAgICBxdWVzdGlvbi5jb21tZW50Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uQ29tbWVudENoYW5nZWQoKTtcbiAgICB9O1xuICAgIHF1ZXN0aW9uLmVycm9yc0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbkVycm9yc0NoYW5nZWQoKTtcbiAgICB9O1xuICAgIHF1ZXN0aW9uLnRpdGxlQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uVmlzaWJsZUluZGV4Q2hhbmdlZCgpO1xuICAgIH07XG4gICAgcXVlc3Rpb24ucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ2aXNpYmxlSW5kZXhcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uVmlzaWJsZUluZGV4Q2hhbmdlZCgpO1xuICAgIH0pO1xuICAgIHF1ZXN0aW9uLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiaXNSZWFkT25seVwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25SZWFkT25seUNoYW5nZWQoKTtcbiAgICB9KTtcbiAgICB0aGlzLmtvRHVtbXkgPSBrby5vYnNlcnZhYmxlKDApO1xuICAgIHRoaXMua29WYWx1ZSA9IHRoaXMuY3JlYXRla29WYWx1ZSgpO1xuICAgIHRoaXMua29Db21tZW50ID0ga28ub2JzZXJ2YWJsZSh0aGlzLnF1ZXN0aW9uLmNvbW1lbnQpO1xuICAgIHRoaXMua29FcnJvcnModGhpcy5xdWVzdGlvbi5lcnJvcnMpO1xuICAgIHRoaXMua29Jc1JlYWRPbmx5ID0ga28ub2JzZXJ2YWJsZSh0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkpO1xuICAgIHRoaXMua29WYWx1ZS5zdWJzY3JpYmUoZnVuY3Rpb24obmV3VmFsdWUpIHtcbiAgICAgIHNlbGYudXBkYXRlVmFsdWUobmV3VmFsdWUpO1xuICAgIH0pO1xuICAgIHRoaXMua29Db21tZW50LnN1YnNjcmliZShmdW5jdGlvbihuZXdWYWx1ZSkge1xuICAgICAgc2VsZi51cGRhdGVDb21tZW50KG5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29WYWx1ZVwiXSA9IHRoaXMua29WYWx1ZTtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29Db21tZW50XCJdID0gdGhpcy5rb0NvbW1lbnQ7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvSXNSZWFkT25seVwiXSA9IHRoaXMua29Jc1JlYWRPbmx5O1xuICAgIHRoaXMucXVlc3Rpb25bXCJrb1F1ZXN0aW9uQWZ0ZXJSZW5kZXJcIl0gPSBmdW5jdGlvbihlbCwgY29uKSB7XG4gICAgICBzZWxmLmtvUXVlc3Rpb25BZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVRdWVzdGlvbigpIHtcbiAgICB0aGlzLnVwZGF0ZUtvRHVtbXkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgdmFyIHZhbCA9IHRoaXMucXVlc3Rpb24udmFsdWU7XG4gICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh2YWwsIHRoaXMua29WYWx1ZSgpKSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0a29WYWx1ZSh2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbW1lbnRDaGFuZ2VkKCkge1xuICAgIHZhciB2YWwgPSB0aGlzLnF1ZXN0aW9uLmNvbW1lbnQ7XG4gICAgaWYgKEhlbHBlcnMuaXNUd29WYWx1ZUVxdWFscyh2YWwsIHRoaXMua29WYWx1ZSgpKSkgcmV0dXJuO1xuICAgIHRoaXMua29Db21tZW50KHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUluZGV4Q2hhbmdlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZUtvRHVtbXkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHN1cGVyLm9uU3VydmV5TG9hZCgpO1xuICAgIHRoaXMub25SZWFkT25seUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25SZWFkT25seUNoYW5nZWQoKSB7XG4gICAgdGhpcy5rb0lzUmVhZE9ubHkodGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5KTtcbiAgfVxuICBwcm90ZWN0ZWQgb25FcnJvcnNDaGFuZ2VkKCkge1xuICAgIHRoaXMua29FcnJvcnModGhpcy5xdWVzdGlvbi5lcnJvcnMpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVrb1ZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIGtvLm9ic2VydmFibGUodGhpcy5xdWVzdGlvbi52YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldGtvVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHRoaXMua29WYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnF1ZXN0aW9uLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUNvbW1lbnQobmV3VmFsdWU6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24uY29tbWVudCA9IG5ld1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBnZXRObygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnZpc2libGVJbmRleCA+IC0xXG4gICAgICA/IHRoaXMucXVlc3Rpb24udmlzaWJsZUluZGV4ICsgMSArIFwiLiBcIlxuICAgICAgOiBcIlwiO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVLb0R1bW15KCkge1xuICAgIHRoaXMua29EdW1teSh0aGlzLmtvRHVtbXkoKSArIDEpO1xuICAgIHRoaXMucXVlc3Rpb24ubG9jVGl0bGUub25DaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGtvUXVlc3Rpb25BZnRlclJlbmRlcihlbGVtZW50cywgY29uKSB7XG4gICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICB2YXIgdEVsID0gZWxlbWVudHNbMF07XG4gICAgaWYgKHRFbC5ub2RlTmFtZSA9PT0gXCIjdGV4dFwiKSB0RWwuZGF0YSA9IFwiXCI7XG4gICAgdEVsID0gZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKHRFbC5ub2RlTmFtZSA9PT0gXCIjdGV4dFwiKSB0RWwuZGF0YSA9IFwiXCI7XG4gICAgaWYgKGVsICYmIHRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0KVxuICAgICAgdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQuYWZ0ZXJSZW5kZXIodGhpcy5xdWVzdGlvbiwgZWwpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbi50cyIsImltcG9ydCB7IEhhc2hUYWJsZSwgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbmJhc2VcIjtcbmltcG9ydCB7IEJhc2UsIFN1cnZleUVycm9yLCBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgQW5zd2VyUmVxdWlyZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBTdXJ2ZXlWYWxpZGF0b3IsIElWYWxpZGF0b3JPd25lciwgVmFsaWRhdG9yUnVubmVyIH0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yLCBUZXh0UHJlUHJvY2Vzc29yVmFsdWUgfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgQ29uZGl0aW9uUnVubmVyIH0gZnJvbSBcIi4vY29uZGl0aW9uc1wiO1xuXG4vKipcbiAqIEV4dGVuZHMgcXVlc3Rpb24gYmFzZSBjbGFzcyB3aXRoIHRpdGxlLCB2YWx1ZSwgZXJyb3JzIGFuZCBvdGhlciBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbiBleHRlbmRzIFF1ZXN0aW9uQmFzZSBpbXBsZW1lbnRzIElWYWxpZGF0b3JPd25lciB7XG4gIHByaXZhdGUgcXVlc3Rpb25WYWx1ZTogYW55O1xuICBwcml2YXRlIHF1ZXN0aW9uQ29tbWVudDogc3RyaW5nO1xuICBwcml2YXRlIHRleHRQcmVQcm9jZXNzb3I6IFRleHRQcmVQcm9jZXNzb3I7XG4gIHByaXZhdGUgY29uZGl0aW9uRW5hYmVsUnVubmVyOiBDb25kaXRpb25SdW5uZXI7XG4gIHByaXZhdGUgdmFsaWRhdG9yc1ZhbHVlOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+ID0gdGhpcy5jcmVhdGVOZXdBcnJheShcbiAgICBcInZhbGlkYXRvcnNcIlxuICApO1xuICB2YWx1ZUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29tbWVudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgdGl0bGVDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHZhbGlkYXRlVmFsdWVDYWxsYmFjazogKCkgPT4gU3VydmV5RXJyb3I7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbG9jVGl0bGVWYWx1ZSA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiLCB0aGlzLCB0cnVlKTtcbiAgICBsb2NUaXRsZVZhbHVlLm9uUmVuZGVyZWRIdG1sQ2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gc2VsZi5mdWxsVGl0bGU7XG4gICAgfTtcbiAgICB2YXIgbG9jRGVzY3JpcHRpb25WYWx1ZSA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXG4gICAgICBcImRlc2NyaXB0aW9uXCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgbG9jRGVzY3JpcHRpb25WYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKGh0bWwpIHtcbiAgICAgIHJldHVybiBzZWxmLmdldFByb2Nlc3NlZEh0bWwoaHRtbCk7XG4gICAgfTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tbWVudFRleHRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHRoaXMpO1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZU5hbWUgPyB0aGlzLnZhbHVlTmFtZSA6IHRoaXMubmFtZTtcbiAgfVxuICBwdWJsaWMgZ2V0IHZhbHVlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZU5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZU5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZU5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBtYXkgaGF2ZSBhIHRpdGxlIGxvY2F0ZWQgb24gdGhlIGxlZnRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxvd1RpdGxlTGVmdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInF1ZXN0aW9uXCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgIT09IFwiaGlkZGVuXCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNEZXNjcmlwdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbiAhPSBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBkaWZmZXJlbnQgZnJvbSBcImRlZmF1bHRcIiB0byBzZXQgdGhlIHNwZWNpZmljIHF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uIGZvciB0aGlzIHBhbmVsL3BhZ2UuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIFwiZGVmYXVsdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlTG9jYXRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHZhciBpc1Zpc2liaWxpdHlDaGFuZ2VkID1cbiAgICAgIHRoaXMudGl0bGVMb2NhdGlvbiA9PSBcImhpZGRlblwiIHx8IHZhbHVlID09IFwiaGlkZGVuXCI7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmIChpc1Zpc2liaWxpdHlDaGFuZ2VkICYmIHRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS5xdWVzdGlvblZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIHRoaXMudmlzaWJsZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHRpdGxlIGxvY2F0aW9uIGJhc2VkIG9uIHF1ZXN0aW9uIHRpdGxlTG9jYXRpb24gcHJvcGVydHkgYW5kIFF1ZXN0aW9uVGl0bGVMb2NhdGlvbiBvZiBpdCdzIHBhcmVudHNcbiAgICogQHNlZSB0aXRsZUxvY2F0aW9uXG4gICAqIEBzZWUgUGFuZWxNb2RlbEJhc2UuUXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqIEBzZWUgU3VydmV5TW9kZWwuUXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0VGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuZ2V0VGl0bGVMb2NhdGlvbkNvcmUoKTtcbiAgICBpZiAobG9jYXRpb24gPT09IFwibGVmdFwiICYmICF0aGlzLmlzQWxsb3dUaXRsZUxlZnQpIGxvY2F0aW9uID0gXCJ0b3BcIjtcbiAgICByZXR1cm4gbG9jYXRpb247XG4gIH1cbiAgcHJvdGVjdGVkIGdldFRpdGxlTG9jYXRpb25Db3JlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudGl0bGVMb2NhdGlvbiAhPT0gXCJkZWZhdWx0XCIpIHJldHVybiB0aGlzLnRpdGxlTG9jYXRpb247XG4gICAgdmFyIGxvY2F0aW9uID0gXCJ0b3BcIjtcbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIGxvY2F0aW9uID0gdGhpcy5wYXJlbnQuZ2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN1cnZleSkge1xuICAgICAgbG9jYXRpb24gPSB0aGlzLnN1cnZleS5xdWVzdGlvblRpdGxlTG9jYXRpb247XG4gICAgfVxuICAgIHJldHVybiBsb2NhdGlvbjtcbiAgfVxuICBnZXQgaGFzVGl0bGVPbkxlZnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVGl0bGUgJiYgdGhpcy5nZXRUaXRsZUxvY2F0aW9uKCkgPT09IFwibGVmdFwiO1xuICB9XG4gIGdldCBoYXNUaXRsZU9uVG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1RpdGxlICYmIHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpID09PSBcInRvcFwiO1xuICB9XG4gIGdldCBoYXNUaXRsZU9uQm90dG9tKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1RpdGxlICYmIHRoaXMuZ2V0VGl0bGVMb2NhdGlvbigpID09PSBcImJvdHRvbVwiO1xuICB9XG4gIGdldCBoYXNUaXRsZU9uTGVmdFRvcCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaGFzVGl0bGUpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgbG9jYXRpb24gPSB0aGlzLmdldFRpdGxlTG9jYXRpb24oKTtcbiAgICByZXR1cm4gbG9jYXRpb24gPT09IFwibGVmdFwiIHx8IGxvY2F0aW9uID09PSBcInRvcFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgZXJyb3JMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5LnF1ZXN0aW9uRXJyb3JMb2NhdGlvbiA6IFwidG9wXCI7XG4gIH1cbiAgcHVibGljIGdldCBoYXNJbnB1dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlucHV0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZCArIFwiaVwiO1xuICB9XG4gIC8qKlxuICAgKiBRdWVzdGlvbiB0aXRsZS4gVXNlIHN1cnZleSBxdWVzdGlvblRpdGxlVGVtcGxhdGUgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSB0aXRsZSBxdWVzdGlvbiBpcyByZW5kZXJlZC4gSWYgaXQgaXMgZW1wdHksIHRoZW4gcXVlc3Rpb24gbmFtZSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInRpdGxlXCIsIHRoaXMubmFtZSk7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIiwgdmFsKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnRpdGxlQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICBnZXQgbG9jVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIik7XG4gIH1cbiAgLyoqXG4gICAqIFF1ZXN0aW9uIGRlc2NyaXB0aW9uLiBJdCByZW5kZXJzIHVuZGVyIHF1ZXN0aW9uIHRpdGxlIGJ5IHVzaW5nIHNtYWxsZXIgZm9udC4gVW5saWtlIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24gY2FuIGJlIGVtcHR5LlxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgcHVibGljIHNldCBkZXNjcmlwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZGVzY3JpcHRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jRGVzY3JpcHRpb24oKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiZGVzY3JpcHRpb25cIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXN0b20gdGV4dCB0aGF0IHdpbGwgYmUgc2hvd24gb24gcmVxdWlyZWQgZXJyb3IuIFVzZSB0aGlzIHByb3BlcnR5LCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc2hvdyB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZEVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInJlcXVpcmVkRXJyb3JUZXh0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1JlcXVpcmVkRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInJlcXVpcmVkRXJyb3JUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZ2V0IG9yIHNldCB0aGUgY29tbWVudCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29tbWVudFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImNvbW1lbnRUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJJdGVtVGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBjb21tZW50VGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29tbWVudFRleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jQ29tbWVudFRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29tbWVudFRleHRcIik7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgbG9jVGl0bGVIdG1sKCk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMubG9jVGl0bGUudGV4dE9ySHRtbDtcbiAgICByZXR1cm4gcmVzID8gcmVzIDogdGhpcy5uYW1lO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29weSBvZiBxdWVzdGlvbiBlcnJvcnMgc3VydmV5LiBGb3Igc29tZSBxdWVzdGlvbnMgbGlrZSBtYXRyaXggYW5kIHBhbmVsIGR5bmFtaWMgaXQgaW5jbHVkZXMgdGhlIGVycm9ycyBvZiBuZXN0ZWQgcXVlc3Rpb25zLlxuICAgKi9cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5zbGljZSgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZW5kcmVkIHF1ZXN0aW9uIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm9jZXNzZWRUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9jZXNzZWRIdG1sKHRoaXMubG9jVGl0bGVIdG1sKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGl0bGUgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgcXVlc3Rpb24gdGVtcGxhdGUuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZVRlbXBsYXRlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZ1bGxUaXRsZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5nZXRRdWVzdGlvblRpdGxlVGVtcGxhdGUoKSkge1xuICAgICAgaWYgKCF0aGlzLnRleHRQcmVQcm9jZXNzb3IpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3IgPSBuZXcgVGV4dFByZVByb2Nlc3NvcigpO1xuICAgICAgICB0aGlzLnRleHRQcmVQcm9jZXNzb3Iub25Qcm9jZXNzID0gZnVuY3Rpb24oXG4gICAgICAgICAgdGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VsZi5nZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2VzcyhcbiAgICAgICAgdGhpcy5zdXJ2ZXkuZ2V0UXVlc3Rpb25UaXRsZVRlbXBsYXRlKClcbiAgICAgICk7XG4gICAgfVxuICAgIHZhciByZXF1aXJlVGV4dCA9IHRoaXMucmVxdWlyZWRUZXh0O1xuICAgIGlmIChyZXF1aXJlVGV4dCkgcmVxdWlyZVRleHQgKz0gXCIgXCI7XG4gICAgdmFyIG5vID0gdGhpcy5ubztcbiAgICBpZiAobm8pIG5vICs9IFwiLiBcIjtcbiAgICByZXR1cm4gbm8gKyByZXF1aXJlVGV4dCArIHRoaXMucHJvY2Vzc2VkVGl0bGU7XG4gIH1cbiAgcHVibGljIGZvY3VzKG9uRXJyb3I6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIFN1cnZleUVsZW1lbnQuU2Nyb2xsRWxlbWVudFRvVG9wKHRoaXMuaWQpO1xuICAgIHZhciBpZCA9ICFvbkVycm9yXG4gICAgICA/IHRoaXMuZ2V0Rmlyc3RJbnB1dEVsZW1lbnRJZCgpXG4gICAgICA6IHRoaXMuZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk7XG4gICAgaWYgKFN1cnZleUVsZW1lbnQuRm9jdXNFbGVtZW50KGlkKSkge1xuICAgICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5mb2N1c0NhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUNzc0NsYXNzZXMocmVzOiBhbnksIHN1cnZleUNzczogYW55KSB7XG4gICAgc3VwZXIudXBkYXRlQ3NzQ2xhc3NlcyhyZXMsIHN1cnZleUNzcyk7XG4gICAgaWYgKHRoaXMuaXNSZXF1aXJlZCkge1xuICAgICAgaWYgKHN1cnZleUNzcy5xdWVzdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICByZXMucm9vdCArPSBcIiBcIiArIHN1cnZleUNzcy5xdWVzdGlvbi5yZXF1aXJlZDtcbiAgICAgIH1cbiAgICAgIGlmIChzdXJ2ZXlDc3MucXVlc3Rpb24udGl0bGVSZXF1aXJlZCkge1xuICAgICAgICByZXMudGl0bGUgKz0gXCIgXCIgKyBzdXJ2ZXlDc3MucXVlc3Rpb24udGl0bGVSZXF1aXJlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dElkO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdEVycm9ySW5wdXRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRGaXJzdElucHV0RWxlbWVudElkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb2Nlc3NlZFRleHRWYWx1ZSh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkge1xuICAgIHZhciBuYW1lID0gdGV4dFZhbHVlLm5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSBuYW1lID09IFwibm9cIiB8fCBuYW1lID09IFwidGl0bGVcIiB8fCBuYW1lID09IFwicmVxdWlyZVwiO1xuICAgIGlmIChuYW1lID09IFwibm9cIikgdGV4dFZhbHVlLnZhbHVlID0gdGhpcy5ubztcbiAgICBpZiAobmFtZSA9PSBcInRpdGxlXCIpIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMucHJvY2Vzc2VkVGl0bGU7XG4gICAgaWYgKG5hbWUgPT0gXCJyZXF1aXJlXCIpIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMucmVxdWlyZWRUZXh0O1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0Q29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIG1ha2UgdGhlIHF1ZXN0aW9uIGEgcmVxdWlyZWQuIElmIGEgdXNlciBkb2Vzbid0IGFuc3dlciB0aGUgcXVlc3Rpb24gdGhlbiBhIHZhbGlkYXRpb24gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzUmVxdWlyZWRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5pc1JlcXVpcmVkID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVxdWlyZWRcIiwgdmFsKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnRpdGxlQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0NvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImhhc0NvbW1lbnRcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaGFzQ29tbWVudCh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuc3VwcG9ydENvbW1lbnQoKSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhhc0NvbW1lbnRcIiwgdmFsKTtcbiAgICBpZiAodGhpcy5oYXNDb21tZW50KSB0aGlzLmhhc090aGVyID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCBoYXNPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaGFzT3RoZXJcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgaGFzT3RoZXIodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLnN1cHBvcnRPdGhlcigpIHx8IHRoaXMuaGFzT3RoZXIgPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaGFzT3RoZXJcIiwgdmFsKTtcbiAgICBpZiAodGhpcy5oYXNPdGhlcikgdGhpcy5oYXNDb21tZW50ID0gZmFsc2U7XG4gICAgdGhpcy5oYXNPdGhlckNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzT3RoZXJDaGFuZ2VkKCkge31cbiAgLyoqXG4gICAqIFJldHVucyB0cnVlIGlmIHJlYWRPbmx5IHByb3BlcnR5IGlzIHRydWUgb3Igc3VydmV5IGlzIGluIGRpc3BsYXkgbW9kZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tb2RlbFxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzUmVhZE9ubHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZE9ubHkgfHwgKHRoaXMuc3VydmV5ICE9IG51bGwgJiYgdGhpcy5zdXJ2ZXkuaXNEaXNwbGF5TW9kZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlIHRvIG1ha2UgYSBxdWVzdGlvbiByZWFkb25seS5cbiAgICovXG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSB0byBtYWtlIHRoZSBxdWVzdGlvbiByZWFkb25seS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJlYWRPbmx5XCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlYWRPbmx5KHZhbDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLnJlYWRPbmx5ID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlYWRPbmx5XCIsIHZhbCk7XG4gICAgdGhpcy5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICB9XG4gIC8qKlxuICAgKiBBbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyB0cnVlIG9yIGZhbHNlLiBJZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIHJlYWQgb25seSBhbmQgYW4gZW5kLXVzZXIgd2lsbCBub3QgYWJsZSB0byBhbnN3ZXIgb24gdGhlIHF1c3Rpb24uIFRoZSBsaWJyYXJ5IHJ1bnMgdGhlIGV4cHJlc3Npb24gb24gc3VydmV5IHN0YXJ0IGFuZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZhbHVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZW1wdHkgdGhlbiByZWFkT25seSBwcm9wZXJ0eSBpcyB1c2VkLlxuICAgKiBAc2VlIHJlYWRPbmx5XG4gICAqIEBzZWUgaXNSZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBlbmFibGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJlbmFibGVJZlwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZUlmKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZW5hYmxlSWZcIiwgdmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMpO1xuICAgIGlmICghdGhpcy5lbmFibGVJZikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jb25kaXRpb25FbmFiZWxSdW5uZXIpXG4gICAgICB0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lciA9IG5ldyBDb25kaXRpb25SdW5uZXIodGhpcy5lbmFibGVJZik7XG4gICAgdGhpcy5jb25kaXRpb25FbmFiZWxSdW5uZXIuZXhwcmVzc2lvbiA9IHRoaXMuZW5hYmxlSWY7XG4gICAgdGhpcy5yZWFkT25seSA9ICF0aGlzLmNvbmRpdGlvbkVuYWJlbFJ1bm5lci5ydW4odmFsdWVzKTtcbiAgfVxuXG4gIG9uUmVhZE9ubHlDaGFuZ2VkKCkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVhZE9ubHlcIiwgdGhpcy5pc1JlYWRPbmx5KTtcbiAgfVxuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICB2YXIgdGl0bGVWYWx1ZSA9IHRoaXMubG9jVGl0bGUudGV4dDtcbiAgICBpZiAoIXRpdGxlVmFsdWUpIHJldHVybjtcbiAgICBpZiAodGl0bGVWYWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2YoXCJ7XCIgKyBuYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudGl0bGVDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IG5vKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudmlzaWJsZUluZGV4IDwgMCkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSAxO1xuICAgIHZhciBpc051bWVyaWMgPSB0cnVlO1xuICAgIHZhciBzdHIgPSBcIlwiO1xuICAgIGlmICh0aGlzLnN1cnZleSAmJiB0aGlzLnN1cnZleS5xdWVzdGlvblN0YXJ0SW5kZXgpIHtcbiAgICAgIHN0ciA9IHRoaXMuc3VydmV5LnF1ZXN0aW9uU3RhcnRJbmRleDtcbiAgICAgIGlmIChwYXJzZUludChzdHIpKSBzdGFydEluZGV4ID0gcGFyc2VJbnQoc3RyKTtcbiAgICAgIGVsc2UgaWYgKHN0ci5sZW5ndGggPT0gMSkgaXNOdW1lcmljID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChpc051bWVyaWMpIHJldHVybiAodGhpcy52aXNpYmxlSW5kZXggKyBzdGFydEluZGV4KS50b1N0cmluZygpO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHN0ci5jaGFyQ29kZUF0KDApICsgdGhpcy52aXNpYmxlSW5kZXgpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvblNldERhdGEoKSB7XG4gICAgc3VwZXIub25TZXREYXRhKCk7XG4gICAgdGhpcy5vblN1cnZleVZhbHVlQ2hhbmdlZCh0aGlzLnZhbHVlKTtcbiAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc3ZhbHVlQ2hhbmdlZENhbGxiYWNrRmlyaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKlxuICAgKiBHZXQvU2V0IHRoZSBxdWVzdGlvbiB2YWx1ZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlLnNldFZhbHVlXG4gICAqIEBzZWUgU3VydmV5TW9kZS5nZXRWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlRnJvbURhdGEodGhpcy5nZXRWYWx1ZUNvcmUoKSk7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgaWYgKHRoaXMuaXN2YWx1ZUNoYW5nZWRDYWxsYmFja0ZpcmluZykgcmV0dXJuO1xuICAgIHRoaXMuaXN2YWx1ZUNoYW5nZWRDYWxsYmFja0ZpcmluZyA9IHRydWU7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy52YWx1ZUNoYW5nZWRDYWxsYmFjayk7XG4gICAgdGhpcy5pc3ZhbHVlQ2hhbmdlZENhbGxiYWNrRmlyaW5nID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWUoKSB7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgdGhpcy5jb21tZW50ID0gbnVsbDtcbiAgfVxuICBwcml2YXRlIGNhbkNsZWFyVmFsdWVBc0ludmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1Zpc2libGUpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXRoaXMuc3VydmV5IHx8ICF0aGlzLnZhbHVlTmFtZSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICF0aGlzLnN1cnZleS5oYXNWaXNpYmxlUXVlc3Rpb25CeVZhbHVlTmFtZSh0aGlzLnZhbHVlTmFtZSk7XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWVJZkludmlzaWJsZSgpIHtcbiAgICBpZiAodGhpcy5jYW5DbGVhclZhbHVlQXNJbnZpc2libGUoKSkge1xuICAgICAgdGhpcy5jbGVhclZhbHVlKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVmYXVsdCB2YWx1ZSB0byB0aGUgcXVlc3Rpb24uIEl0IHdpbGwgYmUgYXNzaWduIHRvIHRoZSBxdWVzdGlvbiBvbiBsb2FkaW5nIHRoZSBzdXJ2ZXkgZnJvbSBKU09OIG9yIGFkZGluZyBhIHF1ZXN0aW9uIHRvIHRoZSBzdXJ2ZXkgb3Igb24gc2V0dGluZyB0aGlzIHByb3BlcnR5IG9mIHRoZSB2YWx1ZSBpcyBlbXB0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZGVmYXVsdFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZVwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNvcnJlY3QgYW5zd2VyIG9uIHRoZSBxdWVzdGlvbi4gU2V0IHRoaXMgdmFsdWUgaWYgeW91IGFyZSBkb2luZyBhIHF1aXouXG4gICAqIEBzZWUgU3VydmV5TW9kZWwuY29ycmVjdEFuc3dlcnNcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5pbkNvcnJlY3RBbnN3ZXJzXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvcnJlY3RBbnN3ZXIoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29ycmVjdEFuc3dlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvcnJlY3RBbnN3ZXIodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb3JyZWN0QW5zd2VyXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGlzQW5zd2VyQ29ycmVjdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRW1wdHkodGhpcy52YWx1ZSkgfHwgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5jb3JyZWN0QW5zd2VyKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuY29ycmVjdEFuc3dlcik7XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZVZhbHVlV2l0aERlZmF1bHRzKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNMb2FkaW5nRnJvbUpzb24gfHxcbiAgICAgICghdGhpcy5pc0Rlc2lnbk1vZGUgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy5kZWZhdWx0VmFsdWUpKVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBpZiAoIXRoaXMuaXNEZXNpZ25Nb2RlICYmICF0aGlzLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldERlZmF1bHRWYWx1ZSgpIHtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHF1ZXN0aW9uIGNvbW1lbnQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1lbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb21tZW50KCk7XG4gIH1cbiAgcHVibGljIHNldCBjb21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jb21tZW50ID09IG5ld1ZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5zZXRDb21tZW50KG5ld1ZhbHVlKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNvbW1lbnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb21tZW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSAhPSBudWxsXG4gICAgICA/IHRoaXMuZGF0YS5nZXRDb21tZW50KHRoaXMuZ2V0VmFsdWVOYW1lKCkpXG4gICAgICA6IHRoaXMucXVlc3Rpb25Db21tZW50O1xuICB9XG4gIHByb3RlY3RlZCBzZXRDb21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldE5ld0NvbW1lbnQobmV3VmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXN0aW9uIHZhbHVlIGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbHVlRW1wdHkodGhpcy52YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHF1ZXN0aW9uIHZhbGlkYXRvcnMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbGlkYXRvcnMoKTogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yc1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsaWRhdG9ycyh2YWw6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWxpZGF0b3JzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aHJlcmUgaXMgYSB2YWxpZGF0aW9uIGVycm9yKHMpIGluIHRoZSBxdWVzdGlvbi5cbiAgICogQHBhcmFtIGZpcmVDYWxsYmFjayBzZXQgaXQgdG8gdHJ1ZSB0byBzaG93IGFuIGVycm9yIGluIFVJLlxuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgdGhpcy5jaGVja0ZvckVycm9ycyhmaXJlQ2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGggPiAwO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0aW9uIGVycm9ycyBjb3VudC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudEVycm9yQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMubGVuZ3RoO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjaGFyL3N0cmluZyBmb3IgYSByZXF1aXJlZCBxdWVzdGlvbi5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5yZXF1aXJlZFRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ICE9IG51bGwgJiYgdGhpcy5pc1JlcXVpcmVkXG4gICAgICA/IHRoaXMuc3VydmV5LnJlcXVpcmVkVGV4dFxuICAgICAgOiBcIlwiO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgZXJyb3IgaW50byB0aGUgcXVlc3Rpb24gZXJyb3IgbGlzdC5cbiAgICogQHBhcmFtIGVycm9yXG4gICAqL1xuICBwdWJsaWMgYWRkRXJyb3IoZXJyb3I6IFN1cnZleUVycm9yKSB7XG4gICAgdGhpcy5lcnJvcnMucHVzaChlcnJvcik7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5lcnJvcnNDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIHByaXZhdGUgY2hlY2tGb3JFcnJvcnMoZmlyZUNhbGxiYWNrOiBib29sZWFuKSB7XG4gICAgdmFyIGVycm9yTGVuZ3RoID0gdGhpcy5lcnJvcnMgPyB0aGlzLmVycm9ycy5sZW5ndGggOiAwO1xuICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgdGhpcy5vbkNoZWNrRm9yRXJyb3JzKHRoaXMuZXJyb3JzKTtcbiAgICBpZiAodGhpcy5lcnJvcnMubGVuZ3RoID09IDAgJiYgIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB2YXIgZXJyb3IgPSB0aGlzLnJ1blZhbGlkYXRvcnMoKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAvL3ZhbGlkYXRvcnMgbWF5IGNoYW5nZSB0aGUgcXVlc3Rpb24gdmFsdWUuXG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5lcnJvcnMubGVuZ3RoID09IDApIHtcbiAgICAgIHZhciBlcnJvciA9IHRoaXMuZmlyZVN1cnZleVZhbGlkYXRpb24oKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgZmlyZUNhbGxiYWNrICYmXG4gICAgICAoZXJyb3JMZW5ndGggIT0gdGhpcy5lcnJvcnMubGVuZ3RoIHx8IGVycm9yTGVuZ3RoID4gMClcbiAgICApIHtcbiAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuZXJyb3JzQ2hhbmdlZENhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmaXJlU3VydmV5VmFsaWRhdGlvbigpOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKHRoaXMudmFsaWRhdGVWYWx1ZUNhbGxiYWNrKSByZXR1cm4gdGhpcy52YWxpZGF0ZVZhbHVlQ2FsbGJhY2soKTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS52YWxpZGF0ZVF1ZXN0aW9uKHRoaXMpIDogbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIGlmICh0aGlzLmhhc1JlcXVpcmVkRXJyb3IoKSkge1xuICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgQW5zd2VyUmVxdWlyZWRFcnJvcih0aGlzLnJlcXVpcmVkRXJyb3JUZXh0KSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBoYXNSZXF1aXJlZEVycm9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUmVxdWlyZWQgJiYgdGhpcy5pc0VtcHR5KCk7XG4gIH1cbiAgcHJvdGVjdGVkIHJ1blZhbGlkYXRvcnMoKTogU3VydmV5RXJyb3Ige1xuICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUnVubmVyKCkucnVuKHRoaXMpO1xuICB9XG4gIHByaXZhdGUgaXNWYWx1ZUNoYW5nZWRJblN1cnZleSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2V0TmV3VmFsdWVJbkRhdGEobmV3VmFsdWUpO1xuICAgIHRoaXMub25WYWx1ZUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWVJbkRhdGEobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5pc1ZhbHVlQ2hhbmdlZEluU3VydmV5KSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMudmFsdWVUb0RhdGEobmV3VmFsdWUpO1xuICAgICAgdGhpcy5zZXRWYWx1ZUNvcmUobmV3VmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFZhbHVlQ29yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhICE9IG51bGxcbiAgICAgID8gdGhpcy5kYXRhLmdldFZhbHVlKHRoaXMuZ2V0VmFsdWVOYW1lKCkpXG4gICAgICA6IHRoaXMucXVlc3Rpb25WYWx1ZTtcbiAgfVxuICBwcml2YXRlIHNldFZhbHVlQ29yZShuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuZGF0YSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmRhdGEuc2V0VmFsdWUodGhpcy5nZXRWYWx1ZU5hbWUoKSwgbmV3VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXN0aW9uVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlVG9EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHt9XG4gIHByb3RlY3RlZCBzZXROZXdDb21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5kYXRhICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZGF0YS5zZXRDb21tZW50KHRoaXMuZ2V0VmFsdWVOYW1lKCksIG5ld1ZhbHVlKTtcbiAgICB9IGVsc2UgdGhpcy5xdWVzdGlvbkNvbW1lbnQgPSBuZXdWYWx1ZTtcbiAgfVxuICAvL0lRdWVzdGlvblxuICBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1ZhbHVlQ2hhbmdlZEluU3VydmV5ID0gdHJ1ZTtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZUZyb21EYXRhKG5ld1ZhbHVlKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNvbW1lbnRDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIHRoaXMuaXNWYWx1ZUNoYW5nZWRJblN1cnZleSA9IGZhbHNlO1xuICB9XG4gIC8vSVZhbGlkYXRvck93bmVyXG4gIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZ2V0IHZhbGlkYXRlZFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgc2V0IHZhbGlkYXRlZFZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgfVxufVxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJxdWVzdGlvblwiLFxuICBbXG4gICAgeyBuYW1lOiBcInRpdGxlOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7IG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGVzY3JpcHRpb25cIiB9LFxuICAgIHsgbmFtZTogXCJjb21tZW50VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tbWVudFRleHRcIiB9LFxuICAgIFwidmFsdWVOYW1lXCIsXG4gICAgXCJlbmFibGVJZjpjb25kaXRpb25cIixcbiAgICBcImRlZmF1bHRWYWx1ZTp2YWx1ZVwiLFxuICAgIFwiY29ycmVjdEFuc3dlcjp2YWx1ZVwiLFxuICAgIFwiaXNSZXF1aXJlZDpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJyZXF1aXJlZEVycm9yVGV4dDp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUmVxdWlyZWRFcnJvclRleHRcIlxuICAgIH0sXG4gICAgXCJyZWFkT25seTpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJ2YWxpZGF0b3JzOnZhbGlkYXRvcnNcIixcbiAgICAgIGJhc2VDbGFzc05hbWU6IFwic3VydmV5dmFsaWRhdG9yXCIsXG4gICAgICBjbGFzc05hbWVQYXJ0OiBcInZhbGlkYXRvclwiXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRpdGxlTG9jYXRpb25cIixcbiAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgY2hvaWNlczogW1wiZGVmYXVsdFwiLCBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJoaWRkZW5cIl1cbiAgICB9XG4gIF0sXG4gIG51bGwsXG4gIFwicXVlc3Rpb25iYXNlXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb24udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIEFuc3dlclJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjdXN0b21FcnJvclRleHQ6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tRXJyb3JUZXh0XG4gICAgICA/IHRoaXMuY3VzdG9tRXJyb3JUZXh0XG4gICAgICA6IHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZXF1aXJlZEVycm9yXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgT25lQW5zd2VyUmVxdWlyZWRFcnJvciBleHRlbmRzIFN1cnZleUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUVycm9yVGV4dDogc3RyaW5nID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21FcnJvclRleHRcbiAgICAgID8gdGhpcy5jdXN0b21FcnJvclRleHRcbiAgICAgIDogc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcInJlcXVpcmVkRXJyb3JJblBhbmVsXCIpO1xuICB9XG59XG5leHBvcnQgY2xhc3MgUmVxdXJlTnVtZXJpY0Vycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJudW1lcmljRXJyb3JcIik7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBFeGNlZWRTaXplRXJyb3IgZXh0ZW5kcyBTdXJ2ZXlFcnJvciB7XG4gIHByaXZhdGUgbWF4U2l6ZTogbnVtYmVyO1xuICBjb25zdHJ1Y3RvcihtYXhTaXplOiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemU7XG4gIH1cbiAgcHVibGljIGdldFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAuZ2V0U3RyaW5nKFwiZXhjZWVkTWF4U2l6ZVwiKVxuICAgICAgW1wiZm9ybWF0XCJdKHRoaXMuZ2V0VGV4dFNpemUoKSk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUZXh0U2l6ZSgpIHtcbiAgICB2YXIgc2l6ZXMgPSBbXCJCeXRlc1wiLCBcIktCXCIsIFwiTUJcIiwgXCJHQlwiLCBcIlRCXCJdO1xuICAgIHZhciBmaXhlZCA9IFswLCAwLCAyLCAzLCAzXTtcbiAgICBpZiAodGhpcy5tYXhTaXplID09IDApIHJldHVybiBcIjAgQnl0ZVwiO1xuICAgIHZhciBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyh0aGlzLm1heFNpemUpIC8gTWF0aC5sb2coMTAyNCkpO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMubWF4U2l6ZSAvIE1hdGgucG93KDEwMjQsIGkpO1xuICAgIHJldHVybiB2YWx1ZS50b0ZpeGVkKGZpeGVkW2ldKSArIFwiIFwiICsgc2l6ZXNbaV07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEN1c3RvbUVycm9yIGV4dGVuZHMgU3VydmV5RXJyb3Ige1xuICBwcml2YXRlIHRleHQ6IHN0cmluZztcbiAgY29uc3RydWN0b3IodGV4dDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2Vycm9yLnRzIiwiZXhwb3J0IGludGVyZmFjZSBIYXNoVGFibGU8VD4ge1xuICBba2V5OiBzdHJpbmddOiBUO1xufVxuXG5leHBvcnQgY2xhc3MgSGVscGVycyB7XG4gIC8qKlxuICAgKiBBIHN0YXRpYyBtZXRob2RzIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgdW5kZXJmaW5lZCwgbnVsbCwgZW1wdHkgc3RyaW5nIG9yIGVtcHR5IGFycmF5LlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNWYWx1ZUVtcHR5KHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gIXZhbHVlICYmIHZhbHVlICE9PSAwICYmIHZhbHVlICE9PSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQXJyYXlDb250YWluc0VxdWFsKHg6IGFueSwgeTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHgpIHx8ICFBcnJheS5pc0FycmF5KHkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGogPSAwO1xuICAgICAgZm9yICg7IGogPCB5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChIZWxwZXJzLmlzVHdvVmFsdWVFcXVhbHMoeFtpXSwgeVtqXSkpIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGogPT09IHkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgaXNUd29WYWx1ZUVxdWFscyh4OiBhbnksIHk6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh4ID09PSB5KSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoISh4IGluc3RhbmNlb2YgT2JqZWN0KSB8fCAhKHkgaW5zdGFuY2VvZiBPYmplY3QpKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yICh2YXIgcCBpbiB4KSB7XG4gICAgICBpZiAoIXguaGFzT3duUHJvcGVydHkocCkpIGNvbnRpbnVlO1xuICAgICAgaWYgKCF5Lmhhc093blByb3BlcnR5KHApKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoeFtwXSA9PT0geVtwXSkgY29udGludWU7XG4gICAgICBpZiAodHlwZW9mIHhbcF0gIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICghdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKHhbcF0sIHlbcF0pKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAocCBpbiB5KSB7XG4gICAgICBpZiAoeS5oYXNPd25Qcm9wZXJ0eShwKSAmJiAheC5oYXNPd25Qcm9wZXJ0eShwKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcmFuZG9taXplQXJyYXk8VD4oYXJyYXk6IEFycmF5PFQ+KTogQXJyYXk8VD4ge1xuICAgIGZvciAodmFyIGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICB2YXIgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTtcbiAgICAgIGFycmF5W2ldID0gYXJyYXlbal07XG4gICAgICBhcnJheVtqXSA9IHRlbXA7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxufVxuaWYgKCFTdHJpbmcucHJvdG90eXBlW1wiZm9ybWF0XCJdKSB7XG4gIFN0cmluZy5wcm90b3R5cGVbXCJmb3JtYXRcIl0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlKC97KFxcZCspfS9nLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGFyZ3NbbnVtYmVyXSAhPSBcInVuZGVmaW5lZFwiID8gYXJnc1tudW1iZXJdIDogbWF0Y2g7XG4gICAgfSk7XG4gIH07XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvaGVscGVycy50cyIsImltcG9ydCB7IElMb2NhbGl6YWJsZU93bmVyLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuXG4vKipcbiAqIEFycmF5IG9mIEl0ZW1WYWx1ZSBpcyB1c2VkIGluIGNoZWNrb3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIGNob2ljZXMsIG1hdHJpeCBjb2x1bW5zIGFuZCByb3dzLlxuICogSXQgaGFzIHR3byBtYWluIHByb3BlcnRpZXM6IHZhbHVlIGFuZCB0ZXh0LiBJZiB0ZXh0IGlzIGVtcHR5LCB2YWx1ZSBpcyB1c2VkIGZvciBkaXNwbGF5aW5nLlxuICogVGhlIHRleHQgcHJvcGVydHkgaXMgbG9jYWxpemFibGUgYW5kIHN1cHBvcnQgbWFya2Rvd24uXG4gKi9cbmV4cG9ydCBjbGFzcyBJdGVtVmFsdWUge1xuICBwdWJsaWMgc3RhdGljIFNlcGFyYXRvciA9IFwifFwiO1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUFycmF5KGxvY093bmVyOiBJTG9jYWxpemFibGVPd25lcik6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHZhciBpdGVtczogQXJyYXk8SXRlbVZhbHVlPiA9IFtdO1xuICAgIEl0ZW1WYWx1ZS5zZXR1cEFycmF5KGl0ZW1zLCBsb2NPd25lcik7XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0dXBBcnJheShcbiAgICBpdGVtczogQXJyYXk8SXRlbVZhbHVlPixcbiAgICBsb2NPd25lcjogSUxvY2FsaXphYmxlT3duZXJcbiAgKSB7XG4gICAgaXRlbXMucHVzaCA9IGZ1bmN0aW9uKHZhbHVlKTogbnVtYmVyIHtcbiAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsIHZhbHVlKTtcbiAgICAgIHZhbHVlLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgaXRlbXMuc3BsaWNlID0gZnVuY3Rpb24oXG4gICAgICBzdGFydD86IG51bWJlcixcbiAgICAgIGRlbGV0ZUNvdW50PzogbnVtYmVyLFxuICAgICAgLi4uaXRlbXM6IEl0ZW1WYWx1ZVtdXG4gICAgKTogSXRlbVZhbHVlW10ge1xuICAgICAgdmFyIHJlc3VsdCA9IEFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIGRlbGV0ZUNvdW50LFxuICAgICAgICAuLi5pdGVtc1xuICAgICAgKTtcbiAgICAgIGlmICghaXRlbXMpIGl0ZW1zID0gW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZW1zW2ldLmxvY093bmVyID0gbG9jT3duZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cbiAgcHVibGljIHN0YXRpYyBzZXREYXRhKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCB2YWx1ZXM6IEFycmF5PGFueT4pIHtcbiAgICBpdGVtcy5sZW5ndGggPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgICB2YXIgaXRlbSA9IG5ldyBJdGVtVmFsdWUobnVsbCk7XG4gICAgICBpdGVtLnNldERhdGEodmFsdWUpO1xuICAgICAgaXRlbXMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXREYXRhKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+KTogYW55IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2goaXRlbXNbaV0uZ2V0RGF0YSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldEl0ZW1CeVZhbHVlKGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LCB2YWw6IGFueSk6IEl0ZW1WYWx1ZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGl0ZW1zW2ldLnZhbHVlID09IHZhbCkgcmV0dXJuIGl0ZW1zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGdldFRleHRPckh0bWxCeVZhbHVlKFxuICAgIGl0ZW1zOiBBcnJheTxJdGVtVmFsdWU+LFxuICAgIHZhbDogYW55XG4gICk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW0gPSBJdGVtVmFsdWUuZ2V0SXRlbUJ5VmFsdWUoaXRlbXMsIHZhbCk7XG4gICAgcmV0dXJuIGl0ZW0gIT09IG51bGwgPyBpdGVtLmxvY1RleHQudGV4dE9ySHRtbCA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBOb3RpZnlBcnJheU9uTG9jYWxlQ2hhbmdlZChpdGVtczogQXJyYXk8SXRlbVZhbHVlPikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW1zW2ldLmxvY1RleHQub25DaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgc3RhdGljIGl0ZW1WYWx1ZVByb3AgPSBbXG4gICAgXCJ0ZXh0XCIsXG4gICAgXCJ2YWx1ZVwiLFxuICAgIFwiaGFzVGV4dFwiLFxuICAgIFwibG9jT3duZXJcIixcbiAgICBcImxvY1RleHRcIixcbiAgICBcImlzVmFsdWVFbXB0eVwiLFxuICAgIFwibG9jVGV4dFZhbHVlXCIsXG4gICAgXCJwb3NcIlxuICBdO1xuICBwcml2YXRlIGl0ZW1WYWx1ZTogYW55O1xuICBwcml2YXRlIGxvY1RleHRWYWx1ZTogTG9jYWxpemFibGVTdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBhbnksIHRleHQ6IHN0cmluZyA9IG51bGwpIHtcbiAgICB0aGlzLmxvY1RleHRWYWx1ZSA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhudWxsLCB0cnVlKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5sb2NUZXh0VmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dCA/IHRleHQgOiAhc2VsZi5pc1ZhbHVlRW1wdHkgPyBzZWxmLnZhbHVlLnRvU3RyaW5nKCkgOiBudWxsO1xuICAgIH07XG4gICAgaWYgKHRleHQpIHRoaXMubG9jVGV4dC50ZXh0ID0gdGV4dDtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJpdGVtdmFsdWVcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY093bmVyKCk6IElMb2NhbGl6YWJsZU93bmVyIHtcbiAgICByZXR1cm4gdGhpcy5sb2NUZXh0Lm93bmVyO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9jT3duZXIodmFsdWU6IElMb2NhbGl6YWJsZU93bmVyKSB7XG4gICAgdGhpcy5sb2NUZXh0Lm93bmVyID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLml0ZW1WYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLml0ZW1WYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGlmICghdGhpcy5pdGVtVmFsdWUpIHJldHVybjtcbiAgICB2YXIgc3RyOiBzdHJpbmcgPSB0aGlzLml0ZW1WYWx1ZS50b1N0cmluZygpO1xuICAgIHZhciBpbmRleCA9IHN0ci5pbmRleE9mKEl0ZW1WYWx1ZS5TZXBhcmF0b3IpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLml0ZW1WYWx1ZSA9IHN0ci5zbGljZSgwLCBpbmRleCk7XG4gICAgICB0aGlzLnRleHQgPSBzdHIuc2xpY2UoaW5kZXggKyAxKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGdldCBoYXNUZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvY1RleHQucHVyZVRleHQgPyB0cnVlIDogZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jVGV4dC50ZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dChuZXdUZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLmxvY1RleHQudGV4dCA9IG5ld1RleHQ7XG4gIH1cbiAgcHVibGljIGdldERhdGEoKTogYW55IHtcbiAgICB2YXIgY3VzdG9tQXR0cmlidXRlcyA9IHRoaXMuZ2V0Q3VzdG9tQXR0cmlidXRlcygpO1xuICAgIHZhciB0ZXh0SnNvbiA9IHRoaXMubG9jVGV4dC5nZXRKc29uKCk7XG4gICAgaWYgKCFjdXN0b21BdHRyaWJ1dGVzICYmICF0ZXh0SnNvbikgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgdmFyIHJlc3VsdCA9IHsgdmFsdWU6IHRoaXMudmFsdWUgfTtcbiAgICBpZiAodGV4dEpzb24pIHJlc3VsdFtcInRleHRcIl0gPSB0ZXh0SnNvbjtcbiAgICBpZiAoY3VzdG9tQXR0cmlidXRlcykge1xuICAgICAgZm9yICh2YXIga2V5IGluIGN1c3RvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBjdXN0b21BdHRyaWJ1dGVzW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHVibGljIHNldERhdGEodmFsdWU6IGFueSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUudmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHZhciBleGNlcHRpb24gPSBudWxsO1xuICAgICAgaWYgKHRoaXMuaXNPYmpJdGVtVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLml0ZW1WYWx1ZSA9IHZhbHVlLml0ZW1WYWx1ZTtcbiAgICAgICAgdGhpcy5sb2NUZXh0LnNldEpzb24odmFsdWUubG9jVGV4dC5nZXRKc29uKCkpO1xuICAgICAgICBleGNlcHRpb24gPSBJdGVtVmFsdWUuaXRlbVZhbHVlUHJvcDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29weUF0dHJpYnV0ZXModmFsdWUsIGV4Y2VwdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXQgaXNWYWx1ZUVtcHR5KCkge1xuICAgIHJldHVybiAhdGhpcy5pdGVtVmFsdWUgJiYgdGhpcy5pdGVtVmFsdWUgIT09IDAgJiYgdGhpcy5pdGVtVmFsdWUgIT09IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgaXNPYmpJdGVtVmFsdWUob2JqOiBhbnkpIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iai5nZXRUeXBlICE9PSBcInVuZGVmaW5lZFwiICYmIG9iai5nZXRUeXBlKCkgPT0gXCJpdGVtdmFsdWVcIjtcbiAgfVxuICBwcml2YXRlIGNvcHlBdHRyaWJ1dGVzKHNyYzogYW55LCBleGNlcHRvbnM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICBpZiAodHlwZW9mIHNyY1trZXldID09IFwiZnVuY3Rpb25cIikgY29udGludWU7XG4gICAgICBpZiAoZXhjZXB0b25zICYmIGV4Y2VwdG9ucy5pbmRleE9mKGtleSkgPiAtMSkgY29udGludWU7XG4gICAgICBpZiAoa2V5ID09IFwidGV4dFwiKSB7XG4gICAgICAgIHRoaXMubG9jVGV4dC5zZXRKc29uKHNyY1trZXldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNba2V5XSA9IHNyY1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldEN1c3RvbUF0dHJpYnV0ZXMoKTogYW55IHtcbiAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcykge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgdGhpc1trZXldID09IFwiZnVuY3Rpb25cIiB8fFxuICAgICAgICBJdGVtVmFsdWUuaXRlbVZhbHVlUHJvcC5pbmRleE9mKGtleSkgPiAtMSB8fFxuICAgICAgICBrZXkgPT0gXCJpdGVtVmFsdWVcIlxuICAgICAgKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0ge307XG4gICAgICByZXN1bHRba2V5XSA9IHRoaXNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwiaXRlbXZhbHVlXCIsIFtcbiAgXCIhdmFsdWVcIixcbiAge1xuICAgIG5hbWU6IFwidGV4dFwiLFxuICAgIG9uR2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICByZXR1cm4gb2JqLmxvY1RleHQucHVyZVRleHQ7XG4gICAgfVxuICB9XG5dKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9pdGVtdmFsdWUudHMiLCJleHBvcnQgdmFyIHN1cnZleUNzcyA9IHtcbiAgY3VycmVudFR5cGU6IFwiXCIsXG4gIGdldENzczogZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxvYyA9IHRoaXMuY3VycmVudFR5cGUgPyB0aGlzW3RoaXMuY3VycmVudFR5cGVdIDogZGVmYXVsdFN0YW5kYXJkQ3NzO1xuICAgIGlmICghbG9jKSBsb2MgPSBkZWZhdWx0U3RhbmRhcmRDc3M7XG4gICAgcmV0dXJuIGxvYztcbiAgfVxufTtcblxuZXhwb3J0IHZhciBkZWZhdWx0U3RhbmRhcmRDc3MgPSB7XG4gIHJvb3Q6IFwic3ZfbWFpbiBzdl9kZWZhdWx0X2Nzc1wiLFxuICBoZWFkZXI6IFwic3ZfaGVhZGVyXCIsXG4gIGJvZHk6IFwic3ZfYm9keVwiLFxuICBmb290ZXI6IFwic3ZfbmF2XCIsXG4gIG5hdmlnYXRpb25CdXR0b246IFwiXCIsXG4gIGNvbXBsZXRlZFBhZ2U6IFwic3ZfY29tcGxldGVkX3BhZ2VcIixcbiAgbmF2aWdhdGlvbjoge1xuICAgIGNvbXBsZXRlOiBcInN2X2NvbXBsZXRlX2J0blwiLFxuICAgIHByZXY6IFwic3ZfcHJldl9idG5cIixcbiAgICBuZXh0OiBcInN2X25leHRfYnRuXCIsXG4gICAgc3RhcnQ6IFwic3Zfc3RhcnRfYnRuXCJcbiAgfSxcbiAgcHJvZ3Jlc3M6IFwic3ZfcHJvZ3Jlc3NcIixcbiAgcHJvZ3Jlc3NCYXI6IFwic3ZfcHJvZ3Jlc3NfYmFyXCIsXG4gIHBhZ2U6IHtcbiAgICByb290OiBcInN2X3Bfcm9vdFwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlwiXG4gIH0sXG4gIC8vIFRPRE86IG1vdmUgdG8gdGhlIHBhZ2Ugb2JqZWN0XG4gIHBhZ2VUaXRsZTogXCJzdl9wYWdlX3RpdGxlXCIsXG4gIHBhZ2VEZXNjcmlwdGlvbjogXCJcIixcbiAgcm93OiBcInN2X3Jvd1wiLFxuICBxdWVzdGlvbjoge1xuICAgIG1haW5Sb290OiBcInN2X3Egc3ZfcXN0blwiLFxuICAgIHRpdGxlOiBcInN2X3FfdGl0bGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzdl9xX2Rlc2NyaXB0aW9uXCIsXG4gICAgY29tbWVudDogXCJcIixcbiAgICByZXF1aXJlZDogXCJcIixcbiAgICB0aXRsZVJlcXVpcmVkOiBcIlwiLFxuICAgIGluZGVudDogMjAsXG4gICAgZm9vdGVyOiBcInN2X3FfZm9vdGVyXCJcbiAgfSxcbiAgcGFuZWw6IHsgdGl0bGU6IFwic3ZfcF90aXRsZVwiLCBkZXNjcmlwdGlvbjogXCJcIiwgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCIgfSxcbiAgZXJyb3I6IHsgcm9vdDogXCJzdl9xX2VyYm94XCIsIGljb246IFwiXCIsIGl0ZW06IFwiXCIgfSxcblxuICBib29sZWFuOiB7IHJvb3Q6IFwic3ZfcWNiYyBzdl9xYmxuXCIsIGl0ZW06IFwic3ZfcV9jaGVja2JveFwiIH0sXG4gIGNoZWNrYm94OiB7XG4gICAgcm9vdDogXCJzdl9xY2JjIHN2X3FjYnhcIixcbiAgICBpdGVtOiBcInN2X3FfY2hlY2tib3hcIixcbiAgICBsYWJlbDogXCJzdl9xX2NoZWNrYm94X2xhYmVsXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwic3ZfcV9jaGVja2JveF9jb250cm9sX2l0ZW1cIixcbiAgICBjb250cm9sTGFiZWw6IFwic3ZfcV9jaGVja2JveF9jb250cm9sX2xhYmVsXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9vdGhlciBzdl9xX2NoZWNrYm94X290aGVyXCJcbiAgfSxcbiAgY29tbWVudDogXCJcIixcbiAgZHJvcGRvd246IHtcbiAgICByb290OiBcIlwiLFxuICAgIGNvbnRyb2w6IFwic3ZfcV9kcm9wZG93bl9jb250cm9sXCIsXG4gICAgc2VsZWN0V3JhcHBlcjogXCJzdl9zZWxlY3Rfd3JhcHBlclwiLFxuICAgIG90aGVyOiBcInN2X3Ffb3RoZXJcIlxuICB9LFxuICBtYXRyaXg6IHsgcm9vdDogXCJzdl9xX21hdHJpeFwiLCBsYWJlbDogXCJzdl9xX21fbGFiZWxcIiB9LFxuICBtYXRyaXhkcm9wZG93bjogeyByb290OiBcInN2X3FfbWF0cml4X2Ryb3Bkb3duXCIgfSxcbiAgbWF0cml4ZHluYW1pYzoge1xuICAgIHJvb3Q6IFwic3ZfcV9tYXRyaXhfZHluYW1pY1wiLFxuICAgIGJ1dHRvbjogXCJzdl9tYXRyaXhfZHluYW1pY19idXR0b25cIlxuICB9LFxuICBwYW5lbGR5bmFtaWM6IHsgcm9vdDogXCJzdl9wYW5lbF9keW5hbWljXCIsIHRpdGxlOiBcInN2X3BfdGl0bGVcIiwgYnV0dG9uOiBcIlwiIH0sXG4gIG11bHRpcGxldGV4dDoge1xuICAgIHJvb3Q6IFwic3ZfcV9tdFwiLFxuICAgIGl0ZW1UaXRsZTogXCJzdl9xX210X3RpdGxlXCIsXG4gICAgcm93OiBcInN2X3FfbXRfcm93XCIsXG4gICAgaXRlbVZhbHVlOiBcInN2X3FfbXRfaXRlbV92YWx1ZSBzdl9xX3RleHRfcm9vdFwiXG4gIH0sXG4gIHJhZGlvZ3JvdXA6IHtcbiAgICByb290OiBcInN2X3FjYmNcIixcbiAgICBpdGVtOiBcInN2X3FfcmFkaW9ncm91cFwiLFxuICAgIGxhYmVsOiBcInN2X3FfcmFkaW9ncm91cF9sYWJlbFwiLFxuICAgIGl0ZW1Db250cm9sOiBcInN2X3FfcmFkaW9ncm91cF9jb250cm9sX2l0ZW1cIixcbiAgICBjb250cm9sTGFiZWw6IFwiXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9vdGhlciBzdl9xX3JhZGlvZ3JvdXBfb3RoZXJcIlxuICB9LFxuICByYXRpbmc6IHtcbiAgICByb290OiBcInN2X3FfcmF0aW5nXCIsXG4gICAgaXRlbTogXCJzdl9xX3JhdGluZ19pdGVtXCIsXG4gICAgc2VsZWN0ZWQ6IFwiYWN0aXZlXCIsXG4gICAgbWluVGV4dDogXCJzdl9xX3JhdGluZ19taW5fdGV4dFwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiLFxuICAgIG1heFRleHQ6IFwic3ZfcV9yYXRpbmdfbWF4X3RleHRcIlxuICB9LFxuICB0ZXh0OiBcInN2X3FfdGV4dF9yb290XCIsXG4gIGV4cHJlc3Npb246IFwiXCIsXG4gIGZpbGU6IHtcbiAgICByb290OiBcInN2X3FfZmlsZVwiLFxuICAgIHBsYWNlaG9sZGVySW5wdXQ6IFwic3ZfcV9maWxlX3BsYWNlaG9sZGVyXCIsXG4gICAgcHJldmlldzogXCJzdl9xX2ZpbGVfcHJldmlld1wiLFxuICAgIHJlbW92ZUJ1dHRvbjogXCJzdl9xX2ZpbGVfcmVtb3ZlX2J1dHRvblwiXG4gIH0sXG4gIHNhdmVEYXRhOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBzYXZpbmc6IFwiXCIsXG4gICAgZXJyb3I6IFwiXCIsXG4gICAgc3VjY2VzczogXCJcIixcbiAgICBzYXZlQWdhaW5CdXR0b246IFwiXCJcbiAgfSxcbiAgd2luZG93OiB7XG4gICAgcm9vdDogXCJzdl93aW5kb3dcIixcbiAgICBib2R5OiBcInN2X3dpbmRvd19jb250ZW50XCIsXG4gICAgaGVhZGVyOiB7XG4gICAgICByb290OiBcInN2X3dpbmRvd190aXRsZVwiLFxuICAgICAgdGl0bGU6IFwiXCIsXG4gICAgICBidXR0b246IFwiXCIsXG4gICAgICBidXR0b25FeHBhbmRlZDogXCJcIixcbiAgICAgIGJ1dHRvbkNvbGxhcHNlZDogXCJcIlxuICAgIH1cbiAgfVxufTtcblxuc3VydmV5Q3NzW1wic3RhbmRhcmRcIl0gPSBkZWZhdWx0U3RhbmRhcmRDc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3NzdGFuZGFyZC50cyIsImltcG9ydCB7IEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IENvbmRpdGlvbnNQYXJzZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zUGFyc2VyXCI7XG5pbXBvcnQgeyBGdW5jdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9mdW5jdGlvbnNmYWN0b3J5XCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcblxuZXhwb3J0IGNsYXNzIE9wZXJhbmQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgb3JpZ2lvbmFsVmFsdWU6IGFueSkge31cbiAgcHVibGljIGdldFZhbHVlKHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlKTogYW55IHtcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRTaW1wbGVWYWx1ZSh0aGlzLm9yaWdpb25hbFZhbHVlKTtcbiAgICBpZiAocmVzLmlzU2ltcGxlKSByZXR1cm4gcmVzLnZhbHVlO1xuICAgIHZhciB2YWwgPSB0aGlzLnJlbW92ZVF1b3Rlc0FuZEVzY2FwZXModGhpcy5vcmlnaW9uYWxWYWx1ZSk7XG4gICAgaWYgKHByb2Nlc3NWYWx1ZSkge1xuICAgICAgdmFyIG5hbWUgPSB0aGlzLmdldFZhbHVlTmFtZSh2YWwpO1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgaWYgKCFwcm9jZXNzVmFsdWUuaGFzVmFsdWUobmFtZSkpIHJldHVybiBudWxsO1xuICAgICAgICB2YWwgPSBwcm9jZXNzVmFsdWUuZ2V0VmFsdWUobmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNpbXBsZVZhbHVlKHZhbCkudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBpc0Jvb2xlYW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNCb29sZWFuVmFsdWUodGhpcy5vcmlnaW9uYWxWYWx1ZSk7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgdmFyIHZhbCA9IHRoaXMub3JpZ2lvbmFsVmFsdWU7XG4gICAgaWYgKHZhbCAmJiAoIXRoaXMuaXNOdW1lcmljKHZhbCkgJiYgIXRoaXMuaXNCb29sZWFuVmFsdWUodmFsKSkpXG4gICAgICB2YWwgPSBcIidcIiArIHZhbCArIFwiJ1wiO1xuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHJpdmF0ZSByZW1vdmVRdW90ZXNBbmRFc2NhcGVzKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsLmxlbmd0aCA+IDAgJiYgKHZhbFswXSA9PSBcIidcIiB8fCB2YWxbMF0gPT0gJ1wiJykpIHZhbCA9IHZhbC5zdWJzdHIoMSk7XG4gICAgdmFyIGxlbiA9IHZhbC5sZW5ndGg7XG4gICAgaWYgKGxlbiA+IDAgJiYgKHZhbFtsZW4gLSAxXSA9PSBcIidcIiB8fCB2YWxbbGVuIC0gMV0gPT0gJ1wiJykpXG4gICAgICB2YWwgPSB2YWwuc3Vic3RyKDAsIGxlbiAtIDEpO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKFwiXFxcXCdcIiwgXCInXCIpO1xuICAgICAgdmFsID0gdmFsLnJlcGxhY2UoJ1xcXFxcIicsICdcIicpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVOYW1lKHZhbDogYW55KSB7XG4gICAgaWYgKHZhbC5sZW5ndGggPCAzIHx8IHZhbFswXSAhPSBcIntcIiB8fCB2YWxbdmFsLmxlbmd0aCAtIDFdICE9IFwifVwiKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHZhbC5zdWJzdHIoMSwgdmFsLmxlbmd0aCAtIDIpO1xuICB9XG4gIHByaXZhdGUgaXNCb29sZWFuVmFsdWUodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiIHx8IHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwiZmFsc2VcIilcbiAgICApO1xuICB9XG4gIHByaXZhdGUgaXNOdW1lcmljKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgKHZhbHVlLmluZGV4T2YoXCItXCIpID4gLTEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIitcIikgPiAxIHx8XG4gICAgICAgIHZhbHVlLmluZGV4T2YoXCIqXCIpID4gLTEgfHxcbiAgICAgICAgdmFsdWUuaW5kZXhPZihcIi9cIikgPiAtMSB8fFxuICAgICAgICB2YWx1ZS5pbmRleE9mKFwiJVwiKSA+IC0xKVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgaWYgKGlzTmFOKHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaXNGaW5pdGUodmFsKTtcbiAgfVxuICBwcml2YXRlIGdldFNpbXBsZVZhbHVlKHZhbDogYW55KTogYW55IHtcbiAgICB2YXIgcmVzID0geyBpc1NpbXBsZTogZmFsc2UsIHZhbHVlOiB2YWwgfTtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXMudmFsdWUgPSBudWxsO1xuICAgICAgcmVzLmlzU2ltcGxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGlmICghdmFsIHx8IHR5cGVvZiB2YWwgIT0gXCJzdHJpbmdcIikge1xuICAgICAgcmVzLmlzU2ltcGxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzTnVtZXJpYyh2YWwpKSB7XG4gICAgICByZXMuaXNTaW1wbGUgPSB0cnVlO1xuICAgICAgcmVzLnZhbHVlID0gcGFyc2VGbG9hdCh2YWwpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNCb29sZWFuVmFsdWUodmFsKSkge1xuICAgICAgcmVzLnZhbHVlID0gdmFsLnRvTG93ZXJDYXNlKCkgPT0gXCJ0cnVlXCI7XG4gICAgICByZXMuaXNTaW1wbGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uT3BlcmFuZCBleHRlbmRzIE9wZXJhbmQge1xuICBwdWJsaWMgcGFyYW1ldGVyczogQXJyYXk8T3BlcmFuZD4gPSBuZXcgQXJyYXk8T3BlcmFuZD4oKTtcbiAgY29uc3RydWN0b3IocHVibGljIG9yaWdpb25hbFZhbHVlOiBhbnkpIHtcbiAgICBzdXBlcihvcmlnaW9uYWxWYWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlKSB7XG4gICAgdmFyIHBhcmFtVmFsdWVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHBhcmFtVmFsdWVzLnB1c2godGhpcy5wYXJhbWV0ZXJzW2ldLmdldFZhbHVlKHByb2Nlc3NWYWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJ1bih0aGlzLm9yaWdpb25hbFZhbHVlLCBwYXJhbVZhbHVlcyk7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHZhciByZXMgPSB0aGlzLm9yaWdpb25hbFZhbHVlICsgXCIoXCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtZXRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpID4gMCkgcmVzICs9IFwiLCBcIjtcbiAgICAgIHJlcyArPSB0aGlzLnBhcmFtZXRlcnNbaV0udG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25PcGVyYW5kIGV4dGVuZHMgT3BlcmFuZCB7XG4gIHB1YmxpYyBsZWZ0OiBPcGVyYW5kO1xuICBwdWJsaWMgcmlnaHQ6IE9wZXJhbmQ7XG4gIHB1YmxpYyBvcGVyYXRvcjogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihudWxsKTtcbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUocHJvY2Vzc1ZhbHVlOiBQcm9jZXNzVmFsdWUpOiBhbnkge1xuICAgIGlmICghdGhpcy5sZWZ0IHx8ICF0aGlzLnJpZ2h0KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgbCA9IHRoaXMubGVmdC5nZXRWYWx1ZShwcm9jZXNzVmFsdWUpO1xuICAgIHZhciByID0gdGhpcy5yaWdodC5nZXRWYWx1ZShwcm9jZXNzVmFsdWUpO1xuICAgIGlmICh0aGlzLm9wZXJhdG9yID09IFwiK1wiKSB7XG4gICAgICByZXR1cm4gbCArIHI7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wZXJhdG9yID09IFwiLVwiKSB7XG4gICAgICByZXR1cm4gbCAtIHI7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wZXJhdG9yID09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gbCAqIHI7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wZXJhdG9yID09IFwiL1wiKSB7XG4gICAgICBpZiAoIXIpIHJldHVybiBudWxsO1xuICAgICAgcmV0dXJuIGwgLyByO1xuICAgIH1cbiAgICBpZiAodGhpcy5vcGVyYXRvciA9PSBcIiVcIikge1xuICAgICAgaWYgKCFyKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBsICUgcjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHZhciByZXMgPSB0aGlzLmxlZnQgPyB0aGlzLmxlZnQudG9TdHJpbmcoKSA6IFwiXCI7XG4gICAgcmVzICs9IFwiIFwiICsgdGhpcy5vcGVyYXRvciArIFwiIFwiO1xuICAgIGlmICh0aGlzLnJpZ2h0KSByZXMgKz0gdGhpcy5yaWdodC50b1N0cmluZygpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25PcGVyYW5kIGV4dGVuZHMgT3BlcmFuZCB7XG4gIHB1YmxpYyByb290OiBDb25kaXRpb25Ob2RlO1xuICBwcml2YXRlIHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlO1xuICBjb25zdHJ1Y3Rvcihyb290OiBDb25kaXRpb25Ob2RlID0gbnVsbCkge1xuICAgIHN1cGVyKG51bGwpO1xuICAgIGlmIChyb290KSB0aGlzLnJvb3QgPSByb290O1xuICB9XG4gIHB1YmxpYyBnZXRWYWx1ZShwcm9jZXNzVmFsdWU6IFByb2Nlc3NWYWx1ZSk6IGFueSB7XG4gICAgaWYgKCF0aGlzLnJvb3QpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnByb2Nlc3NWYWx1ZSA9IHByb2Nlc3NWYWx1ZTtcbiAgICByZXR1cm4gdGhpcy5ydW5Ob2RlKHRoaXMucm9vdCk7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm9vdCA/IHRoaXMucm9vdC50b1N0cmluZygpIDogXCJcIjtcbiAgfVxuICBwcml2YXRlIHJ1bk5vZGUobm9kZTogQ29uZGl0aW9uTm9kZSk6IGJvb2xlYW4ge1xuICAgIHZhciBvbkZpcnN0RmFpbCA9IG5vZGUuY29ubmVjdGl2ZSA9PSBcImFuZFwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJlcyA9IHRoaXMucnVuTm9kZUNvbmRpdGlvbihub2RlLmNoaWxkcmVuW2ldKTtcbiAgICAgIGlmICghcmVzICYmIG9uRmlyc3RGYWlsKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAocmVzICYmICFvbkZpcnN0RmFpbCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBvbkZpcnN0RmFpbDtcbiAgfVxuICBwcml2YXRlIHJ1bk5vZGVDb25kaXRpb24odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZVtcImNoaWxkcmVuXCJdKSByZXR1cm4gdGhpcy5ydW5Ob2RlKHZhbHVlKTtcbiAgICBpZiAodmFsdWVbXCJsZWZ0XCJdKSByZXR1cm4gdGhpcy5ydW5Db25kaXRpb24odmFsdWUpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb25kaXRpb24ucGVyZm9ybUV4cGxpY2l0KFxuICAgICAgY29uZGl0aW9uLmxlZnQsXG4gICAgICBjb25kaXRpb24ucmlnaHQsXG4gICAgICB0aGlzLnByb2Nlc3NWYWx1ZVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbiB7XG4gIHN0YXRpYyBvcGVyYXRvcnNWYWx1ZTogSGFzaFRhYmxlPEZ1bmN0aW9uPiA9IG51bGw7XG4gIHN0YXRpYyBnZXQgb3BlcmF0b3JzKCkge1xuICAgIGlmIChDb25kaXRpb24ub3BlcmF0b3JzVmFsdWUgIT0gbnVsbCkgcmV0dXJuIENvbmRpdGlvbi5vcGVyYXRvcnNWYWx1ZTtcbiAgICBDb25kaXRpb24ub3BlcmF0b3JzVmFsdWUgPSB7XG4gICAgICBlbXB0eTogZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhbGVmdDtcbiAgICAgIH0sXG4gICAgICBub3RlbXB0eTogZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gISFsZWZ0O1xuICAgICAgfSxcbiAgICAgIGVxdWFsOiBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgICAgICBpZiAoKGxlZnQgPT0gbnVsbCAmJiByaWdodCAhPSBudWxsKSB8fCAobGVmdCAhPSBudWxsICYmIHJpZ2h0ID09IG51bGwpKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGxlZnQgPT0gcmlnaHQ7XG4gICAgICB9LFxuICAgICAgbm90ZXF1YWw6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGlmICgobGVmdCA9PSBudWxsICYmIHJpZ2h0ICE9IG51bGwpIHx8IChsZWZ0ICE9IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkpXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChsZWZ0ID09IG51bGwgJiYgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbGVmdCAhPSByaWdodDtcbiAgICAgIH0sXG4gICAgICBjb250YWluczogZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIENvbmRpdGlvbi5vcGVyYXRvcnNWYWx1ZS5jb250YWluc0NvcmUobGVmdCwgcmlnaHQsIHRydWUpO1xuICAgICAgfSxcbiAgICAgIG5vdGNvbnRhaW5zOiBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgICAgICByZXR1cm4gQ29uZGl0aW9uLm9wZXJhdG9yc1ZhbHVlLmNvbnRhaW5zQ29yZShsZWZ0LCByaWdodCwgZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGNvbnRhaW5zQ29yZTogZnVuY3Rpb24obGVmdCwgcmlnaHQsIGlzQ29udGFpbnMpIHtcbiAgICAgICAgaWYgKCFsZWZ0KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICghbGVmdC5sZW5ndGgpIHtcbiAgICAgICAgICBsZWZ0ID0gbGVmdC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbGVmdCA9PT0gXCJzdHJpbmdcIiB8fCBsZWZ0IGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgICAgaWYgKCFyaWdodCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIHJpZ2h0ID0gcmlnaHQudG9TdHJpbmcoKTtcbiAgICAgICAgICB2YXIgZm91bmQgPSBsZWZ0LmluZGV4T2YocmlnaHQpID4gLTE7XG4gICAgICAgICAgcmV0dXJuIGlzQ29udGFpbnMgPyBmb3VuZCA6ICFmb3VuZDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlZnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAobGVmdFtpXSA9PSByaWdodCkgcmV0dXJuIGlzQ29udGFpbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFpc0NvbnRhaW5zO1xuICAgICAgfSxcbiAgICAgIGdyZWF0ZXI6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbGVmdCA+IHJpZ2h0O1xuICAgICAgfSxcbiAgICAgIGxlc3M6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbGVmdCA8IHJpZ2h0O1xuICAgICAgfSxcbiAgICAgIGdyZWF0ZXJvcmVxdWFsOiBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgICAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGxlZnQgPj0gcmlnaHQ7XG4gICAgICB9LFxuICAgICAgbGVzc29yZXF1YWw6IGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGlmIChsZWZ0ID09IG51bGwgfHwgcmlnaHQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbGVmdCA8PSByaWdodDtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDb25kaXRpb24ub3BlcmF0b3JzVmFsdWU7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXRPcGVyYXRvcihvcE5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5vcGVyYXRvcnNbb3BOYW1lXTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIHNldE9wZXJhdG9yKFxuICAgIG9wTmFtZTogc3RyaW5nLFxuICAgIGZ1bmM6IChsZWZ0OiBhbnksIHJpZ2h0OiBhbnkpID0+IGJvb2xlYW5cbiAgKSB7XG4gICAgQ29uZGl0aW9uLm9wZXJhdG9yc1tvcE5hbWVdID0gZnVuYztcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzQ29ycmVjdE9wZXJhdG9yKG9wTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFvcE5hbWUpIHJldHVybiBmYWxzZTtcbiAgICBvcE5hbWUgPSBvcE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gQ29uZGl0aW9uLm9wZXJhdG9yc1tvcE5hbWVdICE9IHVuZGVmaW5lZDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGlzTm9SaWdodE9wZXJhdGlvbihvcDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG9wID09IFwiZW1wdHlcIiB8fCBvcCA9PSBcIm5vdGVtcHR5XCI7XG4gIH1cbiAgcHJpdmF0ZSBvcFZhbHVlOiBzdHJpbmcgPSBcImVxdWFsXCI7XG4gIHByaXZhdGUgbGVmdFZhbHVlOiBPcGVyYW5kID0gbnVsbDtcbiAgcHJpdmF0ZSByaWdodFZhbHVlOiBPcGVyYW5kID0gbnVsbDtcbiAgcHVibGljIGdldCBsZWZ0KCk6IE9wZXJhbmQge1xuICAgIHJldHVybiB0aGlzLmxlZnRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGxlZnQodmFsOiBPcGVyYW5kKSB7XG4gICAgdGhpcy5sZWZ0VmFsdWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCByaWdodCgpOiBPcGVyYW5kIHtcbiAgICByZXR1cm4gdGhpcy5yaWdodFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgcmlnaHQodmFsOiBPcGVyYW5kKSB7XG4gICAgdGhpcy5yaWdodFZhbHVlID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgb3BlcmF0b3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5vcFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgb3BlcmF0b3IodmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdmFsdWUpIHJldHVybjtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFDb25kaXRpb24ub3BlcmF0b3JzW3ZhbHVlXSkgcmV0dXJuO1xuICAgIHRoaXMub3BWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBwZXJmb3JtKFxuICAgIGxlZnQ6IGFueSA9IG51bGwsXG4gICAgcmlnaHQ6IGFueSA9IG51bGwsXG4gICAgcHJvY2Vzc1ZhbHVlOiBQcm9jZXNzVmFsdWUgPSBudWxsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghbGVmdCkgbGVmdCA9IHRoaXMubGVmdDtcbiAgICBpZiAoIXJpZ2h0KSByaWdodCA9IHRoaXMucmlnaHQ7XG4gICAgcmV0dXJuIHRoaXMucGVyZm9ybUV4cGxpY2l0KGxlZnQsIHJpZ2h0LCBwcm9jZXNzVmFsdWUpO1xuICB9XG4gIHB1YmxpYyBwZXJmb3JtRXhwbGljaXQoXG4gICAgbGVmdDogYW55LFxuICAgIHJpZ2h0OiBhbnksXG4gICAgcHJvY2Vzc1ZhbHVlOiBQcm9jZXNzVmFsdWVcbiAgKTogYm9vbGVhbiB7XG4gICAgdmFyIGxlZnRWYWx1ZSA9IGxlZnQgPyBsZWZ0LmdldFZhbHVlKHByb2Nlc3NWYWx1ZSkgOiBudWxsO1xuICAgIGlmICghcmlnaHQgJiYgKGxlZnRWYWx1ZSA9PT0gdHJ1ZSB8fCBsZWZ0VmFsdWUgPT09IGZhbHNlKSkgcmV0dXJuIGxlZnRWYWx1ZTtcbiAgICB2YXIgcmlnaHRWYWx1ZSA9IHJpZ2h0ID8gcmlnaHQuZ2V0VmFsdWUocHJvY2Vzc1ZhbHVlKSA6IG51bGw7XG4gICAgcmV0dXJuIENvbmRpdGlvbi5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0obGVmdFZhbHVlLCByaWdodFZhbHVlKTtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucmlnaHQgfHwgIXRoaXMub3BlcmF0b3IpIHJldHVybiBcIlwiO1xuICAgIHZhciBsZWZ0ID0gdGhpcy5sZWZ0LnRvU3RyaW5nKCk7XG4gICAgdmFyIHJlcyA9IGxlZnQgKyBcIiBcIiArIHRoaXMub3BlcmF0aW9uVG9TdHJpbmcoKTtcbiAgICBpZiAoQ29uZGl0aW9uLmlzTm9SaWdodE9wZXJhdGlvbih0aGlzLm9wZXJhdG9yKSkgcmV0dXJuIHJlcztcbiAgICB2YXIgcmlnaHQgPSB0aGlzLnJpZ2h0LnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIHJlcyArIFwiIFwiICsgcmlnaHQ7XG4gIH1cbiAgcHJpdmF0ZSBvcGVyYXRpb25Ub1N0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciBvcCA9IHRoaXMub3BlcmF0b3I7XG4gICAgaWYgKG9wID09IFwiZXF1YWxcIikgcmV0dXJuIFwiPVwiO1xuICAgIGlmIChvcCA9PSBcIm5vdGVxdWFsXCIpIHJldHVybiBcIiE9XCI7XG4gICAgaWYgKG9wID09IFwiZ3JlYXRlclwiKSByZXR1cm4gXCI+XCI7XG4gICAgaWYgKG9wID09IFwibGVzc1wiKSByZXR1cm4gXCI8XCI7XG4gICAgaWYgKG9wID09IFwiZ3JlYXRlcm9yZXF1YWxcIikgcmV0dXJuIFwiPj1cIjtcbiAgICBpZiAob3AgPT0gXCJsZXNzb3JlcXVhbFwiKSByZXR1cm4gXCI8PVwiO1xuICAgIHJldHVybiBvcDtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbk5vZGUge1xuICBwcml2YXRlIGNvbm5lY3RpdmVWYWx1ZTogc3RyaW5nID0gXCJhbmRcIjtcbiAgcHVibGljIGNoaWxkcmVuOiBBcnJheTxhbnk+ID0gW107XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHt9XG4gIHB1YmxpYyBnZXQgY29ubmVjdGl2ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3RpdmVWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbm5lY3RpdmUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdmFsdWUpIHJldHVybjtcbiAgICB2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHZhbHVlID09IFwiJlwiIHx8IHZhbHVlID09IFwiJiZcIikgdmFsdWUgPSBcImFuZFwiO1xuICAgIGlmICh2YWx1ZSA9PSBcInxcIiB8fCB2YWx1ZSA9PSBcInx8XCIpIHZhbHVlID0gXCJvclwiO1xuICAgIGlmICh2YWx1ZSAhPSBcImFuZFwiICYmIHZhbHVlICE9IFwib3JcIikgcmV0dXJuO1xuICAgIHRoaXMuY29ubmVjdGl2ZVZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PSAwO1xuICB9XG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgdGhpcy5jb25uZWN0aXZlID0gXCJhbmRcIjtcbiAgfVxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0VtcHR5KSByZXR1cm4gXCJcIjtcbiAgICB2YXIgcmVzID0gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgICB2YXIgbm9kZVRleHQgPSBjaGlsZC50b1N0cmluZygpO1xuICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbm9kZVRleHQgPSBcIihcIiArIG5vZGVUZXh0ICsgXCIpXCI7XG4gICAgICB9XG4gICAgICBpZiAobm9kZVRleHQpIHtcbiAgICAgICAgaWYgKHJlcykgcmVzICs9IFwiIFwiICsgdGhpcy5jb25uZWN0aXZlICsgXCIgXCI7XG4gICAgICAgIHJlcyArPSBub2RlVGV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25SdW5uZXIge1xuICBwcml2YXRlIGV4cHJlc3Npb25WYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIHByb2Nlc3NWYWx1ZTogUHJvY2Vzc1ZhbHVlO1xuICBwcml2YXRlIG9wZXJhbmQ6IE9wZXJhbmQ7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uO1xuICAgIHRoaXMucHJvY2Vzc1ZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmV4cHJlc3Npb25WYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmV4cHJlc3Npb24gPT0gdmFsdWUpIHJldHVybjtcbiAgICB0aGlzLmV4cHJlc3Npb25WYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub3BlcmFuZCA9IG5ldyBDb25kaXRpb25zUGFyc2VyKCkucGFyc2VFeHByZXNzaW9uKHRoaXMuZXhwcmVzc2lvblZhbHVlKTtcbiAgfVxuICBwdWJsaWMgcnVuKHZhbHVlczogSGFzaFRhYmxlPGFueT4pOiBhbnkge1xuICAgIGlmICghdGhpcy5vcGVyYW5kKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLnByb2Nlc3NWYWx1ZS52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgcmV0dXJuIHRoaXMub3BlcmFuZC5nZXRWYWx1ZSh0aGlzLnByb2Nlc3NWYWx1ZSk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25SdW5uZXIge1xuICBwcml2YXRlIGV4cHJlc3Npb25WYWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIHJvb3Q6IENvbmRpdGlvbk5vZGU7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihleHByZXNzaW9uOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJvb3QgPSBuZXcgQ29uZGl0aW9uTm9kZSgpO1xuICAgIHRoaXMuZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247XG4gIH1cbiAgcHVibGljIGdldCBleHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvblZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZXhwcmVzc2lvbiA9PSB2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuZXhwcmVzc2lvblZhbHVlID0gdmFsdWU7XG4gICAgbmV3IENvbmRpdGlvbnNQYXJzZXIoKS5wYXJzZSh0aGlzLmV4cHJlc3Npb25WYWx1ZSwgdGhpcy5yb290KTtcbiAgfVxuICBwdWJsaWMgcnVuKHZhbHVlczogSGFzaFRhYmxlPGFueT4pOiBib29sZWFuIHtcbiAgICB2YXIgY29uZGl0aW9uID0gbmV3IENvbmRpdGlvbk9wZXJhbmQodGhpcy5yb290KTtcbiAgICB2YXIgcHJvY2Vzc1ZhbHVlID0gbmV3IFByb2Nlc3NWYWx1ZSgpO1xuICAgIHByb2Nlc3NWYWx1ZS52YWx1ZXMgPSB2YWx1ZXM7XG4gICAgcmV0dXJuIDxib29sZWFuPmNvbmRpdGlvbi5nZXRWYWx1ZShwcm9jZXNzVmFsdWUpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uZGl0aW9ucy50cyIsImltcG9ydCB7IEhlbHBlcnMsIEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFByb2Nlc3NWYWx1ZSB7XG4gIHB1YmxpYyB2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+ID0gbnVsbDtcbiAgY29uc3RydWN0b3IoKSB7fVxuICBwdWJsaWMgZ2V0Rmlyc3ROYW1lKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICB2YXIgcmVzID0gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaCA9IHRleHRbaV07XG4gICAgICBpZiAoY2ggPT0gXCIuXCIgfHwgY2ggPT0gXCJbXCIpIGJyZWFrO1xuICAgICAgcmVzICs9IGNoO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBoYXNWYWx1ZSh0ZXh0OiBzdHJpbmcsIHZhbHVlczogSGFzaFRhYmxlPGFueT4gPSBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWx1ZXMpIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuICAgIHZhciByZXMgPSB0aGlzLmdldFZhbHVlQ29yZSh0ZXh0LCB2YWx1ZXMpO1xuICAgIHJldHVybiByZXMuaGFzVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBIYXNoVGFibGU8YW55PiA9IG51bGwpOiBhbnkge1xuICAgIGlmICghdmFsdWVzKSB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcbiAgICB2YXIgcmVzID0gdGhpcy5nZXRWYWx1ZUNvcmUodGV4dCwgdmFsdWVzKTtcbiAgICByZXR1cm4gcmVzLnZhbHVlO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVDb3JlKHRleHQ6IHN0cmluZywgdmFsdWVzOiBhbnkpOiBhbnkge1xuICAgIHZhciByZXMgPSB7IGhhc1ZhbHVlOiBmYWxzZSwgdmFsdWU6IG51bGwgfTtcbiAgICB2YXIgY3VyVmFsdWUgPSB2YWx1ZXM7XG4gICAgaWYgKCFjdXJWYWx1ZSkgcmV0dXJuIHJlcztcbiAgICB2YXIgaXNGaXJzdCA9IHRydWU7XG4gICAgd2hpbGUgKHRleHQgJiYgdGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgaXNBcnJheSA9ICFpc0ZpcnN0ICYmIHRleHRbMF0gPT0gXCJbXCI7XG4gICAgICBpZiAoIWlzQXJyYXkpIHtcbiAgICAgICAgaWYgKCFpc0ZpcnN0KSB0ZXh0ID0gdGV4dC5zdWJzdHIoMSk7XG4gICAgICAgIHZhciBjdXJOYW1lID0gdGhpcy5nZXRGaXJzdE5hbWUodGV4dCk7XG4gICAgICAgIGlmICghY3VyTmFtZSkgcmV0dXJuIHJlcztcbiAgICAgICAgaWYgKEhlbHBlcnMuaXNWYWx1ZUVtcHR5KGN1clZhbHVlW2N1ck5hbWVdKSkgcmV0dXJuIHJlcztcbiAgICAgICAgY3VyVmFsdWUgPSBjdXJWYWx1ZVtjdXJOYW1lXTtcbiAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyKGN1ck5hbWUubGVuZ3RoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJWYWx1ZSkpIHJldHVybiByZXM7XG4gICAgICAgIHZhciBpbmRleCA9IDE7XG4gICAgICAgIHZhciBzdHIgPSBcIlwiO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0W2luZGV4XSAhPSBcIl1cIikge1xuICAgICAgICAgIHN0ciArPSB0ZXh0W2luZGV4XTtcbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSBpbmRleCA8IHRleHQubGVuZ3RoID8gdGV4dC5zdWJzdHIoaW5kZXggKyAxKSA6IFwiXCI7XG4gICAgICAgIGluZGV4ID0gdGhpcy5nZXRJbnRWYWx1ZShzdHIpO1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGN1clZhbHVlLmxlbmd0aCkgcmV0dXJuIHJlcztcbiAgICAgICAgY3VyVmFsdWUgPSBjdXJWYWx1ZVtpbmRleF07XG4gICAgICB9XG4gICAgICBpc0ZpcnN0ID0gZmFsc2U7XG4gICAgfVxuICAgIHJlcy52YWx1ZSA9IGN1clZhbHVlO1xuICAgIHJlcy5oYXNWYWx1ZSA9IHRydWU7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGdldEludFZhbHVlKHN0cjogYW55KSB7XG4gICAgaWYgKHN0ciA9PSBcIjBcIiB8fCAoKHN0ciB8IDApID4gMCAmJiBzdHIgJSAxID09IDApKSByZXR1cm4gTnVtYmVyKHN0cik7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uZGl0aW9uUHJvY2Vzc1ZhbHVlLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7XG4gIFF1ZXN0aW9uU2VsZWN0QmFzZSxcbiAgUXVlc3Rpb25DaGVja2JveEJhc2Vcbn0gZnJvbSBcIi4uL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uU2VsZWN0QmFzZUltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25JbXBsZW1lbnRvciB7XG4gIGtvT3RoZXJWaXNpYmxlOiBhbnk7XG4gIGtvVmlzaWJsZUNob2ljZXM6IGFueTtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHRoaXMua29PdGhlclZpc2libGUgPSBrby5jb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29WYWx1ZSgpO1xuICAgICAgcmV0dXJuIHNlbGYuaXNPdGhlclNlbGVjdGVkO1xuICAgIH0pO1xuICAgIHRoaXMua29WaXNpYmxlQ2hvaWNlcyA9IGtvLm9ic2VydmFibGVBcnJheShcbiAgICAgICg8UXVlc3Rpb25DaGVja2JveEJhc2U+c2VsZi5xdWVzdGlvbikudmlzaWJsZUNob2ljZXNcbiAgICApO1xuICAgICg8UXVlc3Rpb25DaGVja2JveEJhc2U+cXVlc3Rpb24pLmNob2ljZXNDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29WaXNpYmxlQ2hvaWNlcyhcbiAgICAgICAgKDxRdWVzdGlvbkNoZWNrYm94QmFzZT5zZWxmLnF1ZXN0aW9uKS52aXNpYmxlQ2hvaWNlc1xuICAgICAgKTtcbiAgICB9O1xuICAgIHRoaXMucXVlc3Rpb25bXCJrb090aGVyVmlzaWJsZVwiXSA9IHRoaXMua29PdGhlclZpc2libGU7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvVmlzaWJsZUNob2ljZXNcIl0gPSB0aGlzLmtvVmlzaWJsZUNob2ljZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBpc090aGVyU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICg8UXVlc3Rpb25TZWxlY3RCYXNlPnRoaXMucXVlc3Rpb24pLmlzT3RoZXJTZWxlY3RlZDtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvblNlbGVjdEJhc2VJbXBsZW1lbnRvciB7XG4gIGtvV2lkdGg6IGFueTtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHRoaXMua29XaWR0aCA9IGtvLm9ic2VydmFibGUodGhpcy5jb2xXaWR0aCk7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvV2lkdGhcIl0gPSB0aGlzLmtvV2lkdGg7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvQWZ0ZXJSZW5kZXJcIl0gPSB0aGlzLmtvQWZ0ZXJSZW5kZXI7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICg8UXVlc3Rpb25DaGVja2JveEJhc2U+dGhpcy5xdWVzdGlvbikuY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25Db2xDb3VudENoYW5nZWQoKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbENvdW50Q2hhbmdlZCgpIHtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29XaWR0aFwiXSA9IGtvLm9ic2VydmFibGUodGhpcy5jb2xXaWR0aCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCBjb2xXaWR0aCgpOiBzdHJpbmcge1xuICAgIHZhciBjb2xDb3VudCA9ICg8UXVlc3Rpb25DaGVja2JveEJhc2U+dGhpcy5xdWVzdGlvbikuY29sQ291bnQ7XG4gICAgcmV0dXJuIGNvbENvdW50ID4gMCA/IDEwMCAvIGNvbENvdW50ICsgXCIlXCIgOiBcIlwiO1xuICB9XG4gIHByaXZhdGUga29BZnRlclJlbmRlcihlbCwgY29uKSB7XG4gICAgdmFyIHRFbCA9IGVsWzBdO1xuICAgIGlmICh0RWwubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB0RWwuZGF0YSA9IFwiXCI7XG4gICAgdEVsID0gZWxbZWwubGVuZ3RoIC0gMV07XG4gICAgaWYgKHRFbC5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHRFbC5kYXRhID0gXCJcIjtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fYmFzZXNlbGVjdC50cyIsImltcG9ydCB7XG4gIEpzb25PYmplY3QsXG4gIEN1c3RvbVByb3BlcnRpZXNDb2xsZWN0aW9uLFxuICBKc29uT2JqZWN0UHJvcGVydHlcbn0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSGFzaFRhYmxlLCBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgQmFzZSxcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlJbXBsLFxuICBJVGV4dFByb2Nlc3NvcixcbiAgU3VydmV5RXJyb3Jcbn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgVGV4dFByZVByb2Nlc3NvciwgVGV4dFByZVByb2Nlc3NvclZhbHVlIH0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7XG4gIFF1ZXN0aW9uU2VsZWN0QmFzZSxcbiAgUXVlc3Rpb25DaGVja2JveEJhc2Vcbn0gZnJvbSBcIi4vcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSBcIi4vcXVlc3Rpb25fZHJvcGRvd25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB9IGZyb20gXCIuL3F1ZXN0aW9uX2NoZWNrYm94XCI7XG5pbXBvcnQgeyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCB9IGZyb20gXCIuL3F1ZXN0aW9uX3JhZGlvZ3JvdXBcIjtcbmltcG9ydCB7IFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSBcIi4vcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Db21tZW50TW9kZWwgfSBmcm9tIFwiLi9xdWVzdGlvbl9jb21tZW50XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jvb2xlYW5cIjtcbmltcG9ydCB7IENob2ljZXNSZXN0ZnVsbCB9IGZyb20gXCIuL2Nob2ljZXNSZXN0ZnVsbFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgU3VydmV5VmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBDdXN0b21XaWRnZXRDb2xsZWN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25DdXN0b21XaWRnZXRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeERyb3Bkb3duRGF0YSB7XG4gIG9uUm93Q2hhbmdlZChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICBuZXdSb3dWYWx1ZTogYW55XG4gICk7XG4gIHZhbGlkYXRlQ2VsbChcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICByb3dWYWx1ZTogYW55XG4gICk6IFN1cnZleUVycm9yO1xuICBjb2x1bW5zOiBBcnJheTxNYXRyaXhEcm9wZG93bkNvbHVtbj47XG4gIGNyZWF0ZVF1ZXN0aW9uKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtblxuICApOiBRdWVzdGlvbjtcbiAgZ2V0TG9jYWxlKCk6IHN0cmluZztcbiAgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZztcbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeENvbHVtbk93bmVyIGV4dGVuZHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBnZXRSZXF1aXJlZFRleHQoKTogc3RyaW5nO1xuICBvbkNvbHVtblByb3BlcnRpZXNDaGFuZ2VkKGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4pO1xuICBnZXRDZWxsVHlwZSgpOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihcbiAgY2VsbFF1ZXN0aW9uOiBRdWVzdGlvblNlbGVjdEJhc2UsXG4gIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLFxuICBkYXRhOiBhbnlcbikge1xuICBpZiAoY2VsbFF1ZXN0aW9uLmhhc090aGVyKSB7XG4gICAgY2VsbFF1ZXN0aW9uLnN0b3JlT3RoZXJzQXNDb21tZW50ID0gZmFsc2U7XG4gIH1cbiAgaWYgKFxuICAgICghY2VsbFF1ZXN0aW9uLmNob2ljZXMgfHwgY2VsbFF1ZXN0aW9uLmNob2ljZXMubGVuZ3RoID09IDApICYmXG4gICAgY2VsbFF1ZXN0aW9uLmNob2ljZXNCeVVybC5pc0VtcHR5XG4gICkge1xuICAgIGNlbGxRdWVzdGlvbi5jaG9pY2VzID0gcXVlc3Rpb24uY2hvaWNlcztcbiAgfVxuICBpZiAoIWNlbGxRdWVzdGlvbi5jaG9pY2VzQnlVcmwuaXNFbXB0eSkge1xuICAgIGNlbGxRdWVzdGlvbi5jaG9pY2VzQnlVcmwucnVuKGRhdGEpO1xuICB9XG59XG5leHBvcnQgdmFyIG1hdHJpeERyb3Bkb3duQ29sdW1uVHlwZXMgPSB7XG4gIGRyb3Bkb3duOiB7XG4gICAgcHJvcGVydGllczogW1xuICAgICAgXCJjaG9pY2VzXCIsXG4gICAgICBcImNob2ljZXNPcmRlclwiLFxuICAgICAgXCJjaG9pY2VzQnlVcmxcIixcbiAgICAgIFwib3B0aW9uc0NhcHRpb25cIixcbiAgICAgIFwib3RoZXJUZXh0XCJcbiAgICBdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoY2VsbFF1ZXN0aW9uLCBjb2x1bW4sIHF1ZXN0aW9uLCBkYXRhKSA9PiB7XG4gICAgICBvblVwZGF0ZVNlbGVjdEJhc2VDZWxsUXVlc3Rpb24oY2VsbFF1ZXN0aW9uLCBjb2x1bW4sIHF1ZXN0aW9uLCBkYXRhKTtcbiAgICAgIGlmICghY2VsbFF1ZXN0aW9uLm9wdGlvbnNDYXB0aW9uKVxuICAgICAgICBjZWxsUXVlc3Rpb24ub3B0aW9uc0NhcHRpb24gPSBxdWVzdGlvbi5vcHRpb25zQ2FwdGlvbjtcbiAgICB9XG4gIH0sXG4gIGNoZWNrYm94OiB7XG4gICAgcHJvcGVydGllczogW1wiY2hvaWNlc1wiLCBcImNob2ljZXNPcmRlclwiLCBcImNob2ljZXNCeVVybFwiLCBcIm90aGVyVGV4dFwiXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKGNlbGxRdWVzdGlvbiwgY29sdW1uLCBxdWVzdGlvbiwgZGF0YSkgPT4ge1xuICAgICAgb25VcGRhdGVTZWxlY3RCYXNlQ2VsbFF1ZXN0aW9uKGNlbGxRdWVzdGlvbiwgY29sdW1uLCBxdWVzdGlvbiwgZGF0YSk7XG4gICAgICBjZWxsUXVlc3Rpb24uY29sQ291bnQgPVxuICAgICAgICBjb2x1bW4uY29sQ291bnQgPiAtMSA/IGNvbHVtbi5jb2xDb3VudCA6IHF1ZXN0aW9uLmNvbHVtbkNvbENvdW50O1xuICAgIH1cbiAgfSxcbiAgcmFkaW9ncm91cDoge1xuICAgIHByb3BlcnRpZXM6IFtcImNob2ljZXNcIiwgXCJjaG9pY2VzT3JkZXJcIiwgXCJjaG9pY2VzQnlVcmxcIiwgXCJvdGhlclRleHRcIl0sXG4gICAgb25DZWxsUXVlc3Rpb25VcGRhdGU6IChjZWxsUXVlc3Rpb24sIGNvbHVtbiwgcXVlc3Rpb24sIGRhdGEpID0+IHtcbiAgICAgIG9uVXBkYXRlU2VsZWN0QmFzZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb24sIGNvbHVtbiwgcXVlc3Rpb24sIGRhdGEpO1xuICAgICAgY2VsbFF1ZXN0aW9uLmNvbENvdW50ID1cbiAgICAgICAgY29sdW1uLmNvbENvdW50ID4gLTEgPyBjb2x1bW4uY29sQ291bnQgOiBxdWVzdGlvbi5jb2x1bW5Db2xDb3VudDtcbiAgICB9XG4gIH0sXG4gIHRleHQ6IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJwbGFjZUhvbGRlclwiLCBcImlucHV0VHlwZVwiXSxcbiAgICBvbkNlbGxRdWVzdGlvblVwZGF0ZTogKGNlbGxRdWVzdGlvbiwgY29sdW1uLCBxdWVzdGlvbiwgZGF0YSkgPT4ge31cbiAgfSxcbiAgY29tbWVudDoge1xuICAgIHByb3BlcnRpZXM6IFtcInBsYWNlSG9sZGVyXCJdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoY2VsbFF1ZXN0aW9uLCBjb2x1bW4sIHF1ZXN0aW9uLCBkYXRhKSA9PiB7fVxuICB9LFxuICBib29sZWFuOiB7XG4gICAgcHJvcGVydGllczogW1wiZGVmYXVsdFZhbHVlXCJdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoY2VsbFF1ZXN0aW9uLCBjb2x1bW4sIHF1ZXN0aW9uLCBkYXRhKSA9PiB7XG4gICAgICBjZWxsUXVlc3Rpb24uc2hvd1RpdGxlID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIGV4cHJlc3Npb246IHtcbiAgICBwcm9wZXJ0aWVzOiBbXCJleHByZXNzaW9uXCJdLFxuICAgIG9uQ2VsbFF1ZXN0aW9uVXBkYXRlOiAoY2VsbFF1ZXN0aW9uLCBjb2x1bW4sIHF1ZXN0aW9uLCBkYXRhKSA9PiB7fVxuICB9XG59O1xuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25Db2x1bW4gZXh0ZW5kcyBCYXNlIGltcGxlbWVudHMgSUxvY2FsaXphYmxlT3duZXIge1xuICBwdWJsaWMgc3RhdGljIGdldENvbHVtblR5cGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcykge1xuICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHRlbXBsYXRlUXVlc3Rpb25WYWx1ZTogUXVlc3Rpb247XG4gIHByaXZhdGUgY29sT3duZXJWYWx1ZTogSU1hdHJpeENvbHVtbk93bmVyID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIGlmICh0aXRsZSkgdGhpcy50aXRsZSA9IHRpdGxlO1xuICB9XG4gIGdldER5bmFtaWNQcm9wZXJ0eU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjZWxsVHlwZVwiO1xuICB9XG4gIGdldER5bmFtaWNUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2FsY0NlbGxRdWVzdGlvblR5cGUoKTtcbiAgfVxuICBnZXREeW5hbWljUHJvcGVydGllcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICB2YXIgcVR5cGUgPSB0aGlzLmNhbGNDZWxsUXVlc3Rpb25UeXBlKCk7XG4gICAgdmFyIHFEZWZpbml0aW9uID0gbWF0cml4RHJvcGRvd25Db2x1bW5UeXBlc1txVHlwZV07XG4gICAgaWYgKHFEZWZpbml0aW9uKSByZXR1cm4gcURlZmluaXRpb24ucHJvcGVydGllcztcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcHVibGljIGdldCBjb2xPd25lcigpOiBJTWF0cml4Q29sdW1uT3duZXIge1xuICAgIHJldHVybiB0aGlzLmNvbE93bmVyVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBjb2xPd25lcih2YWx1ZTogSU1hdHJpeENvbHVtbk93bmVyKSB7XG4gICAgdGhpcy5jb2xPd25lclZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVUZW1wbGF0ZVF1ZXN0aW9uKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKSB7XG4gICAgcmV0dXJuIFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNlbGxUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNlbGxUeXBlXCIsIFwiZGVmYXVsdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNlbGxUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2VsbFR5cGVcIiwgdmFsKTtcbiAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlUXVlc3Rpb24oKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHRlbXBsYXRlUXVlc3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvblZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm5hbWU7XG4gIH1cbiAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm5hbWUgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udGl0bGU7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi50aXRsZSA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IGxvY1RpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubG9jVGl0bGU7XG4gIH1cbiAgcHVibGljIGdldCBmdWxsVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRGdWxsVGl0bGUodGhpcy5sb2NUaXRsZS50ZXh0T3JIdG1sKTtcbiAgfVxuICBwdWJsaWMgZ2V0RnVsbFRpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXN0cikgc3RyID0gdGhpcy5uYW1lO1xuICAgIGlmICh0aGlzLmlzUmVxdWlyZWQpIHtcbiAgICAgIHZhciByZXF1aXJlVGV4dCA9IHRoaXMuY29sT3duZXIgPyB0aGlzLmNvbE93bmVyLmdldFJlcXVpcmVkVGV4dCgpIDogXCJcIjtcbiAgICAgIGlmIChyZXF1aXJlVGV4dCkgcmVxdWlyZVRleHQgKz0gXCIgXCI7XG4gICAgICBzdHIgPSByZXF1aXJlVGV4dCArIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5pc1JlcXVpcmVkO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uaXNSZXF1aXJlZCA9IHZhbDtcbiAgfVxuICBwdWJsaWMgZ2V0IHJlYWRPbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVhZE9ubHk7XG4gIH1cbiAgcHVibGljIHNldCByZWFkT25seSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ucmVhZE9ubHkgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCBoYXNPdGhlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmhhc090aGVyO1xuICB9XG4gIHB1YmxpYyBzZXQgaGFzT3RoZXIodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmhhc090aGVyID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgdmlzaWJsZUlmKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVRdWVzdGlvbi52aXNpYmxlSWY7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udmlzaWJsZUlmID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgZW5hYmxlSWYoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLmVuYWJsZUlmO1xuICB9XG4gIHB1YmxpYyBzZXQgZW5hYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24uZW5hYmxlSWYgPSB2YWw7XG4gIH1cbiAgcHVibGljIGdldCB2YWxpZGF0b3JzKCk6IEFycmF5PFN1cnZleVZhbGlkYXRvcj4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlUXVlc3Rpb24udmFsaWRhdG9ycztcbiAgfVxuICBwdWJsaWMgc2V0IHZhbGlkYXRvcnModmFsOiBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+KSB7XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLnZhbGlkYXRvcnMgPSB2YWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pbldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pbldpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluV2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtaW5XaWR0aFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgY29sQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgLTEgfHwgdmFsID4gNCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbE93bmVyID8gdGhpcy5jb2xPd25lci5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5jb2xPd25lciA/IHRoaXMuY29sT3duZXIuZ2V0TWFya2Rvd25IdG1sKHRleHQpIDogbnVsbDtcbiAgfVxuICBwdWJsaWMgY3JlYXRlQ2VsbFF1ZXN0aW9uKGRhdGE6IGFueSk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcVR5cGUgPSB0aGlzLmNhbGNDZWxsUXVlc3Rpb25UeXBlKCk7XG4gICAgdmFyIGNlbGxRdWVzdGlvbiA9IDxRdWVzdGlvbj50aGlzLmNyZWF0ZU5ld1F1ZXN0aW9uKHFUeXBlKTtcbiAgICB0aGlzLnVwZGF0ZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb24sIGRhdGEpO1xuICAgIHJldHVybiBjZWxsUXVlc3Rpb247XG4gIH1cbiAgcHVibGljIHVwZGF0ZUNlbGxRdWVzdGlvbihjZWxsUXVlc3Rpb246IFF1ZXN0aW9uLCBkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnNldFF1ZXN0aW9uUHJvcGVydGllcyhjZWxsUXVlc3Rpb24pO1xuICAgIHZhciBxVHlwZSA9IHRoaXMuY2FsY0NlbGxRdWVzdGlvblR5cGUoKTtcbiAgICB2YXIgcURlZmluaXRpb24gPSBtYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzW3FUeXBlXTtcbiAgICBpZiAocURlZmluaXRpb24gJiYgcURlZmluaXRpb25bXCJvbkNlbGxRdWVzdGlvblVwZGF0ZVwiXSkge1xuICAgICAgcURlZmluaXRpb25bXCJvbkNlbGxRdWVzdGlvblVwZGF0ZVwiXShcbiAgICAgICAgY2VsbFF1ZXN0aW9uLFxuICAgICAgICB0aGlzLFxuICAgICAgICB0aGlzLmNvbE93bmVyLFxuICAgICAgICBkYXRhXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBkZWZhdWx0Q2VsbFR5cGVDaGFuZ2VkKCkge1xuICAgIHRoaXMudXBkYXRlVGVtcGxhdGVRdWVzdGlvbigpO1xuICB9XG4gIHByb3RlY3RlZCBjYWxjQ2VsbFF1ZXN0aW9uVHlwZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNlbGxUeXBlICE9PSBcImRlZmF1bHRcIikgcmV0dXJuIHRoaXMuY2VsbFR5cGU7XG4gICAgaWYgKHRoaXMuY29sT3duZXIpIHJldHVybiB0aGlzLmNvbE93bmVyLmdldENlbGxUeXBlKCk7XG4gICAgcmV0dXJuIFwiZHJvcGRvd25cIjtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlVGVtcGxhdGVRdWVzdGlvbigpIHtcbiAgICB2YXIgcHJldkNlbGxUeXBlID0gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uXG4gICAgICA/IHRoaXMudGVtcGxhdGVRdWVzdGlvbi5nZXRUeXBlKClcbiAgICAgIDogXCJcIjtcbiAgICB2YXIgY3VyQ2VsbFR5cGUgPSB0aGlzLmNhbGNDZWxsUXVlc3Rpb25UeXBlKCk7XG4gICAgaWYgKGN1ckNlbGxUeXBlID09PSBwcmV2Q2VsbFR5cGUpIHJldHVybjtcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLnJlbW92ZVByb3BlcnRpZXMocHJldkNlbGxUeXBlKTtcbiAgICB9XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1F1ZXN0aW9uKGN1ckNlbGxUeXBlKTtcbiAgICB0aGlzLnRlbXBsYXRlUXVlc3Rpb24ubG9jT3duZXIgPSB0aGlzO1xuICAgIHRoaXMuYWRkUHJvcGVydGllcyhjdXJDZWxsVHlwZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMudGVtcGxhdGVRdWVzdGlvbi5sb2NUaXRsZS5vblJlbmRlcmVkSHRtbENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0RnVsbFRpdGxlKHRleHQpO1xuICAgIH07XG4gICAgdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uLm9uUHJvcGVydHlDaGFuZ2VkLmFkZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuZG9Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdRdWVzdGlvbihjZWxsVHlwZTogc3RyaW5nKTogUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj5Kc29uT2JqZWN0Lm1ldGFEYXRhLmNyZWF0ZUNsYXNzKGNlbGxUeXBlKTtcbiAgICB0aGlzLnNldFF1ZXN0aW9uUHJvcGVydGllcyhxdWVzdGlvbik7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG4gIHByb3RlY3RlZCBzZXRRdWVzdGlvblByb3BlcnRpZXMocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgaWYgKHRoaXMudGVtcGxhdGVRdWVzdGlvbikge1xuICAgICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdCh0aGlzLnRlbXBsYXRlUXVlc3Rpb24pO1xuICAgICAganNvbi50eXBlID0gcXVlc3Rpb24uZ2V0VHlwZSgpO1xuICAgICAgbmV3IEpzb25PYmplY3QoKS50b09iamVjdChqc29uLCBxdWVzdGlvbik7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcsIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgIHRoaXMuZG9Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgZG9Db2x1bW5Qcm9wZXJ0aWVzQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5jb2xPd25lciAhPSBudWxsICYmICF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICB0aGlzLmNvbE93bmVyLm9uQ29sdW1uUHJvcGVydGllc0NoYW5nZWQodGhpcyk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0UHJvcGVydGllcyhjdXJDZWxsVHlwZTogc3RyaW5nKTogQXJyYXk8SnNvbk9iamVjdFByb3BlcnR5PiB7XG4gICAgdmFyIHFEZWYgPSBtYXRyaXhEcm9wZG93bkNvbHVtblR5cGVzW2N1ckNlbGxUeXBlXTtcbiAgICBpZiAoIXFEZWYgfHwgIXFEZWYucHJvcGVydGllcykgcmV0dXJuIFtdO1xuICAgIHJldHVybiBKc29uT2JqZWN0Lm1ldGFEYXRhLmZpbmRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlLCBxRGVmLnByb3BlcnRpZXMpO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlUHJvcGVydGllcyhjdXJDZWxsVHlwZTogc3RyaW5nKSB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXMoY3VyQ2VsbFR5cGUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgZGVsZXRlIHRoaXNbcHJvcC5uYW1lXTtcbiAgICAgIGlmIChwcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eSkge1xuICAgICAgICBkZWxldGUgdGhpc1twcm9wLnNlcmlhbGl6YXRpb25Qcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYWRkUHJvcGVydGllcyhjdXJDZWxsVHlwZTogc3RyaW5nKSB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy50ZW1wbGF0ZVF1ZXN0aW9uO1xuICAgIHZhciBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKGN1ckNlbGxUeXBlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gcHJvcGVydGllc1tpXTtcbiAgICAgIHRoaXMuYWRkUHJvcGVydHkocXVlc3Rpb24sIHByb3AubmFtZSwgZmFsc2UpO1xuICAgICAgaWYgKHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5KSB7XG4gICAgICAgIHRoaXMuYWRkUHJvcGVydHkocXVlc3Rpb24sIHByb3Auc2VyaWFsaXphdGlvblByb3BlcnR5LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBhZGRQcm9wZXJ0eShcbiAgICBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBpc1JlYWRPbmx5OiBib29sZWFuXG4gICkge1xuICAgIHZhciBkZXNjID0ge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHF1ZXN0aW9uW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICghaXNSZWFkT25seSkge1xuICAgICAgZGVzY1tcInNldFwiXSA9IGZ1bmN0aW9uKHY6IGFueSkge1xuICAgICAgICBxdWVzdGlvbltwcm9wTmFtZV0gPSB2O1xuICAgICAgfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BOYW1lLCBkZXNjKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF0cml4RHJvcGRvd25DZWxsIHtcbiAgcHJpdmF0ZSBxdWVzdGlvblZhbHVlOiBRdWVzdGlvbjtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAgcHVibGljIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgcHVibGljIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGFcbiAgKSB7XG4gICAgdGhpcy5xdWVzdGlvblZhbHVlID0gZGF0YS5jcmVhdGVRdWVzdGlvbih0aGlzLnJvdywgdGhpcy5jb2x1bW4pO1xuICAgIHRoaXMucXVlc3Rpb25WYWx1ZS52YWxpZGF0ZVZhbHVlQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkYXRhLnZhbGlkYXRlQ2VsbChyb3csIGNvbHVtbi5uYW1lLCByb3cudmFsdWUpO1xuICAgIH07XG4gICAgQ3VzdG9tUHJvcGVydGllc0NvbGxlY3Rpb24uZ2V0UHJvcGVydGllcyhjb2x1bW4uZ2V0VHlwZSgpKS5mb3JFYWNoKFxuICAgICAgcHJvcGVydHkgPT4ge1xuICAgICAgICBsZXQgcHJvcGVydHlOYW1lID0gcHJvcGVydHkubmFtZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbHVtbltwcm9wZXJ0eU5hbWVdICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICB0aGlzLnF1ZXN0aW9uVmFsdWUuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUsIG51bGwpID09IG51bGxcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5xdWVzdGlvblZhbHVlW3Byb3BlcnR5TmFtZV0gPSBjb2x1bW5bcHJvcGVydHlOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gICAgT2JqZWN0LmtleXMoY29sdW1uKS5mb3JFYWNoKGtleSA9PiB7fSk7XG4gICAgdGhpcy5xdWVzdGlvblZhbHVlLnVwZGF0ZUN1c3RvbVdpZGdldCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgcXVlc3Rpb24oKTogUXVlc3Rpb24ge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMucXVlc3Rpb24udmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB0aGlzLnF1ZXN0aW9uLnJ1bkNvbmRpdGlvbih2YWx1ZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZVxuICBpbXBsZW1lbnRzIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCwgSUxvY2FsaXphYmxlT3duZXIsIElUZXh0UHJvY2Vzc29yIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaWRDb3VudGVyOiBudW1iZXIgPSAxO1xuICBwcml2YXRlIHN0YXRpYyBnZXRJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNyb3dfXCIgKyBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZS5pZENvdW50ZXIrKztcbiAgfVxuICBwcm90ZWN0ZWQgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YTtcbiAgcHJpdmF0ZSByb3dWYWx1ZXM6IEhhc2hUYWJsZTxhbnk+ID0ge307XG4gIHByaXZhdGUgaXNTZXR0aW5nVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpZFZhbHVlOiBzdHJpbmc7XG4gIHByaXZhdGUgdGV4dFByZVByb2Nlc3NvcjtcblxuICBwdWJsaWMgY2VsbHM6IEFycmF5PE1hdHJpeERyb3Bkb3duQ2VsbD4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBJTWF0cml4RHJvcGRvd25EYXRhLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yID0gbmV3IFRleHRQcmVQcm9jZXNzb3IoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9IGZ1bmN0aW9uKFxuICAgICAgdGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWVcbiAgICApIHtcbiAgICAgIHNlbGYuZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZSk7XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5yb3dWYWx1ZXNbdGhpcy5kYXRhLmNvbHVtbnNbaV0ubmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJvd1ZhbHVlc1t0aGlzLmRhdGEuY29sdW1uc1tpXS5uYW1lXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaWRWYWx1ZSA9IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLmdldElkKCk7XG4gIH1cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkVmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCByb3dOYW1lKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5yb3dWYWx1ZXM7XG4gIH1cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1NldHRpbmdWYWx1ZSA9IHRydWU7XG4gICAgdGhpcy5yb3dWYWx1ZXMgPSB7fTtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSB7XG4gICAgICAgIHRoaXMucm93VmFsdWVzW2tleV0gPSB2YWx1ZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY2VsbHNbaV0ucXVlc3Rpb24ub25TdXJ2ZXlWYWx1ZUNoYW5nZWQoXG4gICAgICAgIHRoaXMuZ2V0VmFsdWUodGhpcy5jZWxsc1tpXS5jb2x1bW4ubmFtZSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuaXNTZXR0aW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VmFsdWUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5yb3dWYWx1ZXNbbmFtZV07XG4gIH1cbiAgcHVibGljIHNldFZhbHVlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmlzU2V0dGluZ1ZhbHVlKSByZXR1cm47XG4gICAgaWYgKG5ld1ZhbHVlID09PSBcIlwiKSBuZXdWYWx1ZSA9IG51bGw7XG4gICAgaWYgKG5ld1ZhbHVlICE9IG51bGwpIHtcbiAgICAgIHRoaXMucm93VmFsdWVzW25hbWVdID0gbmV3VmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnJvd1ZhbHVlc1tuYW1lXTtcbiAgICB9XG4gICAgdGhpcy5kYXRhLm9uUm93Q2hhbmdlZCh0aGlzLCBuYW1lLCB0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm9uQW55VmFsdWVDaGFuZ2VkKFwicm93XCIpO1xuICB9XG4gIHB1YmxpYyBnZXRDb21tZW50KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWUobmFtZSArIEJhc2UuY29tbWVudFByZWZpeCk7XG4gICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IFwiXCI7XG4gIH1cbiAgcHVibGljIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShuYW1lICsgQmFzZS5jb21tZW50UHJlZml4LCBuZXdWYWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldCBpc0VtcHR5KCkge1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChIZWxwZXJzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdmFsKSB7XG4gICAgICBpZiAodmFsW2tleV0gIT09IHVuZGVmaW5lZCAmJiB2YWxba2V5XSAhPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeUNvbHVtbihjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jZWxsc1tpXS5jb2x1bW4gPT0gY29sdW1uKSByZXR1cm4gdGhpcy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHVibGljIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0TG9jYWxlKCkgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSA/IHRoaXMuZGF0YS5nZXRNYXJrZG93bkh0bWwodGV4dCkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBvbkxvY2FsZUNoYW5nZWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmNlbGxzW2ldLnF1ZXN0aW9uLm9uTG9jYWxlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB2YWx1ZXNbXCJyb3dcIl0gPSB0aGlzLnZhbHVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jZWxsc1tpXS5ydW5Db25kaXRpb24odmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGJ1aWxkQ2VsbHMoKSB7XG4gICAgdmFyIGNvbHVtbnMgPSB0aGlzLmRhdGEuY29sdW1ucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjb2x1bW4gPSBjb2x1bW5zW2ldO1xuICAgICAgdGhpcy5jZWxscy5wdXNoKHRoaXMuY3JlYXRlQ2VsbChjb2x1bW4pKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUNlbGwoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IE1hdHJpeERyb3Bkb3duQ2VsbCB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXhEcm9wZG93bkNlbGwoY29sdW1uLCB0aGlzLCB0aGlzLmRhdGEpO1xuICB9XG4gIGdlU3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0U3VydmV5KCkgOiBudWxsO1xuICB9XG4gIC8vSVRleHRQcm9jZXNzb3JcbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpIHtcbiAgICB2YXIgZmlyc3ROYW1lID0gbmV3IFByb2Nlc3NWYWx1ZSgpLmdldEZpcnN0TmFtZSh0ZXh0VmFsdWUubmFtZSk7XG4gICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gZmlyc3ROYW1lID09IFwicm93XCI7XG4gICAgaWYgKCF0ZXh0VmFsdWUuaXNFeGlzdHMpIHJldHVybjtcbiAgICAvL25hbWUgc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHJvd1xuICAgIHZhciB2YWx1ZXMgPSB7IHJvdzogdGhpcy52YWx1ZSB9O1xuICAgIHRleHRWYWx1ZS52YWx1ZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRWYWx1ZSh0ZXh0VmFsdWUubmFtZSwgdmFsdWVzKTtcbiAgfVxuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdGV4dCA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3VydmV5KCkucHJvY2Vzc1RleHQodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKTtcbiAgfVxuICBwcm9jZXNzVGV4dEV4KHRleHQ6IHN0cmluZyk6IGFueSB7XG4gICAgdGV4dCA9IHRoaXMucHJvY2Vzc1RleHQodGV4dCwgdHJ1ZSk7XG4gICAgdmFyIGhhc0FsbFZhbHVlc09uTGFzdFJ1biA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5oYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgdmFyIHJlcyA9IHRoaXMuZ2V0U3VydmV5KCkucHJvY2Vzc1RleHRFeCh0ZXh0KTtcbiAgICByZXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuID1cbiAgICAgIHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gJiYgaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHJldHVybiByZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIG1hdHJpeCBkcm9wZG93biBhbmQgbWF0cml4IGR5bmFtaWMgcXVlc3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSBleHRlbmRzIFF1ZXN0aW9uXG4gIGltcGxlbWVudHMgSU1hdHJpeERyb3Bkb3duRGF0YSB7XG4gIHB1YmxpYyBzdGF0aWMgYWRkRGVmYXVsdENvbHVtbnMobWF0cml4OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlKSB7XG4gICAgdmFyIGNvbE5hbWVzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xOYW1lcy5sZW5ndGg7IGkrKykgbWF0cml4LmFkZENvbHVtbihjb2xOYW1lc1tpXSk7XG4gIH1cbiAgcHJpdmF0ZSBjb2x1bW5zVmFsdWU6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPjtcbiAgcHJpdmF0ZSBjaG9pY2VzVmFsdWU6IEFycmF5PEl0ZW1WYWx1ZT47XG4gIHByaXZhdGUgaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgZ2VuZXJhdGVkVmlzaWJsZVJvd3M6IEFycmF5PE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlPiA9IG51bGw7XG4gIGNvbHVtbnNDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHVwZGF0ZUNlbGxzQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNvbHVtbnNWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3QXJyYXkoXCJjb2x1bW5zXCIsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGl0ZW0uY29sT3duZXIgPSBzZWxmO1xuICAgIH0pO1xuICAgIHRoaXMuY2hvaWNlc1ZhbHVlID0gdGhpcy5jcmVhdGVJdGVtVmFsdWVzKFwiY2hvaWNlc1wiKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3B0aW9uc0NhcHRpb25cIiwgdGhpcyk7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImNvbHVtbnNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDtcbiAgICAgIHNlbGYuZmlyZUNhbGxiYWNrKHNlbGYuY29sdW1uc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhkcm9wZG93bmJhc2VcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzQWxsb3dUaXRsZUxlZnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBtYXRyaXggY29sdW1ucy5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29sdW1ucygpOiBBcnJheTxNYXRyaXhEcm9wZG93bkNvbHVtbj4ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHVtbnModmFsdWU6IEFycmF5PE1hdHJpeERyb3Bkb3duQ29sdW1uPikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbnNcIiwgdmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCBvbk1hdHJpeFJvd0NyZWF0ZWQocm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSkge1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHJvd1ZhbHVlOiByb3cudmFsdWUsXG4gICAgICByb3c6IHJvdyxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIGNvbHVtbk5hbWU6IG51bGwsXG4gICAgICBjZWxsOiBudWxsLFxuICAgICAgY2VsbFF1ZXN0aW9uOiBudWxsLFxuICAgICAgdmFsdWU6IG51bGxcbiAgICB9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvcHRpb25zLmNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgIG9wdGlvbnMuY29sdW1uTmFtZSA9IG9wdGlvbnMuY29sdW1uLm5hbWU7XG4gICAgICB2YXIgY2VsbCA9IHJvdy5jZWxsc1tpXTtcbiAgICAgIG9wdGlvbnMuY2VsbCA9IGNlbGw7XG4gICAgICBvcHRpb25zLmNlbGxRdWVzdGlvbiA9IGNlbGwucXVlc3Rpb247XG4gICAgICBvcHRpb25zLnZhbHVlID0gY2VsbC52YWx1ZTtcbiAgICAgIHRoaXMuc3VydmV5Lm1hdHJpeENlbGxDcmVhdGVkKHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGNlbGwgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2VsbFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2VsbFR5cGVcIiwgXCJkcm9wZG93blwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNlbGxUeXBlKHZhbDogc3RyaW5nKSB7XG4gICAgdmFsID0gdmFsLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHRoaXMuY2VsbFR5cGUgPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2VsbFR5cGVcIiwgdmFsKTtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbnNDZWxsVHlwZSgpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMudXBkYXRlQ2VsbHNDYWxsYmFjayk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVDb2x1bW5zQ2VsbFR5cGUoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuY29sdW1uc1tpXS5kZWZhdWx0Q2VsbFR5cGVDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBjb2x1bW4gY291bnQgZm9yIHJhZGlvZ3JvdXAgYW5kIGNoZWNrYm94ICBjZWxsIHR5cGVzLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5Db2xDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5Db2xDb3VudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHVtbkNvbENvdW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvbHVtbkNvbENvdW50XCIsIHZhbHVlKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnVwZGF0ZUNlbGxzQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIG1pbWltdW0gY29sdW1uIHdpZHRoLlxuICAgKi9cbiAgcHVibGljIGdldCBjb2x1bW5NaW5XaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb2x1bW5NaW5XaWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbHVtbk1pbldpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uTWluV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBzaG93IHRoZSBob3Jpem9udGFsIHNjcm9sbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaG9yaXpvbnRhbFNjcm9sbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaG9yaXpvbnRhbFNjcm9sbFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBob3Jpem9udGFsU2Nyb2xsKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImhvcml6b250YWxTY3JvbGxcIiwgdmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5yZXF1aXJlZFRleHQgOiBcIlwiO1xuICB9XG4gIG9uQ29sdW1uUHJvcGVydGllc0NoYW5nZWQoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbikge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvdyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV07XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJvdy5jZWxscy5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocm93LmNlbGxzW2pdLmNvbHVtbiAhPT0gY29sdW1uKSBjb250aW51ZTtcbiAgICAgICAgY29sdW1uLnVwZGF0ZUNlbGxRdWVzdGlvbihyb3cuY2VsbHNbal0ucXVlc3Rpb24sIHJvdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXRDZWxsVHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNlbGxUeXBlO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHN1cGVyLnJ1bkNvbmRpdGlvbih2YWx1ZXMpO1xuICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24odmFsdWVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuQ2VsbHNDb25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuO1xuICAgIHZhciBuZXdWYWx1ZXMgPSB7fTtcbiAgICBpZiAodmFsdWVzICYmIHZhbHVlcyBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgbmV3VmFsdWVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZXMpKTtcbiAgICB9XG4gICAgbmV3VmFsdWVzW1wicm93XCJdID0ge307XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgcm93c1tpXS5ydW5Db25kaXRpb24obmV3VmFsdWVzKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIG9uTG9jYWxlQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5vbkxvY2FsZUNoYW5nZWQoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5jb2x1bW5zW2ldLm9uTG9jYWxlQ2hhbmdlZCgpO1xuICAgIH1cbiAgICB2YXIgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKCFyb3dzKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzW2ldLm9uTG9jYWxlQ2hhbmdlZCgpO1xuICAgIH1cbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnVwZGF0ZUNlbGxzQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gYnkgaXQncyBuYW1lLiBSZXR1bnMgbnVsbCBpZiBhIGNvbHVtbiB3aXRoIHRoaXMgbmFtZSBkb2Vzbid0IGV4aXN0LlxuICAgKiBAcGFyYW0gY29sdW1uXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uTmFtZShjb2x1bW5OYW1lOiBzdHJpbmcpOiBNYXRyaXhEcm9wZG93bkNvbHVtbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNvbHVtbnNbaV0ubmFtZSA9PSBjb2x1bW5OYW1lKSByZXR1cm4gdGhpcy5jb2x1bW5zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29sdW1uIHdpZHRoLlxuICAgKiBAcGFyYW0gY29sdW1uXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29sdW1uV2lkdGgoY29sdW1uOiBNYXRyaXhEcm9wZG93bkNvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbHVtbi5taW5XaWR0aCA/IGNvbHVtbi5taW5XaWR0aCA6IHRoaXMuY29sdW1uTWluV2lkdGg7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGNob2ljZXMgZm9yIGRyb3Bkb3duLCBjaGVja2JveCBhbmQgcmFkaW9ncm91cCBjZWxsIHR5cGVzLlxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNob2ljZXNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXModmFsOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBvcHRpb25zIGNhcHRpb24gZm9yIGRyb3Bkb3duIGNlbGwgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3B0aW9uc0NhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvcHRpb25zQ2FwdGlvblwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wdGlvbnNDYXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvcHRpb25zQ2FwdGlvblwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jT3B0aW9uc0NhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgYWRkQ29sdW1uKG5hbWU6IHN0cmluZywgdGl0bGU6IHN0cmluZyA9IG51bGwpOiBNYXRyaXhEcm9wZG93bkNvbHVtbiB7XG4gICAgdmFyIGNvbHVtbiA9IG5ldyBNYXRyaXhEcm9wZG93bkNvbHVtbihuYW1lLCB0aXRsZSk7XG4gICAgdGhpcy5jb2x1bW5zVmFsdWUucHVzaChjb2x1bW4pO1xuICAgIHJldHVybiBjb2x1bW47XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJvd3MgbW9kZWwgb2JqZWN0cyB0aGF0IHVzZWQgZHVyaW5nIHJlbmRlcmluZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZVJvd3MoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2U+IHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IHRoaXMuZ2VuZXJhdGVSb3dzKCk7XG4gICAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24odGhpcy5kYXRhLmdldEFsbFZhbHVlcygpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3M7XG4gIH1cbiAgcHVibGljIG9uU3VydmV5TG9hZCgpIHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IHZhbHVlLiBJZiB0aGUgcm93IHZhbHVlIGlzIGVtcHR5LCB0aGUgb2JqZWN0IGlzIGVtcHR5OiB7fS5cbiAgICogQHBhcmFtIHJvd0luZGV4IHJvdyBpbmRleCBmcm9tIDAgdG8gdmlzaWJsZSByb3cgY291bnQgLSAxLlxuICAgKi9cbiAgcHVibGljIGdldFJvd1ZhbHVlKHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICBpZiAocm93SW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgdmlzUm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKHJvd0luZGV4ID49IHZpc1Jvd3MubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRoaXMudmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmdldFJvd1ZhbHVlQ29yZSh2aXNSb3dzW3Jvd0luZGV4XSwgbmV3VmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIHJvdyB2YWx1ZS5cbiAgICogQHBhcmFtIHJvd0luZGV4IHJvdyBpbmRleCBmcm9tIDAgdG8gdmlzaWJsZSByb3cgY291bnQgLSAxLlxuICAgKiBAcGFyYW0gcm93VmFsdWUgYW4gb2JqZWN0IHtcImNvbHVtbiBuYW1lXCI6IGNvbHVtblZhbHVlLC4uLiB9XG4gICAqL1xuICBwdWJsaWMgc2V0Um93VmFsdWUocm93SW5kZXg6IG51bWJlciwgcm93VmFsdWU6IGFueSkge1xuICAgIGlmIChyb3dJbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2aXNSb3dzID0gdGhpcy52aXNpYmxlUm93cztcbiAgICBpZiAocm93SW5kZXggPj0gdmlzUm93cy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHRoaXMub25Sb3dDaGFuZ2VkKHZpc1Jvd3Nbcm93SW5kZXhdLCBcIlwiLCByb3dWYWx1ZSk7XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2U+IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3VmFsdWUoY3VyVmFsdWU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuICFjdXJWYWx1ZSA/IHt9IDogY3VyVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJvd1ZhbHVlQ29yZShcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHF1ZXN0aW9uVmFsdWU6IGFueSxcbiAgICBjcmVhdGU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBhbnkge1xuICAgIHZhciByZXN1bHQgPSBxdWVzdGlvblZhbHVlW3Jvdy5yb3dOYW1lXSA/IHF1ZXN0aW9uVmFsdWVbcm93LnJvd05hbWVdIDogbnVsbDtcbiAgICBpZiAoIXJlc3VsdCAmJiBjcmVhdGUpIHtcbiAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgcXVlc3Rpb25WYWx1ZVtyb3cucm93TmFtZV0gPSByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJvd0Rpc3BsYXlWYWx1ZShcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogYW55IHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgIGlmIChyb3dWYWx1ZVtjb2x1bW4ubmFtZV0pIHtcbiAgICAgICAgcm93VmFsdWVbY29sdW1uLm5hbWVdID0gcm93LmNlbGxzW2ldLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvd1ZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBvbkJlZm9yZVZhbHVlQ2hhbmdlZCh2YWw6IGFueSkge31cbiAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzUm93Q2hhbmdpbmcpIHJldHVybjtcbiAgICB0aGlzLm9uQmVmb3JlVmFsdWVDaGFuZ2VkKHRoaXMudmFsdWUpO1xuICAgIGlmICghdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cyB8fCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aCA9PSAwKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IHRydWU7XG4gICAgdmFyIHZhbCA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0udmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlQ29yZShyb3csIHZhbCk7XG4gICAgfVxuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBpZiAoIXJvd3MpIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcmV0dXJuIHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2VsbHMgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLmNlbGxzO1xuICAgICAgaWYgKCFjZWxscykgY29udGludWU7XG4gICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgY2VsbHMubGVuZ3RoOyBjb2xJbmRleCsrKSB7XG4gICAgICAgIHZhciBxdWVzdGlvbiA9IGNlbGxzW2NvbEluZGV4XS5xdWVzdGlvbjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHF1ZXN0aW9uICYmXG4gICAgICAgICAgKCFxdWVzdGlvbi5zdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHx8ICFxdWVzdGlvbi52YWx1ZSlcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgdmFyIGVycm9zSW5Db2x1bW5zID0gdGhpcy5oYXNFcnJvckluQ29sdW1ucyhmaXJlQ2FsbGJhY2spO1xuICAgIHJldHVybiBzdXBlci5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKSB8fCBlcnJvc0luQ29sdW1ucztcbiAgfVxuICBwdWJsaWMgZ2V0QWxsRXJyb3JzKCk6IEFycmF5PFN1cnZleUVycm9yPiB7XG4gICAgdmFyIHJlc3VsdCA9IHN1cGVyLmdldEFsbEVycm9ycygpO1xuICAgIHZhciByb3dzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByb3cgPSByb3dzW2ldO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByb3cuY2VsbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGVycm9ycyA9IHJvdy5jZWxsc1tqXS5xdWVzdGlvbi5nZXRBbGxFcnJvcnMoKTtcbiAgICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5jb25jYXQoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJbkNvbHVtbnMoZmlyZUNhbGxiYWNrOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNlbGxzID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXS5jZWxscztcbiAgICAgIGlmICghY2VsbHMpIGNvbnRpbnVlO1xuICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IHRoaXMuY29sdW1ucy5sZW5ndGg7IGNvbEluZGV4KyspIHtcbiAgICAgICAgaWYgKCFjZWxsc1tjb2xJbmRleF0pIGNvbnRpbnVlO1xuICAgICAgICB2YXIgcXVlc3Rpb24gPSBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICAgIHJlcyA9XG4gICAgICAgICAgKHF1ZXN0aW9uICYmIHF1ZXN0aW9uLnZpc2libGUgJiYgcXVlc3Rpb24uaGFzRXJyb3JzKGZpcmVDYWxsYmFjaykpIHx8XG4gICAgICAgICAgcmVzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByb3RlY3RlZCBnZXRGaXJzdElucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRGaXJzdENlbGxRdWVzdGlvbihmYWxzZSk7XG4gICAgcmV0dXJuIHF1ZXN0aW9uID8gcXVlc3Rpb24uaW5wdXRJZCA6IHN1cGVyLmdldEZpcnN0SW5wdXRFbGVtZW50SWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk6IHN0cmluZyB7XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRGaXJzdENlbGxRdWVzdGlvbih0cnVlKTtcbiAgICByZXR1cm4gcXVlc3Rpb24gPyBxdWVzdGlvbi5pbnB1dElkIDogc3VwZXIuZ2V0Rmlyc3RFcnJvcklucHV0RWxlbWVudElkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEZpcnN0Q2VsbFF1ZXN0aW9uKG9uRXJyb3I6IGJvb2xlYW4pOiBRdWVzdGlvbiB7XG4gICAgaWYgKCF0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjZWxscyA9IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaV0uY2VsbHM7XG4gICAgICBmb3IgKHZhciBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgdGhpcy5jb2x1bW5zLmxlbmd0aDsgY29sSW5kZXgrKykge1xuICAgICAgICBpZiAoIW9uRXJyb3IpIHJldHVybiBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICAgIGlmIChjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb24uY3VycmVudEVycm9yQ291bnQgPiAwKVxuICAgICAgICAgIHJldHVybiBjZWxsc1tjb2xJbmRleF0ucXVlc3Rpb247XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vSU1hdHJpeERyb3Bkb3duRGF0YVxuICBwdWJsaWMgY3JlYXRlUXVlc3Rpb24oXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uXG4gICk6IFF1ZXN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVRdWVzdGlvbkNvcmUocm93LCBjb2x1bW4pO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVRdWVzdGlvbkNvcmUoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBjb2x1bW46IE1hdHJpeERyb3Bkb3duQ29sdW1uXG4gICk6IFF1ZXN0aW9uIHtcbiAgICB2YXIgcXVlc3Rpb24gPSBjb2x1bW4uY3JlYXRlQ2VsbFF1ZXN0aW9uKHJvdyk7XG4gICAgaWYgKHRoaXMuaXNSZWFkT25seSkge1xuICAgICAgcXVlc3Rpb24ucmVhZE9ubHkgPSB0cnVlO1xuICAgIH1cbiAgICBxdWVzdGlvbi5zZXRTdXJ2ZXlJbXBsKHJvdyk7XG4gICAgcmV0dXJuIHF1ZXN0aW9uO1xuICB9XG4gIHByb3RlY3RlZCBkZWxldGVSb3dWYWx1ZShcbiAgICBuZXdWYWx1ZTogYW55LFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2VcbiAgKTogYW55IHtcbiAgICBkZWxldGUgbmV3VmFsdWVbcm93LnJvd05hbWVdO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhuZXdWYWx1ZSkubGVuZ3RoID09IDAgPyBudWxsIDogbmV3VmFsdWU7XG4gIH1cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nRnJvbUpzb24pIHJldHVybjtcbiAgICB2YXIgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByb3dzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25DZWxsVmFsdWVDaGFuZ2VkKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgaWYgKCF0aGlzLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZ2V0UXVlc3Rpb24gPSBmdW5jdGlvbihjb2xOYW1lKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgc2VsZi5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLmNvbHVtbnNbaV0ubmFtZSA9PSBjb2xOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHJvdy5jZWxsc1tpXS5xdWVzdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIHJvdzogcm93LFxuICAgICAgY29sdW1uTmFtZTogY29sdW1uTmFtZSxcbiAgICAgIHJvd1ZhbHVlOiByb3dWYWx1ZSxcbiAgICAgIHZhbHVlOiByb3dWYWx1ZVtjb2x1bW5OYW1lXSxcbiAgICAgIGdldENlbGxRdWVzdGlvbjogZ2V0UXVlc3Rpb25cbiAgICB9O1xuICAgIHRoaXMuc3VydmV5Lm1hdHJpeENlbGxWYWx1ZUNoYW5nZWQodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgdmFsaWRhdGVDZWxsKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIHJvd1ZhbHVlOiBhbnlcbiAgKTogU3VydmV5RXJyb3Ige1xuICAgIGlmICghdGhpcy5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICByb3c6IHJvdyxcbiAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbk5hbWUsXG4gICAgICByb3dWYWx1ZTogcm93VmFsdWUsXG4gICAgICB2YWx1ZTogcm93VmFsdWVbY29sdW1uTmFtZV1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnN1cnZleS5tYXRyaXhDZWxsVmFsaWRhdGUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgb25Sb3dDaGFuZ2VkKFxuICAgIHJvdzogTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gICAgY29sdW1uTmFtZTogc3RyaW5nLFxuICAgIG5ld1Jvd1ZhbHVlOiBhbnlcbiAgKSB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICBpZiAodGhpcy5pc01hdHJpeFZhbHVlRW1wdHkob2xkVmFsdWUpKSBvbGRWYWx1ZSA9IG51bGw7XG4gICAgdmFyIG5ld1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB2YXIgcm93VmFsdWUgPSB0aGlzLmdldFJvd1ZhbHVlQ29yZShyb3csIG5ld1ZhbHVlLCB0cnVlKTtcbiAgICBpZiAoIXJvd1ZhbHVlKSByb3dWYWx1ZSA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiByb3dWYWx1ZSkgZGVsZXRlIHJvd1ZhbHVlW2tleV07XG4gICAgaWYgKG5ld1Jvd1ZhbHVlKSB7XG4gICAgICBuZXdSb3dWYWx1ZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobmV3Um93VmFsdWUpKTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBuZXdSb3dWYWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KG5ld1Jvd1ZhbHVlW2tleV0pKSB7XG4gICAgICAgICAgcm93VmFsdWVba2V5XSA9IG5ld1Jvd1ZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHJvd1ZhbHVlKS5sZW5ndGggPT0gMCkge1xuICAgICAgbmV3VmFsdWUgPSB0aGlzLmRlbGV0ZVJvd1ZhbHVlKG5ld1ZhbHVlLCByb3cpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHJldHVybjtcbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICAgIGlmIChjb2x1bW5OYW1lKSB7XG4gICAgICB0aGlzLm9uQ2VsbFZhbHVlQ2hhbmdlZChyb3csIGNvbHVtbk5hbWUsIHJvd1ZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpc01hdHJpeFZhbHVlRW1wdHkodmFsKSB7XG4gICAgaWYgKCF2YWwpIHJldHVybjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModmFsW2ldKS5sZW5ndGggPiAwKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbCkubGVuZ3RoID09IDA7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcIm1hdHJpeGRyb3Bkb3duY29sdW1uXCIsXG4gIFtcbiAgICBcIm5hbWVcIixcbiAgICB7IG5hbWU6IFwidGl0bGVcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNlbGxUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6ICgpID0+IHtcbiAgICAgICAgdmFyIHJlcyA9IE1hdHJpeERyb3Bkb3duQ29sdW1uLmdldENvbHVtblR5cGVzKCk7XG4gICAgICAgIHJlcy5zcGxpY2UoMCwgMCwgXCJkZWZhdWx0XCIpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH0sXG4gICAgeyBuYW1lOiBcImNvbENvdW50XCIsIGRlZmF1bHQ6IC0xLCBjaG9pY2VzOiBbLTEsIDAsIDEsIDIsIDMsIDRdIH0sXG4gICAgXCJpc1JlcXVpcmVkOmJvb2xlYW5cIixcbiAgICBcImhhc090aGVyOmJvb2xlYW5cIixcbiAgICBcInJlYWRPbmx5OmJvb2xlYW5cIixcbiAgICBcIm1pbldpZHRoXCIsXG4gICAgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gICAgXCJlbmFibGVJZjpjb25kaXRpb25cIixcbiAgICB7XG4gICAgICBuYW1lOiBcInZhbGlkYXRvcnM6dmFsaWRhdG9yc1wiLFxuICAgICAgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl2YWxpZGF0b3JcIixcbiAgICAgIGNsYXNzTmFtZVBhcnQ6IFwidmFsaWRhdG9yXCJcbiAgICB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgTWF0cml4RHJvcGRvd25Db2x1bW4oXCJcIik7XG4gIH1cbik7XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwibWF0cml4ZHJvcGRvd25iYXNlXCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbHVtbnM6bWF0cml4ZHJvcGRvd25jb2x1bW5zXCIsXG4gICAgICBjbGFzc05hbWU6IFwibWF0cml4ZHJvcGRvd25jb2x1bW5cIlxuICAgIH0sXG4gICAgXCJob3Jpem9udGFsU2Nyb2xsOmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXM6aXRlbXZhbHVlc1wiLFxuICAgICAgb25HZXRWYWx1ZTogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXREYXRhKG9iai5jaG9pY2VzKTtcbiAgICAgIH0sXG4gICAgICBvblNldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSwgdmFsdWU6IGFueSkge1xuICAgICAgICBvYmouY2hvaWNlcyA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgeyBuYW1lOiBcIm9wdGlvbnNDYXB0aW9uXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPcHRpb25zQ2FwdGlvblwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjZWxsVHlwZVwiLFxuICAgICAgZGVmYXVsdDogXCJkcm9wZG93blwiLFxuICAgICAgY2hvaWNlczogKCkgPT4ge1xuICAgICAgICByZXR1cm4gTWF0cml4RHJvcGRvd25Db2x1bW4uZ2V0Q29sdW1uVHlwZXMoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJjb2x1bW5Db2xDb3VudFwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgMywgNF0gfSxcbiAgICBcImNvbHVtbk1pbldpZHRoXCJcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlLnRzIiwiZXhwb3J0IGNsYXNzIFRleHRQcmVQcm9jZXNzb3JJdGVtIHtcbiAgcHVibGljIHN0YXJ0OiBudW1iZXI7XG4gIHB1YmxpYyBlbmQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFRleHRQcmVQcm9jZXNzb3JWYWx1ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzRXhpc3RzID0gZmFsc2U7XG4gIH1cbiAgcHVibGljIHZhbHVlOiBhbnk7XG4gIHB1YmxpYyBpc0V4aXN0czogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFRleHRQcmVQcm9jZXNzb3Ige1xuICBwcml2YXRlIGhhc0FsbFZhbHVlc09uTGFzdFJ1blZhbHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBvblByb2Nlc3M6ICh0ZXh0VmFsdWU6IFRleHRQcmVQcm9jZXNzb3JWYWx1ZSkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IoKSB7fVxuICBwdWJsaWMgcHJvY2Vzcyh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICB0aGlzLmhhc0FsbFZhbHVlc09uTGFzdFJ1blZhbHVlID0gdHJ1ZTtcbiAgICBpZiAoIXRleHQpIHJldHVybiB0ZXh0O1xuICAgIGlmICghdGhpcy5vblByb2Nlc3MpIHJldHVybiB0ZXh0O1xuICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0SXRlbXModGV4dCk7XG4gICAgZm9yICh2YXIgaSA9IGl0ZW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgdmFyIG5hbWUgPSB0aGlzLmdldE5hbWUodGV4dC5zdWJzdHJpbmcoaXRlbS5zdGFydCArIDEsIGl0ZW0uZW5kKSk7XG4gICAgICBpZiAoIXRoaXMuY2FuUHJvY2Vzc05hbWUobmFtZSkpIGNvbnRpbnVlO1xuICAgICAgdmFyIHRleHRWYWx1ZSA9IG5ldyBUZXh0UHJlUHJvY2Vzc29yVmFsdWUobmFtZSwgcmV0dXJuRGlzcGxheVZhbHVlKTtcbiAgICAgIHRoaXMub25Qcm9jZXNzKHRleHRWYWx1ZSk7XG4gICAgICBpZiAoIXRleHRWYWx1ZS5pc0V4aXN0cykge1xuICAgICAgICB0aGlzLmhhc0FsbFZhbHVlc09uTGFzdFJ1blZhbHVlID0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRleHRWYWx1ZS52YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IFwiXCI7XG4gICAgICAgIHRoaXMuaGFzQWxsVmFsdWVzT25MYXN0UnVuVmFsdWUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRleHQgPVxuICAgICAgICB0ZXh0LnN1YnN0cigwLCBpdGVtLnN0YXJ0KSArXG4gICAgICAgIHRleHRWYWx1ZS52YWx1ZSArXG4gICAgICAgIHRleHQuc3Vic3RyKGl0ZW0uZW5kICsgMSk7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzQWxsVmFsdWVzT25MYXN0UnVuKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0FsbFZhbHVlc09uTGFzdFJ1blZhbHVlO1xuICB9XG4gIHByaXZhdGUgZ2V0SXRlbXModGV4dDogc3RyaW5nKTogQXJyYXk8VGV4dFByZVByb2Nlc3Nvckl0ZW0+IHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB2YXIgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XG4gICAgdmFyIHN0YXJ0ID0gLTE7XG4gICAgdmFyIGNoID0gXCJcIjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBjaCA9IHRleHRbaV07XG4gICAgICBpZiAoY2ggPT0gXCJ7XCIpIHN0YXJ0ID0gaTtcbiAgICAgIGlmIChjaCA9PSBcIn1cIikge1xuICAgICAgICBpZiAoc3RhcnQgPiAtMSkge1xuICAgICAgICAgIHZhciBpdGVtID0gbmV3IFRleHRQcmVQcm9jZXNzb3JJdGVtKCk7XG4gICAgICAgICAgaXRlbS5zdGFydCA9IHN0YXJ0O1xuICAgICAgICAgIGl0ZW0uZW5kID0gaTtcbiAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0ID0gLTE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuICBwcml2YXRlIGdldE5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICByZXR1cm4gbmFtZS50cmltKCk7XG4gIH1cbiAgcHJpdmF0ZSBjYW5Qcm9jZXNzTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaCA9IG5hbWVbaV07XG4gICAgICBpZiAoY2ggPT0gXCIgXCIgfHwgY2ggPT0gXCItXCIgfHwgY2ggPT0gXCImXCIpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy90ZXh0UHJlUHJvY2Vzc29yLnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCwgSnNvbk1ldGFkYXRhIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHtcbiAgQmFzZSxcbiAgSVN1cnZleSxcbiAgU3VydmV5RWxlbWVudCxcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXlJbXBsLFxuICBJVGV4dFByb2Nlc3NvcixcbiAgSVF1ZXN0aW9uLFxuICBJUGFuZWwsXG4gIElFbGVtZW50LFxuICBJQ29uZGl0aW9uUnVubmVyLFxuICBJUGFnZSxcbiAgU3VydmV5RXJyb3IsXG4gIEV2ZW50XG59IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IElTdXJ2ZXlUcmlnZ2VyT3duZXIsIFN1cnZleVRyaWdnZXIgfSBmcm9tIFwiLi90cmlnZ2VyXCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi9wYWdlXCI7XG5pbXBvcnQgeyBUZXh0UHJlUHJvY2Vzc29yLCBUZXh0UHJlUHJvY2Vzc29yVmFsdWUgfSBmcm9tIFwiLi90ZXh0UHJlUHJvY2Vzc29yXCI7XG5pbXBvcnQgeyBQcm9jZXNzVmFsdWUgfSBmcm9tIFwiLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmltcG9ydCB7IGR4U3VydmV5U2VydmljZSB9IGZyb20gXCIuL2R4U3VydmV5U2VydmljZVwiO1xuaW1wb3J0IHsgSnNvbkVycm9yIH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb25CYXNlIH0gZnJvbSBcIi4vcXVlc3Rpb25iYXNlXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgU3R5bGVzTWFuYWdlciB9IGZyb20gXCIuL3N0eWxlc21hbmFnZXJcIjtcbmltcG9ydCB7IFN1cnZleVRpbWVyIH0gZnJvbSBcIi4vc3VydmV5dGltZXJcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcblxuLyoqXG4gKiBTdXJ2ZXkgb2JqZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXJ2ZXkuIFBhZ2VzLCBRdWVzdGlvbnMsIGZsb3cgbG9naWMgYW5kIGV0Yy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleU1vZGVsIGV4dGVuZHMgQmFzZVxuICBpbXBsZW1lbnRzIElTdXJ2ZXksXG4gICAgSVN1cnZleURhdGEsXG4gICAgSVN1cnZleUltcGwsXG4gICAgSVN1cnZleVRyaWdnZXJPd25lcixcbiAgICBJTG9jYWxpemFibGVPd25lciB7XG4gIHByaXZhdGUgc3RhdGljIHN0eWxlc01hbmFnZXIgPSBuZXcgU3R5bGVzTWFuYWdlcigpO1xuICBwdWJsaWMgc3RhdGljIHBsYXRmb3JtOiBzdHJpbmcgPSBcInVua25vd25cIjtcbiAgcHVibGljIGdldCBwbGF0Zm9ybU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3VydmV5TW9kZWwucGxhdGZvcm07XG4gIH1cbiAgLyoqXG4gICAqIFlvdSBtYXkgc2hvdyBjb21tZW50cyBpbnB1dCBmb3IgdGhlIG1vc3Qgb2YgcXVlc3Rpb25zLiBUaGUgZW50ZXJlZCB0ZXh0IGluIHRoZSBjb21tZW50IGlucHV0IHdpbGwgYmUgc2F2ZWQgYXMgJ3F1ZXN0aW9uIG5hbWUnICsgJ2NvbW1lbnRQcmVmaXgnLlxuICAgKiBAc2VlIGRhdGFcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tbWVudFByZWZpeCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBCYXNlLmNvbW1lbnRQcmVmaXg7XG4gIH1cbiAgcHVibGljIHNldCBjb21tZW50UHJlZml4KHZhbDogc3RyaW5nKSB7XG4gICAgQmFzZS5jb21tZW50UHJlZml4ID0gdmFsO1xuICB9XG5cbiAgcHJpdmF0ZSBwYWdlc1ZhbHVlOiBBcnJheTxQYWdlTW9kZWw+O1xuICBwcml2YXRlIHRyaWdnZXJzVmFsdWU6IEFycmF5PFN1cnZleVRyaWdnZXI+O1xuICBwcml2YXRlIGN1cnJlbnRQYWdlVmFsdWU6IFBhZ2VNb2RlbCA9IG51bGw7XG4gIHByaXZhdGUgdmFsdWVzSGFzaDogSGFzaFRhYmxlPGFueT4gPSB7fTtcbiAgcHJpdmF0ZSB2YXJpYWJsZXNIYXNoOiBIYXNoVGFibGU8YW55PiA9IHt9O1xuXG4gIHByaXZhdGUgbG9jYWxlVmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgcHJpdmF0ZSBpc0NvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGlzU3RhcnRlZFN0YXRlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgaXNDb21wbGV0ZWRCZWZvcmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB0ZXh0UHJlUHJvY2Vzc29yOiBUZXh0UHJlUHJvY2Vzc29yO1xuICBwcml2YXRlIGNvbXBsZXRlZFN0YXRlVmFsdWU6IHN0cmluZyA9IFwiXCI7XG4gIHByaXZhdGUgY29tcGxldGVkU3RhdGVUZXh0VmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgcHJpdmF0ZSBpc1RpbWVyU3RhcnRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgdXNlciBjbGljayBvbiAnQ29tcGxldGUnIGJ1dHRvbiBhbmQgZmluaXNoZWQgdGhlIHN1cnZleS4gWW91IG1heSB1c2UgaXQgdG8gc2VuZCB0aGUgZGF0YSB0byB5b3VyIHdlYiBzZXJ2ZXIuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnNob3dEYXRhU2F2aW5nKHRleHQpIGNhbGwgdGhpcyBtZXRob2QgdG8gc2hvdyB0aGF0IHRoZSBzdXJ2ZXkgaXMgc2F2aW5nIHRoZSBkYXRhIG9uIHlvdXIgc2VydmVyLiBUaGUgdGV4dCBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gc2hvdyB5b3VyIG1lc3NhZ2UgaW5zdGVhZCBvZiBkZWZhdWx0LlxuICAgKiA8YnIvPiBvcHRpb25zLnNob3dEYXRhU2F2aW5nRXJyb3IodGV4dCkgY2FsbCB0aGlzIG1ldGhvZCB0byBzaG93IHRoYXQgdGhlcmUgaXMgYW4gZXJyb3Igb24gc2F2aW5nIHRoZSBkYXRhIG9uIHlvdXIgc2VydmVyLiBJZiB5b3Ugd2FudCB0byBzaG93IGEgY3VzdG9tIGVycm9yLCB1c2UgYW4gb3B0aW9uYWwgdGV4dCBwYXJhbWV0ZXIuXG4gICAqIDxici8+IG9wdGlvbnMuc2hvd0RhdGFTYXZpbmdTdWNjZXNzKHRleHQpIGNhbGwgdGhpcyBtZXRob2QgdG8gc2hvdyB0aGF0IHRoZSBkYXRhIHdlcmUgc3VjY2Vzc2Z1bCBzYXZlZCBvbiB0aGUgc2VydmVyLlxuICAgKiA8YnIvPiBvcHRpb25zLnNob3dEYXRhU2F2aW5nQ2xlYXIgY2FsbCB0aGlzIG1ldGhvZCB0byBoaWRlIHRoZSB0ZXh0IGFib3V0IHRoZSBzYXZpbmcgcHJvZ3Jlc3MuXG4gICAqIEBzZWUgZGF0YVxuICAgKiBAc2VlIGNsZWFySW52aXNpYmxlVmFsdWVzXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgKi9cbiAgcHVibGljIG9uQ29tcGxldGU6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBhZnRlciB0aGUgc3VydmV5IGNoYW5nZWQgaXQncyBzdGF0ZSBmcm9tIFwic3RhcnRpbmdcIiB0byBcInJ1bm5pbmdcIi4gVGhlIFwic3RhcnRpbmdcIiBzdGF0ZSBtZWFucyB0aGF0IHN1cnZleSBzaG93cyB0aGUgc3RhcnRlZCBwYWdlLlxuICAgKiBUaGUgZmlyc3RQYWdlSXNTdGFydGVkIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgdG8gdGhlIHRydWUsIGlmIHlvdSB3YW50IHRvIGhhdmUgdGhlIHN0YXJ0ZWQgcGFnZSBpbiB5b3VyIHN1cnZleS4gVGhlIGVuZC11c2VyIHNob3VsZCBjbGljayBvbiB0aGUgXCJTdGFydFwiIGJ1dHRvbiB0byBzdGFydCB0aGUgc3VydmV5LlxuICAgKiBAc2VlIGZpcnN0UGFnZUlzU3RhcnRlZFxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LFxuICAgIGFueVxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2xpY2tpbmcgJ05leHQnIHBhZ2UgaWYgc2VuZFJlc3VsdE9uUGFnZU5leHQgaXMgc2V0IHRvIHRydWUuIFlvdSBtYXkgdXNlIGl0IHRvIHNhdmUgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzLCBmb3IgZXhhbXBsZSwgaWYgeW91ciBzdXJ2ZXkgaXMgbGFyZ2UgZW5vdWdoLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogQHNlZSBzZW5kUmVzdWx0T25QYWdlTmV4dFxuICAgKi9cbiAgcHVibGljIG9uUGFydGlhbFNlbmQ6IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsKSA9PiBhbnksIGFueT4gPSBuZXcgRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSxcbiAgICBhbnlcbiAgPigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gYW5vdGhlciBwYWdlIGJlY29tZXMgdGhlIGN1cnJlbnQuIFR5cGljYWxseSBpdCBoYXBwZW5zIHdoZW4gYSB1c2VyIGNsaWNrIG9uICdOZXh0JyBvciAnUHJldicgYnV0dG9ucy5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbi5vbGRDdXJyZW50UGFnZSB0aGUgcHJldmlvdXMgY3VycmVudC9hY3RpdmUgcGFnZVxuICAgKiA8YnIvPiBvcHRpb24ubmV3Q3VycmVudFBhZ2UgYSBuZXcgY3VycmVudC9hY3RpdmUgcGFnZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlXG4gICAqIEBzZWUgY3VycmVudFBhZ2VOb1xuICAgKiBAc2VlIG5leHRQYWdlXG4gICAqIEBzZWUgcHJldlBhZ2VcbiAgICogQHNlZSBjb21wbGV0ZUxhc3RQYWdlXG4gICAqL1xuICBwdWJsaWMgb25DdXJyZW50UGFnZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSBxdWVzdGlvbiB2YWx1ZSBpcyBjaGFuZ2VkLiBJdCBjYW4gYmUgZG9uZSB2aWEgVUkgYnkgYSB1c2VyIG9yIHByb2dyYW1tYXRpY2FsbHkgb24gY2FsbGluZyBzZXRWYWx1ZSBtZXRob2QuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgdGhlIHZhbHVlIG5hbWUgdGhhdCBoYXMgYmVlbiBjaGFuZ2VkXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBxdWVzdGlvbiB3aGljaCBxdWVzdGlvbi5uYW1lIGVxdWFscyB0byB0aGUgdmFsdWUgbmFtZS4gSWYgdGhlcmUgYXJlIHNldmVyYWwgcXVlc3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSwgdGhlIGZpcnN0IHF1ZXN0aW9uIGlzIHRha2VuLiBJZiB0aGVyZSBpcyBubyBzdWNoIHF1ZXN0aW9ucywgdGhlIG9wdGlvbnMucXVlc3Rpb24gaXMgbnVsbC5cbiAgICogPGJyLz4gb3B0aW9ucy52YWx1ZSBhIG5ldyB2YWx1ZVxuICAgKiBAc2VlIHNldFZhbHVlXG4gICAqL1xuICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBjaGFuZ2luZyBhIHF1ZXN0aW9uIHZpc2liaWxpdHkuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcXVlc3Rpb24gd2hpY2ggdmlzaWJpbGl0eSBoYXMgYmVlbiBjaGFuZ2VkXG4gICAqIDxici8+IG9wdGlvbnMubmFtZSBhIHF1ZXN0aW9uIG5hbWVcbiAgICogPGJyLz4gb3B0aW9ucy52aXNpYmxlIGEgcXVlc3Rpb24gdmlzaWJsZSBib29sZWFuIHZhbHVlXG4gICAqIEBzZWUgUXVlc3Rpb25CYXNlLnZpc2liaWxlXG4gICAqIEBzZWUgUXVlc3Rpb25CYXNlLnZpc2liaWxlSWZcbiAgICovXG4gIHB1YmxpYyBvblZpc2libGVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2hhbmdpbmcgYSBwYWdlIHZpc2liaWxpdHkuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnBhZ2UgYSBwYWdlICB3aGljaCB2aXNpYmlsaXR5IGhhcyBiZWVuIGNoYW5nZWRcbiAgICogPGJyLz4gb3B0aW9ucy52aXNpYmxlIGEgcGFnZSB2aXNpYmxlIGJvb2xlYW4gdmFsdWVcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJpbGVcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJpbGVJZlxuICAgKi9cbiAgcHVibGljIG9uUGFnZVZpc2libGVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gY2hhbmdpbmcgYSBwYW5lbCB2aXNpYmlsaXR5LlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5wYW5lbCBhIHBhbmVsIHdoaWNoIHZpc2liaWxpdHkgaGFzIGJlZW4gY2hhbmdlZFxuICAgKiA8YnIvPiBvcHRpb25zLnZpc2libGUgYSBwYW5lbCB2aXNpYmxlIGJvb2xlYW4gdmFsdWVcbiAgICogQHNlZSBQYW5lbE1vZGVsLnZpc2liaWxlXG4gICAqIEBzZWUgUGFuZWxNb2RlbC52aXNpYmlsZUlmXG4gICAqL1xuICBwdWJsaWMgb25QYW5lbFZpc2libGVDaGFuZ2VkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgbmV3IHF1ZXN0aW9uIGludG8gc3VydmV5LlxuICAgKiAncXVlc3Rpb24nOiBxdWVzdGlvbiwgJ25hbWUnOiBxdWVzdGlvbi5uYW1lLCAnaW5kZXgnOiBpbmRleCwgJ3BhcmVudFBhbmVsJzogcGFyZW50UGFuZWwsICdyb290UGFuZWwnOiByb290UGFuZWxcbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBuZXdseSBhZGRlZCBxdWVzdGlvbiBvYmplY3QuXG4gICAqIDxici8+IG9wdGlvbnMubmFtZSBhIHF1ZXN0aW9uIG5hbWVcbiAgICogPGJyLz4gb3B0aW9ucy5pbmRleCBhIGluZGV4IG9mIHRoZSBxdWVzdGlvbiBpbiB0aGUgY29udGFpbmVyIChwYWdlIG9yIHBhbmVsKVxuICAgKiA8YnIvPiBvcHRpb25zLnBhcmVudFBhbmVsIGEgY29udGFpbmVyIHdoZXJlIHF1ZXN0aW9uIGlzIGxvY2F0ZWQuIEl0IGNhbiBiZSBwYWdlIG9yIHBhbmVsLlxuICAgKiA8YnIvPiBvcHRpb25zLnJvb3RQYW5lbCB0eXBpY2FsbHkgaXQgaXMgYSBwYWdlLlxuICAgKiBAc2VlIFF1ZXN0aW9uQmFzZVxuICAgKi9cbiAgcHVibGljIG9uUXVlc3Rpb25BZGRlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIG9uIHJlbW92aW5nIGEgcXVlc3Rpb24gZnJvbSBzdXJ2ZXlcbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSByZW1vdmVkIHF1ZXN0aW9uIG9iamVjdC5cbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAc2VlIFF1ZXN0aW9uQmFzZVxuICAgKi9cbiAgcHVibGljIG9uUXVlc3Rpb25SZW1vdmVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgcGFuZWwgaW50byBzdXJ2ZXlcbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucGFuZWwgYSBuZXdseSBhZGRlZCBwYW5lbCBvYmplY3QuXG4gICAqIDxici8+IG9wdGlvbnMubmFtZSBhIHBhbmVsIG5hbWVcbiAgICogPGJyLz4gb3B0aW9ucy5pbmRleCBhIGluZGV4IG9mIHRoZSBwYW5lbCBpbiB0aGUgY29udGFpbmVyIChwYWdlIG9yIHBhbmVsKVxuICAgKiA8YnIvPiBvcHRpb25zLnBhcmVudFBhbmVsIGEgY29udGFpbmVyIHdoZXJlIHF1ZXN0aW9uIGlzIGxvY2F0ZWQuIEl0IGNhbiBiZSBwYWdlIG9yIHBhbmVsLlxuICAgKiA8YnIvPiBvcHRpb25zLnJvb3RQYW5lbCB0eXBpY2FsbHkgaXQgaXMgYSBwYWdlLlxuICAgKiBAc2VlIFBhbmVsTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvblBhbmVsQWRkZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiByZW1vdmluZyBhIHBhbmVsIGZyb20gc3VydmV5XG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnBhbmVsIGEgcmVtb3ZlZCBwYW5lbCBvYmplY3QuXG4gICAqIDxici8+IG9wdGlvbnMubmFtZSBhIHBhbmVsIG5hbWVcbiAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25QYW5lbFJlbW92ZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBwYWdlIGludG8gc3VydmV5XG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnBhZ2UgYSBuZXdseSBhZGRlZCBwYW5lbCBvYmplY3QuXG4gICAqIEBzZWUgUGFuZWxNb2RlbFxuICAgKi9cbiAgcHVibGljIG9uUGFnZUFkZGVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gdmFsaWRhdGluZyB2YWx1ZSBpbiBhIHF1ZXN0aW9uLiBTZXQgeW91ciBlcnJvciB0byBvcHRpb25zLmVycm9yIGFuZCBzdXJ2ZXkgd2lsbCBzaG93IHRoZSBlcnJvciBmb3IgdGhlIHF1ZXN0aW9uIGFuZCBibG9jayBjb21wbGV0aW5nIHRoZSBzdXJ2ZXkgb3IgZ29pbmcgdG8gdGhlIG5leHQgcGFnZS5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBxdWVzdGlvblxuICAgKiA8YnIvPiBvcHRpb25zLm5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqIDxici8+IG9wdGlvbnMudmFsdWUgdGhlIGN1cnJlbnQgcXVlc3Rpb24gdmFsdWVcbiAgICogPGJyLz4gb3B0aW9ucy5lcnJvciBhbiBlcnJvciBzdHJpbmcuIEl0IGlzIGVtcHR5IGJ5IGRlZmF1bHQuXG4gICAqIEBzZWUgb25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9uc1xuICAgKi9cbiAgcHVibGljIG9uVmFsaWRhdGVRdWVzdGlvbjogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIHRoaXMgZXZlbnQgdG8gdmFsaWRhdGUgZGF0YSBvbiB5b3VyIHNlcnZlci5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuZGF0YSB0aGUgdmFsdWVzIG9mIGFsbCBub24tZW1wdHkgcXVlc3Rpb25zIG9uIHRoZSBjdXJyZW50IHBhZ2UuIFlvdSBjYW4gZ2V0IGEgcXVlc3Rpb24gdmFsdWUgYXMgb3B0aW9ucy5kYXRhW1wibXlRdWVzdGlvbk5hbWVcIl0uXG4gICAqIDxici8+IG9wdGlvbnMuZXJyb3JzIHNldCB5b3VyIGVycm9ycyB0byB0aGlzIG9iamVjdCBhczogb3B0aW9ucy5lcnJvcnNbXCJteVF1ZXN0aW9uTmFtZVwiXSA9IFwiRXJyb3IgdGV4dFwiOy4gSXQgd2lsbCBiZSBzaG93biBhcyBhIHF1ZXN0aW9uIGVycm9yLlxuICAgKiBAc2VlIG9uVmFsaWRhdGVRdWVzdGlvblxuICAgKiBAc2VlIG9uVmFsaWRhdGVQYW5lbFxuICAgKi9cbiAgcHVibGljIG9uU2VydmVyVmFsaWRhdGVRdWVzdGlvbnM6IChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIG1vZGlmeSB0aGUgaHRtbCBiZWZvcmUgcmVuZGVyaW5nLCBmb3IgZXhhbXBsZSBodG1sIG9uICdUaGFuayB5b3UnIHBhZ2UuIE9wdGlvbnMgaGFzIG9uZSBwYXJhbWV0ZXI6IG9wdGlvbnMuaHRtbC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuaHRtbCBhbiBodG1sIHRoYXQgeW91IG1heSBjaGFuZ2UgYmVmb3JlIHRleHQgcHJvY2Vzc2luZyBhbmQgdGhlbiByZW5kZXJpbmcuXG4gICAqIEBzZWUgY29tcGxldGVkSHRtbFxuICAgKiBAc2VlIGxvYWRpbmdIdG1sXG4gICAqIEBzZWUgUXVlc3Rpb25IdG1sTW9kZWwuaHRtbFxuICAgKi9cbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiB2YWxpZGF0aW5nIGEgcGFuZWwuIFNldCB5b3VyIGVycm9yIHRvIG9wdGlvbnMuZXJyb3IgYW5kIHN1cnZleSB3aWxsIHNob3cgdGhlIGVycm9yIGZvciB0aGUgcGFuZWwgYW5kIGJsb2NrIGNvbXBsZXRpbmcgdGhlIHN1cnZleSBvciBnb2luZyB0byB0aGUgbmV4dCBwYWdlLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5uYW1lIGEgcGFuZWwgbmFtZVxuICAgKiA8YnIvPiBvcHRpb25zLmVycm9yIGFuIGVycm9yIHN0cmluZy4gSXQgaXMgZW1wdHkgYnkgZGVmYXVsdC5cbiAgICogQHNlZSBvblZhbGlkYXRlUXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBvblZhbGlkYXRlUGFuZWw6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgcHVibGljIG9uUHJvY2Vzc0h0bWw6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIHByb2Nlc3MgdGhlIG1hcmtkb3duIHRleHQuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnRleHQgYSB0ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVuZGVyZWRcbiAgICogPGJyLz4gb3B0aW9ucy5odG1sIGEgaHRtbC4gSXQgaXMgbnVsbCBieSBkZWZhdWx0LiBTZXQgaXQgYW5kIHN1cnZleSB3aWxsIHVzZSBpdCBpbnN0ZWFkIG9mIG9wdGlvbnMudGV4dFxuICAgKi9cbiAgcHVibGljIG9uVGV4dE1hcmtkb3duOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgZmlyZXMgd2hlbiBpdCBnZXQgcmVzcG9uc2UgZnJvbSB0aGUgW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2Ugb24gc2F2aW5nIHN1cnZleSByZXN1bHRzLiBVc2UgaXQgdG8gZmluZCBvdXQgaWYgdGhlIHJlc3VsdHMgaGF2ZSBiZWVuIHNhdmVkIHN1Y2Nlc3NmdWwuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnN1Y2Nlc3MgaXQgaXMgdHJ1ZSBpZiB0aGUgcmVzdWx0cyB3ZXJlIHNlbnQgdG8gdGhlIHNlcnZpY2Ugc3VjY2Vzc2Z1bFxuICAgKiA8YnIvPiBvcHRpb25zLnJlc3BvbnNlIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmljZVxuICAgKi9cbiAgcHVibGljIG9uU2VuZFJlc3VsdDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVXNlIGl0IHRvIGdldCByZXN1bHRzIGFmdGVyIGNhbGxpbmcgdGhlIGdldFJlc3VsdCBtZXRob2QuIEl0IHJldHVybnMgYSBzaW1wbGUgYW5hbHl0aWMgZnJvbSBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZS5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuc3VjY2VzcyBpdCBpcyB0cnVlIGlmIHRoZSByZXN1bHRzIHdlcmUgZ290IGZyb20gdGhlIHNlcnZpY2Ugc3VjY2Vzc2Z1bFxuICAgKiA8YnIvPiBvcHRpb25zLmRhdGEgdGhlIG9iamVjdCB7QW5zd2Vyc0NvdW50LCBRdWVzdGlvblJlc3VsdCA6IHt9IH0uIEFuc3dlcnNDb3VudCBpcyB0aGUgbnVtYmVyIG9mIHBvc3RlZCBzdXJ2ZXkgcmVzdWx0cy4gUXVlc3Rpb25SZXN1bHQgaXMgYW4gb2JqZWN0IHdpdGggYWxsIHBvc3NpYmxlIHVuaXF1ZSBhbnN3ZXJzIHRvIHRoZSBxdWVzdGlvbiBhbmQgbnVtYmVyIG9mIHRoZXNlIGFuc3dlcnMuXG4gICAqIDxici8+IG9wdGlvbnMuZGF0YUxpc3QgYW4gYXJyYXkgb2Ygb2JqZWN0cyB7bmFtZSwgdmFsdWV9LCB3aGVyZSAnbmFtZScgaXMgYW4gdW5pcXVlIHZhbHVlL2Fuc3dlciB0byB0aGUgcXVlc3Rpb24gYW5kIHZhbHVlIGlzIGEgbnVtYmVyL2NvdW50IG9mIHN1Y2ggYW5zd2Vycy5cbiAgICogPGJyLz4gb3B0aW9ucy5yZXNwb25zZSB0aGUgc2VydmVyIHJlc3BvbnNlXG4gICAqIEBzZWUgZ2V0UmVzdWx0XG4gICAqL1xuICBwdWJsaWMgb25HZXRSZXN1bHQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiB1cGxvYWRpbmcgdGhlIGZpbGUgaW4gUXVlc3Rpb25GaWxlLiBZb3UgbWF5IHVzZSBpdCB0byBjaGFuZ2UgdGhlIGZpbGUgbmFtZSBvciB0ZWxscyB0aGUgbGlicmFyeSBkbyBub3QgYWNjZXB0IHRoZSBmaWxlLiBUaGVyZSBhcmUgdGhyZWUgcHJvcGVydGllcyBpbiBvcHRpb25zOiBvcHRpb25zLm5hbWUsIG9wdGlvbnMuZmlsZSBhbmQgb3B0aW9ucy5hY2NlcHQuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiBuYW1lOiBuYW1lLCBmaWxlOiBmaWxlLCBhY2NlcHQ6IGFjY2VwdFxuICAgKiA8YnIvPiBuYW1lIHRoZSBmaWxlIG5hbWVcbiAgICogPGJyLz4gZmlsZSB0aGUgSmF2YXNjcmlwdCBGaWxlIG9iamVjdFxuICAgKiA8YnIvPiBhY2NlcHQgYSBib29sZWFuIHZhbHVlLCB0cnVlIGJ5IGRlZmF1bHQuIFNldCBpdCB0byBmYWxzZSB0byBkZW55IHRoaXMgZmlsZSB0byB1cGxvYWRcbiAgICogQHNlZSB1cGxvYWRGaWxlXG4gICAqL1xuICBwdWJsaWMgb25VcGxvYWRGaWxlOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIHJlbmRlcmluZyBhIHF1ZXN0aW9uLiBVc2UgaXQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcXVlc3Rpb24gY3NzIGNsYXNzZXMuXG4gICAqIFRoZXJlIGFyZSB0d28gcGFyYW1ldGVycyBpbiBvcHRpb25zOiBvcHRpb25zLnF1ZXN0aW9uIGFuZCBvcHRpb25zLmNzc0NsYXNzZXNcbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBxdWVzdGlvbiBmb3Igd2hpY2ggeW91IG1heSBjaGFuZ2UgdGhlIGNzcyBjbGFzc2VzXG4gICAqIDxici8+IG9wdGlvbnMuY3NzQ2xhc3NlcyBhbiBvYmplY3Qgd2l0aCBjc3MgY2xhc3Nlcy4gRm9yIGV4YW1wbGUge3Jvb3Q6IFwidGFibGVcIiwgYnV0dG9uOiBcImJ1dHRvblwifS4gWW91IG1heSBjaGFuZ2UgdGhlbSB0byB5b3VyIG93biBjc3MgY2xhc3Nlcy5cbiAgICovXG4gIHB1YmxpYyBvblVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3NlczogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSByZW5kZXJpbmcgYSBwYW5lbCBvciBwYWdlLiBVc2UgaXQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcGFuZWwvcGFnZSBjc3MgY2xhc3Nlcy5cbiAgICogVGhlcmUgYXJlIHR3byBwYXJhbWV0ZXJzIGluIG9wdGlvbnM6IG9wdGlvbnMucGFuZWwgYW5kIG9wdGlvbnMuY3NzQ2xhc3Nlc1xuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5wYW5lbCBhIHBhbmVsIGZvciB3aGljaCB5b3UgbWF5IGNoYW5nZSB0aGUgY3NzIGNsYXNzZXNcbiAgICogPGJyLz4gb3B0aW9ucy5jc3NDbGFzc2VzIGFuIG9iamVjdCB3aXRoIGNzcyBjbGFzc2VzLiBGb3IgZXhhbXBsZSB7dGl0bGU6IFwic3ZfcF90aXRsZVwiLCBkZXNjcmlwdGlvbjogXCJzbWFsbFwifS4gWW91IG1heSBjaGFuZ2UgdGhlbSB0byB5b3VyIG93biBjc3MgY2xhc3Nlcy5cbiAgICovXG4gIHB1YmxpYyBvblVwZGF0ZVBhbmVsQ3NzQ2xhc3NlczogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHJpZ2h0IGFmdGVyIHN1cnZleSBpcyByZW5kZXJlZCBpbiBET00uIG9wdGlvbnMuaHRtbEVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudC5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMuaHRtbEVsZW1lbnQgYSByb290IGh0bWwgZWxlbWVudCBiaW5kZWQgd2l0aCB0aGUgc3VydmV5IG9iamVjdFxuICAgKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXJTdXJ2ZXk6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBhIHBhZ2UgaXMgcmVuZHJlZCBpbiBET00uIFVzZSBpdCB0byBtb2RpZnkgaHRtbCBlbGVtZW50cy4gVGhlcmUgYXJlIHR3byBwYXJhbWV0ZXJzIGluIG9wdGlvbnM6IG9wdGlvbnMuY3VycmVudFBhZ2UsIG9wdGlvbnMuaHRtbEVsZW1lbnRcbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucGFnZSBhIHBhZ2Ugb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWQuIFR5cGljYWxseSB0aGUgY3VycmVudC9hY3RpdmUgcGFnZS5cbiAgICogPGJyLz4gb3B0aW9ucy5odG1sRWxlbWVudCBhbiBodG1sIGVsZW1lbnQgYmluZGVkIHdpdGggdGhlIHBhZ2Ugb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgb25BZnRlclJlbmRlclBhZ2U6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCByaWdodCBhZnRlciBhIHF1ZXN0aW9uIGlzIHJlbmRyZWQgaW4gRE9NLiBVc2UgaXQgdG8gbW9kaWZ5IGh0bWwgZWxlbWVudHMuIFRoZXJlIGFyZSB0d28gcGFyYW1ldGVycyBpbiBvcHRpb25zOiBvcHRpb25zLnF1ZXN0aW9uLCBvcHRpb25zLmh0bWxFbGVtZW50XG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcXVlc3Rpb24gb2JqZWN0IGZvciB3aGljaCB0aGUgZXZlbnQgaXMgZmlyZWRcbiAgICogPGJyLz4gb3B0aW9ucy5odG1sRWxlbWVudCBhbiBodG1sIGVsZW1lbnQgYmluZGVkIHdpdGggdGhlIHF1ZXN0aW9uIG9iamVjdFxuICAgKi9cbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXJRdWVzdGlvbjogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHJpZ2h0IGFmdGVyIGEgcGFuZWwgaXMgcmVuZHJlZCBpbiBET00uIFVzZSBpdCB0byBtb2RpZnkgaHRtbCBlbGVtZW50cy4gVGhlcmUgYXJlIHR3byBwYXJhbWV0ZXJzIGluIG9wdGlvbnM6IG9wdGlvbnMucGFuZWwsIG9wdGlvbnMuaHRtbEVsZW1lbnRcbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucGFuZWwgYSBwYW5lbCBvYmplY3QgZm9yIHdoaWNoIHRoZSBldmVudCBpcyBmaXJlZFxuICAgKiA8YnIvPiBvcHRpb25zLmh0bWxFbGVtZW50IGFuIGh0bWwgZWxlbWVudCBiaW5kZWQgd2l0aCB0aGUgcGFuZWwgb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgb25BZnRlclJlbmRlclBhbmVsOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gYWRkaW5nIGEgbmV3IHJvdyBpbiBNYXRyaXggRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBtYXRyaXggcXVlc3Rpb24uXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC52aXNpYmxlUm93c1xuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Um93QWRkZWQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiByZW1vdmluZyBhIHJvdyBmcm9tIE1hdHJpeCBEeW5hbWljIHF1ZXN0aW9uLlxuICAgKiA8YnIvPiBzZW5kZXIgdGhlIHN1cnZleSBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICogPGJyLz4gb3B0aW9ucy5xdWVzdGlvbiBhIG1hdHJpeCBxdWVzdGlvbi5cbiAgICogPGJyLz4gb3B0aW9ucy5yb3dJbmRleCBhIHJlbW92ZWQgcm93IGluZGV4LlxuICAgKiA8YnIvPiBvcHRpb25zLnJvdyBhIHJlbW92ZWQgcm93IG9iamVjdC5cbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsLnZpc2libGVSb3dzXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhSb3dSZW1vdmVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgZm9yIGV2ZXJ5IGNlbGwgY3JlYXRlZCBpbiBNYXRyaXggRHltaWMgYW5kIE1hdHJpeCBEcm9wZG93biBxdWVzdGlvbnMuXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gLSB0aGUgbWF0cml4IHF1ZXN0aW9uXG4gICAqIDxici8+IG9wdGlvbnMuY2VsbCAtIHRoZSBtYXRyaXggY2VsbFxuICAgKiA8YnIvPiBvcHRpb25zLmNlbGxRdWVzdGlvbiAtIHRoZSBxdWVzdGlvbi9lZGl0b3IgaW4gdGhlIGNlbGwuIFlvdSBtYXkgY3VzdG9taXplIGl0LCBjaGFuZ2UgaXQncyBwcm9wZXJ0aWVzLCBsaWtlIGNob2ljZXMgb3IgdmlzaWJsZS5cbiAgICogPGJyLz4gb3B0aW9ucy5yb3dWYWx1ZSAtIHRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudCByb3cuIFRvIGFjY2VzcyB0aGUgdmFsdWUgb2YgcGF0aWN1bGFyIGNvbHVtbiB1c2U6IG9wdGlvbnMucm93VmFsdWVbXCJjb2x1bW5WYWx1ZVwiXVxuICAgKiA8YnIvPiBvcHRpb25zLmNvbHVtbiAtIHRoZSBtYXRyaXggY29sdW1uIG9iamVjdFxuICAgKiA8YnIvPiBvcHRpb25zLmNvbHVtTmFtZSAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWVcbiAgICogPGJyLz4gb3B0aW9ucy5yb3cgLSB0aGUgbWF0cml4IHJvdyBvYmplY3RcbiAgICogQHNlZSBvbk1hdHJpeFJvd0FkZGVkXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWxcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxcbiAgICovXG4gIHB1YmxpYyBvbk1hdHJpeENlbGxDcmVhdGVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgZm9yIGV2ZXJ5IGNlbGwgYWZ0ZXIgaXMgaGFzIGJlZW4gcmVuZGVyZWQgaW4gRE9NLlxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIC0gdGhlIG1hdHJpeCBxdWVzdGlvblxuICAgKiA8YnIvPiBvcHRpb25zLmNlbGwgLSB0aGUgbWF0cml4IGNlbGxcbiAgICogPGJyLz4gb3B0aW9ucy5jZWxsUXVlc3Rpb24gLSB0aGUgcXVlc3Rpb24vZWRpdG9yIGluIHRoZSBjZWxsLlxuICAgKiA8YnIvPiBvcHRpb25zLmh0bWxFbGVtZW50IGEgaHRtbCBlbGVtZW50IGJpbmRlZCB3aXRoIHRoZSBjZWxsUXVlc3Rpb24gb2JqZWN0XG4gICAqIDxici8+IG9wdGlvbnMuY29sdW1uIC0gdGhlIG1hdHJpeCBjb2x1bW4gb2JqZWN0XG4gICAqIDxici8+IG9wdGlvbnMucm93IC0gdGhlIG1hdHJpeCByb3cgb2JqZWN0XG4gICAqIEBzZWUgb25NYXRyaXhDZWxsQ3JlYXRlZFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhBZnRlckNlbGxSZW5kZXI6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCB3aGVuIGNlbGwgdmFsdWUgaXMgY2hhbmdlZCBpbiBNYXRyaXggRHltaWMgYW5kIE1hdHJpeCBEcm9wZG93biBxdWVzdGlvbnMuXG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gLSB0aGUgbWF0cml4IHF1ZXN0aW9uXG4gICAqIDxici8+IG9wdGlvbnMuY29sdW1OYW1lIC0gdGhlIG1hdHJpeCBjb2x1bW4gbmFtZVxuICAgKiA8YnIvPiBvcHRpb25zLnZhbHVlIC0gYSBuZXcgdmFsdWVcbiAgICogPGJyLz4gb3B0aW9ucy5yb3cgLSB0aGUgbWF0cml4IHJvdyBvYmplY3RcbiAgICogPGJyLz4gb3B0aW9ucy5nZXRDZWxsUXVlc3Rpb24oY29sdW1uTmFtZSkgLSB0aGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBjZWxsIHF1ZXN0aW9uIGJ5IGNvbHVtbiBuYW1lLlxuICAgKiBAc2VlIG9uTWF0cml4Um93QWRkZWRcbiAgICogQHNlZSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbFxuICAgKi9cbiAgcHVibGljIG9uTWF0cml4Q2VsbFZhbHVlQ2hhbmdlZDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gTWF0cml4IER5bWljIGFuZCBNYXRyaXggRHJvcGRvd24gcXVlc3Rpb25zIHZhbGlkYXRlIHRoZSBjZWxsIHZhbHVlLlxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIC0gdGhlIG1hdHJpeCBxdWVzdGlvblxuICAgKiA8YnIvPiBvcHRpb25zLmNvbHVtTmFtZSAtIHRoZSBtYXRyaXggY29sdW1uIG5hbWVcbiAgICogPGJyLz4gb3B0aW9ucy52YWx1ZSAtIGEgY2VsbCB2YWx1ZVxuICAgKiA8YnIvPiBvcHRpb25zLnJvdyAtIHRoZSBtYXRyaXggcm93IG9iamVjdFxuICAgKiA8YnIvPiBvcHRpb25zLmdldENlbGxRdWVzdGlvbihjb2x1bW5OYW1lKSAtIHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNlbGwgcXVlc3Rpb24gYnkgY29sdW1uIG5hbWUuXG4gICAqIEBzZWUgb25NYXRyaXhSb3dBZGRlZFxuICAgKiBAc2VlIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsXG4gICAqL1xuICBwdWJsaWMgb25NYXRyaXhDZWxsVmFsaWRhdGU6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCBpcyBmaXJlZCBvbiBhZGRpbmcgYSBuZXcgcGFuZWwgaW4gUGFuZWwgRHluYW1pYyBxdWVzdGlvbi5cbiAgICogPGJyLz4gc2VuZGVyIHRoZSBzdXJ2ZXkgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAqIDxici8+IG9wdGlvbnMucXVlc3Rpb24gYSBwYW5lbCBxdWVzdGlvbi5cbiAgICogQHNlZSBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsXG4gICAqIEBzZWUgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbC5wYW5lbHNcbiAgICovXG4gIHB1YmxpYyBvbkR5bmFtaWNQYW5lbEFkZGVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgb24gcmVtb3ZpbmcgYSBwYW5lbCBmcm9tIFBhbmVsIER5bmFtaWMgcXVlc3Rpb24uXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcGFuZWwgcXVlc3Rpb24uXG4gICAqIDxici8+IG9wdGlvbnMucGFuZWxJbmRleCBhIHJlbW92ZWQgcGFuZWwgaW5kZXguXG4gICAqIEBzZWUgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbFxuICAgKiBAc2VlIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwucGFuZWxzXG4gICAqL1xuICBwdWJsaWMgb25EeW5hbWljUGFuZWxSZW1vdmVkOiBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksXG4gICAgYW55XG4gID4gPSBuZXcgRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LCBhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgZXZlcnkgc2Vjb25kIGlmIHRoZSBtZXRob2Qgc3RhcnRUaW1lciBoYXMgYmVlbiBjYWxsZWQuXG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIHRpbWVTcGVudFxuICAgKiBAc2VlIFBhZ2UudGltZVNwZW50XG4gICAqL1xuICBwdWJsaWMgb25UaW1lcjogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LFxuICAgIGFueVxuICA+KCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgaXMgZmlyZWQgYmVmb3JlIGRpc3BsYXlpbmcgYSBuZXcgaW5mb3JtYXRpb24gaW4gdGhlIFRpbWVyIFBhbmVsLiBVc2UgaXQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAqIDxici8+IG9wdGlvbnMudGV4dCAtIHRoZSB0aW1lciBwYW5lbCBpbmZvIHRleHQuXG4gICAqL1xuICBwdWJsaWMgb25UaW1lclBhbmVsSW5mb1RleHQ6IEV2ZW50PFxuICAgIChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSxcbiAgICBhbnlcbiAgPiA9IG5ldyBFdmVudDwoc2VuZGVyOiBTdXJ2ZXlNb2RlbCwgb3B0aW9uczogYW55KSA9PiBhbnksIGFueT4oKTtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIGV2ZW50IHRvIGRlZmluZSwgaWYgdGhlIGFuc3dlciBvbiB0aGUgcXVlc3Rpb24gaXMgY29ycmVjdCBvciBub3QuXG4gICAqIDxici8+IHNlbmRlciB0aGUgc3VydmV5IG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgKiA8YnIvPiBvcHRpb25zLnF1ZXN0aW9uIGEgcXVlc3Rpb24gb24gd2hpY2ggeW91IGhhdmUgdG8gZGVjaWRlIGlmIHRoZSBhbnN3ZXIgaXMgY29ycmVjdCBvciBub3QuXG4gICAqIDxici8+IG9wdGlvbnMucmVzdWx0IHJldHVybiB0cnVlLCBpZiB0aGUgYW5zd2VyIGlzIGNvcnJlY3Qgb3IgZmFsc2UgaWYgdGhlIGFuc3dlciBpcyBub3QgY29ycmVjdC4gVXNlIHF1ZXN0aW9ucyB2YWx1ZSBhbmQgY29ycmVjdEFuc3dlciBwcm9wZXJ0aWVzIHRvIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICogQHNlZSBRdWVzdGlvbi52YWx1ZVxuICAgKiBAc2VlIFF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXJcbiAgICovXG4gIHB1YmxpYyBvbklzQW5zd2VyQ29ycmVjdDogRXZlbnQ8XG4gICAgKHNlbmRlcjogU3VydmV5TW9kZWwsIG9wdGlvbnM6IGFueSkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChzZW5kZXI6IFN1cnZleU1vZGVsLCBvcHRpb25zOiBhbnkpID0+IGFueSwgYW55PigpO1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgZXJyb3JzIG9uIGxvYWRpbmcgc3VydmV5IGpzb24uIElmIHRoZSBsaXN0IGlzIGVtcHR5IGFmdGVyIGxvYWRpbmcgYSBqc29uIHRoZW4gdGhlIGpzb24gaXMgY29ycmVjdCBhbmQgdGhlcmUgaXMgbm8gZXJyb3JzIGluIGl0LlxuICAgKiBAc2VlIEpzb25FcnJvclxuICAgKi9cbiAgcHVibGljIGpzb25FcnJvcnM6IEFycmF5PEpzb25FcnJvcj4gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGpzb25PYmo6IGFueSA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgbG9jVGl0bGVWYWx1ZSA9IHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiLCB0aGlzLCB0cnVlKTtcbiAgICBsb2NUaXRsZVZhbHVlLm9uUmVuZGVyZWRIdG1sQ2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gc2VsZi5wcm9jZXNzZWRUaXRsZTtcbiAgICB9O1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRIdG1sXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZWRCZWZvcmVIdG1sXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJsb2FkaW5nSHRtbFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwic3RhcnRTdXJ2ZXlcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhZ2VQcmV2XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYWdlTmV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiLCB0aGlzLCB0cnVlKTtcblxuICAgIHRoaXMudGV4dFByZVByb2Nlc3NvciA9IG5ldyBUZXh0UHJlUHJvY2Vzc29yKCk7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9IGZ1bmN0aW9uKFxuICAgICAgdGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWVcbiAgICApIHtcbiAgICAgIHNlbGYuZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLnBhZ2VzVmFsdWUgPSB0aGlzLmNyZWF0ZU5ld0FycmF5KFwicGFnZXNcIiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHNlbGYuZG9PblBhZ2VBZGRlZCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy50cmlnZ2Vyc1ZhbHVlID0gdGhpcy5jcmVhdGVOZXdBcnJheShcInRyaWdnZXJzXCIsIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB2YWx1ZS5zZXRPd25lcihzZWxmKTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICBcImZpcnN0UGFnZUlzU3RhcnRlZFwiLFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYub25GaXJzdFBhZ2VJc1N0YXJ0ZWRDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiaXNTaW5nbGVQYWdlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbklzU2luZ2xlUGFnZUNoYW5nZWQoKTtcbiAgICB9KTtcbiAgICB0aGlzLm9uQmVmb3JlQ3JlYXRpbmcoKTtcbiAgICBpZiAoanNvbk9iaikge1xuICAgICAgaWYgKHR5cGVvZiBqc29uT2JqID09PSBcInN0cmluZ1wiIHx8IGpzb25PYmogaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAganNvbk9iaiA9IEpTT04ucGFyc2UoanNvbk9iaiBhcyBzdHJpbmcpO1xuICAgICAgfVxuICAgICAgaWYgKGpzb25PYmogJiYganNvbk9iai5jbGllbnRJZCkge1xuICAgICAgICB0aGlzLmNsaWVudElkID0ganNvbk9iai5jbGllbnRJZDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0SnNvbk9iamVjdChqc29uT2JqKTtcbiAgICAgIGlmICh0aGlzLnN1cnZleUlkKSB7XG4gICAgICAgIHRoaXMubG9hZFN1cnZleUZyb21TZXJ2aWNlKHRoaXMuc3VydmV5SWQsIHRoaXMuY2xpZW50SWQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uQ3JlYXRpbmcoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInN1cnZleVwiO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBhbGwgcGFnZXMgaW4gdGhlIHN1cnZleSwgaW5jbHVkaW5nIGludmlzaWJsZS5cbiAgICogQHNlZSBQYWdlTW9kZWxcbiAgICogQHNlZSB2aXNpYmxlUGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZXMoKTogQXJyYXk8UGFnZU1vZGVsPiB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXNWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgdHJpZ2dlcnMgaW4gdGhlIHN1cnZleS5cbiAgICogQHNlZSBTdXJ2ZXlUcmlnZ2VyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyaWdnZXJzKCk6IEFycmF5PFN1cnZleVRyaWdnZXI+IHtcbiAgICByZXR1cm4gdGhpcy50cmlnZ2Vyc1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgdHJpZ2dlcnModmFsOiBBcnJheTxTdXJ2ZXlUcmlnZ2VyPikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRyaWdnZXJzXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGF1dG9tYXRpY2FsbHkgbG9hZCBzdXJ2ZXkgSnNvbiBmcm9tIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiBAc2VlIGxvYWRTdXJ2ZXlGcm9tU2VydmljZVxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdXJ2ZXlJZFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1cnZleUlkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5SWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gYXV0b21hdGljYWxseSBzYXZlIHRoZSBkYXRhIGludG8gdGhlIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICogQHNlZSBzdXJ2ZXlTaG93RGF0YVNhdmluZ1xuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlQb3N0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5UG9zdElkXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3VydmV5UG9zdElkKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5UG9zdElkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IGFzIGluZGVudGlmaWNhdG9yIGZvciBhIHVzZXIsIGZvciBleGFtcGxlIGUtbWFpbCBvciB1bmlxdWUgY3VzdG9tZXIgaWQgaW4geW91ciB3ZWIgYXBwbGljYXRpb24uIElmIHlvdSBhcmUgbG9hZGluZyBzdXJ2ZXkgb3IgcG9zdGluZyBzdXJ2ZXkgcmVzdWx0cyAgZnJvbS90byBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSwgdGhlbiB0aGUgbGlicmFyeSBkbyBub3QgYWxsb3cgdG8gcnVuIHRoZSBzYW1lIHN1cnZleSB0aGUgc2Vjb25kIHRpbWUuIE9uIHRoZSBzZWNvbmQgcnVuLCB0aGUgdXNlciB3aWxsIHNlZSB0aGUgJ1RoYW5rIHlvdScgcGFnZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgY2xpZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2xpZW50SWRcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBjbGllbnRJZCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNsaWVudElkXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZW1wdHksIGJlZm9yZSBzdGFydGluZyB0byBydW4gdGhlIHN1cnZleSwgdGhlIGxpYnJhcnkgY2hlY2tlcyBpZiB0aGUgY29va2llIHdpdGggdGhpcyBuYW1lIGV4aXN0cy4gSWYgaXQgaXMgdHJ1ZSwgdGhlIHN1cnZleSBnb2VzIHRvIGNvbXBsZXRlIG1vZGUgYW5kIGFuIHVzZXIgc2VlcyB0aGUgJ1RoYW5rIHlvdScgcGFnZS4gT24gY29tcGxldGluZyB0aGUgc3VydmV5IHRoZSBjb29raWUgd2l0aCB0aGlzIG5hbWUgaXMgY3JlYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29va2llTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjb29raWVOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29va2llTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImNvb2tpZU5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIHRydWUsIHRvIHNhdmUgcmVzdWx0cyBvbiBjb21wbGV0aW5nIGV2ZXJ5IHBhZ2UuIG9uUGFydGlhbFNlbmQgZXZlbnQgaXMgZmlyZWQuXG4gICAqIEBzZWUgb25QYXJ0aWFsU2VuZFxuICAgKiBAc2VlIGNsaWVudElkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlbmRSZXN1bHRPblBhZ2VOZXh0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzZW5kUmVzdWx0T25QYWdlTmV4dFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzZW5kUmVzdWx0T25QYWdlTmV4dCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzZW5kUmVzdWx0T25QYWdlTmV4dFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byBzaG93IHRoZSBwcm9ncmVzcyBvbiBzYXZpbmcvc2VuZGluZyBkYXRhIGludG8gdGhlIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlLlxuICAgKiBAc2VlIHN1cnZleVBvc3RJZFxuICAgKi9cbiAgcHVibGljIGdldCBzdXJ2ZXlTaG93RGF0YVNhdmluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5U2hvd0RhdGFTYXZpbmdcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3VydmV5U2hvd0RhdGFTYXZpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3VydmV5U2hvd0RhdGFTYXZpbmdcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogT24gc2hvd2luZyB0aGUgbmV4dCBvciBwcmV2aW91cyBwYWdlLCBhIGZpcnN0IGlucHV0IGlzIGZvY3VzZWQsIGlmIHRoZSBwcm9wZXJ0eSBzZXQgdG8gdHJ1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZm9jdXNGaXJzdFF1ZXN0aW9uQXV0b21hdGljXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBmYWxzZSB0byBoaWRlICdQcmV2JywgJ05leHQnIGFuZCAnQ29tcGxldGUnIGJ1dHRvbnMuIEl0IG1ha2VzIHNlbnNlIGlmIHlvdSBhcmUgZ29pbmcgdG8gY3JlYXRlIGEgY3VzdG9tIG5hdmlnYXRpb24gb3IgaGF2ZSBqdXN0IG9uZSBwYWdlIG9yIG9uIHNldHRpbmcgZ29OZXh0UGFnZUF1dG9tYXRpYyBwcm9wZXJ0eS5cbiAgICogQHNlZSBnb05leHRQYWdlQXV0b21hdGljXG4gICAqIEBzZWUgc2hvd1ByZXZCdXR0b25cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd05hdmlnYXRpb25CdXR0b25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93TmF2aWdhdGlvbkJ1dHRvbnNcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93TmF2aWdhdGlvbkJ1dHRvbnModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd05hdmlnYXRpb25CdXR0b25zXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBmYWxzZSB0byBoaWRlIHRoZSAnUHJldicgdG8gZGlzYWJsZSBmb3IgZW5kLXVzZXJzIGdvIGJhY2sgdG8gdGhlaXIgYW5zd2Vycy5cbiAgICogQHNlZSBzaG93TmF2aWdhdGlvbkJ1dHRvbnNcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1ByZXZCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQcmV2QnV0dG9uXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1ByZXZCdXR0b24odmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1ByZXZCdXR0b25cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvIGZhbHNlIGhpZGUgc3VydmV5IHRpdGxlLlxuICAgKiBAc2VlIHRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1RpdGxlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUaXRsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgdG8gaGlkZSBwYWdlIHRpdGxlcy5cbiAgICogQHNlZSBQYWdlTW9kZWwudGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1BhZ2VUaXRsZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dQYWdlVGl0bGVzXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1BhZ2VUaXRsZXModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1BhZ2VUaXRsZXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogT24gZmluaXNoaW5nIHRoZSBzdXJ2ZXkgdGhlICdUaGFuayB5b3UnLCBwYWdlIG9uIGNvbXBsZXRlLCBpcyBzaG93bi4gU2V0IHRoZSBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gaGlkZSB0aGUgJ1RoYW5rIHlvdScgcGFnZS5cbiAgICogQHNlZSBkYXRhXG4gICAqIEBzZWUgb25Db21wbGV0ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaG93Q29tcGxldGVkUGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd0NvbXBsZXRlZFBhZ2VcIiwgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93Q29tcGxldGVkUGFnZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93Q29tcGxldGVkUGFnZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBIGNoYXIvc3RyaW5nIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBpbiB0aGUgdGl0bGUgcmVxdWlyZWQgcXVlc3Rpb25zLlxuICAgKiBAc2VlIFF1ZXN0aW9uQmFzZS50aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVxdWlyZWRUZXh0XCIsIFwiKlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlcXVpcmVkVGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJlcXVpcmVkVGV4dFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBmaXJzdCBxdWVzdGlvbiBpbmRleCBpcyAxLiBZb3UgbWF5IHN0YXJ0IGl0IGZyb20gMTAwIG9yIGZyb20gJ0EnLCBieSBzZXR0aW5nIDEwMCBvciAnQScgdG8gdGhpcyBwcm9wZXJ0eS5cbiAgICogQHNlZSBRdWVzdGlvbkJhc2UudGl0bGVcbiAgICogQHNlZSByZXF1aXJlZFRleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25TdGFydEluZGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uU3RhcnRJbmRleCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uU3RhcnRJbmRleFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0IHRoZSBlbnRlcmVkIHRleHQgaW4gdGhlIG90aGVycyBpbnB1dCBpbiB0aGUgY2hlY2tib3gvcmFkaW9ncm91cC9kcm9wZG93biBhcmUgc3RvcmVkIGFzIFwicXVlc3Rpb24gbmFtZSBcIiArIFwiLUNvbW1lbnRcIi4gVGhlIHZhbHVlIGl0c2VsZiBpcyBcInF1ZXN0aW9uIG5hbWVcIjogXCJvdGhlcnNcIi4gU2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UsIHRvIHN0b3JlIHRoZSBlbnRlcmVkIHRleHQgZGlyZWN0bHkgaW4gdGhlIFwicXVlc3Rpb24gbmFtZVwiIGtleS5cbiAgICogQHNlZSBjb21tZW50UHJlZml4XG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0aGUgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGlmIHlvdSB3YW50IHRvIGdvIHRvIHRoZSBuZXh0IHBhZ2Ugd2l0aG91dCBwcmVzc2luZyAnTmV4dCcgYnV0dG9uIHdoZW4gYWxsIHF1ZXN0aW9ucyBhcmUgYW53ZXJlZC5cbiAgICogdHJ1ZSAtIGdvIG5leHQgcGFnZSBhbmQgc3VibWl0IGF1dG9tYXRpY2FsbHlcbiAgICogXCJhdXRvZ29uZXh0XCIgLSBnbyBuZXh0IHBhZ2UgYXV0b21hdGljYWxseSBidXQgZG8gbm90IHN1Ym1pdFxuICAgKiBmYWxzZSAtIGRvIG5vdCBnbyBuZXh0IHBhZ2UgYW5kIG5vdCBzdWJtaXQgYXV0b21hdGljYWxseVxuICAgKiBAc2VlIHNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgKi9cbiAgcHVibGljIGdldCBnb05leHRQYWdlQXV0b21hdGljKCk6IGJvb2xlYW4gfCBcImF1dG9nb25leHRcIiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImdvTmV4dFBhZ2VBdXRvbWF0aWNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgZ29OZXh0UGFnZUF1dG9tYXRpYyh2YWw6IGJvb2xlYW4gfCBcImF1dG9nb25leHRcIikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImdvTmV4dFBhZ2VBdXRvbWF0aWNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvICdub25lJyB0byBpbmNsdWRlIHRoZSBpbnZpc2libGUgdmFsdWVzIGludG8gdGhlIHN1cnZleSBkYXRhLlxuICAgKiA8L2JyPiBTZXQgaXQgdG8gJ29uSGlkZGVuJyB0byBjbGVhciB0aGUgcXVlc3Rpb24gdmFsdWUgd2hlbiBpdCBiZWNvbWVzIGludmlzaWJsZS5cbiAgICogPC9icj4gTGVhdmUgaXQgZXF1YWxzIHRvICdvbkNvbXBsZXRlJywgdG8gcmVtb3ZlIGZyb20gZGF0YSBwcm9wZXJ0eSB2YWx1ZXMgb2YgaW52aXNpYmxlIHF1ZXN0aW9ucyBvbiBzdXJ2ZXkgY29tcGxldGUuIEluIHRoaXMgY2FzZSwgdGhlIGludmlzaWJsZSBxdWVzdGlvbnMgd2lsbCBub3QgYmUgc3RvcmVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqIDwvYnI+IFRoZSBkZWZhdWx0IHZhbHVlIGlzICdvbkNvbXBsZXRlJy5cbiAgICogQHNlZSBRdWVzdGlvbkJhc2UudmlzaWJsZVxuICAgKiBAc2VlIG9uQ29tcGxldGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY2xlYXJJbnZpc2libGVWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIiwgXCJvbkNvbXBsZXRlXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2xlYXJJbnZpc2libGVWYWx1ZXModmFsOiBhbnkpIHtcbiAgICBpZiAodmFsID09PSB0cnVlKSB2YWwgPSBcIm9uQ29tcGxldGVcIjtcbiAgICBpZiAodmFsID09PSBmYWxzZSkgdmFsID0gXCJub25lXCI7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIiwgdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gY2hhbmdlIHRoZSBzdXJ2ZXkgbG9jYWxlLiBCeSBkZWZhdWx0IGl0IGlzIGVtcHR5LCAnZW4nLiBZb3UgbWF5IHNldCBpdCB0byAnZGUnIC0gZ2VybWFuLCAnZnInIC0gZnJlbmNoIGFuZCBzbyBvbi4gVGhlIGxpYnJhcnkgaGFzIGJ1aWx0LWluIGxvY2FsaXphdGlvbiBmb3Igc2V2ZXJhbCBsYW5ndWFnZXMuIFRoZSBsaWJyYXJ5IGhhcyBhIG11bHRpLWxhbmd1YWdlIHN1cHBvcnQgYXMgd2VsbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxlVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBsb2NhbGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMubG9jYWxlVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJsb2NhbGVcIiwgdmFsdWUpO1xuICAgIHN1cnZleUxvY2FsaXphdGlvbi5jdXJyZW50TG9jYWxlID0gdmFsdWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLm9uTG9jYWxlQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICAvL0lMb2NhbGl6YWJsZU93bmVyXG4gIGdldExvY2FsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGU7XG4gIH1cbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHsgdGV4dDogdGV4dCwgaHRtbDogbnVsbCB9O1xuICAgIHRoaXMub25UZXh0TWFya2Rvd24uZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy5odG1sO1xuICB9XG4gIGdldExvY1N0cmluZyhzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKHN0cik7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgdGhhdCByZW5kZXJzIHdoZW4gdGhlcmUgaXMgbm8gYW55IHZpc2libGUgcGFnZSBhbmQgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGVtcHR5U3VydmV5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY1N0cmluZyhcImVtcHR5U3VydmV5XCIpO1xuICB9XG4gIC8qKlxuICAgKiBTdXJ2ZXkgdGl0bGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwidGl0bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInRpdGxlXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaHRtbCB0aGF0IHNob3dzIG9uIGNvbXBsZXRlZCAoJ1RoYW5rIHlvdScpIHBhZ2UuIFNldCBpdCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogQHNlZSBzaG93Q29tcGxldGVkUGFnZVxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBjb21wbGV0ZWRIdG1sKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29tcGxldGVkSHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbXBsZXRlZEh0bWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiY29tcGxldGVkSHRtbFwiLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0NvbXBsZXRlZEh0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiY29tcGxldGVkSHRtbFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGh0bWwgdGhhdCBzaG93cyBpZiB0aGUgZW5kIHVzZXIgaGFzIGFscmVhZHkgY29tcGxldGVkIHRoZSBzdXJ2ZXkuXG4gICAqIEBzZWUgY2xpZW50SWRcbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY29tcGxldGVkQmVmb3JlSHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbXBsZXRlZEJlZm9yZUh0bWxcIik7XG4gIH1cbiAgcHVibGljIHNldCBjb21wbGV0ZWRCZWZvcmVIdG1sKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbXBsZXRlZEJlZm9yZUh0bWxcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBsb2NDb21wbGV0ZWRCZWZvcmVIdG1sKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbXBsZXRlZEJlZm9yZUh0bWxcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBodG1sIHRoYXQgc2hvd3Mgb24gbG9hZGluZyBzdXJ2ZXkgSnNvbiBmcm9tIHRoZSBkeHN1cnZleS5jb20gc2VydmljZS5cbiAgICogQHNlZSBzdXJ2ZXlJZFxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBsb2FkaW5nSHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxvYWRpbmdIdG1sXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9hZGluZ0h0bWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibG9hZGluZ0h0bWxcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBsb2NMb2FkaW5nSHRtbCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJsb2FkaW5nSHRtbFwiKTtcbiAgfVxuICAvKipcbiAgICogQSB0ZXh0IHRoYXQgcmVuZGVycyBvbiB0aGUgJ1N0YXJ0JyBidXR0b24uIFNldCBpdCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdGV4dC5cbiAgICogVGhlIHN0YXJ0IGJ1dHRvbiBpcyBzaG93biBvbiB0aGUgc3RhcnRlZCBwYWdlLiBZb3UgaGF2ZSB0byBzZXQgZmlyc3RQYWdlSXNTdGFydGVkIHByb3BlcnR5IHRvIHRydWUsIHRvIGhhdmUgdGhlIHN0YXJ0ZWQgcGFnZS5cbiAgICogQHNlZSBmaXJzdFBhZ2VJc1N0YXJ0ZWRcbiAgICogQHNlZSBsb2NhbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRTdXJ2ZXlUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJzdGFydFN1cnZleVwiLFxuICAgICAgdGhpcy5nZXRMb2NTdHJpbmcoXCJzdGFydFN1cnZleVRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhcnRTdXJ2ZXlUZXh0KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInN0YXJ0U3VydmV5XCIsIG5ld1ZhbHVlKTtcbiAgfVxuICBnZXQgbG9jU3RhcnRTdXJ2ZXlUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInN0YXJ0U3VydmV5XCIpO1xuICB9XG4gIC8qKlxuICAgKiBBIHRleHQgdGhhdCByZW5kZXJzIG9uIHRoZSAnUHJldicgYnV0dG9uLiBTZXQgaXQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2VQcmV2VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwicGFnZVByZXZcIixcbiAgICAgIHRoaXMuZ2V0TG9jU3RyaW5nKFwicGFnZVByZXZUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhZ2VQcmV2VGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYWdlUHJldlwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY1BhZ2VQcmV2VGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwYWdlUHJldlwiKTtcbiAgfVxuICAvKipcbiAgICogQSB0ZXh0IHRoYXQgcmVuZGVycyBvbiB0aGUgJ05leHQnIGJ1dHRvbi4gU2V0IGl0IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiBAc2VlIGxvY2FsZVxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlTmV4dFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhZ2VOZXh0XCIsXG4gICAgICB0aGlzLmdldExvY1N0cmluZyhcInBhZ2VOZXh0VGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYWdlTmV4dFRleHQobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFnZU5leHRcIiwgbmV3VmFsdWUpO1xuICB9XG4gIGdldCBsb2NQYWdlTmV4dFRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFnZU5leHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIEEgdGV4dCB0aGF0IHJlbmRlcnMgb24gdGhlICdDb21wbGV0ZScgYnV0dG9uLiBTZXQgaXQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQuXG4gICAqIEBzZWUgbG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbXBsZXRlVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiY29tcGxldGVcIixcbiAgICAgIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGVUZXh0XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbXBsZXRlVGV4dChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb21wbGV0ZVwiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgZ2V0IGxvY0NvbXBsZXRlVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJjb21wbGV0ZVwiKTtcbiAgfVxuICAvKipcbiAgICogQSB0ZW1wbGF0ZSBmb3IgYSBxdWVzdGlvbiB0aXRsZS5cbiAgICogQHNlZSBRdWVzdGlvbk1vZGVsLnRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJxdWVzdGlvblRpdGxlVGVtcGxhdGVcIiwgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBxdWVzdGlvbiB0aXRsZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVxuICAgKiBAc2VlIFF1ZXN0aW9uTW9kZWwudGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXRRdWVzdGlvblRpdGxlVGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5sb2NRdWVzdGlvblRpdGxlVGVtcGxhdGUudGV4dE9ySHRtbDtcbiAgfVxuICBnZXQgbG9jUXVlc3Rpb25UaXRsZVRlbXBsYXRlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInF1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byB0dXJuIG9mZiB0aGUgbnVtYmVyaW5nIG9uIHBhZ2VzIHRpdGxlcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1BhZ2VOdW1iZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UGFnZU51bWJlcnNcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1BhZ2VOdW1iZXJzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnNob3dQYWdlTnVtYmVycykgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQYWdlTnVtYmVyc1wiLCB2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBcIm9mZlwiIHRvIHR1cm4gb2ZmIHRoZSBudW1iZXJpbmcgb24gcXVlc3Rpb25zIHRpdGxlcyBvciBcIm9ucGFnZVwiIHRvIHN0YXJ0IG51bWJlcmluZyBvbiBldmVyeSBwYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcIm9uXCIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dRdWVzdGlvbk51bWJlcnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCBcIm9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1F1ZXN0aW9uTnVtYmVycyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhbHVlID0gdmFsdWUgPT09IFwib25wYWdlXCIgPyBcIm9uUGFnZVwiIDogdmFsdWU7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UXVlc3Rpb25OdW1iZXJzXCIsIHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIFwidG9wXCIgdG8gc2hvdyB0aGUgcHJvZ3Jlc3MgYmFyIG9uIHRoZSBib3R0b20gb3IgdG8gXCJib3R0b21cIiB0byBzaG93IGl0IG9uIHRoZSBib3R0b20uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQcm9ncmVzc0JhcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UHJvZ3Jlc3NCYXJcIiwgXCJvZmZcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UHJvZ3Jlc3NCYXIobmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dQcm9ncmVzc0JhclwiLCBuZXdWYWx1ZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dC9odG1sIHRoYXQgcmVuZGVycyBhcyBzdXJ2ZXkgdGl0bGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZFRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3NUZXh0KHRoaXMubG9jVGl0bGUudGV4dE9ySHRtbCwgdHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvICdib3R0b20nIG9yICdsZWZ0JyB0byBzaG93IHF1ZXN0aW9uIHRpdGxlIHVuZGVyIHRoZSBxdWVzdGlvbiBvciBvbiB0aGUgbGVmdC5cbiAgICogPGJyLz48Yj5Ob3RlOjwvYj4gU29tZSBxdWVzdGlvbnMsIGZvciBleGFtcGxlIG1hdHJpeGVzLCBkbyBub3Qgc3VwcG9ydCAnbGVmdCcgdmFsdWUuIFRoZSB0aXRsZSBmb3IgdGhlbSB3aWxsIGJlIGRpc3BsYXllZCBvbiB0aGUgdG9wLlxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvblRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25UaXRsZUxvY2F0aW9uXCIsIFwidG9wXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25UaXRsZUxvY2F0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIiwgdmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvICdib3R0b20nIHRvIHNob3cgcXVlc3Rpb24gZXJyb3IocykgdW5kZXIgdGhlIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvbkVycm9yTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25FcnJvckxvY2F0aW9uXCIsIFwidG9wXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25FcnJvckxvY2F0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvbkVycm9yTG9jYXRpb25cIiwgdmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIG1vZGUgdG8gJ2Rpc3BsYXknIHRvIG1ha2UgdGhlIHN1cnZleSByZWFkLW9ubHkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICdlZGl0Jy5cbiAgICovXG4gIHB1YmxpYyBnZXQgbW9kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtb2RlXCIsIFwiZWRpdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1vZGUodmFsdWU6IHN0cmluZykge1xuICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodmFsdWUgPT0gdGhpcy5tb2RlKSByZXR1cm47XG4gICAgaWYgKHZhbHVlICE9IFwiZWRpdFwiICYmIHZhbHVlICE9IFwiZGlzcGxheVwiKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibW9kZVwiLCB2YWx1ZSk7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0QWxsUXVlc3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5vblJlYWRPbmx5Q2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQW4gb2JqZWN0IHRoYXQgc3RvcmVzIHRoZSBzdXJ2ZXkgcmVzdWx0cy9kYXRhLiBZb3UgbWF5IHNldCBpdCBkaXJlY3RseSBhcyB7ICdxdWVzdGlvbiBuYW1lJzogcXVlc3Rpb25WYWx1ZSwgLi4uIH1cbiAgICogQHNlZSBzZXRWYWx1ZVxuICAgKiBAc2VlIGdldFZhbHVlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRhdGEoKTogYW55IHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMudmFsdWVzSGFzaCkge1xuICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLnZhbHVlc0hhc2hba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG4gIHB1YmxpYyBzZXQgZGF0YShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlc0hhc2ggPSB7fTtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgICAgdGhpcy5zZXREYXRhVmFsdWVDb3JlKHRoaXMudmFsdWVzSGFzaCwga2V5LCBkYXRhW2tleV0pO1xuICAgICAgICB0aGlzLmNoZWNrVHJpZ2dlcnMoa2V5LCBkYXRhW2tleV0sIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5ub3RpZnlBbGxRdWVzdGlvbnNPblZhbHVlQ2hhbmdlZCgpO1xuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICB9XG4gIHByb3RlY3RlZCBzZXREYXRhVmFsdWVDb3JlKHZhbHVlc0hhc2g6IGFueSwga2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB2YWx1ZXNIYXNoW2tleV0gPSB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhbGwgY29tbWVudHMgZnJvbSB0aGUgZGF0YS5cbiAgICogQHNlZSBkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbW1lbnRzKCk6IGFueSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnZhbHVlc0hhc2gpIHtcbiAgICAgIGlmIChrZXkuaW5kZXhPZih0aGlzLmNvbW1lbnRQcmVmaXgpID4gMCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMudmFsdWVzSGFzaFtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpc2libGUgcGFnZXMuIElmIGFsbCBwYWdlcyBhcmUgdmlzaWJsZSB0aGVuIGl0IGlzIHRoZSBzYW1lIGFzIHBhZ2VzIHByb3BlcnR5LlxuICAgKiBAc2VlIHBhZ2VzXG4gICAqIEBzZWUgUGFnZU1vZGVsLnZpc2libGVcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJsZUlmXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVQYWdlcygpOiBBcnJheTxQYWdlTW9kZWw+IHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiB0aGlzLnBhZ2VzO1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8UGFnZU1vZGVsPigpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucGFnZXNbaV0uaXNWaXNpYmxlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMucGFnZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbm8gYW55IHBhZ2UgaW4gdGhlIHN1cnZleS4gVGhlIHN1cnZleSBpcyBlbXB0eS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlcy5sZW5ndGggPT0gMDtcbiAgfVxuICAvKipcbiAgICogZGVwcmljYXRlZCwgbWlzc3BlbGxpbmcsIHVzZSBwYWdlQ291bnQgcHJvcGVydHlcbiAgICovXG4gIGdldCBQYWdlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlQ291bnQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1cnZleSBwYWdlcyBjb3VudC5cbiAgICogQHNlZSB2aXNpYmxlUGFnZUNvdW50XG4gICAqIEBzZWUgcGFnZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnZXMubGVuZ3RoO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdXJ2ZXkgdmlzaWJsZSBwYWdlcyBjb3VudFxuICAgKiBAc2VlIHBhZ2VDb3VudFxuICAgKiBAc2VlIHZpc2libGVQYWdlc1xuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlUGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZVBhZ2VzLmxlbmd0aDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3RhcnRlZCBQYWdlLiBmaXJzdFBhZ2VJc1N0YXJ0ZWQgcHJvcGVydHkgc2hvdWxkIGJlIGVxdWFscyB0byB0cnVlXG4gICAqIEBzZWUgZmlyc3RQYWdlSXNTdGFydGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXJ0ZWRQYWdlKCk6IFBhZ2VNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkICYmIHRoaXMucGFnZXMubGVuZ3RoID4gMFxuICAgICAgPyB0aGlzLnBhZ2VzWzBdXG4gICAgICA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VydmV5IHBhZ2UuIElmIHN1cnZleSBpcyByZW5kcmVkIHRoZW4gaXQgaXMgYSBwYWdlIHRoYXQgYSB1c2VyIGNhbiBzZWUvZWRpdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2UoKTogUGFnZU1vZGVsIHtcbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAodlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZVZhbHVlKSA8IDApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlVmFsdWUgPT0gbnVsbCAmJiB2UGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IHZQYWdlc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFBhZ2VWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbnRQYWdlKHZhbHVlOiBQYWdlTW9kZWwpIHtcbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdlBhZ2VzLmluZGV4T2YodmFsdWUpIDwgMCkgcmV0dXJuO1xuICAgIGlmICh2YWx1ZSA9PSB0aGlzLmN1cnJlbnRQYWdlVmFsdWUpIHJldHVybjtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmN1cnJlbnRQYWdlVmFsdWU7XG4gICAgdGhpcy5jdXJyZW50UGFnZVZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB2YWx1ZS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgICB2YWx1ZS5zZXRXYXNTaG93bih0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50UGFnZUNoYW5nZWQodmFsdWUsIG9sZFZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHBhZ2UgaW4gdGhlIHZpc2libGUgcGFnZXMgYXJyYXkuIEl0IHN0YXJ0cyBmcm9tIDAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRQYWdlTm8oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbnRQYWdlTm8odmFsdWU6IG51bWJlcikge1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IHRoaXMudmlzaWJsZVBhZ2VzLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnZpc2libGVQYWdlc1t2YWx1ZV07XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHJhbmRvbWl6ZSBxdWVzdGlvbnMuIFNldCBpdCB0byAncmFuZG9tJyB0byByYW5kb21pemUgcXVlc3Rpb25zLCAnaW5pdGlhbCcgdG8ga2VlcCB0aGVtIGluIHRoZSBzYW1lIG9yZGVyLiBZb3UgY2FuIHJhbmRvbWl6ZSBxdWVzdGlvbnMgb24gYSBzcGVjaWZpYyBwYWdlLlxuICAgKiBAc2VlIFN1cnZleVBhZ2UucXVlc3Rpb25zT3JkZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zT3JkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uc09yZGVyXCIsIFwiaW5pdGlhbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uc09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT3JkZXJcIiwgdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGlucHV0IGZvY3VzIHRvIHRoZSBmaXJzdCBxdWVzdGlvbiB3aXRoIHRoZSBpbnB1dC5cbiAgICovXG4gIHB1YmxpYyBmb2N1c0ZpcnN0UXVlc3Rpb24oKSB7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmIChwYWdlKSB7XG4gICAgICBwYWdlLnNjcm9sbFRvVG9wKCk7XG4gICAgICBwYWdlLmZvY3VzRmlyc3RRdWVzdGlvbigpO1xuICAgIH1cbiAgfVxuICBzY3JvbGxUb1RvcE9uUGFnZUNoYW5nZSgpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgaWYgKCFwYWdlKSByZXR1cm47XG4gICAgcGFnZS5zY3JvbGxUb1RvcCgpO1xuICAgIGlmICh0aGlzLmZvY3VzRmlyc3RRdWVzdGlvbkF1dG9tYXRpYykge1xuICAgICAgcGFnZS5mb2N1c0ZpcnN0UXVlc3Rpb24oKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3VydmV5IHN0YXRlOiAnbG9hZGluZycgLSBsb2FkaW5nIGZyb20gdGhlIGpzb24sICdjb21wbGV0ZWQnIC0gYSB1c2VyIGhhcyBjb21wbGV0ZWQgdGhlIHN1cnZleSxcbiAgICogJ3N0YXJ0aW5nJyAtIHRoZSBzdGFydGVkIHBhZ2UgaXMgc2hvd2luZywgcnVubmluZycgLSBhIHVzZXIgYW5zd2VycyBhIHF1ZXN0aW9ucyByaWdodCBub3csICdlbXB0eScgLSB0aGVyZSBpcyBub3RoaW5nIHRvIHNob3cgaW4gdGhlIGN1cnJlbnQgc3VydmV5LlxuICAgKi9cbiAgcHVibGljIGdldCBzdGF0ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZykgcmV0dXJuIFwibG9hZGluZ1wiO1xuICAgIGlmICh0aGlzLmlzQ29tcGxldGVkKSByZXR1cm4gXCJjb21wbGV0ZWRcIjtcbiAgICBpZiAodGhpcy5pc0NvbXBsZXRlZEJlZm9yZSkgcmV0dXJuIFwiY29tcGxldGVkYmVmb3JlXCI7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNEZXNpZ25Nb2RlICYmXG4gICAgICB0aGlzLmlzRWRpdE1vZGUgJiZcbiAgICAgIHRoaXMuaXNTdGFydGVkU3RhdGUgJiZcbiAgICAgIHRoaXMuc3RhcnRlZFBhZ2VcbiAgICApXG4gICAgICByZXR1cm4gXCJzdGFydGluZ1wiO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlID8gXCJydW5uaW5nXCIgOiBcImVtcHR5XCI7XG4gIH1cbiAgcHVibGljIGdldCBjb21wbGV0ZWRTdGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbXBsZXRlZFN0YXRlVmFsdWU7XG4gIH1cbiAgZ2V0IGNvbXBsZXRlZFN0YXRlVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbXBsZXRlZFN0YXRlVGV4dFZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBzZXRDb21wbGV0ZWRTdGF0ZSh2YWx1ZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbXBsZXRlZFN0YXRlVmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBcInNhdmluZ1wiKSB0ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJzYXZpbmdEYXRhXCIpO1xuICAgICAgaWYgKHZhbHVlID09IFwiZXJyb3JcIikgdGV4dCA9IHRoaXMuZ2V0TG9jU3RyaW5nKFwic2F2aW5nRGF0YUVycm9yXCIpO1xuICAgICAgaWYgKHZhbHVlID09IFwic3VjY2Vzc1wiKSB0ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcoXCJzYXZpbmdEYXRhU3VjY2Vzc1wiKTtcbiAgICB9XG4gICAgdGhpcy5jb21wbGV0ZWRTdGF0ZVRleHRWYWx1ZSA9IHRleHQ7XG4gIH1cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBzdXJ2ZXkgZGF0YSBhbmQgc3RhdGUuIElmIHRoZSBzdXJ2ZXkgaGFzIGEgJ2NvbXBsZXRlZCcgc3RhdGUsIGl0IHdpbGwgaGF2ZSBhICdydW5uaW5nJyBzdGF0ZS5cbiAgICogQHBhcmFtIGNsZWFyRGF0YSBjbGVhciB0aGUgZGF0YVxuICAgKiBAcGFyYW0gZ290b0ZpcnN0UGFnZSBtYWtlIHRoZSBmaXJzdCBwYWdlIGFzIGEgY3VycmVudCBwYWdlLlxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBzdGF0ZVxuICAgKiBAc2VlIGN1cnJlbnRQYWdlXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoY2xlYXJEYXRhOiBib29sZWFuID0gdHJ1ZSwgZ290b0ZpcnN0UGFnZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoY2xlYXJEYXRhKSB7XG4gICAgICB0aGlzLmRhdGEgPSBudWxsO1xuICAgICAgdGhpcy52YXJpYWJsZXNIYXNoID0ge307XG4gICAgfVxuICAgIHRoaXMudGltZVNwZW50ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0udGltZVNwZW50ID0gMDtcbiAgICAgIHRoaXMucGFnZXNbaV0uc2V0V2FzU2hvd24oZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLmlzQ29tcGxldGVkID0gZmFsc2U7XG4gICAgdGhpcy5pc0NvbXBsZXRlZEJlZm9yZSA9IGZhbHNlO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5pc1N0YXJ0ZWRTdGF0ZSA9IHRoaXMuZmlyc3RQYWdlSXNTdGFydGVkO1xuICAgIGlmIChnb3RvRmlyc3RQYWdlICYmIHRoaXMudmlzaWJsZVBhZ2VDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLnZpc2libGVQYWdlc1swXTtcbiAgICB9XG4gIH1cbiAgcHVibGljIG1lcmdlVmFsdWVzKHNyYzogYW55LCBkZXN0OiBhbnkpIHtcbiAgICBpZiAoIWRlc3QgfHwgIXNyYykgcmV0dXJuO1xuICAgIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHNyY1trZXldO1xuICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoIWRlc3Rba2V5XSkgZGVzdFtrZXldID0ge307XG4gICAgICAgIHRoaXMubWVyZ2VWYWx1ZXModmFsdWUsIGRlc3Rba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIHVwZGF0ZUN1c3RvbVdpZGdldHMocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgaWYgKCFwYWdlKSByZXR1cm47XG4gICAgcGFnZS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGN1cnJlbnRQYWdlQ2hhbmdlZChuZXdWYWx1ZTogUGFnZU1vZGVsLCBvbGRWYWx1ZTogUGFnZU1vZGVsKSB7XG4gICAgdGhpcy5vbkN1cnJlbnRQYWdlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgIG9sZEN1cnJlbnRQYWdlOiBvbGRWYWx1ZSxcbiAgICAgIG5ld0N1cnJlbnRQYWdlOiBuZXdWYWx1ZVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm9ncmVzcyB0aGF0IGEgdXNlciBtYWRlIGJ5IGFuc3dlcmluZyBvbiB0aGUgc3VydmV5LlxuICAgKi9cbiAgcHVibGljIGdldFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgdmFyIGluZGV4ID0gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSArIDE7XG4gICAgcmV0dXJuIE1hdGguY2VpbChpbmRleCAqIDEwMCAvIHRoaXMudmlzaWJsZVBhZ2VDb3VudCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBuYXZpZ2F0aW9uIGJ1dHRvbnM6ICdQcmV2JywgJ05leHQnIG9yICdDb21wbGV0ZScgYXJlIHNob3duLlxuICAgKi9cbiAgcHVibGljIGdldCBpc05hdmlnYXRpb25CdXR0b25zU2hvd2luZygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgaWYgKCFwYWdlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIChcbiAgICAgIHBhZ2UubmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5ID09IFwic2hvd1wiIHx8XG4gICAgICAocGFnZS5uYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkgIT0gXCJoaWRlXCIgJiYgdGhpcy5zaG93TmF2aWdhdGlvbkJ1dHRvbnMpXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaW4gdGhlIGVkaXQgbW9kZS5cbiAgICogQHNlZSBtb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRWRpdE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PSBcImVkaXRcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaW4gdGhlIGRpc3BsYXkgbW9kZS5cbiAgICogQHNlZSBtb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRGlzcGxheU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PSBcImRpc3BsYXlcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXJ2ZXkgaW4gdGhlIGRlc2lnbiBtb2RlLiBJdCBpcyB1c2VkIGJ5IFN1cnZleUpTIEVkaXRvclxuICAgKiBAc2VlIHNldERlc2lnbk1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXNpZ25Nb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpc0Rlc2lnbk1vZGVcIiwgZmFsc2UpO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsIGl0IHRvIHNldCB0aGUgc3VydmV5IGludG8gdGhlIGRlc2lnbiBtb2RlLlxuICAgKiBAcGFyYW0gdmFsdWUgdXNlIHRydWUgdG8gc2V0IHRoZSBzdXJ2ZXkgaW50byB0aGUgZGVzaWduIG1vZGUuXG4gICAqL1xuICBwdWJsaWMgc2V0RGVzaWduTW9kZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzRGVzaWduTW9kZVwiLCB2YWx1ZSk7XG4gICAgdGhpcy5vbklzU2luZ2xlUGFnZUNoYW5nZWQoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiBhIHVzZXIgaGFzIGFscmVhZHkgY29tcGxldGVkIHRoZSBzdXJ2ZXkgb24gdGhpcyBicm93c2VyIGFuZCB0aGVyZSBpcyBhIGNvb2tpZSBhYm91dCBpdC4gU3VydmV5IGdvZXMgdG8gJ2NvbXBsZXRlZCcgc3RhdGUgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS5cbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqIEBzZWUgc2V0Q29va2llXG4gICAqIEBzZWUgZGVsZXRlQ29va2llXG4gICAqIEBzZWUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzQ29va2llKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jb29raWVOYW1lKSByZXR1cm4gZmFsc2U7XG4gICAgdmFyIGNvb2tpZXMgPSBkb2N1bWVudC5jb29raWU7XG4gICAgcmV0dXJuIGNvb2tpZXMgJiYgY29va2llcy5pbmRleE9mKHRoaXMuY29va2llTmFtZSArIFwiPXRydWVcIikgPiAtMTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBjb29raWUgd2l0aCBjb29raWVOYW1lIGluIHRoZSBicm93c2VyLiBJdCBpcyBkb25lIGF1dG9tYXRpY2FsbHkgb24gc3VydmV5IGNvbXBsZXRlIGlmIGNvb2tpZU5hbWUgaXMgbm90IGVtcHR5LlxuICAgKiBAc2VlIGNvb2tpZU5hbWVcbiAgICogQHNlZSBoYXNDb29raWVcbiAgICogQHNlZSBkZWxldGVDb29raWVcbiAgICovXG4gIHB1YmxpYyBzZXRDb29raWUoKSB7XG4gICAgaWYgKCF0aGlzLmNvb2tpZU5hbWUpIHJldHVybjtcbiAgICBkb2N1bWVudC5jb29raWUgPVxuICAgICAgdGhpcy5jb29raWVOYW1lICsgXCI9dHJ1ZTsgZXhwaXJlcz1GcmksIDMxIERlYyA5OTk5IDA6MDowIEdNVFwiO1xuICB9XG4gIC8qKlxuICAgKiBEZWxldGUgdGhlIGNvb2tpZSB3aXRoIGNvb2tpZU5hbWUgaW4gdGhlIGJyb3dzZXIuXG4gICAqIEBzZWUgY29va2llTmFtZVxuICAgKiBAc2VlIGhhc0Nvb2tpZVxuICAgKiBAc2VlIHNldENvb2tpZVxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUNvb2tpZSgpIHtcbiAgICBpZiAoIXRoaXMuY29va2llTmFtZSkgcmV0dXJuO1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IHRoaXMuY29va2llTmFtZSArIFwiPTtcIjtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBnbyB0byB0aGUgbmV4dCBwYWdlLiBJdCByZXR1cm5zIGZhbHNlLCBpZiBpdCBpcyB0aGUgbGFzdCBwYWdlLiBJZiB0aGVyZSBpcyBhbiBlcnJvciwgZm9yIGV4YW1wbGUgcmVxdWlyZWQgcXVlc3Rpb24gaXMgZW1wdHksIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGFzIHdlbGwuXG4gICAqIEBzZWUgaXNDdXJyZW50UGFnZUhhc0Vycm9yc1xuICAgKiBAc2VlIHByZXZQYWdlXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKi9cbiAgcHVibGljIG5leHRQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzTGFzdFBhZ2UpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuaXNDdXJyZW50UGFnZUhhc0Vycm9ycykgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmRvU2VydmVyVmFsaWRhdGlvbigpKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5kb05leHRQYWdlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlcmUgaXMgYW55IGVycm9yIG9uIHRoZSBjdXJyZW50IHBhZ2UuIEZvciBleGFtcGxlLCB0aGUgcmVxdWlyZWQgcXVlc3Rpb24gaXMgZW1wdHkgb3IgYSBxdWVzdGlvbiB2YWxpZGF0aW9uIGlzIGZhaWxlZC5cbiAgICogQHNlZSBuZXh0UGFnZVxuICAgKi9cbiAgcHVibGljIGdldCBpc0N1cnJlbnRQYWdlSGFzRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlLmhhc0Vycm9ycyh0cnVlLCB0cnVlKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBnbyB0byB0aGUgcHJldmlvdXMgcGFnZS4gSXQgcmV0dXJucyBmYWxzZSBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBwYWdlIGFscmVhZHkuIEl0IGRvZXNuJ3QgcGVyZm9ybSBhbnkgY2hlY2tzLCByZXF1aXJlZCBxdWVzdGlvbnMgY2FuIGJlIGVtcHR5LlxuICAgKiBAc2VlIGlzRmlyc3RQYWdlXG4gICAqL1xuICBwdWJsaWMgcHJldlBhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNGaXJzdFBhZ2UpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgdmFyIGluZGV4ID0gdlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSk7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHZQYWdlc1tpbmRleCAtIDFdO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsIGl0IHRvIGNvbXBsZXRlIHRoZSBzdXJ2ZXksIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGxhc3Qgb25lLiBJdCByZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIGFuIGVycm9yIG9uIHRoZSBwYWdlLiBJZiB0aGVyZSBpcyBubyBlcnJvcnMgb24gdGhlIHBhZ2UsIGl0IGNhbGxzIGRvQ29tcGxldGUgYW5kIHJldHVybnMgdHJ1ZS5cbiAgICogQHNlZSBpc0N1cnJlbnRQYWdlSGFzRXJyb3JzXG4gICAqIEBzZWUgbmV4dFBhZ2VcbiAgICogQHNlZSBkb0NvbXBsZXRlXG4gICAqL1xuICBwdWJsaWMgY29tcGxldGVMYXN0UGFnZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0VkaXRNb2RlICYmIHRoaXMuaXNDdXJyZW50UGFnZUhhc0Vycm9ycykgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmRvU2VydmVyVmFsaWRhdGlvbigpKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5kb0NvbXBsZXRlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIGlmIHlvdSB3YW50IHRvIGNvbWJpbmUgYWxsIHlvdXIgcGFnZXMgaW4gb25lIHBhZ2UuIFBhZ2VzIHdpbGwgYmUgY29udmVydGVkIGludG8gcGFuZWxzLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1NpbmdsZVBhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlzU2luZ2xlUGFnZVwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc1NpbmdsZVBhZ2UodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNTaW5nbGVQYWdlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIHRvIG1ha2UgdGhlIGZpcnN0IHBhZ2UgeW91ciBzdGFydGluZyBwYWdlLiBUaGUgZW5kLXVzZXIgY291bGQgbm90IGNvbWViYWNrIHRvIHRoZSBzdGFydCBwYWdlIGFuZCBpdCBpcyBub3QgY291bnQgaW4gdGhlIHByb2dyZXNzLlxuICAgKi9cbiAgcHVibGljIGdldCBmaXJzdFBhZ2VJc1N0YXJ0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImZpcnN0UGFnZUlzU3RhcnRlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBmaXJzdFBhZ2VJc1N0YXJ0ZWQodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiZmlyc3RQYWdlSXNTdGFydGVkXCIsIHZhbCk7XG4gIH1cbiAgaXNQYWdlU3RhcnRlZChwYWdlOiBJUGFnZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCAmJiB0aGlzLnBhZ2VzLmxlbmd0aCA+IDAgJiYgdGhpcy5wYWdlc1swXSA9PT0gcGFnZVxuICAgICk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uRmlyc3RQYWdlSXNTdGFydGVkQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5wYWdlcy5sZW5ndGggPT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuaXNTdGFydGVkU3RhdGUgPSB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZDtcbiAgICB0aGlzLnBhZ2VWaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLnBhZ2VzWzBdLCAhdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQpO1xuICB9XG4gIG9yaWdpb25hbFBhZ2VzID0gbnVsbDtcbiAgcHJvdGVjdGVkIG9uSXNTaW5nbGVQYWdlQ2hhbmdlZCgpIHtcbiAgICBpZiAoIXRoaXMuaXNTaW5nbGVQYWdlIHx8IHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICBpZiAodGhpcy5vcmlnaW9uYWxQYWdlcykge1xuICAgICAgICB0aGlzLnBhZ2VzLnNwbGljZSgwLCB0aGlzLnBhZ2VzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcmlnaW9uYWxQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMucGFnZXMucHVzaCh0aGlzLm9yaWdpb25hbFBhZ2VzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5vcmlnaW9uYWxQYWdlcyA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3JpZ2lvbmFsUGFnZXMgPSB0aGlzLnBhZ2VzLnNsaWNlKDAsIHRoaXMucGFnZXMubGVuZ3RoKTtcbiAgICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgPyAxIDogMDtcbiAgICAgIHZhciBzaW5nbGVQYWdlID0gdGhpcy5jcmVhdGVTaW5nbGVQYWdlKHN0YXJ0SW5kZXgpO1xuICAgICAgdmFyIGRlbGV0ZWRMZW4gPSB0aGlzLnBhZ2VzLmxlbmd0aCAtIHN0YXJ0SW5kZXg7XG4gICAgICB0aGlzLnBhZ2VzLnNwbGljZShzdGFydEluZGV4LCBkZWxldGVkTGVuLCBzaW5nbGVQYWdlKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVTaW5nbGVQYWdlKHN0YXJ0SW5kZXg6IG51bWJlcik6IFBhZ2VNb2RlbCB7XG4gICAgdmFyIHNpbmdsZSA9IHRoaXMuY3JlYXRlTmV3UGFnZShcImFsbFwiKTtcbiAgICBzaW5nbGUuc2V0U3VydmV5SW1wbCh0aGlzKTtcbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5wYWdlc1tpXTtcbiAgICAgIHZhciBwYW5lbCA9IHNpbmdsZS5hZGROZXdQYW5lbChwYWdlLm5hbWUpO1xuICAgICAgdmFyIGpzb24gPSBuZXcgSnNvbk9iamVjdCgpLnRvSnNvbk9iamVjdChwYWdlKTtcbiAgICAgIG5ldyBKc29uT2JqZWN0KCkudG9PYmplY3QoanNvbiwgcGFuZWwpO1xuICAgIH1cbiAgICByZXR1cm4gc2luZ2xlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3Qgb25lLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0ZpcnN0UGFnZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PSBudWxsKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlUGFnZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRQYWdlKSA9PSAwO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNTaG93UHJldkJ1dHRvbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0ZpcnN0UGFnZSB8fCAhdGhpcy5zaG93UHJldkJ1dHRvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLm1heFRpbWVUb0ZpbmlzaCA+IDApIHJldHVybiBmYWxzZTtcbiAgICB2YXIgcGFnZSA9IHRoaXMudmlzaWJsZVBhZ2VzW3RoaXMuY3VycmVudFBhZ2VObyAtIDFdO1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZSkgPD0gMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGxhc3Qgb25lLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0xhc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID09IG51bGwpIHJldHVybiB0cnVlO1xuICAgIHZhciB2UGFnZXMgPSB0aGlzLnZpc2libGVQYWdlcztcbiAgICByZXR1cm4gdlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSkgPT0gdlBhZ2VzLmxlbmd0aCAtIDE7XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gY29tcGxldGUgdGhlIHN1cnZleS4gSXQgd3JpdGVzIGNvb2tpZSBpZiBjb29raWVOYW1lIHByb3BlcnR5IGlzIG5vdCBlbXB0eSwgc2V0IHRoZSBzdXJ2ZXkgaW50byAnY29tcGxldGVkJyBzdGF0ZSwgZmlyZSBvbkNvbXBsZXRlIGV2ZW50IGFuZCBzZW5kUmVzdWx0IGludG8gW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2UgaWYgc3VydmV5UG9zdElkIHByb3BlcnR5IGlzIG5vdCBlbXB0eS4gSXQgZG9lc24ndCBwZXJmb3JtIGFueSB2YWxpZGF0aW9uLCB1bmxpa2UgY29tcGxldGVMYXN0UGFnZSBmdW5jdGlvbi5cbiAgICogQHNlZSBjb29raWVOYW1lXG4gICAqIEBzZWUgc3RhdGVcbiAgICogQHNlZSBvbkNvbXBsZXRlXG4gICAqIEBzZWUgc3VydmV5UG9zdElkXG4gICAqIEBzZWUgY29tcGxldGVMYXN0UGFnZVxuICAgKi9cbiAgcHVibGljIGRvQ29tcGxldGUoKSB7XG4gICAgbGV0IHByZXZpb3VzQ29va2llID0gdGhpcy5oYXNDb29raWU7XG4gICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgICB0aGlzLmNsZWFyVW51c2VkVmFsdWVzKCk7XG4gICAgdGhpcy5zZXRDb29raWUoKTtcbiAgICB0aGlzLnNldENvbXBsZXRlZCgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgb25Db21wbGV0ZU9wdGlvbnMgPSB7XG4gICAgICBzaG93RGF0YVNhdmluZzogZnVuY3Rpb24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJzYXZpbmdcIiwgdGV4dCk7XG4gICAgICB9LFxuICAgICAgc2hvd0RhdGFTYXZpbmdFcnJvcjogZnVuY3Rpb24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJlcnJvclwiLCB0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBzaG93RGF0YVNhdmluZ1N1Y2Nlc3M6IGZ1bmN0aW9uKHRleHQ6IHN0cmluZykge1xuICAgICAgICBzZWxmLnNldENvbXBsZXRlZFN0YXRlKFwic3VjY2Vzc1wiLCB0ZXh0KTtcbiAgICAgIH0sXG4gICAgICBzaG93RGF0YVNhdmluZ0NsZWFyOiBmdW5jdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcIlwiLCBcIlwiKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25Db21wbGV0ZS5maXJlKHRoaXMsIG9uQ29tcGxldGVPcHRpb25zKTtcbiAgICBpZiAoIXByZXZpb3VzQ29va2llICYmIHRoaXMuc3VydmV5UG9zdElkKSB7XG4gICAgICB0aGlzLnNlbmRSZXN1bHQoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSBzdXJ2ZXkuIENoYW5nZSB0aGUgbW9kZSBmcm9tIFwic3RhcnRpbmdcIiB0byBcInJ1bm5pbmdcIi4gWW91IG5lZWQgdG8gY2FsbCBpdCwgaWYgdGhlcmUgaXMgYSBzdGFydGVkIHBhZ2UgaW4geW91ciBzdXJ2ZXksIG90aGVyd2lzZSBpdCBkb2VzIG5vdGhpbmcuXG4gICAqIEBzZWUgZmlyc3RQYWdlSXNTdGFydGVkXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoKSB7XG4gICAgaWYgKCF0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNTdGFydGVkU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0VGltZXJGcm9tVUkoKTtcbiAgICB0aGlzLm9uU3RhcnRlZC5maXJlKHRoaXMsIHt9KTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiBhdCB0aGUgY3VycmVudCBtb21lbnQgdGhlIHF1ZXN0aW9uIHZhbHVlcyBvbiB0aGUgY3VycmVudCBwYWdlIGFyZSB2YWxpZGF0aW5nIG9uIHRoZSBzZXJ2ZXIuXG4gICAqIEBzZWUgb25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldCBpc1ZhbGlkYXRpbmdPblNlcnZlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNWYWxpZGF0aW5nT25TZXJ2ZXJcIiwgZmFsc2UpO1xuICB9XG4gIHByaXZhdGUgc2V0SXNWYWxpZGF0aW5nT25TZXJ2ZXIodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLmlzVmFsaWRhdGluZ09uU2VydmVyKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXNWYWxpZGF0aW5nT25TZXJ2ZXJcIiwgdmFsKTtcbiAgICB0aGlzLm9uSXNWYWxpZGF0aW5nT25TZXJ2ZXJDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXNWYWxpZGF0aW5nT25TZXJ2ZXJDaGFuZ2VkKCkge31cbiAgcHJvdGVjdGVkIGRvU2VydmVyVmFsaWRhdGlvbigpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMub25TZXJ2ZXJWYWxpZGF0ZVF1ZXN0aW9ucykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIGRhdGE6IHt9LFxuICAgICAgZXJyb3JzOiB7fSxcbiAgICAgIHN1cnZleTogdGhpcyxcbiAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5jb21wbGV0ZVNlcnZlclZhbGlkYXRpb24ob3B0aW9ucyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VycmVudFBhZ2UucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmN1cnJlbnRQYWdlLnF1ZXN0aW9uc1tpXTtcbiAgICAgIGlmICghcXVlc3Rpb24udmlzaWJsZSkgY29udGludWU7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldFZhbHVlKHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpKTtcbiAgICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpKVxuICAgICAgICBvcHRpb25zLmRhdGFbcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCldID0gdmFsdWU7XG4gICAgfVxuICAgIHRoaXMuc2V0SXNWYWxpZGF0aW5nT25TZXJ2ZXIodHJ1ZSk7XG4gICAgdGhpcy5vblNlcnZlclZhbGlkYXRlUXVlc3Rpb25zKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgY29tcGxldGVTZXJ2ZXJWYWxpZGF0aW9uKG9wdGlvbnM6IGFueSkge1xuICAgIHRoaXMuc2V0SXNWYWxpZGF0aW5nT25TZXJ2ZXIoZmFsc2UpO1xuICAgIGlmICghb3B0aW9ucyAmJiAhb3B0aW9ucy5zdXJ2ZXkpIHJldHVybjtcbiAgICB2YXIgc2VsZiA9IG9wdGlvbnMuc3VydmV5O1xuICAgIHZhciBoYXNFcnJvcnMgPSBmYWxzZTtcbiAgICBpZiAob3B0aW9ucy5lcnJvcnMpIHtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gb3B0aW9ucy5lcnJvcnMpIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gc2VsZi5nZXRRdWVzdGlvbkJ5TmFtZShuYW1lKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uICYmIHF1ZXN0aW9uW1wiZXJyb3JzXCJdKSB7XG4gICAgICAgICAgaGFzRXJyb3JzID0gdHJ1ZTtcbiAgICAgICAgICBxdWVzdGlvbltcImFkZEVycm9yXCJdKG5ldyBDdXN0b21FcnJvcihvcHRpb25zLmVycm9yc1tuYW1lXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzRXJyb3JzKSB7XG4gICAgICBpZiAoc2VsZi5pc0xhc3RQYWdlKSBzZWxmLmRvQ29tcGxldGUoKTtcbiAgICAgIGVsc2Ugc2VsZi5kb05leHRQYWdlKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBkb05leHRQYWdlKCkge1xuICAgIHRoaXMuY2hlY2tPblBhZ2VUcmlnZ2VycygpO1xuICAgIGlmICh0aGlzLnNlbmRSZXN1bHRPblBhZ2VOZXh0KSB7XG4gICAgICB0aGlzLnNlbmRSZXN1bHQodGhpcy5zdXJ2ZXlQb3N0SWQsIHRoaXMuY2xpZW50SWQsIHRydWUpO1xuICAgIH1cbiAgICB2YXIgdlBhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgdmFyIGluZGV4ID0gdlBhZ2VzLmluZGV4T2YodGhpcy5jdXJyZW50UGFnZSk7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHZQYWdlc1tpbmRleCArIDFdO1xuICB9XG4gIHByb3RlY3RlZCBzZXRDb21wbGV0ZWQoKSB7XG4gICAgdGhpcy5pc0NvbXBsZXRlZCA9IHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGh0bWwgZm9yIGNvbXBsZXRlZCAnVGhhbmsgeW91JyBwYWdlLlxuICAgKiBAc2VlIGNvbXBsZXRlZEh0bWxcbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvY2Vzc2VkQ29tcGxldGVkSHRtbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNvbXBsZXRlZEh0bWwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdG1sKHRoaXMuY29tcGxldGVkSHRtbCk7XG4gICAgfVxuICAgIHJldHVybiBcIjxoMz5cIiArIHRoaXMuZ2V0TG9jU3RyaW5nKFwiY29tcGxldGluZ1N1cnZleVwiKSArIFwiPC9oMz5cIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaHRtbCBzaG93aW5nIHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgY29tcGxldGVkIHRoZSBzdXJ2ZXlcbiAgICogQHNlZSBjb21wbGV0ZWRIdG1sXG4gICAqL1xuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZENvbXBsZXRlZEJlZm9yZUh0bWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb21wbGV0ZWRCZWZvcmVIdG1sKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSHRtbCh0aGlzLmNvbXBsZXRlZEJlZm9yZUh0bWwpO1xuICAgIH1cbiAgICByZXR1cm4gXCI8aDM+XCIgKyB0aGlzLmdldExvY1N0cmluZyhcImNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmVcIikgKyBcIjwvaDM+XCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGh0bWwgdGhhdCBzaG93cyBvbiBsb2FkaW5nIHRoZSBqc29uLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm9jZXNzZWRMb2FkaW5nSHRtbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmxvYWRpbmdIdG1sKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9jZXNzSHRtbCh0aGlzLmxvYWRpbmdIdG1sKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiPGgzPlwiICsgdGhpcy5nZXRMb2NTdHJpbmcoXCJsb2FkaW5nU3VydmV5XCIpICsgXCI8L2gzPlwiO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgY3VycmVudCBwcm9ncmVzcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcHJvZ3Jlc3NUZXh0KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT0gbnVsbCkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIHZQYWdlcyA9IHRoaXMudmlzaWJsZVBhZ2VzO1xuICAgIHZhciBpbmRleCA9IHZQYWdlcy5pbmRleE9mKHRoaXMuY3VycmVudFBhZ2UpICsgMTtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJwcm9ncmVzc1RleHRcIilbXCJmb3JtYXRcIl0oaW5kZXgsIHZQYWdlcy5sZW5ndGgpO1xuICB9XG4gIHByb3RlY3RlZCBhZnRlclJlbmRlclN1cnZleShodG1sRWxlbWVudCkge1xuICAgIHRoaXMub25BZnRlclJlbmRlclN1cnZleS5maXJlKHRoaXMsIHtcbiAgICAgIHN1cnZleTogdGhpcyxcbiAgICAgIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudFxuICAgIH0pO1xuICB9XG4gIHVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3NlcyhxdWVzdGlvbjogSVF1ZXN0aW9uLCBjc3NDbGFzc2VzOiBhbnkpIHtcbiAgICB0aGlzLm9uVXBkYXRlUXVlc3Rpb25Dc3NDbGFzc2VzLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgY3NzQ2xhc3NlczogY3NzQ2xhc3Nlc1xuICAgIH0pO1xuICB9XG4gIHVwZGF0ZVBhbmVsQ3NzQ2xhc3NlcyhwYW5lbDogSVBhbmVsLCBjc3NDbGFzc2VzOiBhbnkpIHtcbiAgICB0aGlzLm9uVXBkYXRlUGFuZWxDc3NDbGFzc2VzLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgY3NzQ2xhc3NlczogY3NzQ2xhc3Nlc1xuICAgIH0pO1xuICB9XG4gIGFmdGVyUmVuZGVyUGFnZShodG1sRWxlbWVudCkge1xuICAgIGlmICh0aGlzLm9uQWZ0ZXJSZW5kZXJQYWdlLmlzRW1wdHkpIHJldHVybjtcbiAgICB0aGlzLm9uQWZ0ZXJSZW5kZXJQYWdlLmZpcmUodGhpcywge1xuICAgICAgcGFnZTogdGhpcy5jdXJyZW50UGFnZSxcbiAgICAgIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudFxuICAgIH0pO1xuICB9XG4gIGFmdGVyUmVuZGVyUXVlc3Rpb24ocXVlc3Rpb246IElRdWVzdGlvbiwgaHRtbEVsZW1lbnQpIHtcbiAgICB0aGlzLm9uQWZ0ZXJSZW5kZXJRdWVzdGlvbi5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIGh0bWxFbGVtZW50OiBodG1sRWxlbWVudFxuICAgIH0pO1xuICB9XG4gIGFmdGVyUmVuZGVyUGFuZWwocGFuZWw6IElFbGVtZW50LCBodG1sRWxlbWVudCkge1xuICAgIHRoaXMub25BZnRlclJlbmRlclBhbmVsLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgaHRtbEVsZW1lbnQ6IGh0bWxFbGVtZW50XG4gICAgfSk7XG4gIH1cbiAgbWF0cml4Um93QWRkZWQocXVlc3Rpb246IElRdWVzdGlvbikge1xuICAgIHRoaXMub25NYXRyaXhSb3dBZGRlZC5maXJlKHRoaXMsIHsgcXVlc3Rpb246IHF1ZXN0aW9uIH0pO1xuICB9XG4gIG1hdHJpeFJvd1JlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgcm93SW5kZXg6IG51bWJlciwgcm93OiBhbnkpIHtcbiAgICB0aGlzLm9uTWF0cml4Um93UmVtb3ZlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHJvd0luZGV4OiByb3dJbmRleCxcbiAgICAgIHJvdzogcm93XG4gICAgfSk7XG4gIH1cbiAgbWF0cml4Q2VsbENyZWF0ZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25NYXRyaXhDZWxsQ3JlYXRlZC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG1hdHJpeEFmdGVyQ2VsbFJlbmRlcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpIHtcbiAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgdGhpcy5vbk1hdHJpeEFmdGVyQ2VsbFJlbmRlci5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICB9XG4gIG1hdHJpeENlbGxWYWx1ZUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgb3B0aW9uczogYW55KSB7XG4gICAgb3B0aW9ucy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIHRoaXMub25NYXRyaXhDZWxsVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgbWF0cml4Q2VsbFZhbGlkYXRlKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG9wdGlvbnM6IGFueSk6IFN1cnZleUVycm9yIHtcbiAgICBvcHRpb25zLnF1ZXN0aW9uID0gcXVlc3Rpb247XG4gICAgdGhpcy5vbk1hdHJpeENlbGxWYWxpZGF0ZS5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmVycm9yID8gbmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3IpIDogbnVsbDtcbiAgfVxuICBkeW5hbWljUGFuZWxBZGRlZChxdWVzdGlvbjogSVF1ZXN0aW9uKSB7XG4gICAgdGhpcy5vbkR5bmFtaWNQYW5lbEFkZGVkLmZpcmUodGhpcywgeyBxdWVzdGlvbjogcXVlc3Rpb24gfSk7XG4gIH1cbiAgZHluYW1pY1BhbmVsUmVtb3ZlZChxdWVzdGlvbjogSVF1ZXN0aW9uLCBwYW5lbEluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLm9uRHluYW1pY1BhbmVsUmVtb3ZlZC5maXJlKHRoaXMsIHtcbiAgICAgIHF1ZXN0aW9uOiBxdWVzdGlvbixcbiAgICAgIHBhbmVsSW5kZXg6IHBhbmVsSW5kZXhcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgdGhlIGZpbGUgaW50byBzZXJ2ZXlcbiAgICogQHBhcmFtIG5hbWUgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gZmlsZSB1cGxvYWRpbmcgZmlsZVxuICAgKiBAcGFyYW0gc3RvcmVEYXRhQXNUZXh0IHNldCBpdCB0byB0cnVlIHRvIGVuY29kZSBmaWxlIGNvbnRlbnQgaW50byB0aGUgc3VydmV5IHJlc3VsdHNcbiAgICogQHBhcmFtIHVwbG9hZGluZ0NhbGxiYWNrIGEgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3RhdHVzIG9uIHVwbG9hZGluZyB0aGUgZmlsZVxuICAgKi9cbiAgcHVibGljIHVwbG9hZEZpbGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUsXG4gICAgc3RvcmVEYXRhQXNUZXh0OiBib29sZWFuLFxuICAgIHVwbG9hZGluZ0NhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcpID0+IGFueVxuICApOiBib29sZWFuIHtcbiAgICB2YXIgYWNjZXB0ID0gdHJ1ZTtcbiAgICB0aGlzLm9uVXBsb2FkRmlsZS5maXJlKHRoaXMsIHsgbmFtZTogbmFtZSwgZmlsZTogZmlsZSwgYWNjZXB0OiBhY2NlcHQgfSk7XG4gICAgaWYgKCFhY2NlcHQpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXN0b3JlRGF0YUFzVGV4dCAmJiB0aGlzLnN1cnZleVBvc3RJZCkge1xuICAgICAgdGhpcy51cGxvYWRGaWxlQ29yZShuYW1lLCBmaWxlLCB1cGxvYWRpbmdDYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVTdXJ2ZXlTZXJ2aWNlKCk6IGR4U3VydmV5U2VydmljZSB7XG4gICAgcmV0dXJuIG5ldyBkeFN1cnZleVNlcnZpY2UoKTtcbiAgfVxuICBwcm90ZWN0ZWQgdXBsb2FkRmlsZUNvcmUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUsXG4gICAgdXBsb2FkaW5nQ2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZykgPT4gYW55XG4gICkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spIHVwbG9hZGluZ0NhbGxiYWNrKFwidXBsb2FkaW5nXCIpO1xuICAgIHRoaXMuY3JlYXRlU3VydmV5U2VydmljZSgpLnNlbmRGaWxlKHRoaXMuc3VydmV5UG9zdElkLCBmaWxlLCBmdW5jdGlvbihcbiAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICByZXNwb25zZTogYW55XG4gICAgKSB7XG4gICAgICBpZiAodXBsb2FkaW5nQ2FsbGJhY2spIHVwbG9hZGluZ0NhbGxiYWNrKHN1Y2Nlc3MgPyBcInN1Y2Nlc3NcIiA6IFwiZXJyb3JcIik7XG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICBzZWxmLnNldFZhbHVlKG5hbWUsIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBnZXRQYWdlKGluZGV4OiBudW1iZXIpOiBQYWdlTW9kZWwge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzW2luZGV4XTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcGFnZSBpbnRvIHRoZSBzdXJ2ZXlcbiAgICogQHBhcmFtIHBhZ2VcbiAgICogQHNlZSBhZGROZXdQYWdlXG4gICAqL1xuICBwdWJsaWMgYWRkUGFnZShwYWdlOiBQYWdlTW9kZWwpIHtcbiAgICBpZiAocGFnZSA9PSBudWxsKSByZXR1cm47XG4gICAgdGhpcy5wYWdlcy5wdXNoKHBhZ2UpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwYWdlIGFuZCBhZGRzIGl0IGludG8gdGhlIHN1cnZleS4gR2VuYXJhdGVzIGEgbmV3IG5hbWUgaWYgdGhlIG5hbWUgcGFyYW1ldGVyIGlzIG5vdCBzZXQuXG4gICAqIEBwYXJhbSBuYW1lIGEgcGFnZSBuYW1lXG4gICAqIEBzZWUgYWRkUGFnZVxuICAgKi9cbiAgcHVibGljIGFkZE5ld1BhZ2UobmFtZTogc3RyaW5nID0gbnVsbCkge1xuICAgIHZhciBwYWdlID0gdGhpcy5jcmVhdGVOZXdQYWdlKG5hbWUpO1xuICAgIHRoaXMuYWRkUGFnZShwYWdlKTtcbiAgICByZXR1cm4gcGFnZTtcbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBwYWdlIGZyb20gdGhlIHN1cnZleVxuICAgKiBAcGFyYW0gcGFnZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhZ2UocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5wYWdlcy5pbmRleE9mKHBhZ2UpO1xuICAgIGlmIChpbmRleCA8IDApIHJldHVybjtcbiAgICB0aGlzLnBhZ2VzLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFBhZ2VWYWx1ZSA9PSBwYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlcy5sZW5ndGggPiAwID8gdGhpcy5wYWdlc1swXSA6IG51bGw7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHF1ZXN0aW9uIGJ5IGl0cyBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIGEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gY2FzZUluc2Vuc2l0aXZlXG4gICAqIEBzZWUgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZVxuICAgKi9cbiAgcHVibGljIGdldFF1ZXN0aW9uQnlOYW1lKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9uTmFtZSA9IHF1ZXN0aW9uc1tpXS5uYW1lO1xuICAgICAgaWYgKGNhc2VJbnNlbnNpdGl2ZSkgcXVlc3Rpb25OYW1lID0gcXVlc3Rpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAocXVlc3Rpb25OYW1lID09IG5hbWUpIHJldHVybiBxdWVzdGlvbnNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcXVlc3Rpb24gYnkgaXRzIHZhbHVlIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlTmFtZSBhIHF1ZXN0aW9uIG5hbWVcbiAgICogQHBhcmFtIGNhc2VJbnNlbnNpdGl2ZVxuICAgKiBAc2VlIGdldFF1ZXN0aW9uQnlOYW1lXG4gICAqIEBzZWUgUXVlc3Rpb24udmFsdWVOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZShcbiAgICB2YWx1ZU5hbWU6IHN0cmluZyxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUXVlc3Rpb24ge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpIHZhbHVlTmFtZSA9IHZhbHVlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvblZhbHVlTmFtZSA9IHF1ZXN0aW9uc1tpXS5nZXRWYWx1ZU5hbWUoKTtcbiAgICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpIHF1ZXN0aW9uVmFsdWVOYW1lID0gcXVlc3Rpb25WYWx1ZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChxdWVzdGlvblZhbHVlTmFtZSA9PSB2YWx1ZU5hbWUpIHJldHVybiBxdWVzdGlvbnNbaV07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgYSBsaXN0IG9mIHF1ZXN0aW9ucyBieSB0aGVpciBuYW1lc1xuICAgKiBAcGFyYW0gbmFtZXMgdGhlIGFycmF5IG9mIG5hbWVzXG4gICAqIEBwYXJhbSBjYXNlSW5zZW5zaXRpdmVcbiAgICovXG4gIHB1YmxpYyBnZXRRdWVzdGlvbnNCeU5hbWVzKFxuICAgIG5hbWVzOiBzdHJpbmdbXSxcbiAgICBjYXNlSW5zZW5zaXRpdmU6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBJUXVlc3Rpb25bXSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGlmICghbmFtZXMpIHJldHVybiByZXN1bHQ7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIW5hbWVzW2ldKSBjb250aW51ZTtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZXNbaV0sIGNhc2VJbnNlbnNpdGl2ZSk7XG4gICAgICBpZiAocXVlc3Rpb24pIHJlc3VsdC5wdXNoKHF1ZXN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHBhZ2Ugb24gd2hpY2ggYW4gZWxlbWVudCAocXVlc3Rpb24gb3IgcGFuZWwpIGlzIHBsYWNlZC5cbiAgICogQHBhcmFtIGVsZW1lbnQgUXVlc3Rpb24gb3IgUGFuZWxcbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlQnlFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogUGFnZU1vZGVsIHtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhZ2UgPSB0aGlzLnBhZ2VzW2ldO1xuICAgICAgaWYgKHBhZ2UuY29udGFpbnNFbGVtZW50KGVsZW1lbnQpKSByZXR1cm4gcGFnZTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwYWdlIG9uIHdoaWNoIGEgcXVlc3Rpb24gaXMgbG9jYXRlZFxuICAgKiBAcGFyYW0gcXVlc3Rpb25cbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlQnlRdWVzdGlvbihxdWVzdGlvbjogSVF1ZXN0aW9uKTogUGFnZU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlQnlFbGVtZW50KHF1ZXN0aW9uKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHBhZ2UgYnkgaXQncyBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZVxuICAgKi9cbiAgcHVibGljIGdldFBhZ2VCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZU1vZGVsIHtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMucGFnZXNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy5wYWdlc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJlcnR1bnMgYSBsaXN0IG9mIHBhZ2VzIGJ5IHRoZWlyIG5hbWVzXG4gICAqIEBwYXJhbSBuYW1lcyBhIGxpc3Qgb2YgcGFnZXMgbmFtZXNcbiAgICovXG4gIHB1YmxpYyBnZXRQYWdlc0J5TmFtZXMobmFtZXM6IHN0cmluZ1tdKTogUGFnZU1vZGVsW10ge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBpZiAoIW5hbWVzKSByZXR1cm4gcmVzdWx0O1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFuYW1lc1tpXSkgY29udGludWU7XG4gICAgICB2YXIgcGFnZSA9IHRoaXMuZ2V0UGFnZUJ5TmFtZShuYW1lc1tpXSk7XG4gICAgICBpZiAocGFnZSkgcmVzdWx0LnB1c2gocGFnZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHF1ZXN0aW9ucyBpbiB0aGUgc3VydmV5XG4gICAqIEBwYXJhbSB2aXNpYmxlT25seSBzZXQgaXQgdHJ1ZSwgaWYgeW91IHdhbnQgdG8gZ2V0IG9ubHkgdmlzaWJsZSBxdWVzdGlvbnNcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxRdWVzdGlvbnMoXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8SVF1ZXN0aW9uPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUXVlc3Rpb24+KCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uYWRkUXVlc3Rpb25zVG9MaXN0KFxuICAgICAgICByZXN1bHQsXG4gICAgICAgIHZpc2libGVPbmx5LFxuICAgICAgICBpbmNsdWRpbmdEZXNpZ25UaW1lXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHF1aXogcXVlc3Rpb25zLiBBbGwgdmlzaWJsZSBxdWVzdGlvbnMgdGhhdCBoYXMgaW5wdXQocykgd2lkZ2V0cy5cbiAgICovXG4gIHB1YmxpYyBnZXRRdWl6UXVlc3Rpb25zKCk6IEFycmF5PElRdWVzdGlvbj4ge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8SVF1ZXN0aW9uPigpO1xuICAgIHZhciBzdGFydEluZGV4ID0gdGhpcy5maXJzdFBhZ2VJc1N0YXJ0ZWQgPyAxIDogMDtcbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5wYWdlc1tpXS5pc1Zpc2libGUpIGNvbnRpbnVlO1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucGFnZXNbaV0ucXVlc3Rpb25zO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBxdWVzdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIHEgPSBxdWVzdGlvbnNbal07XG4gICAgICAgIGlmIChxLmlzVmlzaWJsZSAmJiBxLmhhc0lucHV0KSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2gocSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcGFuZWxzIGluIHRoZSBzdXJ2ZXlcbiAgICovXG4gIHB1YmxpYyBnZXRBbGxQYW5lbHMoXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8SVBhbmVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxJUGFuZWw+KCk7XG4gICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0uYWRkUGFuZWxzSW50b0xpc3QocmVzdWx0LCB2aXNpYmxlT25seSwgaW5jbHVkaW5nRGVzaWduVGltZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhZ2UobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQYWdlTW9kZWwobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG5vdGlmeVF1ZXN0aW9uT25WYWx1ZUNoYW5nZWQodmFsdWVOYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICB2YXIgcXVlc3Rpb24gPSBudWxsO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0uZ2V0VmFsdWVOYW1lKCkgIT0gdmFsdWVOYW1lKSBjb250aW51ZTtcbiAgICAgIHF1ZXN0aW9uID0gcXVlc3Rpb25zW2ldO1xuICAgICAgdGhpcy5kb1N1cnZleVZhbHVlQ2hhbmdlZChxdWVzdGlvbiwgbmV3VmFsdWUpO1xuICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZC5maXJlKHRoaXMsIHtcbiAgICAgICAgbmFtZTogdmFsdWVOYW1lLFxuICAgICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghcXVlc3Rpb24pIHtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQuZmlyZSh0aGlzLCB7XG4gICAgICAgIG5hbWU6IHZhbHVlTmFtZSxcbiAgICAgICAgcXVlc3Rpb246IG51bGwsXG4gICAgICAgIHZhbHVlOiBuZXdWYWx1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMubm90aWZ5RWxlbWVudHNPbkFueVZhbHVlT3JWYXJpYWJsZUNoYW5nZWQodmFsdWVOYW1lKTtcbiAgfVxuICBwcml2YXRlIG5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5wYWdlc1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBub3RpZnlBbGxRdWVzdGlvbnNPblZhbHVlQ2hhbmdlZCgpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmRvU3VydmV5VmFsdWVDaGFuZ2VkKFxuICAgICAgICBxdWVzdGlvbnNbaV0sXG4gICAgICAgIHRoaXMuZ2V0VmFsdWUocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGRvU3VydmV5VmFsdWVDaGFuZ2VkKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBxdWVzdGlvbi5vblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjaGVja09uUGFnZVRyaWdnZXJzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkpO1xuICAgICAgdGhpcy5jaGVja1RyaWdnZXJzKHF1ZXN0aW9uLmdldFZhbHVlTmFtZSgpLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0Q3VycmVudFBhZ2VRdWVzdGlvbnMoKTogQXJyYXk8UXVlc3Rpb25CYXNlPiB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICBpZiAoIXBhZ2UpIHJldHVybiByZXN1bHQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlLnF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9uID0gcGFnZS5xdWVzdGlvbnNbaV07XG4gICAgICBpZiAoIXF1ZXN0aW9uLnZpc2libGUgfHwgIXF1ZXN0aW9uLm5hbWUpIGNvbnRpbnVlO1xuICAgICAgcmVzdWx0LnB1c2gocXVlc3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgY2hlY2tUcmlnZ2VycyhuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnksIGlzT25OZXh0UGFnZTogYm9vbGVhbikge1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdHJpZ2dlciA9IHRoaXMudHJpZ2dlcnNbaV07XG4gICAgICBpZiAodHJpZ2dlci5uYW1lID09IG5hbWUgJiYgdHJpZ2dlci5pc09uTmV4dFBhZ2UgPT0gaXNPbk5leHRQYWdlKSB7XG4gICAgICAgIHRyaWdnZXIuY2hlY2sobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGRvRWxlbWVudHNPbkxvYWQoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnBhZ2VzW2ldLm9uU3VydmV5TG9hZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHJ1bkNvbmRpdGlvbnMoKSB7XG4gICAgdmFyIHBhZ2VzID0gdGhpcy5wYWdlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYWdlc1tpXS5ydW5Db25kaXRpb24odGhpcy52YWx1ZXNIYXNoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFNlbmQgdGhlIHN1cnZleSByZXN1bHQgaW50byBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZS5cbiAgICogQHBhcmFtIHBvc3RJZCBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSBwb3N0SWRcbiAgICogQHBhcmFtIGNsaWVudElkIFR5cGljYWxseSBhIGN1c3RvbWVyIGUtbWFpbCBvciBhbiBpZGVudGlmaWNhdG9yXG4gICAqIEBwYXJhbSBpc1BhcnRpYWxDb21wbGV0ZWQgU2V0IGl0IHRvIHRydWUgaWYgdGhlIHN1cnZleSBpcyBub3QgY29tcGxldGVkIHlldCBhbmQgaXQgaXMgYW4gaW50ZXJtZWRpYXRlIHJlc3VsdHNcbiAgICogQHNlZSBzdXJ2ZXlQb3N0SWRcbiAgICogQHNlZSBjbGllbnRJZFxuICAgKi9cbiAgcHVibGljIHNlbmRSZXN1bHQoXG4gICAgcG9zdElkOiBzdHJpbmcgPSBudWxsLFxuICAgIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLFxuICAgIGlzUGFydGlhbENvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIGlmICghdGhpcy5pc0VkaXRNb2RlKSByZXR1cm47XG4gICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCAmJiB0aGlzLm9uUGFydGlhbFNlbmQpIHtcbiAgICAgIHRoaXMub25QYXJ0aWFsU2VuZC5maXJlKHRoaXMsIG51bGwpO1xuICAgIH1cblxuICAgIGlmICghcG9zdElkICYmIHRoaXMuc3VydmV5UG9zdElkKSB7XG4gICAgICBwb3N0SWQgPSB0aGlzLnN1cnZleVBvc3RJZDtcbiAgICB9XG4gICAgaWYgKCFwb3N0SWQpIHJldHVybjtcbiAgICBpZiAoY2xpZW50SWQpIHtcbiAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDtcbiAgICB9XG4gICAgaWYgKGlzUGFydGlhbENvbXBsZXRlZCAmJiAhdGhpcy5jbGllbnRJZCkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAodGhpcy5zdXJ2ZXlTaG93RGF0YVNhdmluZykge1xuICAgICAgdGhpcy5zZXRDb21wbGV0ZWRTdGF0ZShcInNhdmluZ1wiLCBcIlwiKTtcbiAgICB9XG4gICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkuc2VuZFJlc3VsdChcbiAgICAgIHBvc3RJZCxcbiAgICAgIHRoaXMuZGF0YSxcbiAgICAgIGZ1bmN0aW9uKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpIHtcbiAgICAgICAgaWYgKHNlbGYuc3VydmV5U2hvd0RhdGFTYXZpbmcpIHtcbiAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgc2VsZi5zZXRDb21wbGV0ZWRTdGF0ZShcInN1Y2Nlc3NcIiwgXCJcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYuc2V0Q29tcGxldGVkU3RhdGUoXCJlcnJvclwiLCBcIlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5vblNlbmRSZXN1bHQuZmlyZShzZWxmLCB7IHN1Y2Nlc3M6IHN1Y2Nlc3MsIHJlc3BvbnNlOiByZXNwb25zZSB9KTtcbiAgICAgIH0sXG4gICAgICB0aGlzLmNsaWVudElkLFxuICAgICAgaXNQYXJ0aWFsQ29tcGxldGVkXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogSXQgY2FsbHMgdGhlIFtkeHN1cnZleS5jb21dKGh0dHA6Ly93d3cuZHhzdXJ2ZXkuY29tKSBzZXJ2aWNlIGFuZCBvbiBjYWxsYmFjayBmaXJlcyBvbkdldFJlc3VsdCBldmVudCB3aXRoIGFsbCBhbnN3ZXJzIHRoYXQgeW91ciB1c2VycyBtYWRlIGZvciBhIHF1ZXN0aW9uLlxuICAgKiBAcGFyYW0gcmVzdWx0SWQgW2R4c3VydmV5LmNvbV0oaHR0cDovL3d3dy5keHN1cnZleS5jb20pIHNlcnZpY2UgcmVzdWx0SWRcbiAgICogQHBhcmFtIG5hbWUgVGhlIHF1ZXN0aW9uIG5hbWVcbiAgICogQHNlZSBvbkdldFJlc3VsdFxuICAgKi9cbiAgcHVibGljIGdldFJlc3VsdChyZXN1bHRJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkuZ2V0UmVzdWx0KHJlc3VsdElkLCBuYW1lLCBmdW5jdGlvbihcbiAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICBkYXRhOiBhbnksXG4gICAgICBkYXRhTGlzdDogYW55W10sXG4gICAgICByZXNwb25zZTogYW55XG4gICAgKSB7XG4gICAgICBzZWxmLm9uR2V0UmVzdWx0LmZpcmUoc2VsZiwge1xuICAgICAgICBzdWNjZXNzOiBzdWNjZXNzLFxuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBkYXRhTGlzdDogZGF0YUxpc3QsXG4gICAgICAgIHJlc3BvbnNlOiByZXNwb25zZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBzdXJ2ZXkgSnNvbiBmcm9tIHRoZSBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZS4gSWYgY2xpZW50SWQgaXMgbm90IG51bGwgYW5kIHVzZXIgaGFzIGFscmVhZHkgY29tcGxldGVkIHRoZSBzdXJ2ZXksIHRoZSBzdXJ2ZXkgd2lsbCBnbyBpbnRvIFwiY29tcGxldGVkYmVmb3JlXCIgc3RhdGUuXG4gICAqIEBwYXJhbSBzdXJ2ZXlJZCBbZHhzdXJ2ZXkuY29tXShodHRwOi8vd3d3LmR4c3VydmV5LmNvbSkgc2VydmljZSBzdXJ2ZXlJZFxuICAgKiBAcGFyYW0gY2xpZW50SWQgaW5kZW50aWZpY2F0b3IgZm9yIGEgdXNlciwgZm9yIGV4YW1wbGUgZS1tYWlsIG9yIHVuaXF1ZSBjdXN0b21lciBpZCBpbiB5b3VyIHdlYiBhcHBsaWNhdGlvbi5cbiAgICogQHNlZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGxvYWRTdXJ2ZXlGcm9tU2VydmljZShcbiAgICBzdXJ2ZXlJZDogc3RyaW5nID0gbnVsbCxcbiAgICBjbGllbmRJZDogc3RyaW5nID0gbnVsbFxuICApIHtcbiAgICBpZiAoc3VydmV5SWQpIHtcbiAgICAgIHRoaXMuc3VydmV5SWQgPSBzdXJ2ZXlJZDtcbiAgICB9XG4gICAgaWYgKGNsaWVuZElkKSB7XG4gICAgICB0aGlzLmNsaWVudElkID0gY2xpZW5kSWQ7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5vbkxvYWRpbmdTdXJ2ZXlGcm9tU2VydmljZSgpO1xuICAgIGlmIChjbGllbmRJZCkge1xuICAgICAgdGhpcy5jcmVhdGVTdXJ2ZXlTZXJ2aWNlKCkuZ2V0U3VydmV5SnNvbkFuZElzQ29tcGxldGVkKFxuICAgICAgICB0aGlzLnN1cnZleUlkLFxuICAgICAgICB0aGlzLmNsaWVudElkLFxuICAgICAgICBmdW5jdGlvbihcbiAgICAgICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgICAgIGpzb246IHN0cmluZyxcbiAgICAgICAgICBpc0NvbXBsZXRlZDogc3RyaW5nLFxuICAgICAgICAgIHJlc3BvbnNlOiBhbnlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2VsZi5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgICAgc2VsZi5pc0NvbXBsZXRlZEJlZm9yZSA9IGlzQ29tcGxldGVkID09IFwiY29tcGxldGVkXCI7XG4gICAgICAgICAgICBzZWxmLmxvYWRTdXJ2ZXlGcm9tU2VydmljZUpzb24oanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZVN1cnZleVNlcnZpY2UoKS5sb2FkU3VydmV5KHRoaXMuc3VydmV5SWQsIGZ1bmN0aW9uKFxuICAgICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgICByZXN1bHQ6IHN0cmluZyxcbiAgICAgICAgcmVzcG9uc2U6IGFueVxuICAgICAgKSB7XG4gICAgICAgIHNlbGYuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgc2VsZi5sb2FkU3VydmV5RnJvbVNlcnZpY2VKc29uKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGxvYWRTdXJ2ZXlGcm9tU2VydmljZUpzb24oanNvbjogYW55KSB7XG4gICAgaWYgKCFqc29uKSByZXR1cm47XG4gICAgdGhpcy5zZXRKc29uT2JqZWN0KGpzb24pO1xuICAgIHRoaXMubm90aWZ5QWxsUXVlc3Rpb25zT25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLm9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uTG9hZGluZ1N1cnZleUZyb21TZXJ2aWNlKCkge31cbiAgcHJvdGVjdGVkIG9uTG9hZFN1cnZleUZyb21TZXJ2aWNlKCkge31cbiAgcHJpdmF0ZSBjaGVja1BhZ2VWaXNpYmlsaXR5KFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgb2xkUXVlc3Rpb25WaXNpYmxlOiBib29sZWFuXG4gICkge1xuICAgIHZhciBwYWdlID0gdGhpcy5nZXRQYWdlQnlRdWVzdGlvbihxdWVzdGlvbik7XG4gICAgaWYgKCFwYWdlKSByZXR1cm47XG4gICAgdmFyIG5ld1ZhbHVlID0gcGFnZS5pc1Zpc2libGU7XG4gICAgaWYgKG5ld1ZhbHVlICE9IHBhZ2UuZ2V0SXNQYWdlVmlzaWJsZShxdWVzdGlvbikgfHwgb2xkUXVlc3Rpb25WaXNpYmxlKSB7XG4gICAgICB0aGlzLnBhZ2VWaXNpYmlsaXR5Q2hhbmdlZChwYWdlLCBuZXdWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUluZGV4ZXMoKSB7XG4gICAgdGhpcy51cGRhdGVQYWdlVmlzaWJsZUluZGV4ZXModGhpcy5zaG93UGFnZU51bWJlcnMpO1xuICAgIGlmICh0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvblBhZ2VcIikge1xuICAgICAgdmFyIHZpc1BhZ2VzID0gdGhpcy52aXNpYmxlUGFnZXM7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpc1BhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUXVlc3Rpb25WaXNpYmxlSW5kZXhlcyh2aXNQYWdlc1tpXS5xdWVzdGlvbnMsIHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVF1ZXN0aW9uVmlzaWJsZUluZGV4ZXMoXG4gICAgICAgIHRoaXMuZ2V0QWxsUXVlc3Rpb25zKGZhbHNlKSxcbiAgICAgICAgdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVQYWdlVmlzaWJsZUluZGV4ZXMoc2hvd0luZGV4OiBib29sZWFuKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGFnZXNbaV0udmlzaWJsZUluZGV4ID0gdGhpcy5wYWdlc1tpXS52aXNpYmxlID8gaW5kZXgrKyA6IC0xO1xuICAgICAgdGhpcy5wYWdlc1tpXS5udW0gPVxuICAgICAgICBzaG93SW5kZXggJiYgdGhpcy5wYWdlc1tpXS52aXNpYmxlXG4gICAgICAgICAgPyB0aGlzLnBhZ2VzW2ldLnZpc2libGVJbmRleCArIDFcbiAgICAgICAgICA6IC0xO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHVwZGF0ZVF1ZXN0aW9uVmlzaWJsZUluZGV4ZXMoXG4gICAgcXVlc3Rpb25zOiBJUXVlc3Rpb25bXSxcbiAgICBzaG93SW5kZXg6IGJvb2xlYW5cbiAgKSB7XG4gICAgU3VydmV5RWxlbWVudC5zZXRWaXNpYmxlSW5kZXgocXVlc3Rpb25zLCAwLCBzaG93SW5kZXgpO1xuICB9XG4gIHByaXZhdGUgc2V0SnNvbk9iamVjdChqc29uT2JqOiBhbnkpIHtcbiAgICBpZiAoIWpzb25PYmopIHJldHVybjtcbiAgICB0aGlzLmpzb25FcnJvcnMgPSBudWxsO1xuICAgIHZhciBqc29uQ29udmVydGVyID0gbmV3IEpzb25PYmplY3QoKTtcbiAgICBqc29uQ29udmVydGVyLnRvT2JqZWN0KGpzb25PYmosIHRoaXMpO1xuICAgIGlmIChqc29uQ29udmVydGVyLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmpzb25FcnJvcnMgPSBqc29uQ29udmVydGVyLmVycm9ycztcbiAgICB9XG4gIH1cbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHRoaXMuaXNTdGFydGVkU3RhdGUgPSB0aGlzLmZpcnN0UGFnZUlzU3RhcnRlZDtcbiAgICB0aGlzLm9uSXNTaW5nbGVQYWdlQ2hhbmdlZCgpO1xuICAgIHRoaXMucnVuQ29uZGl0aW9ucygpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICBpZiAodGhpcy5oYXNDb29raWUpIHtcbiAgICAgIHRoaXMuZG9Db21wbGV0ZSgpO1xuICAgIH1cbiAgICB0aGlzLmRvRWxlbWVudHNPbkxvYWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25CZWZvcmVDcmVhdGluZygpIHt9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge31cbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpOiBhbnkge1xuICAgIHZhciBuYW1lID0gdGV4dFZhbHVlLm5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICBpZiAobmFtZSA9PT0gXCJwYWdlbm9cIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHZhciBwYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHBhZ2UgIT0gbnVsbCA/IHRoaXMudmlzaWJsZVBhZ2VzLmluZGV4T2YocGFnZSkgKyAxIDogMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwicGFnZWNvdW50XCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLnZpc2libGVQYWdlQ291bnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImNvcnJlY3RlZGFuc3dlcnNcIiB8fCBuYW1lID09PSBcImNvcnJlY3RlZGFuc3dlcmNvdW50XCIpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB0aGlzLmdldENvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImluY29ycmVjdGVkYW5zd2Vyc1wiIHx8IG5hbWUgPT09IFwiaW5jb3JyZWN0ZWRhbnN3ZXJjb3VudFwiKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdGhpcy5nZXRJbkNvcnJlY3RlZEFuc3dlckNvdW50KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcInF1ZXN0aW9uY291bnRcIikge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHRoaXMuZ2V0UXVpelF1ZXN0aW9ucygpLmxlbmd0aDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGZpcnN0TmFtZSA9IG5ldyBQcm9jZXNzVmFsdWUoKS5nZXRGaXJzdE5hbWUobmFtZSk7XG4gICAgdmFyIHZhcmlhYmxlID0gdGhpcy5nZXRWYXJpYWJsZShuYW1lKTtcbiAgICBpZiAodmFyaWFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dFZhbHVlLmlzRXhpc3RzID0gdHJ1ZTtcbiAgICAgIHRleHRWYWx1ZS52YWx1ZSA9IHZhcmlhYmxlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcXVlc3Rpb24gPSB0aGlzLmdldFF1ZXN0aW9uQnlWYWx1ZU5hbWUoZmlyc3ROYW1lLCB0cnVlKTtcbiAgICBpZiAocXVlc3Rpb24pIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICBuYW1lID0gcXVlc3Rpb24uZ2V0VmFsdWVOYW1lKCkgKyBuYW1lLnN1YnN0cihmaXJzdE5hbWUubGVuZ3RoKTtcbiAgICAgIG5hbWUgPSBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICB2YXIgdmFsdWVzID0ge307XG4gICAgICB2YWx1ZXNbZmlyc3ROYW1lXSA9IHRleHRWYWx1ZS5yZXR1cm5EaXNwbGF5VmFsdWVcbiAgICAgICAgPyBxdWVzdGlvbi5kaXNwbGF5VmFsdWVcbiAgICAgICAgOiB0aGlzLmdldFZhbHVlKGZpcnN0TmFtZSk7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0VmFsdWUobmFtZSwgdmFsdWVzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSh0ZXh0VmFsdWUubmFtZSk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRleHRWYWx1ZS5pc0V4aXN0cyA9IHRydWU7XG4gICAgICB0ZXh0VmFsdWUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjbGVhclVudXNlZFZhbHVlcygpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5nZXRBbGxRdWVzdGlvbnMoKTtcbiAgICBmb3IgKHZhciBpOiBudW1iZXIgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWVzdGlvbnNbaV0uY2xlYXJVbnVzZWRWYWx1ZXMoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xlYXJJbnZpc2libGVWYWx1ZXMgPT0gXCJvbkNvbXBsZXRlXCIpIHtcbiAgICAgIHRoaXMuY2xlYXJJbnZpc2libGVRdWVzdGlvblZhbHVlcygpO1xuICAgIH1cbiAgfVxuICBoYXNWaXNpYmxlUXVlc3Rpb25CeVZhbHVlTmFtZSh2YWx1ZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0uZ2V0VmFsdWVOYW1lKCkgPT0gdmFsdWVOYW1lICYmIHF1ZXN0aW9uc1tpXS5pc1Zpc2libGUpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBjbGVhckludmlzaWJsZVF1ZXN0aW9uVmFsdWVzKCkge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEFsbFF1ZXN0aW9ucygpO1xuICAgIGZvciAodmFyIGk6IG51bWJlciA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHF1ZXN0aW9uc1tpXS5jbGVhclZhbHVlSWZJbnZpc2libGUoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYSB2YXJpYWJsZSB2YWx1ZS4gVmFyaWFibGUsIHVubGlrZSB2YWx1ZXMsIGFyZSBub3Qgc3RvcmVkIGluIHRoZSBzdXJ2ZXkgcmVzdWx0cy5cbiAgICogQHBhcmFtIG5hbWUgQSB2YXJpYWJsZSBuYW1lXG4gICAqIEBzZWUgU2V0VmFyaWFibGVcbiAgICovXG4gIHB1YmxpYyBnZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmFyaWFibGVzSGFzaFtuYW1lXTtcbiAgfVxuICAvKipcbiAgICogU2V0cyBhIHZhcmlhYmxlIHZhbHVlLiBWYXJpYWJsZSwgdW5saWtlIHZhbHVlcywgYXJlIG5vdCBzdG9yZWQgaW4gdGhlIHN1cnZleSByZXN1bHRzLlxuICAgKiBAcGFyYW0gbmFtZSBBIHZhcmlhYmxlIG5hbWVcbiAgICogQHBhcmFtIG5ld1ZhbHVlXG4gICAqIEBzZWUgR2V0VmFyaWFibGVcbiAgICovXG4gIHB1YmxpYyBzZXRWYXJpYWJsZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcbiAgICB0aGlzLnZhcmlhYmxlc0hhc2hbbmFtZV0gPSBuZXdWYWx1ZTtcbiAgICB0aGlzLm5vdGlmeUVsZW1lbnRzT25BbnlWYWx1ZU9yVmFyaWFibGVDaGFuZ2VkKG5hbWUpO1xuICB9XG4gIC8vSVN1cnZleSBkYXRhXG4gIHByb3RlY3RlZCBnZXRVbmJpbmRWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIC8vZG8gbm90IHJldHVybiB0aGUgc2FtZSBvYmplY3QgaW5zdGFuY2UhISFcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBhIHF1ZXN0aW9uIHZhbHVlXG4gICAqIEBwYXJhbSBuYW1lIEEgcXVlc3Rpb24gbmFtZVxuICAgKiBAc2VlIGRhdGFcbiAgICogQHNlZSBzZXRWYWx1ZVxuICAgKi9cbiAgcHVibGljIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFuYW1lIHx8IG5hbWUubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWVzSGFzaFtuYW1lXTtcbiAgICByZXR1cm4gdGhpcy5nZXRVbmJpbmRWYWx1ZSh2YWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgYSBxdWVzdGlvbiB2YWx1ZS4gSXQgcnVucyBhbGwgdHJpZ2dlcnMgYW5kIGNvbmRpdGlvbnMgKHZpc2libGVJZiBwcm9wZXJ0aWVzKS4gR29lcyB0byB0aGUgbmV4dCBwYWdlIGlmIGdvTmV4dFBhZ2VBdXRvbWF0aWMgaXMgdHJ1ZSBhbmQgYWxsIHF1ZXN0aW9ucyBvbiB0aGUgY3VycmVudCBwYWdlIGFyZSBhbnN3ZXJlZCBjb3JyZWN0bHkuXG4gICAqIEBwYXJhbSBuYW1lIEEgcXVlc3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gbmV3VmFsdWVcbiAgICogQHNlZSBkYXRhXG4gICAqIEBzZWUgZ2V0VmFsdWVcbiAgICogQHNlZSBQYWdlTW9kZWwudmlzaWJsZUlmXG4gICAqIEBzZWUgUXVlc3Rpb25CYXNlLnZpc2libGVJZlxuICAgKiBAc2VlIGdvTmV4dFBhZ2VBdXRvbWF0aWNcbiAgICovXG4gIHB1YmxpYyBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlRXF1YWwobmFtZSwgbmV3VmFsdWUpKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KG5ld1ZhbHVlKSkge1xuICAgICAgZGVsZXRlIHRoaXMudmFsdWVzSGFzaFtuYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3VmFsdWUgPSB0aGlzLmdldFVuYmluZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgIHRoaXMuc2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5ub3RpZnlRdWVzdGlvbk9uVmFsdWVDaGFuZ2VkKG5hbWUsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLmNoZWNrVHJpZ2dlcnMobmFtZSwgbmV3VmFsdWUsIGZhbHNlKTtcbiAgICB0aGlzLnJ1bkNvbmRpdGlvbnMoKTtcbiAgICB0aGlzLnRyeUdvTmV4dFBhZ2VBdXRvbWF0aWMobmFtZSk7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlRXF1YWwobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKG5ld1ZhbHVlID09IFwiXCIpIG5ld1ZhbHVlID0gbnVsbDtcbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKG5hbWUpO1xuICAgIGlmIChuZXdWYWx1ZSA9PT0gbnVsbCB8fCBvbGRWYWx1ZSA9PT0gbnVsbCkgcmV0dXJuIG5ld1ZhbHVlID09PSBvbGRWYWx1ZTtcbiAgICByZXR1cm4gdGhpcy5pc1R3b1ZhbHVlRXF1YWxzKG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGRvT25QYWdlQWRkZWQocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgcGFnZS5zZXRTdXJ2ZXlJbXBsKHRoaXMpO1xuICAgIGlmICghcGFnZS5uYW1lKSBwYWdlLm5hbWUgPSB0aGlzLmdlbmVyYXRlTmV3TmFtZSh0aGlzLnBhZ2VzLCBcInBhZ2VcIik7XG4gICAgdmFyIG9wdGlvbnMgPSB7IHBhZ2U6IHBhZ2UgfTtcbiAgICB0aGlzLm9uUGFnZUFkZGVkLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gIH1cbiAgcHJpdmF0ZSBnZW5lcmF0ZU5ld05hbWUoZWxlbWVudHM6IEFycmF5PGFueT4sIGJhc2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBrZXlzID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykga2V5c1tlbGVtZW50c1tpXVtcIm5hbWVcIl1dID0gdHJ1ZTtcbiAgICB2YXIgaW5kZXggPSAxO1xuICAgIHdoaWxlIChrZXlzW2Jhc2VOYW1lICsgaW5kZXhdKSBpbmRleCsrO1xuICAgIHJldHVybiBiYXNlTmFtZSArIGluZGV4O1xuICB9XG4gIHByb3RlY3RlZCB0cnlHb05leHRQYWdlQXV0b21hdGljKG5hbWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5nb05leHRQYWdlQXV0b21hdGljIHx8ICF0aGlzLmN1cnJlbnRQYWdlKSByZXR1cm47XG4gICAgdmFyIHF1ZXN0aW9uID0gdGhpcy5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKG5hbWUpO1xuICAgIGlmIChcbiAgICAgIHF1ZXN0aW9uICYmXG4gICAgICAoIXF1ZXN0aW9uLnZpc2libGUgfHwgIXF1ZXN0aW9uLnN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldEN1cnJlbnRQYWdlUXVlc3Rpb25zKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpKTtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0uaGFzSW5wdXQgJiYgdGhpcy5pc1ZhbHVlRW1wdHkodmFsdWUpKSByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5jdXJyZW50UGFnZS5oYXNFcnJvcnModHJ1ZSwgZmFsc2UpKSB7XG4gICAgICBpZiAoIXRoaXMuaXNMYXN0UGFnZSkge1xuICAgICAgICB0aGlzLm5leHRQYWdlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5nb05leHRQYWdlQXV0b21hdGljID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZUxhc3RQYWdlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbW1lbnQgdmFsdWVcbiAgICogQHBhcmFtIG5hbWVcbiAgICogQHNlZSBzZXRDb21tZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGFbbmFtZSArIHRoaXMuY29tbWVudFByZWZpeF07XG4gICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBcIlwiO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgY29tbWVudCB2YWx1ZVxuICAgKiBAcGFyYW0gbmFtZVxuICAgKiBAcGFyYW0gbmV3VmFsdWVcbiAgICogQHNlZSBnZXRDb21tZW50XG4gICAqL1xuICBwdWJsaWMgc2V0Q29tbWVudChuYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB2YXIgY29tbWVudE5hbWUgPSBuYW1lICsgdGhpcy5jb21tZW50UHJlZml4O1xuICAgIGlmIChuZXdWYWx1ZSA9PT0gXCJcIiB8fCBuZXdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgZGVsZXRlIHRoaXMudmFsdWVzSGFzaFtjb21tZW50TmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0RGF0YVZhbHVlQ29yZSh0aGlzLnZhbHVlc0hhc2gsIGNvbW1lbnROYW1lLCBuZXdWYWx1ZSk7XG4gICAgICB0aGlzLnRyeUdvTmV4dFBhZ2VBdXRvbWF0aWMobmFtZSk7XG4gICAgfVxuICAgIHZhciBxdWVzdGlvbiA9IHRoaXMuZ2V0UXVlc3Rpb25CeU5hbWUobmFtZSk7XG4gICAgaWYgKHF1ZXN0aW9uKSB7XG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgICBuYW1lOiBjb21tZW50TmFtZSxcbiAgICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVtb3ZlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdXJ2ZXkgcmVzdWx0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUuIFR5cGljYWxseSBpdCBpcyBhIHF1ZXN0aW9uIG5hbWVcbiAgICovXG4gIHB1YmxpYyBjbGVhclZhbHVlKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0VmFsdWUobmFtZSwgbnVsbCk7XG4gICAgdGhpcy5zZXRDb21tZW50KG5hbWUsIG51bGwpO1xuICB9XG4gIHF1ZXN0aW9uVmlzaWJpbGl0eUNoYW5nZWQocXVlc3Rpb246IElRdWVzdGlvbiwgbmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgbmFtZTogcXVlc3Rpb24ubmFtZSxcbiAgICAgIHZpc2libGU6IG5ld1ZhbHVlXG4gICAgfSk7XG4gICAgdGhpcy5jaGVja1BhZ2VWaXNpYmlsaXR5KHF1ZXN0aW9uLCAhbmV3VmFsdWUpO1xuICAgIGlmIChcbiAgICAgIHF1ZXN0aW9uICYmXG4gICAgICAhcXVlc3Rpb24udmlzaWJsZSAmJlxuICAgICAgdGhpcy5jbGVhckludmlzaWJsZVZhbHVlcyA9PSBcIm9uSGlkZGVuXCJcbiAgICApIHtcbiAgICAgIHF1ZXN0aW9uLmNsZWFyVmFsdWUoKTtcbiAgICB9XG4gIH1cbiAgcGFnZVZpc2liaWxpdHlDaGFuZ2VkKHBhZ2U6IElQYWdlLCBuZXdWYWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUGFnZVZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywgeyBwYWdlOiBwYWdlLCB2aXNpYmxlOiBuZXdWYWx1ZSB9KTtcbiAgfVxuICBwYW5lbFZpc2liaWxpdHlDaGFuZ2VkKHBhbmVsOiBJUGFuZWwsIG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYW5lbFZpc2libGVDaGFuZ2VkLmZpcmUodGhpcywgeyBwYW5lbDogcGFuZWwsIHZpc2libGU6IG5ld1ZhbHVlIH0pO1xuICB9XG4gIHF1ZXN0aW9uQWRkZWQoXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBhcmVudFBhbmVsOiBhbnksXG4gICAgcm9vdFBhbmVsOiBhbnlcbiAgKSB7XG4gICAgaWYgKCFxdWVzdGlvbi5uYW1lKVxuICAgICAgcXVlc3Rpb24ubmFtZSA9IHRoaXMuZ2VuZXJhdGVOZXdOYW1lKFxuICAgICAgICB0aGlzLmdldEFsbFF1ZXN0aW9ucyhmYWxzZSwgdHJ1ZSksXG4gICAgICAgIFwicXVlc3Rpb25cIlxuICAgICAgKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgdGhpcy5vblF1ZXN0aW9uQWRkZWQuZmlyZSh0aGlzLCB7XG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICBuYW1lOiBxdWVzdGlvbi5uYW1lLFxuICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgcGFyZW50UGFuZWw6IHBhcmVudFBhbmVsLFxuICAgICAgcm9vdFBhbmVsOiByb290UGFuZWxcbiAgICB9KTtcbiAgfVxuICBxdWVzdGlvblJlbW92ZWQocXVlc3Rpb246IElRdWVzdGlvbikge1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUXVlc3Rpb25SZW1vdmVkLmZpcmUodGhpcywge1xuICAgICAgcXVlc3Rpb246IHF1ZXN0aW9uLFxuICAgICAgbmFtZTogcXVlc3Rpb24ubmFtZVxuICAgIH0pO1xuICB9XG4gIHBhbmVsQWRkZWQocGFuZWw6IElFbGVtZW50LCBpbmRleDogbnVtYmVyLCBwYXJlbnRQYW5lbDogYW55LCByb290UGFuZWw6IGFueSkge1xuICAgIGlmICghcGFuZWwubmFtZSlcbiAgICAgIHBhbmVsLm5hbWUgPSB0aGlzLmdlbmVyYXRlTmV3TmFtZShcbiAgICAgICAgdGhpcy5nZXRBbGxQYW5lbHMoZmFsc2UsIHRydWUpLFxuICAgICAgICBcInBhbmVsXCJcbiAgICAgICk7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgIHRoaXMub25QYW5lbEFkZGVkLmZpcmUodGhpcywge1xuICAgICAgcGFuZWw6IHBhbmVsLFxuICAgICAgbmFtZTogcGFuZWwubmFtZSxcbiAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgIHBhcmVudFBhbmVsOiBwYXJlbnRQYW5lbCxcbiAgICAgIHJvb3RQYW5lbDogcm9vdFBhbmVsXG4gICAgfSk7XG4gIH1cbiAgcGFuZWxSZW1vdmVkKHBhbmVsOiBJRWxlbWVudCkge1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZUluZGV4ZXMoKTtcbiAgICB0aGlzLm9uUGFuZWxSZW1vdmVkLmZpcmUodGhpcywgeyBwYW5lbDogcGFuZWwsIG5hbWU6IHBhbmVsLm5hbWUgfSk7XG4gIH1cbiAgdmFsaWRhdGVRdWVzdGlvbihxdWVzdGlvbjogSVF1ZXN0aW9uKTogU3VydmV5RXJyb3Ige1xuICAgIGlmICh0aGlzLm9uVmFsaWRhdGVRdWVzdGlvbi5pc0VtcHR5KSByZXR1cm4gbnVsbDtcbiAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgIG5hbWU6IHF1ZXN0aW9uLm5hbWUsXG4gICAgICBxdWVzdGlvbjogcXVlc3Rpb24sXG4gICAgICB2YWx1ZTogdGhpcy5nZXRWYWx1ZShxdWVzdGlvbi5uYW1lKSxcbiAgICAgIGVycm9yOiBudWxsXG4gICAgfTtcbiAgICB0aGlzLm9uVmFsaWRhdGVRdWVzdGlvbi5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmVycm9yID8gbmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3IpIDogbnVsbDtcbiAgfVxuICB2YWxpZGF0ZVBhbmVsKHBhbmVsOiBJUGFuZWwpOiBTdXJ2ZXlFcnJvciB7XG4gICAgaWYgKHRoaXMub25WYWxpZGF0ZVBhbmVsLmlzRW1wdHkpIHJldHVybiBudWxsO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgbmFtZTogcGFuZWwubmFtZSxcbiAgICAgIHBhbmVsOiBwYW5lbCxcbiAgICAgIGVycm9yOiBudWxsXG4gICAgfTtcbiAgICB0aGlzLm9uVmFsaWRhdGVQYW5lbC5maXJlKHRoaXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBvcHRpb25zLmVycm9yID8gbmV3IEN1c3RvbUVycm9yKG9wdGlvbnMuZXJyb3IpIDogbnVsbDtcbiAgfVxuICBwcm9jZXNzSHRtbChodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBvcHRpb25zID0geyBodG1sOiBodG1sIH07XG4gICAgdGhpcy5vblByb2Nlc3NIdG1sLmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXMucHJvY2Vzc1RleHQob3B0aW9ucy5odG1sLCB0cnVlKTtcbiAgfVxuICBwcm9jZXNzVGV4dCh0ZXh0OiBzdHJpbmcsIHJldHVybkRpc3BsYXlWYWx1ZTogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGV4dFByZVByb2Nlc3Nvci5wcm9jZXNzKHRleHQsIHJldHVybkRpc3BsYXlWYWx1ZSk7XG4gIH1cbiAgcHJvY2Vzc1RleHRFeCh0ZXh0OiBzdHJpbmcpOiBhbnkge1xuICAgIHZhciByZXMgPSB7XG4gICAgICB0ZXh0OiB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2Vzcyh0ZXh0KSxcbiAgICAgIGhhc0FsbFZhbHVlc09uTGFzdFJ1bjogdHJ1ZVxuICAgIH07XG4gICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biA9IHRoaXMudGV4dFByZVByb2Nlc3Nvci5oYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvcnJlY3RlZCBhbnN3ZXJzIG9uIHF1aXpcbiAgICovXG4gIHB1YmxpYyBnZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudCgpOiBudW1iZXIge1xuICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLmdldFF1aXpRdWVzdGlvbnMoKTtcbiAgICB2YXIgY291bnRlciA9IDA7XG4gICAgdmFyIG9wdGlvbnMgPSB7IHF1ZXN0aW9uOiBudWxsLCByZXN1bHQ6IGZhbHNlIH07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9wdGlvbnMucXVlc3Rpb24gPSBxdWVzdGlvbnNbaV07XG4gICAgICBvcHRpb25zLnJlc3VsdCA9IG9wdGlvbnMucXVlc3Rpb24uaXNBbnN3ZXJDb3JyZWN0KCk7XG4gICAgICB0aGlzLm9uSXNBbnN3ZXJDb3JyZWN0LmZpcmUodGhpcywgb3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5yZXN1bHQpIGNvdW50ZXIrKztcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpbmNvcnJlY3RlZCBhbnN3ZXJzIG9uIHF1aXpcbiAgICovXG4gIHB1YmxpYyBnZXRJbkNvcnJlY3RlZEFuc3dlckNvdW50KCk6IG51bWJlciB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVpelF1ZXN0aW9ucygpO1xuICAgIHJldHVybiBxdWVzdGlvbnMubGVuZ3RoIC0gdGhpcy5nZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudCgpO1xuICB9XG4gIGdldENvcnJlY3RlZEFuc3dlcnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3JyZWN0ZWRBbnN3ZXJDb3VudCgpO1xuICB9XG4gIGdldEluQ29ycmVjdGVkQW5zd2VycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldEluQ29ycmVjdGVkQW5zd2VyQ291bnQoKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IHRvICd0b3AnIG9yICdib3R0b20nIGlmIHlvdSB3YW50IHRvIHNob3cgdGhlIFBhbmVsIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgaG93IG11Y2ggdGltZSB0aGUgZW5kLXVzZXIgc3BlbnQgb2YgdGhlIHN1cnZleS9wYWdlLlxuICAgKiBJZiB0aGUgdmFsdWUgZG9lc24ndCBlcXVhbCAnbm9uZScgdGhlbiBzdXJ2ZXkgY2FsbHMgc3RhcnRUaW1lcigpIG1ldGhvZCBvbiBzdXJ2ZXkgcmVuZGVyaW5nLlxuICAgKiBAc2VlIHNob3dUaW1lclBhbmVsTW9kZVxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBzdG9wVGltZXJcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1RpbWVyUGFuZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpbWVyUGFuZWxcIiwgXCJub25lXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2hvd1RpbWVyUGFuZWwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93VGltZXJQYW5lbFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXNUaW1lclBhbmVsU2hvd2luZ09uVG9wKCkge1xuICAgIHJldHVybiB0aGlzLmlzVGltZXJTdGFydGVkICYmIHRoaXMuc2hvd1RpbWVyUGFuZWwgPT0gXCJ0b3BcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzVGltZXJQYW5lbFNob3dpbmdPbkJvdHRvbSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RpbWVyU3RhcnRlZCAmJiB0aGlzLnNob3dUaW1lclBhbmVsID09IFwiYm90dG9tXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvICdwYWdlJyBvciAnc3VydmV5JyB0byBzaG93IHRoZSB0aW1lciBpbmZvcm1hdGlvbiBmb3IgcGFnZSBvciBzdXJ2ZXkgb25seS5cbiAgICogVXNlIG9uVGltZXJQYW5lbEluZm9UZXh0IGV2ZW50IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKiBAc2VlIHNob3dUaW1lclBhbmVsXG4gICAqIEBzZWUgb25UaW1lclBhbmVsSW5mb1RleHRcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1RpbWVyUGFuZWxNb2RlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dUaW1lclBhbmVsTW9kZVwiLCBcImFsbFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dUaW1lclBhbmVsTW9kZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNob3dUaW1lclBhbmVsTW9kZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdGltZXJJbmZvVGV4dCgpOiBzdHJpbmcge1xuICAgIHZhciBvcHRpb25zID0geyB0ZXh0OiB0aGlzLmdldFRpbWVySW5mb1RleHQoKSB9O1xuICAgIHRoaXMub25UaW1lclBhbmVsSW5mb1RleHQuZmlyZSh0aGlzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucy50ZXh0O1xuICB9XG4gIHByaXZhdGUgZ2V0VGltZXJJbmZvVGV4dCgpIHtcbiAgICB2YXIgcGFnZSA9IHRoaXMuY3VycmVudFBhZ2U7XG4gICAgaWYgKCFwYWdlKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgcGFnZVNwZW50ID0gdGhpcy5nZXREaXNwbGF5VGltZShwYWdlLnRpbWVTcGVudCk7XG4gICAgdmFyIHN1cnZleVNwZW50ID0gdGhpcy5nZXREaXNwbGF5VGltZSh0aGlzLnRpbWVTcGVudCk7XG4gICAgdmFyIHBhZ2VMaW1pdFNlYyA9IHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKTtcbiAgICB2YXIgcGFnZUxpbWl0ID0gdGhpcy5nZXREaXNwbGF5VGltZShwYWdlTGltaXRTZWMpO1xuICAgIHZhciBzdXJ2ZXlMaW1pdCA9IHRoaXMuZ2V0RGlzcGxheVRpbWUodGhpcy5tYXhUaW1lVG9GaW5pc2gpO1xuICAgIGlmICh0aGlzLnNob3dUaW1lclBhbmVsTW9kZSA9PSBcInBhZ2VcIilcbiAgICAgIHJldHVybiB0aGlzLmdldFRpbWVySW5mb1BhZ2VUZXh0KHBhZ2UsIHBhZ2VTcGVudCwgcGFnZUxpbWl0KTtcbiAgICBpZiAodGhpcy5zaG93VGltZXJQYW5lbE1vZGUgPT0gXCJzdXJ2ZXlcIilcbiAgICAgIHJldHVybiB0aGlzLmdldFRpbWVySW5mb1N1cnZleVRleHQoc3VydmV5U3BlbnQsIHN1cnZleUxpbWl0KTtcbiAgICBpZiAodGhpcy5zaG93VGltZXJQYW5lbE1vZGUgPT0gXCJhbGxcIikge1xuICAgICAgaWYgKHBhZ2VMaW1pdFNlYyA8PSAwICYmIHRoaXMubWF4VGltZVRvRmluaXNoIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jU3RyaW5nKFwidGltZXJTcGVudEFsbFwiKVtcImZvcm1hdFwiXShcbiAgICAgICAgICBwYWdlU3BlbnQsXG4gICAgICAgICAgc3VydmV5U3BlbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYWdlTGltaXRTZWMgPiAwICYmIHRoaXMubWF4VGltZVRvRmluaXNoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMb2NTdHJpbmcoXCJ0aW1lckxpbWl0QWxsXCIpW1wiZm9ybWF0XCJdKFxuICAgICAgICAgIHBhZ2VTcGVudCxcbiAgICAgICAgICBwYWdlTGltaXQsXG4gICAgICAgICAgc3VydmV5U3BlbnQsXG4gICAgICAgICAgc3VydmV5TGltaXRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxldCBwYWdlVGV4dCA9IHRoaXMuZ2V0VGltZXJJbmZvUGFnZVRleHQocGFnZSwgcGFnZVNwZW50LCBwYWdlTGltaXQpO1xuICAgICAgbGV0IHN1cnZleVRleHQgPSB0aGlzLmdldFRpbWVySW5mb1N1cnZleVRleHQoc3VydmV5U3BlbnQsIHN1cnZleUxpbWl0KTtcbiAgICAgIHJldHVybiBwYWdlVGV4dCArIFwiIFwiICsgc3VydmV5VGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXRUaW1lckluZm9QYWdlVGV4dChcbiAgICBwYWdlOiBQYWdlTW9kZWwsXG4gICAgcGFnZVNwZW50OiBzdHJpbmcsXG4gICAgcGFnZUxpbWl0OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlTWF4VGltZVRvRmluaXNoKHBhZ2UpID4gMFxuICAgICAgPyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyTGltaXRQYWdlXCIpW1wiZm9ybWF0XCJdKHBhZ2VTcGVudCwgcGFnZUxpbWl0KVxuICAgICAgOiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU3BlbnRQYWdlXCIpW1wiZm9ybWF0XCJdKHBhZ2VTcGVudCwgcGFnZUxpbWl0KTtcbiAgfVxuICBwcml2YXRlIGdldFRpbWVySW5mb1N1cnZleVRleHQoXG4gICAgc3VydmV5U3BlbnQ6IHN0cmluZyxcbiAgICBzdXJ2ZXlMaW1pdDogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWF4VGltZVRvRmluaXNoID4gMFxuICAgICAgPyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyTGltaXRTdXJ2ZXlcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgc3VydmV5U3BlbnQsXG4gICAgICAgICAgc3VydmV5TGltaXRcbiAgICAgICAgKVxuICAgICAgOiB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU3BlbnRTdXJ2ZXlcIilbXCJmb3JtYXRcIl0oXG4gICAgICAgICAgc3VydmV5U3BlbnQsXG4gICAgICAgICAgc3VydmV5TGltaXRcbiAgICAgICAgKTtcbiAgfVxuICBwcml2YXRlIGdldERpc3BsYXlUaW1lKHZhbDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICB2YXIgbWluID0gTWF0aC5mbG9vcih2YWwgLyA2MCk7XG4gICAgdmFyIHNlYyA9IHZhbCAlIDYwO1xuICAgIHZhciByZXMgPSBcIlwiO1xuICAgIGlmIChtaW4gPiAwKSB7XG4gICAgICByZXMgKz0gbWluICsgXCIgXCIgKyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyTWluXCIpO1xuICAgIH1cbiAgICBpZiAocmVzICYmIHNlYyA9PSAwKSByZXR1cm4gcmVzO1xuICAgIGlmIChyZXMpIHJlcyArPSBcIiBcIjtcbiAgICByZXR1cm4gcmVzICsgc2VjICsgXCIgXCIgKyB0aGlzLmdldExvY1N0cmluZyhcInRpbWVyU2VjXCIpO1xuICB9XG4gIHByaXZhdGUgdGltZXJGdW5jID0gbnVsbDtcbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgdG8gc3RhcnQgdGltZXIgdGhhdCB3aWxsIGNhbGN1bGF0ZSBob3cgbXVjaCB0aW1lIGVuZC11c2VyIHNwZW5kcyBvbiB0aGUgc3VydmV5IG9yIG9uIHBhZ2VzXG4gICAqIEBzZWUgc3RvcFRpbWVyXG4gICAqIEBzZWUgdGltZVNwZW50XG4gICAqL1xuICBwdWJsaWMgc3RhcnRUaW1lcigpIHtcbiAgICBpZiAodGhpcy5pc1RpbWVyU3RhcnRlZCB8fCB0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnRpbWVyRnVuYyA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5kb1RpbWVyKCk7XG4gICAgfTtcbiAgICB0aGlzLmlzVGltZXJTdGFydGVkID0gdHJ1ZTtcbiAgICBTdXJ2ZXlUaW1lci5pbnN0YW5jZS5zdGFydCh0aGlzLnRpbWVyRnVuYyk7XG4gIH1cbiAgc3RhcnRUaW1lckZyb21VSSgpIHtcbiAgICBpZiAodGhpcy5zaG93VGltZXJQYW5lbCAhPSBcIm5vbmVcIiAmJiB0aGlzLnN0YXRlID09PSBcInJ1bm5pbmdcIikge1xuICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTdG9wIHRoZSB0aW1lci5cbiAgICogQHNlZSBzdGFydFRpbWVyXG4gICAqIEBzZWUgdGltZVNwZW50XG4gICAqL1xuICBwdWJsaWMgc3RvcFRpbWVyKCkge1xuICAgIGlmICghdGhpcy5pc1RpbWVyU3RhcnRlZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNUaW1lclN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBTdXJ2ZXlUaW1lci5pbnN0YW5jZS5zdG9wKHRoaXMudGltZXJGdW5jKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGltZSBpbiBzZWNvbmRzIGVuZC11c2VyIHNwZW5kcyBvbiB0aGUgc3VydmV5XG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIFBhZ2VNb2RlbC50aW1lU3BlbnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGltZVNwZW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ0aW1lU3BlbnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCB0aW1lU3BlbnQodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ0aW1lU3BlbnRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgZW5kLXVzZXIgaGFzIHRvIGNvbXBsZXRlIHRoZSBzdXJ2ZXkuIElmIHRoZSB2YWx1ZSBpcyAwIG9yIGxlc3MsIHRoZSBlbmQtdXNlciBoYXMgdW5saW1pdGVkIG51bWJlciBvZiB0aW1lIHRvIGZpbmlzaCB0aGUgc3VydmV5LlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBtYXhUaW1lVG9GaW5pc2hQYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFRpbWVUb0ZpbmlzaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUaW1lVG9GaW5pc2godmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgZW5kLXVzZXIgaGFzIHRvIGNvbXBsZXRlIGEgcGFnZSBpbiB0aGUgc3VydmV5LiBJZiB0aGUgdmFsdWUgaXMgMCBvciBsZXNzLCB0aGUgZW5kLXVzZXIgaGFzIHVubGltaXRlZCB0aW1lLiBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgdmFsdWUgZm9yIGV2ZXJ5IHBhZ2UuXG4gICAqIEBzZWUgc3RhcnRUaW1lclxuICAgKiBAc2VlIG1heFRpbWVUb0ZpbmlzaFxuICAgKiBAc2VlIFBhZ2VNb2RlbC5tYXhUaW1lVG9GaW5pc2hcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4VGltZVRvRmluaXNoUGFnZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hQYWdlXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4VGltZVRvRmluaXNoUGFnZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFRpbWVUb0ZpbmlzaFBhZ2VcIiwgdmFsKTtcbiAgfVxuICBwcml2YXRlIGdldFBhZ2VNYXhUaW1lVG9GaW5pc2gocGFnZTogUGFnZU1vZGVsKSB7XG4gICAgaWYgKCFwYWdlIHx8IHBhZ2UubWF4VGltZVRvRmluaXNoIDwgMCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIHBhZ2UubWF4VGltZVRvRmluaXNoID4gMFxuICAgICAgPyBwYWdlLm1heFRpbWVUb0ZpbmlzaFxuICAgICAgOiB0aGlzLm1heFRpbWVUb0ZpbmlzaFBhZ2U7XG4gIH1cbiAgcHJvdGVjdGVkIGRvVGltZXIoKSB7XG4gICAgdmFyIHBhZ2UgPSB0aGlzLmN1cnJlbnRQYWdlO1xuICAgIGlmIChwYWdlKSB7XG4gICAgICBwYWdlLnRpbWVTcGVudCA9IHBhZ2UudGltZVNwZW50ICsgMTtcbiAgICB9XG4gICAgdGhpcy50aW1lU3BlbnQgPSB0aGlzLnRpbWVTcGVudCArIDE7XG4gICAgdGhpcy5vblRpbWVyLmZpcmUodGhpcywge30pO1xuICAgIGlmICh0aGlzLm1heFRpbWVUb0ZpbmlzaCA+IDAgJiYgdGhpcy5tYXhUaW1lVG9GaW5pc2ggPT0gdGhpcy50aW1lU3BlbnQpIHtcbiAgICAgIHRoaXMuY29tcGxldGVMYXN0UGFnZSgpO1xuICAgIH1cbiAgICBpZiAocGFnZSkge1xuICAgICAgdmFyIHBhZ2VMaW1pdCA9IHRoaXMuZ2V0UGFnZU1heFRpbWVUb0ZpbmlzaChwYWdlKTtcbiAgICAgIGlmIChwYWdlTGltaXQgPiAwICYmIHBhZ2VMaW1pdCA9PSBwYWdlLnRpbWVTcGVudCkge1xuICAgICAgICBpZiAodGhpcy5pc0xhc3RQYWdlKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZUxhc3RQYWdlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vSVN1cnZleUltcGxlbWVudG9yXG4gIGdlU3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8vSVN1cnZleVRyaWdnZXJPd25lclxuICBnZXRPYmplY3RzKHBhZ2VzOiBzdHJpbmdbXSwgcXVlc3Rpb25zOiBzdHJpbmdbXSk6IGFueVtdIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmVzdWx0LCB0aGlzLmdldFBhZ2VzQnlOYW1lcyhwYWdlcykpO1xuICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHJlc3VsdCwgdGhpcy5nZXRRdWVzdGlvbnNCeU5hbWVzKHF1ZXN0aW9ucykpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc2V0VHJpZ2dlclZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgaXNWYXJpYWJsZTogYm9vbGVhbikge1xuICAgIGlmICghbmFtZSkgcmV0dXJuO1xuICAgIGlmIChpc1ZhcmlhYmxlKSB7XG4gICAgICB0aGlzLnNldFZhcmlhYmxlKG5hbWUsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJzdXJ2ZXlcIiwgW1xuICB7XG4gICAgbmFtZTogXCJsb2NhbGVcIixcbiAgICBjaG9pY2VzOiAoKSA9PiB7XG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uLmdldExvY2FsZXMoKTtcbiAgICB9XG4gIH0sXG4gIHsgbmFtZTogXCJ0aXRsZTp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUaXRsZVwiIH0sXG4gIHsgbmFtZTogXCJmb2N1c0ZpcnN0UXVlc3Rpb25BdXRvbWF0aWM6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJjb21wbGV0ZWRIdG1sOmh0bWxcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbXBsZXRlZEh0bWxcIiB9LFxuICB7XG4gICAgbmFtZTogXCJjb21wbGV0ZWRCZWZvcmVIdG1sOmh0bWxcIixcbiAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29tcGxldGVkQmVmb3JlSHRtbFwiXG4gIH0sXG4gIHsgbmFtZTogXCJsb2FkaW5nSHRtbDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMb2FkaW5nSHRtbFwiIH0sXG4gIHsgbmFtZTogXCJwYWdlc1wiLCBjbGFzc05hbWU6IFwicGFnZVwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvbnNcIixcbiAgICBhbHRlcm5hdGl2ZU5hbWU6IFwiZWxlbWVudHNcIixcbiAgICBiYXNlQ2xhc3NOYW1lOiBcInF1ZXN0aW9uXCIsXG4gICAgdmlzaWJsZTogZmFsc2UsXG4gICAgb25HZXRWYWx1ZTogZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIG9uU2V0VmFsdWU6IGZ1bmN0aW9uKG9iaiwgdmFsdWUsIGpzb25Db252ZXJ0ZXIpIHtcbiAgICAgIHZhciBwYWdlID0gb2JqLmFkZE5ld1BhZ2UoXCJcIik7XG4gICAgICBqc29uQ29udmVydGVyLnRvT2JqZWN0KHsgcXVlc3Rpb25zOiB2YWx1ZSB9LCBwYWdlKTtcbiAgICB9XG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcInRyaWdnZXJzOnRyaWdnZXJzXCIsXG4gICAgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl0cmlnZ2VyXCIsXG4gICAgY2xhc3NOYW1lUGFydDogXCJ0cmlnZ2VyXCJcbiAgfSxcbiAgeyBuYW1lOiBcInN1cnZleUlkXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIHsgbmFtZTogXCJzdXJ2ZXlQb3N0SWRcIiwgdmlzaWJsZTogZmFsc2UgfSxcbiAgeyBuYW1lOiBcInN1cnZleVNob3dEYXRhU2F2aW5nXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gIFwiY29va2llTmFtZVwiLFxuICBcInNlbmRSZXN1bHRPblBhZ2VOZXh0OmJvb2xlYW5cIixcbiAgeyBuYW1lOiBcInNob3dOYXZpZ2F0aW9uQnV0dG9uczpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBuYW1lOiBcInNob3dQcmV2QnV0dG9uOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwic2hvd1RpdGxlOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwic2hvd1BhZ2VUaXRsZXM6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbmFtZTogXCJzaG93Q29tcGxldGVkUGFnZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25zT3JkZXJcIixcbiAgICBkZWZhdWx0OiBcImluaXRpYWxcIixcbiAgICBjaG9pY2VzOiBbXCJpbml0aWFsXCIsIFwicmFuZG9tXCJdXG4gIH0sXG4gIFwic2hvd1BhZ2VOdW1iZXJzOmJvb2xlYW5cIixcbiAge1xuICAgIG5hbWU6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLFxuICAgIGRlZmF1bHQ6IFwib25cIixcbiAgICBjaG9pY2VzOiBbXCJvblwiLCBcIm9uUGFnZVwiLCBcIm9mZlwiXVxuICB9LFxuICB7XG4gICAgbmFtZTogXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIixcbiAgICBkZWZhdWx0OiBcInRvcFwiLFxuICAgIGNob2ljZXM6IFtcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIl1cbiAgfSxcbiAgeyBuYW1lOiBcInF1ZXN0aW9uRXJyb3JMb2NhdGlvblwiLCBkZWZhdWx0OiBcInRvcFwiLCBjaG9pY2VzOiBbXCJ0b3BcIiwgXCJib3R0b21cIl0gfSxcbiAge1xuICAgIG5hbWU6IFwic2hvd1Byb2dyZXNzQmFyXCIsXG4gICAgZGVmYXVsdDogXCJvZmZcIixcbiAgICBjaG9pY2VzOiBbXCJvZmZcIiwgXCJ0b3BcIiwgXCJib3R0b21cIl1cbiAgfSxcbiAgeyBuYW1lOiBcIm1vZGVcIiwgZGVmYXVsdDogXCJlZGl0XCIsIGNob2ljZXM6IFtcImVkaXRcIiwgXCJkaXNwbGF5XCJdIH0sXG4gIHsgbmFtZTogXCJzdG9yZU90aGVyc0FzQ29tbWVudDpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgXCJnb05leHRQYWdlQXV0b21hdGljOmJvb2xlYW5cIixcbiAge1xuICAgIG5hbWU6IFwiY2xlYXJJbnZpc2libGVWYWx1ZXNcIixcbiAgICBkZWZhdWx0OiBcIm9uQ29tcGxldGVcIixcbiAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwib25Db21wbGV0ZVwiLCBcIm9uSGlkZGVuXCJdXG4gIH0sXG4gIHsgbmFtZTogXCJzdGFydFN1cnZleVRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1N0YXJ0U3VydmV5VGV4dFwiIH0sXG4gIHsgbmFtZTogXCJwYWdlUHJldlRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhZ2VQcmV2VGV4dFwiIH0sXG4gIHsgbmFtZTogXCJwYWdlTmV4dFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhZ2VOZXh0VGV4dFwiIH0sXG4gIHsgbmFtZTogXCJjb21wbGV0ZVRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbXBsZXRlVGV4dFwiIH0sXG4gIHsgbmFtZTogXCJyZXF1aXJlZFRleHRcIiwgZGVmYXVsdDogXCIqXCIgfSxcbiAgXCJxdWVzdGlvblN0YXJ0SW5kZXhcIixcbiAge1xuICAgIG5hbWU6IFwicXVlc3Rpb25UaXRsZVRlbXBsYXRlXCIsXG4gICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1F1ZXN0aW9uVGl0bGVUZW1wbGF0ZVwiXG4gIH0sXG4gIHsgbmFtZTogXCJmaXJzdFBhZ2VJc1N0YXJ0ZWQ6Ym9vbGVhblwiLCBkZWZhdWx0OiBmYWxzZSB9LFxuICB7IG5hbWU6IFwiaXNTaW5nbGVQYWdlOmJvb2xlYW5cIiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgeyBuYW1lOiBcIm1heFRpbWVUb0ZpbmlzaDpudW1iZXJcIiwgZGVmYXVsdDogMCB9LFxuICB7IG5hbWU6IFwibWF4VGltZVRvRmluaXNoUGFnZTpudW1iZXJcIiwgZGVmYXVsdDogMCB9LFxuICB7XG4gICAgbmFtZTogXCJzaG93VGltZXJQYW5lbFwiLFxuICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgIGNob2ljZXM6IFtcIm5vbmVcIiwgXCJ0b3BcIiwgXCJib3R0b21cIl1cbiAgfSxcbiAge1xuICAgIG5hbWU6IFwic2hvd1RpbWVyUGFuZWxNb2RlXCIsXG4gICAgZGVmYXVsdDogXCJhbGxcIixcbiAgICBjaG9pY2VzOiBbXCJhbGxcIiwgXCJwYWdlXCIsIFwic3VydmV5XCJdXG4gIH1cbl0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleS50cyIsImV4cG9ydCBpbnRlcmZhY2UgSUxvY2FsaXphYmxlT3duZXIge1xuICBnZXRMb2NhbGUoKTogc3RyaW5nO1xuICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKTogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY2xhc3MgcmVwcmVzZW50cyB0aGUgc3RyaW5nIHRoYXQgc3VwcG9ydHMgbXVsdGktbGFuZ3VhZ2VzIGFuZCBtYXJrZG93bi5cbiAqIEl0IHVzZXMgaW4gYWxsIG9iamVjdHMgd2hlcmUgc3VwcG9ydCBmb3IgbXVsdGktbGFuZ3VhZ2VzIGFuZCBtYXJrZG93biBpcyByZXF1aXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsaXphYmxlU3RyaW5nIHtcbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0TG9jYWxlOiBzdHJpbmcgPSBcImRlZmF1bHRcIjtcbiAgcHJpdmF0ZSB2YWx1ZXMgPSB7fTtcbiAgcHJpdmF0ZSBodG1sVmFsdWVzID0ge307XG4gIHB1YmxpYyBvblJlbmRlcmVkSHRtbENhbGxiYWNrOiAoaHRtbDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHB1YmxpYyBvbkdldFRleHRDYWxsYmFjazogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgb3duZXI6IElMb2NhbGl6YWJsZU93bmVyLFxuICAgIHB1YmxpYyB1c2VNYXJrZG93bjogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHRoaXMub25DcmVhdGluZygpO1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jYWxlKCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyID8gdGhpcy5vd25lci5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IHRoaXMucHVyZVRleHQ7XG4gICAgaWYgKHRoaXMub25HZXRUZXh0Q2FsbGJhY2spIHJlcyA9IHRoaXMub25HZXRUZXh0Q2FsbGJhY2socmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXQgcHVyZVRleHQoKSB7XG4gICAgdmFyIGxvYyA9IHRoaXMubG9jYWxlO1xuICAgIGlmICghbG9jKSBsb2MgPSBMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0TG9jYWxlO1xuICAgIHZhciByZXMgPSB0aGlzLnZhbHVlc1tsb2NdO1xuICAgIGlmICghcmVzICYmIGxvYyAhPT0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZSkge1xuICAgICAgcmVzID0gdGhpcy52YWx1ZXNbTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZV07XG4gICAgfVxuICAgIGlmICghcmVzKSByZXMgPSBcIlwiO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBoYXNIdG1sKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0h0bWxWYWx1ZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaHRtbCgpIHtcbiAgICBpZiAoIXRoaXMuaGFzSHRtbCkgcmV0dXJuIFwiXCI7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SHRtbFZhbHVlKCk7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0T3JIdG1sKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0h0bWwgPyB0aGlzLmdldEh0bWxWYWx1ZSgpIDogdGhpcy50ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgcmVuZGVyZWRIdG1sKCkge1xuICAgIHZhciByZXMgPSB0aGlzLnRleHRPckh0bWw7XG4gICAgcmV0dXJuIHRoaXMub25SZW5kZXJlZEh0bWxDYWxsYmFjayA/IHRoaXMub25SZW5kZXJlZEh0bWxDYWxsYmFjayhyZXMpIDogcmVzO1xuICB9XG4gIHB1YmxpYyBzZXQgdGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGVUZXh0KHRoaXMubG9jYWxlLCB2YWx1ZSk7XG4gIH1cbiAgcHVibGljIGdldExvY2FsZVRleHQobG9jOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbG9jKSBsb2MgPSBMb2NhbGl6YWJsZVN0cmluZy5kZWZhdWx0TG9jYWxlO1xuICAgIHZhciByZXMgPSB0aGlzLnZhbHVlc1tsb2NdO1xuICAgIHJldHVybiByZXMgPyByZXMgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzZXRMb2NhbGVUZXh0KGxvYzogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09IHRoaXMuZ2V0TG9jYWxlVGV4dChsb2MpKSByZXR1cm47XG4gICAgaWYgKCFsb2MpIGxvYyA9IExvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRMb2NhbGU7XG4gICAgZGVsZXRlIHRoaXMuaHRtbFZhbHVlc1tsb2NdO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlc1tsb2NdKSBkZWxldGUgdGhpcy52YWx1ZXNbbG9jXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbG9jICE9IExvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRMb2NhbGUgJiZcbiAgICAgICAgICB2YWx1ZSA9PSB0aGlzLmdldExvY2FsZVRleHQoTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zZXRMb2NhbGVUZXh0KGxvYywgbnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52YWx1ZXNbbG9jXSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChsb2MgPT0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5kZWxldGVWYWx1ZXNFcXVhbHNUb0RlZmF1bHQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlZCgpO1xuICB9XG4gIHB1YmxpYyBnZXRKc29uKCk6IGFueSB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcyk7XG4gICAgaWYgKGtleXMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PSAxICYmIGtleXNbMF0gPT0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZSlcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc1trZXlzWzBdXTtcbiAgICByZXR1cm4gdGhpcy52YWx1ZXM7XG4gIH1cbiAgcHVibGljIHNldEpzb24odmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWVzID0ge307XG4gICAgdGhpcy5odG1sVmFsdWVzID0ge307XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuc2V0TG9jYWxlVGV4dChudWxsLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICB0aGlzLnNldExvY2FsZVRleHQoa2V5LCB2YWx1ZVtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbkNoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgb25DaGFuZ2VkKCkge31cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcml2YXRlIGhhc0h0bWxWYWx1ZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMub3duZXIgfHwgIXRoaXMudXNlTWFya2Rvd24pIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdGV4dCA9IHRoaXMudGV4dDtcbiAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgbG9jID0gdGhpcy5sb2NhbGU7XG4gICAgaWYgKCFsb2MpIGxvYyA9IExvY2FsaXphYmxlU3RyaW5nLmRlZmF1bHRMb2NhbGU7XG4gICAgaWYgKCEobG9jIGluIHRoaXMuaHRtbFZhbHVlcykpIHtcbiAgICAgIHRoaXMuaHRtbFZhbHVlc1tsb2NdID0gdGhpcy5vd25lci5nZXRNYXJrZG93bkh0bWwodGV4dCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0bWxWYWx1ZXNbbG9jXSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGdldEh0bWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHZhciBsb2MgPSB0aGlzLmxvY2FsZTtcbiAgICBpZiAoIWxvYykgbG9jID0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZTtcbiAgICByZXR1cm4gdGhpcy5odG1sVmFsdWVzW2xvY107XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZVZhbHVlc0VxdWFsc1RvRGVmYXVsdChkZWZhdWx0VmFsdWU6IHN0cmluZykge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGtleXNbaV0gPT0gTG9jYWxpemFibGVTdHJpbmcuZGVmYXVsdExvY2FsZSkgY29udGludWU7XG4gICAgICBpZiAodGhpcy52YWx1ZXNba2V5c1tpXV0gPT0gZGVmYXVsdFZhbHVlKSBkZWxldGUgdGhpcy52YWx1ZXNba2V5c1tpXV07XG4gICAgfVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemFibGVzdHJpbmcudHMiLCJpbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgQmFzZSxcbiAgSVN1cnZleUltcGwsXG4gIElQYWdlLFxuICBJUGFuZWwsXG4gIElDb25kaXRpb25SdW5uZXIsXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlEYXRhLFxuICBJRWxlbWVudCxcbiAgSVF1ZXN0aW9uLFxuICBTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlFcnJvclxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbmJhc2VcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbmltcG9ydCB7IE9uZUFuc3dlclJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Sb3dNb2RlbCB7XG4gIHByaXZhdGUgdmlzaWJsZVZhbHVlOiBib29sZWFuO1xuICB2aXNpYmlsaXR5Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFuZWw6IFBhbmVsTW9kZWxCYXNlKSB7XG4gICAgdGhpcy52aXNpYmxlVmFsdWUgPSBwYW5lbC5pc0Rlc2lnbk1vZGU7XG4gIH1cbiAgcHVibGljIGVsZW1lbnRzOiBBcnJheTxJRWxlbWVudD4gPSBbXTtcbiAgLy9UT0RPIHJlbW92ZSBhZnRlciB1cGRhdGluZyByZWFjdCBhbmQgdnVlXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gIH1cbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGUodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbCA9PSB0aGlzLnZpc2libGUpIHJldHVybjtcbiAgICB0aGlzLnZpc2libGVWYWx1ZSA9IHZhbDtcbiAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgfVxuICBwdWJsaWMgdXBkYXRlVmlzaWJsZSgpIHtcbiAgICB0aGlzLnZpc2libGUgPSB0aGlzLmNhbGNWaXNpYmxlKCk7XG4gICAgdGhpcy5zZXRXaWR0aCgpO1xuICB9XG4gIHB1YmxpYyBhZGRFbGVtZW50KHE6IElFbGVtZW50KSB7XG4gICAgdGhpcy5lbGVtZW50cy5wdXNoKHEpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZSgpO1xuICB9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLnZpc2liaWxpdHlDaGFuZ2VkQ2FsbGJhY2spIHRoaXMudmlzaWJpbGl0eUNoYW5nZWRDYWxsYmFjaygpO1xuICB9XG4gIHByaXZhdGUgc2V0V2lkdGgoKSB7XG4gICAgdmFyIHZpc0NvdW50ID0gdGhpcy5nZXRWaXNpYmxlQ291bnQoKTtcbiAgICBpZiAodmlzQ291bnQgPT0gMCkgcmV0dXJuO1xuICAgIHZhciBjb3VudGVyID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRzW2ldLmlzVmlzaWJsZSkge1xuICAgICAgICB2YXIgcSA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICAgIHEucmVuZGVyV2lkdGggPSBxLndpZHRoID8gcS53aWR0aCA6IE1hdGguZmxvb3IoMTAwIC8gdmlzQ291bnQpICsgXCIlXCI7XG4gICAgICAgIHEucmlnaHRJbmRlbnQgPSBjb3VudGVyIDwgdmlzQ291bnQgLSAxID8gMSA6IDA7XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWxlbWVudHNbaV0ucmVuZGVyV2lkdGggPSBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFZpc2libGVDb3VudCgpOiBudW1iZXIge1xuICAgIHZhciByZXMgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZWxlbWVudHNbaV0uaXNWaXNpYmxlKSByZXMrKztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGNhbGNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFZpc2libGVDb3VudCgpID4gMDtcbiAgfVxufVxuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgYSBQYW5lbCBhbmQgUGFnZSBvYmplY3RzLlxuICovXG5leHBvcnQgY2xhc3MgUGFuZWxNb2RlbEJhc2UgZXh0ZW5kcyBTdXJ2ZXlFbGVtZW50XG4gIGltcGxlbWVudHMgSVBhbmVsLCBJQ29uZGl0aW9uUnVubmVyLCBJTG9jYWxpemFibGVPd25lciB7XG4gIHByaXZhdGUgc3RhdGljIHBhbmVsQ291bnRlciA9IDEwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UGFuZWxJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNwX1wiICsgUGFuZWxNb2RlbEJhc2UucGFuZWxDb3VudGVyKys7XG4gIH1cblxuICBwcml2YXRlIHJvd1ZhbHVlczogQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4gPSBudWxsO1xuICBwcml2YXRlIGNvbmRpdGlvblJ1bm5lcjogQ29uZGl0aW9uUnVubmVyID0gbnVsbDtcbiAgcHJpdmF0ZSBlbGVtZW50c1ZhbHVlOiBBcnJheTxJRWxlbWVudD47XG4gIHByaXZhdGUgaXNRdWVzdGlvbnNSZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHF1ZXN0aW9uc1ZhbHVlOiBBcnJheTxRdWVzdGlvbkJhc2U+ID0gbmV3IEFycmF5PFF1ZXN0aW9uQmFzZT4oKTtcbiAgcm93c0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgb25HZXRRdWVzdGlvblRpdGxlTG9jYXRpb246ICgpID0+IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuZWxlbWVudHNWYWx1ZSA9IHRoaXMuY3JlYXRlTmV3QXJyYXkoXG4gICAgICBcImVsZW1lbnRzXCIsXG4gICAgICBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHNlbGYub25BZGRFbGVtZW50KGl0ZW0sIHNlbGYuZWxlbWVudHNWYWx1ZS5sZW5ndGgpO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgc2VsZi5vblJlbW92ZUVsZW1lbnQoaXRlbSk7XG4gICAgICB9XG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiZWxlbWVudHNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm1hcmtRdWVzdGlvbkxpc3REaXJ0eSgpO1xuICAgICAgc2VsZi5vblJvd3NDaGFuZ2VkKCk7XG4gICAgfSk7XG4gICAgdGhpcy5pZCA9IFBhbmVsTW9kZWxCYXNlLmdldFBhbmVsSWQoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGxvY1RpdGxlVmFsdWUgPSB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwidGl0bGVcIiwgdGhpcywgdHJ1ZSk7XG4gICAgbG9jVGl0bGVWYWx1ZS5vblJlbmRlcmVkSHRtbENhbGxiYWNrID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0UmVuZGVyZWRUaXRsZSh0ZXh0KTtcbiAgICB9O1xuICAgIHZhciBsb2NEZXNjcmlwdGlvblZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwiZGVzY3JpcHRpb25cIixcbiAgICAgIHRoaXMsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBsb2NEZXNjcmlwdGlvblZhbHVlLm9uR2V0VGV4dENhbGxiYWNrID0gZnVuY3Rpb24oaHRtbCkge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0UHJvY2Vzc2VkSHRtbChodG1sKTtcbiAgICB9O1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJyZXF1aXJlZEVycm9yVGV4dFwiLCB0aGlzKTtcbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHRoaXMub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIHRoaXMubWFya1F1ZXN0aW9uTGlzdERpcnR5KCk7XG4gICAgdGhpcy5vblJvd3NDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFBhbmVsTW9kZWwgb3IgUGFnZU1vZGVsIHRpdGxlIHByb3BlcnR5LlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICovXG4gIHB1YmxpYyBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJ0aXRsZVwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NUaXRsZSgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJ0aXRsZVwiKTtcbiAgfVxuICAvKipcbiAgICogUGFuZWxNb2RlbCBvciBQYWdlTW9kZWwgZGVzY3JpcHRpb24gcHJvcGVydHkuIEl0IHJlbmRlcnMgdW5kZXIgdGl0bGUgYnkgdXNpbmcgc21hbGxlciBmb250LiBVbmxpa2UgdGhlIHRpdGxlLCBkZXNjcmlwdGlvbiBjYW4gYmUgZW1wdHkuXG4gICAqIEBzZWUgdGl0bGVcbiAgICovXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJkZXNjcmlwdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NEZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJkZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGhhc0Rlc2NyaXB0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uICE9IFwiXCI7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXN0b20gdGV4dCB0aGF0IHdpbGwgYmUgc2hvd24gb24gcmVxdWlyZWQgZXJyb3IuIFVzZSB0aGlzIHByb3BlcnR5LCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc2hvdyB0aGUgZGVmYXVsdCB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCByZXF1aXJlZEVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInJlcXVpcmVkRXJyb3JUZXh0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmVxdWlyZWRFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1JlcXVpcmVkRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInJlcXVpcmVkRXJyb3JUZXh0XCIpO1xuICB9XG4gIGdldExvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN1cnZleVxuICAgICAgPyAoPElMb2NhbGl6YWJsZU93bmVyPig8YW55PnRoaXMuc3VydmV5KSkuZ2V0TG9jYWxlKClcbiAgICAgIDogXCJcIjtcbiAgfVxuICBnZXRNYXJrZG93bkh0bWwodGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5XG4gICAgICA/ICg8SUxvY2FsaXphYmxlT3duZXI+KDxhbnk+dGhpcy5zdXJ2ZXkpKS5nZXRNYXJrZG93bkh0bWwodGV4dClcbiAgICAgIDogbnVsbDtcbiAgfVxuICAvKipcbiAgICogQSBwYXJlbnQgZWxlbWVudC4gSXQgaXMgYWx3YXlzIG51bGwgZm9yIHRoZSBQYWdlIG9iamVjdCBhbmQgYWx3YXlzIG5vdCBudWxsIGZvciB0aGUgUGFuZWwgb2JqZWN0LiBQYW5lbCBvYmplY3QgbWF5IGNvbnRhaW4gUXVlc3Rpb25zIGFuZCBvdGhlciBQYW5lbHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhcmVudCgpOiBQYW5lbE1vZGVsQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhcmVudFwiLCBudWxsKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhcmVudCh2YWw6IFBhbmVsTW9kZWxCYXNlKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgdHJ1ZSB0aGUgUGFuZWwgYmVjb21lcyB2aXNpYmxlIGFuZCBpZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBQYW5lbCBiZWNvbWVzIGludmlzaWJsZS4gVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIHZpc2libGUgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSB2aXNpYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc0NsYXNzZXMoKTogYW55IHtcbiAgICB2YXIgY2xhc3NlcyA9IHsgZXJyb3I6IHt9IH07XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLCB0aGlzLmNzcyk7XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLmVycm9yLCB0aGlzLmNzcy5lcnJvcik7XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB0aGlzLnN1cnZleS51cGRhdGVQYW5lbENzc0NsYXNzZXModGhpcywgY2xhc3Nlcyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG4gIHByaXZhdGUgZ2V0IGNzcygpOiBhbnkge1xuICAgIHJldHVybiBzdXJ2ZXlDc3MuZ2V0Q3NzKCk7XG4gIH1cbiAgLyoqXG4gICAqIEEgdW5pcXVlIGVsZW1lbnQgaWRlbnRpZmljYXRvci4gSXQgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlkXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhbmVsLiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBjdXJyZW50IG9iamVjdCBpcyBQYWdlIChhIHJvb3QgUGFuZWwpLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1BhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgcXVlc3Rpb25zIGxvY2F0ZWQgaW4gdGhlIFBhbmVsL1BhZ2UsIGluY2x1ZGluZyBpbiB0aGUgbmVzdGVkIFBhbmVscy5cbiAgICogQHNlZSBRdWVzdGlvbkJhc2VcbiAgICogQHNlZSBlbGVtZW50c1xuICAgKi9cbiAgcHVibGljIGdldCBxdWVzdGlvbnMoKTogQXJyYXk8UXVlc3Rpb25CYXNlPiB7XG4gICAgaWYgKCF0aGlzLmlzUXVlc3Rpb25zUmVhZHkpIHtcbiAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICAgIHZhciBxcyA9ICg8UGFuZWxNb2RlbD5lbCkucXVlc3Rpb25zO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaChxc1tqXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlc3Rpb25zVmFsdWUucHVzaCg8UXVlc3Rpb25CYXNlPmVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pc1F1ZXN0aW9uc1JlYWR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5xdWVzdGlvbnNWYWx1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeU5hbWUobmFtZTogc3RyaW5nKTogUXVlc3Rpb25CYXNlIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5xdWVzdGlvbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChxdWVzdGlvbnNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gcXVlc3Rpb25zW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0UXVlc3Rpb25CeVZhbHVlTmFtZSh2YWx1ZU5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uQmFzZSB7XG4gICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocXVlc3Rpb25zW2ldLmdldFZhbHVlTmFtZSgpID09IHZhbHVlTmFtZSkgcmV0dXJuIHF1ZXN0aW9uc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBtYXJrUXVlc3Rpb25MaXN0RGlydHkoKSB7XG4gICAgdGhpcy5pc1F1ZXN0aW9uc1JlYWR5ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMucGFyZW50KSB0aGlzLnBhcmVudC5tYXJrUXVlc3Rpb25MaXN0RGlydHkoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIG9iamVjdCwgUGFuZWwvUGFnZS4gRWxlbWVudHMgY2FuIGJlIHF1ZXN0aW9ucyBvciBwYW5lbHMuIFRoZSBmdW5jdGlvbiBkb2Vzbid0IHJldHVybiBlbGVtZW50cyBpbiB0aGUgbmVzdGVkIFBhbmVscy5cbiAgICovXG4gIHB1YmxpYyBnZXQgZWxlbWVudHMoKTogQXJyYXk8SUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50c1ZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBlbGVtZW50IGJlbG9uZ3MgdG8gdGhlIFBhbmVsL1BhZ2UuIEl0IGxvb2tzIGluIG5lc3RlZCBQYW5lbHMgYXMgd2VsbC5cbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICogQHNlZSBQYW5lbE1vZGVsXG4gICAqL1xuICBwdWJsaWMgY29udGFpbnNFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWw6IGFueSA9IHRoaXMuZWxlbWVudHNbaV07XG4gICAgICBpZiAoZWwgPT0gZWxlbWVudCkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICBpZiAoKDxQYW5lbE1vZGVsQmFzZT5lbCkuY29udGFpbnNFbGVtZW50KGVsZW1lbnQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCB0byByZXF1aXJlIHRoZSBhbnN3ZXIgYXQgbGVhc3QgaW4gb25lIHF1ZXN0aW9uIGluIHRoZSBwYW5lbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNSZXF1aXJlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzUmVxdWlyZWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiB0aGVyZSBpcyBhbiBlcnJvciBvbiB0aGlzIFBhZ2Ugb3IgaW5zaWRlIHRoZSBjdXJyZW50IFBhbmVsXG4gICAqIEBwYXJhbSBmaXJlQ2FsbGJhY2sgc2V0IGl0IHRvIHRydWUsIHRvIHNob3cgZXJyb3JzIGluIFVJXG4gICAqIEBwYXJhbSBmb2N1c2VPbkZpcnN0RXJyb3Igc2V0IGl0IHRvIHRydWUgdG8gZm9jdXNlIG9uIHRoZSBmaXJzdCBxdWVzdGlvbiB0aGF0IGRvZXNuJ3QgcGFzcyB0aGUgdmFsaWRhdGlvblxuICAgKi9cbiAgcHVibGljIGhhc0Vycm9ycyhcbiAgICBmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlLFxuICAgIGZvY3VzZU9uRmlyc3RFcnJvcjogYm9vbGVhbiA9IGZhbHNlXG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciByZWMgPSB7XG4gICAgICBmaXJlQ2FsbGJhY2s6IGZpcmVDYWxsYmFjayxcbiAgICAgIGZvY3VzZU9uRmlyc3RFcnJvcjogZm9jdXNlT25GaXJzdEVycm9yLFxuICAgICAgZmlyc3RFcnJvclF1ZXN0aW9uOiBudWxsLFxuICAgICAgcmVzdWx0OiBmYWxzZVxuICAgIH07XG4gICAgdGhpcy5oYXNFcnJvcnNDb3JlKHJlYyk7XG4gICAgaWYgKHJlYy5maXJzdEVycm9yUXVlc3Rpb24pIHtcbiAgICAgIHJlYy5maXJzdEVycm9yUXVlc3Rpb24uZm9jdXModHJ1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZWMucmVzdWx0O1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JzSW5QYW5lbHMocmVjOiBhbnkpIHtcbiAgICB2YXIgZXJyb3JMZW5ndGggPSB0aGlzLmVycm9ycy5sZW5ndGg7XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICB0aGlzLmhhc1JlcXVpcmVkRXJyb3IocmVjKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHZhciBjdXN0b21FcnJvciA9IHRoaXMuc3VydmV5LnZhbGlkYXRlUGFuZWwodGhpcyk7XG4gICAgICBpZiAoY3VzdG9tRXJyb3IpIHtcbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChjdXN0b21FcnJvcik7XG4gICAgICAgIHJlYy5yZXN1bHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICByZWMuZmlyZUNhbGxiYWNrICYmXG4gICAgICAoZXJyb3JMZW5ndGggIT0gdGhpcy5lcnJvcnMubGVuZ3RoIHx8IGVycm9yTGVuZ3RoID4gMClcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmVycm9yc0NoYW5nZWRDYWxsYmFjaykgdGhpcy5lcnJvcnNDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBoYXNSZXF1aXJlZEVycm9yKHJlYzogYW55KSB7XG4gICAgaWYgKCF0aGlzLmlzUmVxdWlyZWQpIHJldHVybjtcbiAgICB2YXIgdmlzUXVlc3Rpb25zID0gW107XG4gICAgdGhpcy5hZGRRdWVzdGlvbnNUb0xpc3QodmlzUXVlc3Rpb25zLCB0cnVlKTtcbiAgICBpZiAodmlzUXVlc3Rpb25zLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aXNRdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdmlzUXVlc3Rpb25zW2ldLmlzRW1wdHkoKSkgcmV0dXJuO1xuICAgIH1cbiAgICByZWMucmVzdWx0ID0gdHJ1ZTtcbiAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBPbmVBbnN3ZXJSZXF1aXJlZEVycm9yKHRoaXMucmVxdWlyZWRFcnJvclRleHQpKTtcbiAgICBpZiAoIXJlYy5maXJzdEVycm9yUXVlc3Rpb24pIHtcbiAgICAgIHJlYy5maXJzdEVycm9yUXVlc3Rpb24gPSB2aXNRdWVzdGlvbnNbMF07XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBoYXNFcnJvcnNDb3JlKHJlYzogYW55KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuZWxlbWVudHNbaV0uaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLmVsZW1lbnRzW2ldLmlzUGFuZWwpIHtcbiAgICAgICAgKDxQYW5lbE1vZGVsQmFzZT4oPGFueT50aGlzLmVsZW1lbnRzW2ldKSkuaGFzRXJyb3JzQ29yZShyZWMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHF1ZXN0aW9uID0gPFF1ZXN0aW9uQmFzZT50aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgICBpZiAocXVlc3Rpb24uaXNSZWFkT25seSkgY29udGludWU7XG4gICAgICAgIGlmIChxdWVzdGlvbi5oYXNFcnJvcnMocmVjLmZpcmVDYWxsYmFjaykpIHtcbiAgICAgICAgICBpZiAocmVjLmZvY3VzZU9uRmlyc3RFcnJvciAmJiByZWMuZmlyc3RFcnJvclF1ZXN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIHJlYy5maXJzdEVycm9yUXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjLnJlc3VsdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5oYXNFcnJvcnNJblBhbmVscyhyZWMpO1xuICB9XG4gIC8qKlxuICAgKiBGaWxsIGxpc3QgYXJyYXkgd2l0aCB0aGUgcXVlc3Rpb25zLlxuICAgKiBAcGFyYW0gbGlzdFxuICAgKiBAcGFyYW0gdmlzaWJsZU9ubHkgc2V0IGl0IHRvIHRydWUgdG8gZ2V0IHZpc2libGUgcXVlc3Rpb25zIG9ubHlcbiAgICovXG4gIHB1YmxpYyBhZGRRdWVzdGlvbnNUb0xpc3QoXG4gICAgbGlzdDogQXJyYXk8SVF1ZXN0aW9uPixcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB0aGlzLmFkZEVsZW1lbnRzVG9MaXN0KGxpc3QsIHZpc2libGVPbmx5LCBpbmNsdWRpbmdEZXNpZ25UaW1lLCBmYWxzZSk7XG4gIH1cbiAgLyoqXG4gICAqIEZpbGwgbGlzdCBhcnJheSB3aXRoIHRoZSBwYW5lbHMuXG4gICAqIEBwYXJhbSBsaXN0XG4gICAqL1xuICBwdWJsaWMgYWRkUGFuZWxzSW50b0xpc3QoXG4gICAgbGlzdDogQXJyYXk8SVBhbmVsPixcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGluY2x1ZGluZ0Rlc2lnblRpbWU6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICB0aGlzLmFkZEVsZW1lbnRzVG9MaXN0KFxuICAgICAgPEFycmF5PElFbGVtZW50Pj4oPEFycmF5PGFueT4+bGlzdCksXG4gICAgICB2aXNpYmxlT25seSxcbiAgICAgIGluY2x1ZGluZ0Rlc2lnblRpbWUsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGFkZEVsZW1lbnRzVG9MaXN0KFxuICAgIGxpc3Q6IEFycmF5PElFbGVtZW50PixcbiAgICB2aXNpYmxlT25seTogYm9vbGVhbixcbiAgICBpbmNsdWRpbmdEZXNpZ25UaW1lOiBib29sZWFuLFxuICAgIGlzUGFuZWw6IGJvb2xlYW5cbiAgKSB7XG4gICAgaWYgKHZpc2libGVPbmx5ICYmICF0aGlzLnZpc2libGUpIHJldHVybjtcbiAgICB0aGlzLmFkZEVsZW1lbnRzVG9MaXN0Q29yZShcbiAgICAgIGxpc3QsXG4gICAgICB0aGlzLmVsZW1lbnRzLFxuICAgICAgdmlzaWJsZU9ubHksXG4gICAgICBpbmNsdWRpbmdEZXNpZ25UaW1lLFxuICAgICAgaXNQYW5lbFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBhZGRFbGVtZW50c1RvTGlzdENvcmUoXG4gICAgbGlzdDogQXJyYXk8SUVsZW1lbnQ+LFxuICAgIGVsZW1lbnRzOiBBcnJheTxJRWxlbWVudD4sXG4gICAgdmlzaWJsZU9ubHk6IGJvb2xlYW4sXG4gICAgaW5jbHVkaW5nRGVzaWduVGltZTogYm9vbGVhbixcbiAgICBpc1BhbmVsOiBib29sZWFuXG4gICkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IGVsZW1lbnRzW2ldO1xuICAgICAgaWYgKHZpc2libGVPbmx5ICYmICFlbC52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgIGlmICgoaXNQYW5lbCAmJiBlbC5pc1BhbmVsKSB8fCAoIWlzUGFuZWwgJiYgIWVsLmlzUGFuZWwpKSB7XG4gICAgICAgIGxpc3QucHVzaChlbCk7XG4gICAgICB9XG4gICAgICBpZiAoZWwuaXNQYW5lbCkge1xuICAgICAgICAoPFBhbmVsTW9kZWw+ZWwpLmFkZEVsZW1lbnRzVG9MaXN0Q29yZShcbiAgICAgICAgICBsaXN0LFxuICAgICAgICAgICg8UGFuZWxNb2RlbD5lbCkuZWxlbWVudHMsXG4gICAgICAgICAgdmlzaWJsZU9ubHksXG4gICAgICAgICAgaW5jbHVkaW5nRGVzaWduVGltZSxcbiAgICAgICAgICBpc1BhbmVsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5jbHVkaW5nRGVzaWduVGltZSkge1xuICAgICAgICAgIHRoaXMuYWRkRWxlbWVudHNUb0xpc3RDb3JlKFxuICAgICAgICAgICAgbGlzdCxcbiAgICAgICAgICAgICg8U3VydmV5RWxlbWVudD4oPGFueT5lbCkpLmdldEVsZW1lbnRzSW5EZXNpZ24oZmFsc2UpLFxuICAgICAgICAgICAgdmlzaWJsZU9ubHksXG4gICAgICAgICAgICBpbmNsdWRpbmdEZXNpZ25UaW1lLFxuICAgICAgICAgICAgaXNQYW5lbFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0IHJvd3MoKTogQXJyYXk8UXVlc3Rpb25Sb3dNb2RlbD4ge1xuICAgIGlmICghdGhpcy5yb3dWYWx1ZXMpIHtcbiAgICAgIHRoaXMucm93VmFsdWVzID0gdGhpcy5idWlsZFJvd3MoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucm93VmFsdWVzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgb2JqZWN0IGlzIFBhZ2UgYW5kIGl0IGlzIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQWN0aXZlKCkge1xuICAgIHJldHVybiAhdGhpcy5zdXJ2ZXkgfHwgdGhpcy5zdXJ2ZXkuY3VycmVudFBhZ2UgPT0gdGhpcy5yb290O1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXRzKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBkaWZmZXJlbnQgZnJvbSBcImRlZmF1bHRcIiB0byBzZXQgdGhlIHNwZWNpZmljIHF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uIGZvciB0aGlzIHBhbmVsL3BhZ2UuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwucXVlc3Rpb25UaXRsZUxvY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIiwgXCJkZWZhdWx0XCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcXVlc3Rpb25UaXRsZUxvY2F0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJxdWVzdGlvblRpdGxlTG9jYXRpb25cIiwgdmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgZ2V0UXVlc3Rpb25UaXRsZUxvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMub25HZXRRdWVzdGlvblRpdGxlTG9jYXRpb24pXG4gICAgICByZXR1cm4gdGhpcy5vbkdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbigpO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uVGl0bGVMb2NhdGlvbiAhPSBcImRlZmF1bHRcIilcbiAgICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uVGl0bGVMb2NhdGlvbjtcbiAgICBpZiAodGhpcy5wYXJlbnQpIHJldHVybiB0aGlzLnBhcmVudC5nZXRRdWVzdGlvblRpdGxlTG9jYXRpb24oKTtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgPyB0aGlzLnN1cnZleS5xdWVzdGlvblRpdGxlTG9jYXRpb24gOiBcInRvcFwiO1xuICB9XG4gIHByb3RlY3RlZCBnZXQgcm9vdCgpOiBQYW5lbE1vZGVsQmFzZSB7XG4gICAgdmFyIHJlcyA9IDxQYW5lbE1vZGVsQmFzZT50aGlzO1xuICAgIHdoaWxlIChyZXMucGFyZW50KSByZXMgPSByZXMucGFyZW50O1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJvdygpOiBRdWVzdGlvblJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUm93TW9kZWwodGhpcyk7XG4gIH1cbiAgb25TdXJ2ZXlMb2FkKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50c1tpXS5vblN1cnZleUxvYWQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm93c0NoYW5nZWRDYWxsYmFjaykgdGhpcy5yb3dzQ2hhbmdlZENhbGxiYWNrKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUm93c0NoYW5nZWQoKSB7XG4gICAgdGhpcy5yb3dWYWx1ZXMgPSBudWxsO1xuICAgIGlmICh0aGlzLnJvd3NDaGFuZ2VkQ2FsbGJhY2sgJiYgIXRoaXMuaXNMb2FkaW5nRnJvbUpzb24pXG4gICAgICB0aGlzLnJvd3NDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgfVxuICBwcml2YXRlIG9uQWRkRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgIGVsZW1lbnQuc2V0U3VydmV5SW1wbCh0aGlzLnN1cnZleUltcGwpO1xuICAgIGVsZW1lbnQucGFyZW50ID0gdGhpcztcbiAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICB2YXIgcCA9IDxQYW5lbE1vZGVsPmVsZW1lbnQ7XG4gICAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgICAgdGhpcy5zdXJ2ZXkucGFuZWxBZGRlZChwLCBpbmRleCwgdGhpcywgdGhpcy5yb290KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICAgIHZhciBxID0gPFF1ZXN0aW9uQmFzZT5lbGVtZW50O1xuICAgICAgICB0aGlzLnN1cnZleS5xdWVzdGlvbkFkZGVkKHEsIGluZGV4LCB0aGlzLCB0aGlzLnJvb3QpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgKDxCYXNlPig8YW55PmVsZW1lbnQpKS5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1widmlzaWJsZVwiLCBcImlzVmlzaWJsZVwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKGVsZW1lbnQpO1xuICAgICAgfSxcbiAgICAgIHRoaXMuaWRcbiAgICApO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXG4gICAgICBcInN0YXJ0V2l0aE5ld0xpbmVcIixcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uRWxlbWVudFN0YXJ0V2l0aE5ld0xpbmVDaGFuZ2VkKGVsZW1lbnQpO1xuICAgICAgfSxcbiAgICAgIHRoaXMuaWRcbiAgICApO1xuICB9XG4gIHByaXZhdGUgb25SZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KSB7XG4gICAgZWxlbWVudC5wYXJlbnQgPSBudWxsO1xuICAgICg8QmFzZT4oPGFueT5lbGVtZW50KSkudW5SZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1widmlzaWJsZVwiLCBcImlzVmlzaWJsZVwiLCBcInN0YXJ0V2l0aE5ld0xpbmVcIl0sXG4gICAgICB0aGlzLmlkXG4gICAgKTtcbiAgICBpZiAoIWVsZW1lbnQuaXNQYW5lbCkge1xuICAgICAgaWYgKHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5xdWVzdGlvblJlbW92ZWQoPFF1ZXN0aW9uQmFzZT5lbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc3VydmV5KSB0aGlzLnN1cnZleS5wYW5lbFJlbW92ZWQoZWxlbWVudCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgb25FbGVtZW50VmlzaWJpbGl0eUNoYW5nZWQoZWxlbWVudDogYW55KSB7XG4gICAgaWYgKHRoaXMucm93VmFsdWVzKSB7XG4gICAgICB0aGlzLnVwZGF0ZVJvd3NWaXNpYmlsaXR5KGVsZW1lbnQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50Lm9uRWxlbWVudFZpc2liaWxpdHlDaGFuZ2VkKHRoaXMpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIG9uRWxlbWVudFN0YXJ0V2l0aE5ld0xpbmVDaGFuZ2VkKGVsZW1lbnQ6IGFueSkge1xuICAgIHRoaXMub25Sb3dzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlUm93c1Zpc2liaWxpdHkoZWxlbWVudDogYW55KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd1ZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvdyA9IHRoaXMucm93VmFsdWVzW2ldO1xuICAgICAgaWYgKHJvdy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpID4gLTEpIHtcbiAgICAgICAgcm93LnVwZGF0ZVZpc2libGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYnVpbGRSb3dzKCk6IEFycmF5PFF1ZXN0aW9uUm93TW9kZWw+IHtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5PFF1ZXN0aW9uUm93TW9kZWw+KCk7XG4gICAgdmFyIGxhc3RSb3dWaXNpYmxlSW5kZXggPSAtMTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRzW2ldO1xuICAgICAgdmFyIGlzTmV3Um93ID0gaSA9PSAwIHx8IGVsLnN0YXJ0V2l0aE5ld0xpbmU7XG4gICAgICB2YXIgcm93ID0gaXNOZXdSb3cgPyB0aGlzLmNyZWF0ZVJvdygpIDogcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChpc05ld1JvdykgcmVzdWx0LnB1c2gocm93KTtcbiAgICAgIHJvdy5hZGRFbGVtZW50KGVsKTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXS51cGRhdGVWaXNpYmxlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgcmVuZGVyZWQgdGl0bGUgdGV4dCBvciBodG1sLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm9jZXNzZWRUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZW5kZXJlZFRpdGxlKHRoaXMubG9jVGl0bGUudGV4dE9ySHRtbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJlbmRlcmVkVGl0bGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3IgIT0gbnVsbFxuICAgICAgPyB0aGlzLnRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHQoc3RyLCB0cnVlKVxuICAgICAgOiBzdHI7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBnZXQvc2V0IHRoZSBvYmplY3QgdmlzaWJpbGl0eS5cbiAgICogQHNlZSB2aXNpYmxlSWZcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdmFsdWUpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIHZpc2libGUgb3Igc3VydmV5IGlzIGluIGRlc2lnbiBtb2RlIHJpZ2h0IG5vdy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRGVzaWduTW9kZSB8fCB0aGlzLmdldElzUGFnZVZpc2libGUobnVsbCk7XG4gIH1cbiAgZ2V0SXNQYWdlVmlzaWJsZShleGNlcHRpb25RdWVzdGlvbjogSVF1ZXN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnZpc2libGUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5xdWVzdGlvbnNbaV0gPT0gZXhjZXB0aW9uUXVlc3Rpb24pIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMucXVlc3Rpb25zW2ldLnZpc2libGUpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhbiBlbGVtZW1udCBpbnRvIFBhbmVsIG9yIFBhZ2UuXG4gICAqIEBwYXJhbSBlbGVtZW50XG4gICAqIEBwYXJhbSBpbmRleCBlbGVtZW50IGluZGV4IGluIHRoZSBlbGVtZW50cyBhcnJheVxuICAgKi9cbiAgcHVibGljIGFkZEVsZW1lbnQoZWxlbWVudDogSUVsZW1lbnQsIGluZGV4OiBudW1iZXIgPSAtMSkge1xuICAgIGlmIChlbGVtZW50ID09IG51bGwpIHJldHVybjtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudHMuc3BsaWNlKGluZGV4LCAwLCBlbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIHF1ZXN0aW9uIGludG8gUGFuZWwgb3IgUGFnZS5cbiAgICogQHBhcmFtIHF1ZXN0aW9uXG4gICAqIEBwYXJhbSBpbmRleCBlbGVtZW50IGluZGV4IGluIHRoZSBlbGVtZW50cyBhcnJheVxuICAgKi9cbiAgcHVibGljIGFkZFF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbkJhc2UsIGluZGV4OiBudW1iZXIgPSAtMSkge1xuICAgIHRoaXMuYWRkRWxlbWVudChxdWVzdGlvbiwgaW5kZXgpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBwYW5lbCBpbnRvIFBhbmVsIG9yIFBhZ2UuXG4gICAqIEBwYXJhbSBwYW5lbFxuICAgKiBAcGFyYW0gaW5kZXggZWxlbWVudCBpbmRleCBpbiB0aGUgZWxlbWVudHMgYXJyYXlcbiAgICovXG4gIHB1YmxpYyBhZGRQYW5lbChwYW5lbDogUGFuZWxNb2RlbCwgaW5kZXg6IG51bWJlciA9IC0xKSB7XG4gICAgdGhpcy5hZGRFbGVtZW50KHBhbmVsLCBpbmRleCk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcXVlc3Rpb24gYW5kIGFkZHMgaXQgaW50byB0aGUgZW5kIG9mIHRoZSBlbGVtZW50cyBsaXN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb25UeXBlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiBcInRleHRcIiwgXCJjaGVja2JveFwiLCBcImRyb3Bkb3duXCIsIFwibWF0cml4XCIsIFwiaHRtbFwiLCBcIm1hdHJpeGR5bmFtaWNcIiwgXCJtYXRyaXhkcm9wZG93blwiIGFuZCBzbyBvbi5cbiAgICogQHBhcmFtIG5hbWUgYSBxdWVzdGlvbiBuYW1lXG4gICAqL1xuICBwdWJsaWMgYWRkTmV3UXVlc3Rpb24oXG4gICAgcXVlc3Rpb25UeXBlOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nID0gbnVsbFxuICApOiBRdWVzdGlvbkJhc2Uge1xuICAgIHZhciBxdWVzdGlvbiA9IFF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5jcmVhdGVRdWVzdGlvbihxdWVzdGlvblR5cGUsIG5hbWUpO1xuICAgIHRoaXMuYWRkUXVlc3Rpb24ocXVlc3Rpb24pO1xuICAgIHJldHVybiBxdWVzdGlvbjtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwYW5lbCBhbmQgYWRkcyBpdCBpbnRvIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnRzIGxpc3QuXG4gICAqIEBwYXJhbSBuYW1lIGEgcGFuZWwgbmFtZVxuICAgKi9cbiAgcHVibGljIGFkZE5ld1BhbmVsKG5hbWU6IHN0cmluZyA9IG51bGwpOiBQYW5lbE1vZGVsIHtcbiAgICB2YXIgcGFuZWwgPSB0aGlzLmNyZWF0ZU5ld1BhbmVsKG5hbWUpO1xuICAgIHRoaXMuYWRkUGFuZWwocGFuZWwpO1xuICAgIHJldHVybiBwYW5lbDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFuZWwobmFtZTogc3RyaW5nKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBQYW5lbE1vZGVsKG5hbWUpO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZWxlbWVudCAoUGFuZWwgb3IgUXVlc3Rpb24pIGZyb20gdGhlIGVsZW1lbnRzIGxpc3QuXG4gICAqIEBwYXJhbSBlbGVtZW50XG4gICAqIEBzZWUgZWxlbWVudHNcbiAgICovXG4gIHB1YmxpYyByZW1vdmVFbGVtZW50KGVsZW1lbnQ6IElFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5lbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpO1xuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50c1tpXS5yZW1vdmVFbGVtZW50KGVsZW1lbnQpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5lbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgcXVlc3Rpb24gIGZyb20gdGhlIGVsZW1lbnRzIGxpc3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvblxuICAgKiBAc2VlIGVsZW1lbnRzXG4gICAqIEBzZWUgcmVtb3ZlRWxlbWVudFxuICAgKi9cbiAgcHVibGljIHJlbW92ZVF1ZXN0aW9uKHF1ZXN0aW9uOiBRdWVzdGlvbkJhc2UpIHtcbiAgICB0aGlzLnJlbW92ZUVsZW1lbnQocXVlc3Rpb24pO1xuICB9XG4gIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLnJ1bkNvbmRpdGlvbih2YWx1ZXMpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudmlzaWJsZUlmKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvblJ1bm5lcilcbiAgICAgIHRoaXMuY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnZpc2libGVJZik7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIuZXhwcmVzc2lvbiA9IHRoaXMudmlzaWJsZUlmO1xuICAgIHRoaXMudmlzaWJsZSA9IHRoaXMuY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMpO1xuICB9XG4gIG9uTG9jYWxlQ2hhbmdlZCgpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZWxlbWVudHNbaV0ub25Mb2NhbGVDaGFuZ2VkKCk7XG4gICAgfVxuICAgIHRoaXMubG9jVGl0bGUub25DaGFuZ2VkKCk7XG4gIH1cbiAgb25BbnlWYWx1ZUNoYW5nZWQobmFtZTogc3RyaW5nKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2ldLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIH1cbiAgICB2YXIgdGl0bGVWYWx1ZSA9IHRoaXMubG9jVGl0bGUudGV4dDtcbiAgICBpZiAoIXRpdGxlVmFsdWUpIHJldHVybjtcbiAgICBpZiAodGl0bGVWYWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluZGV4T2YoXCJ7XCIgKyBuYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgIHRoaXMubG9jVGl0bGUub25DaGFuZ2VkKCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSBjb250YWluZXIgZWxlbWVudCwgc2ltaWxhciB0byB0aGUgUGFnZSBvYmplY3RzLiBIb3dldmVyLCB1bmxpa2UgdGhlIFBhZ2UsIFBhbmVsIGNhbid0IGJlIGEgcm9vdC5cbiAqIEl0IG1heSBjb250YWluIHF1ZXN0aW9ucyBhbmQgb3RoZXIgcGFuZWxzLlxuICovXG5leHBvcnQgY2xhc3MgUGFuZWxNb2RlbCBleHRlbmRzIFBhbmVsTW9kZWxCYXNlIGltcGxlbWVudHMgSUVsZW1lbnQge1xuICBzdGF0ZUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcInN0YXRlXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGVDaGFuZ2VkQ2FsbGJhY2spIHNlbGYuc3RhdGVDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInBhbmVsXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc1BhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBwYWdlIHdoZXJlIHRoZSBwYW5lbCBpcyBsb2NhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBwYWdlKCk6IElQYWdlIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlKHRoaXMucGFyZW50KTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhZ2UodmFsOiBJUGFnZSkge1xuICAgIHRoaXMuc2V0UGFnZSh0aGlzLnBhcmVudCwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJjb2xsYXBzZWRcIiB0byByZW5kZXIgb25seSBQYW5lbCB0aXRsZSBhbmQgZXhwYW5kZWQgYnV0dG9uIGFuZCB0byBcImV4cGFuZGVkXCIgdG8gcmVuZGVyIHRoZSBjb2xsYXBzZWQgYnV0dG9uIGluIHRoZSBQYW5lbCBjYXB0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInN0YXRlXCIsIFwiZGVmYXVsdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXRlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic3RhdGVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBQYW5lbCBpcyBpbiB0aGUgY29sbGFwc2VkIHN0YXRlXG4gICAqIEBzZWUgc3RhdGVcbiAgICogQHNlZSBjb2xsYXBzZVxuICAgKiBAc2VlIGlzRXhwYW5kZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNDb2xsYXBzZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUgPT0gXCJjb2xsYXBzZWRcIjtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBQYW5lbCBpcyBpbiB0aGUgZXhwYW5kZWQgc3RhdGVcbiAgICogQHNlZSBzdGF0ZVxuICAgKiBAc2VlIGV4cGFuZFxuICAgKiBAc2VlIGlzQ29sbGFwc2VkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRXhwYW5kZWQoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm47XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUgPT0gXCJleHBhbmRlZFwiO1xuICB9XG4gIC8qKlxuICAgKiBDb2xsYXBzZSB0aGUgUGFuZWxcbiAgICogQHNlZSBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGNvbGxhcHNlKCkge1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIHRoaXMuc3RhdGUgPSBcImNvbGxhcHNlZFwiO1xuICB9XG4gIC8qKlxuICAgKiBFeHBhbmQgdGhlIFBhbmVsXG4gICAqIEBzZWUgc3RhdGVcbiAgICovXG4gIHB1YmxpYyBleHBhbmQoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IFwiZXhwYW5kZWRcIjtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzRXJyb3JzQ29yZShyZWM6IGFueSkge1xuICAgIHN1cGVyLmhhc0Vycm9yc0NvcmUocmVjKTtcbiAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCAmJiByZWMucmVzdWx0ICYmIHJlYy5maXJlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRSZW5kZXJlZFRpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXN0cikge1xuICAgICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQgfHwgdGhpcy5pc0V4cGFuZGVkKSByZXR1cm4gdGhpcy5uYW1lO1xuICAgICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSByZXR1cm4gXCJbXCIgKyB0aGlzLm5hbWUgKyBcIl1cIjtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmdldFJlbmRlcmVkVGl0bGUoc3RyKTtcbiAgfVxuICAvKipcbiAgICogVGhlIFBhbmVsIHdpZHRoLlxuICAgKi9cbiAgcHVibGljIGdldCB3aWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwid2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGlubmVyIGluZGVudC4gU2V0IHRoaXMgcHJvcGVydHkgdG8gaW5jcmVhc2UgdGhlIHBhbmVsIGNvbnRlbnQgbWFyZ2luLlxuICAgKi9cbiAgcHVibGljIGdldCBpbm5lckluZGVudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbm5lckluZGVudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlubmVySW5kZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5uZXJJbmRlbnRcIiwgdmFsKTtcbiAgfVxuICBnZXQgcmVuZGVyV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIik7XG4gIH1cbiAgc2V0IHJlbmRlcldpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIFBhbmVsIHJlbmRlcnMgb24gdGhlIG5ldyBsaW5lIGlmIHRoZSBwcm9wZXJ0eSBpcyB0cnVlLiBJZiB0aGUgcHJvcGVydHkgaXMgZmFsc2UsIHRoZSBwYW5lbCB0cmllcyB0byByZW5kZXIgb24gdGhlIHNhbWUgbGluZS9yb3cgd2l0aCBhIHByZXZpb3VzIHF1ZXN0aW9uL3BhbmVsLlxuICAgKi9cbiAgcHVibGljIGdldCBzdGFydFdpdGhOZXdMaW5lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdGFydFdpdGhOZXdMaW5lXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhcnRXaXRoTmV3TGluZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0YXJ0V2l0aE5ld0xpbmVcIiwgdmFsdWUpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcmlnaHQgaW5kZW50IG9mIHRoZSBQYW5lbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmlnaHRJbmRlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmlnaHRJbmRlbnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCByaWdodEluZGVudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJpZ2h0SW5kZW50XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgc3VwZXIub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzVmlzaWJsZVwiLCB0aGlzLmlzVmlzaWJsZSk7XG4gICAgaWYgKHRoaXMuc3VydmV5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuc3VydmV5LnBhbmVsVmlzaWJpbGl0eUNoYW5nZWQodGhpcywgdGhpcy52aXNpYmxlKTtcbiAgICB9XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJwYW5lbGJhc2VcIixcbiAgW1xuICAgIFwibmFtZVwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwiZWxlbWVudHNcIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJxdWVzdGlvbnNcIixcbiAgICAgIGJhc2VDbGFzc05hbWU6IFwicXVlc3Rpb25cIixcbiAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidmlzaWJsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBcInZpc2libGVJZjpjb25kaXRpb25cIixcbiAgICB7XG4gICAgICBuYW1lOiBcInF1ZXN0aW9uVGl0bGVMb2NhdGlvblwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiXVxuICAgIH0sXG4gICAgeyBuYW1lOiBcInRpdGxlOnRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7IG5hbWU6IFwiZGVzY3JpcHRpb246dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRGVzY3JpcHRpb25cIiB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbEJhc2UoKTtcbiAgfVxuKTtcblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJwYW5lbFwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJzdGF0ZVwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwiY29sbGFwc2VkXCIsIFwiZXhwYW5kZWRcIl1cbiAgICB9LFxuICAgIFwiaXNSZXF1aXJlZDpib29sZWFuXCIsXG4gICAge1xuICAgICAgbmFtZTogXCJyZXF1aXJlZEVycm9yVGV4dDp0ZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUmVxdWlyZWRFcnJvclRleHRcIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcInN0YXJ0V2l0aE5ld0xpbmU6Ym9vbGVhblwiLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcImlubmVySW5kZW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgM10gfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInBhZ2VcIixcbiAgICAgIGlzU2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICAgIGNob2ljZXM6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgICB2YXIgc3VydmV5ID0gb2JqID8gb2JqLnN1cnZleSA6IG51bGw7XG4gICAgICAgIHJldHVybiBzdXJ2ZXkgPyBzdXJ2ZXkucGFnZXMgOiBbXTtcbiAgICAgIH1cbiAgICB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbCgpO1xuICB9LFxuICBcInBhbmVsYmFzZVwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BhbmVsLnRzIiwiaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFN1cnZleUVycm9yLCBJU3VydmV5SW1wbCB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IEN1c3RvbUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IENob2ljZXNSZXN0ZnVsbCB9IGZyb20gXCIuL2Nob2ljZXNSZXN0ZnVsbFwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG4vKipcbiAqIEl0IGlzIGEgYmFzZSBjbGFzcyBmb3IgY2hlY2tib3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uU2VsZWN0QmFzZSBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgcHJpdmF0ZSB2aXNpYmxlQ2hvaWNlc0NhY2hlOiBBcnJheTxJdGVtVmFsdWU+ID0gbnVsbDtcbiAgcHJpdmF0ZSBjb21tZW50VmFsdWU6IHN0cmluZztcbiAgcHJpdmF0ZSBvdGhlckl0ZW1WYWx1ZTogSXRlbVZhbHVlID0gbmV3IEl0ZW1WYWx1ZShcbiAgICBcIm90aGVyXCIsXG4gICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm90aGVySXRlbVRleHRcIilcbiAgKTtcbiAgcHJvdGVjdGVkIGNhY2hlZFZhbHVlOiBhbnk7XG4gIHByaXZhdGUgY2hvaWNlc0Zyb21Vcmw6IEFycmF5PEl0ZW1WYWx1ZT4gPSBudWxsO1xuICBwcml2YXRlIGNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHM6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgY2hvaWNlc1ZhbHVlczogQXJyYXk8SXRlbVZhbHVlPjtcbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGZpbGwgdGhlIGNob2ljZXMgZnJvbSBhIHJlc3RmdWwgc2VydmljZS5cbiAgICogQHNlZSBjaG9pY2VzXG4gICAqL1xuICBwdWJsaWMgY2hvaWNlc0J5VXJsOiBDaG9pY2VzUmVzdGZ1bGw7XG4gIGNob2ljZXNDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmNob2ljZXNWYWx1ZXMgPSB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZXMoXCJjaG9pY2VzXCIpO1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsID0gdGhpcy5jcmVhdGVSZXN0ZnVsbCgpO1xuICAgIHRoaXMuY2hvaWNlc0J5VXJsLm93bmVyID0gdGhpcztcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwib3RoZXJUZXh0XCIsIHRoaXMsIHRydWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJvdGhlckVycm9yVGV4dFwiLCB0aGlzLCB0cnVlKTtcbiAgICB0aGlzLm90aGVySXRlbVZhbHVlLmxvY093bmVyID0gdGhpcztcblxuICAgIHRoaXMuY2hvaWNlc0J5VXJsLmdldFJlc3VsdENhbGxiYWNrID0gZnVuY3Rpb24oaXRlbXM6IEFycmF5PEl0ZW1WYWx1ZT4pIHtcbiAgICAgIHNlbGYub25Mb2FkQ2hvaWNlc0Zyb21VcmwoaXRlbXMpO1xuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG90aGVyIGl0ZW0uIEJ5IHVzaW5nIHRoaXMgcHJvcGVydHksIHlvdSBtYXkgY2hhbmdlIHByb2dyYW1tYXRpY2FsbHkgaXQncyB2YWx1ZSBhbmQgdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3RoZXJJdGVtKCk6IEl0ZW1WYWx1ZSB7XG4gICAgdGhpcy5vdGhlckl0ZW1WYWx1ZS50ZXh0ID0gdGhpcy5vdGhlclRleHQ7XG4gICAgcmV0dXJuIHRoaXMub3RoZXJJdGVtVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIHVzZXIgc2VsZWN0IHRoZSAnb3RoZXInIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzT3RoZXJTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpXG4gICAgICA/IHRoaXMuZ2V0SGFzT3RoZXIodGhpcy52YWx1ZSlcbiAgICAgIDogdGhpcy5nZXRIYXNPdGhlcih0aGlzLmNhY2hlZFZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0SGFzT3RoZXIodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlO1xuICB9XG4gIGdldCB2YWxpZGF0ZWRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlVG9EYXRhQ29yZSh0aGlzLnZhbHVlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUmVzdGZ1bGwoKTogQ2hvaWNlc1Jlc3RmdWxsIHtcbiAgICByZXR1cm4gbmV3IENob2ljZXNSZXN0ZnVsbCgpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRDb21tZW50KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZ2V0U3RvcmVPdGhlcnNBc0NvbW1lbnQoKSkgcmV0dXJuIHN1cGVyLmdldENvbW1lbnQoKTtcbiAgICByZXR1cm4gdGhpcy5jb21tZW50VmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc1NldHRpbmdDb21tZW50OiBib29sZWFuID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzZXRDb21tZW50KG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKSBzdXBlci5zZXRDb21tZW50KG5ld1ZhbHVlKTtcbiAgICBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5pc1NldHRpbmdDb21tZW50ICYmIG5ld1ZhbHVlICE9IHRoaXMuY29tbWVudFZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXNTZXR0aW5nQ29tbWVudCA9IHRydWU7XG4gICAgICAgIHRoaXMuY29tbWVudFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmlzT3RoZXJTZWxlY3RlZCkge1xuICAgICAgICAgIHRoaXMuc2V0TmV3VmFsdWVJbkRhdGEodGhpcy5jYWNoZWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1NldHRpbmdDb21tZW50ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBzZXROZXdWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5jYWNoZWRWYWx1ZUZvclVybFJlcXVlc3RzID0gbmV3VmFsdWU7XG4gICAgc3VwZXIuc2V0TmV3VmFsdWUobmV3VmFsdWUpO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKSByZXR1cm4gc3VwZXIudmFsdWVGcm9tRGF0YSh2YWwpO1xuICAgIHRoaXMuY2FjaGVkVmFsdWUgPSB0aGlzLnZhbHVlRnJvbURhdGFDb3JlKHZhbCk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkVmFsdWU7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlVG9EYXRhKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5nZXRTdG9yZU90aGVyc0FzQ29tbWVudCgpKSByZXR1cm4gc3VwZXIudmFsdWVUb0RhdGEodmFsKTtcbiAgICB0aGlzLmNhY2hlZFZhbHVlID0gdmFsO1xuICAgIHJldHVybiB0aGlzLnZhbHVlVG9EYXRhQ29yZSh2YWwpO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZUZyb21EYXRhQ29yZSh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWwpKSByZXR1cm4gdmFsO1xuICAgIGlmICh2YWwgPT0gdGhpcy5vdGhlckl0ZW0udmFsdWUpIHJldHVybiB2YWw7XG4gICAgdGhpcy5jb21tZW50ID0gdmFsO1xuICAgIHJldHVybiB0aGlzLm90aGVySXRlbS52YWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVUb0RhdGFDb3JlKHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodmFsID09IHRoaXMub3RoZXJJdGVtLnZhbHVlICYmIHRoaXMuZ2V0Q29tbWVudCgpKSB7XG4gICAgICB2YWwgPSB0aGlzLmdldENvbW1lbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBwcm90ZWN0ZWQgaGFzVW5rbm93blZhbHVlKHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCF2YWwpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLmFjdGl2ZUNob2ljZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGl0ZW1zW2ldLnZhbHVlID09IHZhbCkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgaXRlbXMuIEV2ZXJ5IGl0ZW0gaGFzIHZhbHVlIGFuZCB0ZXh0LiBJZiB0ZXh0IGlzIGVtcHR5LCB0aGUgdmFsdWUgaXMgcmVuZGVyZWQuIFRoZSBpdGVtIHRleHQgc3VwcG9ydHMgbWFya2Rvd24uXG4gICAqIEBzZWUgY2hvaWNlc0J5VXJsXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNob2ljZXMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY2hvaWNlc1ZhbHVlcztcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXMobmV3VmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzXCIsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQgdGhlIGVudGVyZWQgdGV4dCBpbiB0aGUgb3RoZXJzIGlucHV0IGluIHRoZSBjaGVja2JveC9yYWRpb2dyb3VwL2Ryb3Bkb3duIGFyZSBzdG9yZWQgYXMgXCJxdWVzdGlvbiBuYW1lIFwiICsgXCItQ29tbWVudFwiLiBUaGUgdmFsdWUgaXRzZWxmIGlzIFwicXVlc3Rpb24gbmFtZVwiOiBcIm90aGVyc1wiLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSwgdG8gc3RvcmUgdGhlIGVudGVyZWQgdGV4dCBkaXJlY3RseSBpbiB0aGUgXCJxdWVzdGlvbiBuYW1lXCIga2V5LlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnN0b3JlT3RoZXJzQXNDb21tZW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzdG9yZU90aGVyc0FzQ29tbWVudFwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0b3JlT3RoZXJzQXNDb21tZW50KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlT3RoZXJzQXNDb21tZW50XCIsIHZhbCk7XG4gIH1cbiAgcHJvdGVjdGVkIGhhc090aGVyQ2hhbmdlZCgpIHtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHJlbmRlciBpdGVtcyBpbiBhIHNwZWNpZmljIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBjaG9pY2VzT3JkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY2hvaWNlc09yZGVyXCIsIFwibm9uZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNob2ljZXNPcmRlcih2YWw6IHN0cmluZykge1xuICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWwgPT0gdGhpcy5jaG9pY2VzT3JkZXIpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjaG9pY2VzT3JkZXJcIiwgdmFsKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgZGlmZmVyZW50IHRleHQgZm9yIG90aGVyIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG90aGVyVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3RoZXJUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwib3RoZXJJdGVtVGV4dFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBvdGhlclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyVGV4dFwiLCB2YWwpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgfVxuICBnZXQgbG9jT3RoZXJUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyVGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRleHQgdGhhdCBzaG93cyB3aGVuIHRoZSBvdGhlciBpdGVtIGlzIGNob29zZWQgYnkgdGhlIG90aGVyIGlucHV0IGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBvdGhlckVycm9yVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwib3RoZXJFcnJvclRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJvdGhlclJlcXVpcmVkRXJyb3JcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgb3RoZXJFcnJvclRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm90aGVyRXJyb3JUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY090aGVyRXJyb3JUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm90aGVyRXJyb3JUZXh0XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGl0ZW1zIGFzIHRoZXkgd2lsbCBiZSByZW5kZXJlZC4gSWYgbmVlZGVkIGl0ZW1zIGFyZSBzb3J0ZWQgYW5kIHRoZSBvdGhlciBpdGVtIGlzIGFkZGVkLlxuICAgKiBAc2VlIGhhc090aGVyXG4gICAqIEBzZWUgY2hvaWNlc09yZGVyXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVDaG9pY2VzKCk6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIGlmICghdGhpcy5oYXNPdGhlciAmJiB0aGlzLmNob2ljZXNPcmRlciA9PSBcIm5vbmVcIilcbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUNob2ljZXM7XG4gICAgaWYgKCF0aGlzLnZpc2libGVDaG9pY2VzQ2FjaGUpIHtcbiAgICAgIHRoaXMudmlzaWJsZUNob2ljZXNDYWNoZSA9IHRoaXMuc29ydFZpc2libGVDaG9pY2VzKFxuICAgICAgICB0aGlzLmFjdGl2ZUNob2ljZXMuc2xpY2UoKVxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLmhhc090aGVyKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZUNob2ljZXNDYWNoZS5wdXNoKHRoaXMub3RoZXJJdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmlzaWJsZUNob2ljZXNDYWNoZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGN1cnJlbnQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBudWxsIHRoZW4gcmV0dXJucyBlbXB0eSBzdHJpbmcuIElmICdvdGhlcicgaXMgc2VsZWN0ZWQgdGhlbiByZXR1cm5zIHRoZSB0ZXh0IGZvciBvdGhlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5nZXREaXNwbGF5VmFsdWUodGhpcy52aXNpYmxlQ2hvaWNlcywgdGhpcy52YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERpc3BsYXlWYWx1ZShpdGVtczogSXRlbVZhbHVlW10sIHZhbDogYW55KTogYW55IHtcbiAgICBpZiAodmFsID09IHRoaXMub3RoZXJJdGVtVmFsdWUudmFsdWUpXG4gICAgICByZXR1cm4gdGhpcy5jb21tZW50ID8gdGhpcy5jb21tZW50IDogXCJcIjtcbiAgICB2YXIgc3RyID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKGl0ZW1zLCB2YWwpO1xuICAgIHJldHVybiBzdHIgPT0gXCJcIiAmJiB2YWwgPyB2YWwgOiBzdHI7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgYWN0aXZlQ2hvaWNlcygpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5jaG9pY2VzRnJvbVVybCA/IHRoaXMuY2hvaWNlc0Zyb21VcmwgOiB0aGlzLmNob2ljZXM7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0T3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBzdXBlci5vbkNoZWNrRm9yRXJyb3JzKGVycm9ycyk7XG4gICAgaWYgKCF0aGlzLmhhc090aGVyIHx8ICF0aGlzLmlzT3RoZXJTZWxlY3RlZCB8fCB0aGlzLmNvbW1lbnQpIHJldHVybjtcbiAgICBlcnJvcnMucHVzaChuZXcgQ3VzdG9tRXJyb3IodGhpcy5vdGhlckVycm9yVGV4dCkpO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIHRoaXMucnVuQ2hvaWNlc0J5VXJsKCk7XG4gIH1cbiAgcHVibGljIG9uTG9jYWxlQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5vbkxvY2FsZUNoYW5nZWQoKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFN0b3JlT3RoZXJzQXNDb21tZW50KCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0b3JlT3RoZXJzQXNDb21tZW50ICYmXG4gICAgICAodGhpcy5zdXJ2ZXkgIT0gbnVsbCA/IHRoaXMuc3VydmV5LnN0b3JlT3RoZXJzQXNDb21tZW50IDogdHJ1ZSlcbiAgICApO1xuICB9XG4gIG9uU3VydmV5TG9hZCgpIHtcbiAgICBzdXBlci5vblN1cnZleUxvYWQoKTtcbiAgICB0aGlzLnJ1bkNob2ljZXNCeVVybCgpO1xuICAgIHRoaXMub25WaXNpYmxlQ2hvaWNlc0NoYW5nZWQoKTtcbiAgfVxuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlci5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB0aGlzLnJ1bkNob2ljZXNCeVVybCgpO1xuICB9XG4gIHByaXZhdGUgcnVuQ2hvaWNlc0J5VXJsKCkge1xuICAgIGlmICghdGhpcy5jaG9pY2VzQnlVcmwgfHwgdGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHZhciBwcm9jZXNzb3IgPSB0aGlzLnN1cnZleUltcGxcbiAgICAgID8gdGhpcy5zdXJ2ZXlJbXBsLmdldFRleHRQcm9jZXNzb3IoKVxuICAgICAgOiB0aGlzLnRleHRQcm9jZXNzb3I7XG4gICAgaWYgKCFwcm9jZXNzb3IpIHByb2Nlc3NvciA9IHRoaXMuc3VydmV5O1xuICAgIGlmICghcHJvY2Vzc29yKSByZXR1cm47XG4gICAgdGhpcy5jaG9pY2VzQnlVcmwucnVuKHByb2Nlc3Nvcik7XG4gIH1cbiAgcHJpdmF0ZSBvbkxvYWRDaG9pY2VzRnJvbVVybChhcnJheTogQXJyYXk8SXRlbVZhbHVlPikge1xuICAgIHZhciBlcnJvckNvdW50ID0gdGhpcy5lcnJvcnMubGVuZ3RoO1xuICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgaWYgKHRoaXMuY2hvaWNlc0J5VXJsICYmIHRoaXMuY2hvaWNlc0J5VXJsLmVycm9yKSB7XG4gICAgICB0aGlzLmVycm9ycy5wdXNoKHRoaXMuY2hvaWNlc0J5VXJsLmVycm9yKTtcbiAgICB9XG4gICAgaWYgKGVycm9yQ291bnQgPiAwIHx8IHRoaXMuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuZXJyb3JzQ2hhbmdlZENhbGxiYWNrKTtcbiAgICB9XG4gICAgdmFyIG5ld0Nob2ljZXMgPSBudWxsO1xuICAgIHZhciBjYWNoZWRWYWx1ZXMgPSB0aGlzLmNyZWF0ZUNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHMoXG4gICAgICB0aGlzLmNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHNcbiAgICApO1xuICAgIGlmIChhcnJheSAmJiBhcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBuZXdDaG9pY2VzID0gbmV3IEFycmF5PEl0ZW1WYWx1ZT4oKTtcbiAgICAgIEl0ZW1WYWx1ZS5zZXREYXRhKG5ld0Nob2ljZXMsIGFycmF5KTtcbiAgICB9XG4gICAgdGhpcy5jaG9pY2VzRnJvbVVybCA9IG5ld0Nob2ljZXM7XG4gICAgaWYgKG5ld0Nob2ljZXMpIHtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMudXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyhjYWNoZWRWYWx1ZXMpO1xuICAgICAgaWYgKG5ld1ZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZS52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblZpc2libGVDaG9pY2VzQ2hhbmdlZCgpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHJldHVybiBudWxsO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcy5wdXNoKHRoaXMuY3JlYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyh2YWxbaV0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiB7IHZhbHVlOiB2YWwsIGlzRXhpc3RzOiAhdGhpcy5oYXNVbmtub3duVmFsdWUodmFsKSB9O1xuICB9XG4gIHByaXZhdGUgdXBkYXRlQ2FjaGVkVmFsdWVGb3JVcmxSZXF1ZXN0cyh2YWw6IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHJldHVybiBudWxsO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB1cGRhdGVkVmFsdWUgPSB0aGlzLnVwZGF0ZUNhY2hlZFZhbHVlRm9yVXJsUmVxdWVzdHModmFsW2ldKTtcbiAgICAgICAgaWYgKHVwZGF0ZWRWYWx1ZSAmJiAhdGhpcy5pc1ZhbHVlRW1wdHkodXBkYXRlZFZhbHVlLnZhbHVlKSkge1xuICAgICAgICAgIHJlcy5wdXNoKHVwZGF0ZWRWYWx1ZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHZhbHVlOiByZXMgfTtcbiAgICB9XG4gICAgdmFyIHZhbHVlID1cbiAgICAgIHZhbC5pc0V4aXN0cyAmJiB0aGlzLmhhc1Vua25vd25WYWx1ZSh2YWwudmFsdWUpID8gbnVsbCA6IHZhbC52YWx1ZTtcbiAgICByZXR1cm4geyB2YWx1ZTogdmFsdWUgfTtcbiAgfVxuICBwcml2YXRlIG9uVmlzaWJsZUNob2ljZXNDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy52aXNpYmxlQ2hvaWNlc0NhY2hlID0gbnVsbDtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNob2ljZXNDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIHByaXZhdGUgc29ydFZpc2libGVDaG9pY2VzKGFycmF5OiBBcnJheTxJdGVtVmFsdWU+KTogQXJyYXk8SXRlbVZhbHVlPiB7XG4gICAgdmFyIG9yZGVyID0gdGhpcy5jaG9pY2VzT3JkZXIudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAob3JkZXIgPT0gXCJhc2NcIikgcmV0dXJuIHRoaXMuc29ydEFycmF5KGFycmF5LCAxKTtcbiAgICBpZiAob3JkZXIgPT0gXCJkZXNjXCIpIHJldHVybiB0aGlzLnNvcnRBcnJheShhcnJheSwgLTEpO1xuICAgIGlmIChvcmRlciA9PSBcInJhbmRvbVwiKSByZXR1cm4gdGhpcy5yYW5kb21pemVBcnJheShhcnJheSk7XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG4gIHByaXZhdGUgc29ydEFycmF5KGFycmF5OiBBcnJheTxJdGVtVmFsdWU+LCBtdWx0OiBudW1iZXIpOiBBcnJheTxJdGVtVmFsdWU+IHtcbiAgICByZXR1cm4gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICBpZiAoYS50ZXh0IDwgYi50ZXh0KSByZXR1cm4gLTEgKiBtdWx0O1xuICAgICAgaWYgKGEudGV4dCA+IGIudGV4dCkgcmV0dXJuIDEgKiBtdWx0O1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSByYW5kb21pemVBcnJheShhcnJheTogQXJyYXk8SXRlbVZhbHVlPik6IEFycmF5PEl0ZW1WYWx1ZT4ge1xuICAgIHJldHVybiBIZWxwZXJzLnJhbmRvbWl6ZUFycmF5PEl0ZW1WYWx1ZT4oYXJyYXkpO1xuICB9XG4gIGNsZWFyVW51c2VkVmFsdWVzKCkge1xuICAgIHN1cGVyLmNsZWFyVW51c2VkVmFsdWVzKCk7XG4gICAgaWYgKCF0aGlzLmlzT3RoZXJTZWxlY3RlZCAmJiAhdGhpcy5oYXNDb21tZW50KSB7XG4gICAgICB0aGlzLmNvbW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGNoZWNrYm94IGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucy4gSXQgaW50cm9kdWNlZCBhIGNvbENvdW50IHByb3BlcnR5LlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveEJhc2UgZXh0ZW5kcyBRdWVzdGlvblNlbGVjdEJhc2Uge1xuICBwcml2YXRlIGNvbENvdW50VmFsdWU6IG51bWJlciA9IDE7XG4gIGNvbENvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgcmFkaW9ncm91cCBhbmQgY2hlY2tib3ggcXVlc3Rpb25zLiBJdGVtcyBhcmUgcmVuZHJlZCBpbiBvbmUgbGluZSBpZiB0aGUgdmFsdWUgaXMgMC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29sQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb2xDb3VudFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sQ291bnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA1KSByZXR1cm47XG4gICAgdGhpcy5jb2xDb3VudFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jb2xDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbn1cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwic2VsZWN0YmFzZVwiLFxuICBbXG4gICAgXCJoYXNDb21tZW50OmJvb2xlYW5cIixcbiAgICBcImhhc090aGVyOmJvb2xlYW5cIixcbiAgICB7XG4gICAgICBuYW1lOiBcImNob2ljZXM6aXRlbXZhbHVlc1wiLFxuICAgICAgb25HZXRWYWx1ZTogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXREYXRhKG9iai5jaG9pY2VzKTtcbiAgICAgIH0sXG4gICAgICBvblNldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSwgdmFsdWU6IGFueSkge1xuICAgICAgICBvYmouY2hvaWNlcyA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjaG9pY2VzT3JkZXJcIixcbiAgICAgIGRlZmF1bHQ6IFwibm9uZVwiLFxuICAgICAgY2hvaWNlczogW1wibm9uZVwiLCBcImFzY1wiLCBcImRlc2NcIiwgXCJyYW5kb21cIl1cbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiY2hvaWNlc0J5VXJsOnJlc3RmdWxsXCIsXG4gICAgICBjbGFzc05hbWU6IFwiQ2hvaWNlc1Jlc3RmdWxsXCIsXG4gICAgICBvbkdldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gb2JqLmNob2ljZXNCeVVybC5nZXREYXRhKCk7XG4gICAgICB9LFxuICAgICAgb25TZXRWYWx1ZTogZnVuY3Rpb24ob2JqOiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgb2JqLmNob2ljZXNCeVVybC5zZXREYXRhKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJvdGhlclRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY090aGVyVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcIm90aGVyRXJyb3JUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NPdGhlckVycm9yVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInN0b3JlT3RoZXJzQXNDb21tZW50OmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9XG4gIF0sXG4gIG51bGwsXG4gIFwicXVlc3Rpb25cIlxuKTtcblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJjaGVja2JveGJhc2VcIixcbiAgW3sgbmFtZTogXCJjb2xDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogMSwgY2hvaWNlczogWzAsIDEsIDIsIDMsIDQsIDVdIH1dLFxuICBudWxsLFxuICBcInNlbGVjdGJhc2VcIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9iYXNlc2VsZWN0LnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi4vcGFnZVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbEJhc2UsIFBhbmVsTW9kZWwsIFF1ZXN0aW9uUm93TW9kZWwgfSBmcm9tIFwiLi4vcGFuZWxcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25CYXNlIH0gZnJvbSBcIi4uL3F1ZXN0aW9uYmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5RWxlbWVudCwgSUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgRWxlbWVudEZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJvdyBleHRlbmRzIFF1ZXN0aW9uUm93TW9kZWwge1xuICBrb1Zpc2libGU6IGFueTtcbiAga29FbGVtZW50czogYW55O1xuICBrb0dldFR5cGU6IGFueTtcbiAga29FbGVtZW50QWZ0ZXJSZW5kZXI6IGFueTtcbiAgY29uc3RydWN0b3IocHVibGljIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHN1cGVyKHBhbmVsKTtcbiAgICB0aGlzLmtvVmlzaWJsZSA9IGtvLm9ic2VydmFibGUodGhpcy52aXNpYmxlKTtcbiAgICB0aGlzLmtvRWxlbWVudHMgPSBrby5vYnNlcnZhYmxlQXJyYXkoKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0dldFR5cGUgPSBmdW5jdGlvbihlbCkge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0RWxlbWVudFR5cGUoZWwpO1xuICAgIH07XG4gICAgdGhpcy5rb0VsZW1lbnRBZnRlclJlbmRlciA9IGZ1bmN0aW9uKGVsLCBjb24pIHtcbiAgICAgIHJldHVybiBzZWxmLmVsZW1lbnRBZnRlclJlbmRlcihlbCwgY29uKTtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBhZGRFbGVtZW50KHE6IElFbGVtZW50KSB7XG4gICAgc3VwZXIuYWRkRWxlbWVudChxKTtcbiAgICB0aGlzLmtvRWxlbWVudHModGhpcy5lbGVtZW50cyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5rb1Zpc2libGUodGhpcy52aXNpYmxlKTtcbiAgICBzdXBlci5vblZpc2libGVDaGFuZ2VkKCk7XG4gIH1cbiAgcHVibGljIGdldEVsZW1lbnRUeXBlKGVsKSB7XG4gICAgcmV0dXJuIGVsLmlzUGFuZWwgPyBcInN1cnZleS1wYW5lbFwiIDogXCJzdXJ2ZXktcXVlc3Rpb25cIjtcbiAgfVxuICBwdWJsaWMga29BZnRlclJlbmRlcihlbCwgY29uKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHRFbCA9IGVsW2ldO1xuICAgICAgdmFyIG5OYW1lID0gdEVsLm5vZGVOYW1lO1xuICAgICAgaWYgKG5OYW1lID09IFwiI3RleHRcIikgdEVsLmRhdGEgPSBcIlwiO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGVsZW1lbnRBZnRlclJlbmRlcihlbGVtZW50cywgY29uKSB7XG4gICAgaWYgKCF0aGlzLnBhbmVsIHx8ICF0aGlzLnBhbmVsLnN1cnZleSkgcmV0dXJuO1xuICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIHZhciBlbGVtZW50ID0gPElFbGVtZW50PmNvbjtcbiAgICBpZiAoZWxlbWVudC5pc1BhbmVsKSB7XG4gICAgICB0aGlzLnBhbmVsLnN1cnZleS5hZnRlclJlbmRlclBhbmVsKGNvbiwgZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhbmVsLnN1cnZleS5hZnRlclJlbmRlclF1ZXN0aW9uKGNvbiwgZWwpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFuZWxJbXBsZW1lbnRvckJhc2Uge1xuICBrb1Jvd3M6IGFueTtcbiAgY29uc3RydWN0b3IocHVibGljIHBhbmVsOiBQYW5lbE1vZGVsQmFzZSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvUm93cyA9IGtvLm9ic2VydmFibGVBcnJheSgpO1xuICAgIHRoaXMucGFuZWwucm93c0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1Jvd3Moc2VsZi5wYW5lbC5yb3dzKTtcbiAgICB9O1xuICAgIHRoaXMucGFuZWxbXCJrb1Jvd3NcIl0gPSB0aGlzLmtvUm93cztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFuZWwgZXh0ZW5kcyBQYW5lbE1vZGVsIHtcbiAga29WaXNpYmxlOiBhbnk7XG4gIGtvSW5uZXJNYXJnaW46IGFueTtcbiAga29SZW5kZXJXaWR0aDogYW55O1xuICBrb0VsZW1lbnRUeXBlOiBhbnk7XG4gIGtvRXJyb3JzOiBhbnk7XG4gIGtvQ3NzOiBhbnk7XG4gIGtvSXNFeHBhbmRlZDogYW55O1xuICBrb0lzQ29sbGFwc2VkOiBhbnk7XG4gIGRvRXhwYW5kOiBhbnk7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUGFuZWxJbXBsZW1lbnRvckJhc2UodGhpcyk7XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29FbGVtZW50VHlwZSA9IGtvLm9ic2VydmFibGUoXCJzdXJ2ZXktcGFuZWxcIik7XG4gICAgdGhpcy5rb1Zpc2libGUgPSBrby5vYnNlcnZhYmxlKHRoaXMuaXNWaXNpYmxlKTtcbiAgICB0aGlzLmtvUmVuZGVyV2lkdGggPSBrby5vYnNlcnZhYmxlKHRoaXMucmVuZGVyV2lkdGgpO1xuICAgIHRoaXMua29FcnJvcnMgPSBrby5vYnNlcnZhYmxlKHRoaXMuZXJyb3JzKTtcbiAgICB0aGlzLmtvQ3NzID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNlbGYuY3NzQ2xhc3NlcztcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNDb2xsYXBzZWQgPSBrby5vYnNlcnZhYmxlKHRoaXMuaXNDb2xsYXBzZWQpO1xuICAgIHRoaXMua29Jc0V4cGFuZGVkID0ga28ub2JzZXJ2YWJsZSh0aGlzLmlzRXhwYW5kZWQpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25TdGF0ZUNoYW5nZWQoKTtcbiAgICB9O1xuICAgIHRoaXMuZXJyb3JzQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvRXJyb3JzKHNlbGYuZXJyb3JzKTtcbiAgICB9O1xuICAgIHRoaXMuZG9FeHBhbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuY2hhbmdlRXhwYW5kZWQoKTtcbiAgICB9O1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydGllc1ZhbHVlQ2hhbmdlZChcbiAgICAgIFtcInJlbmRlcldpZHRoXCIsIFwiaW5uZXJJbmRlbnRcIiwgXCJyaWdodEluZGVudFwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uUmVuZGVyV2lkdGhDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMua29Jbm5lck1hcmdpbiA9IGtvLm9ic2VydmFibGUodGhpcy5nZXRJbmRlbnRTaXplKHRoaXMuaW5uZXJJbmRlbnQpKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlUm93KCk6IFF1ZXN0aW9uUm93TW9kZWwge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25Sb3codGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblJlbmRlcldpZHRoQ2hhbmdlZCgpIHtcbiAgICB0aGlzLmtvUmVuZGVyV2lkdGgodGhpcy5yZW5kZXJXaWR0aCk7XG4gICAgdGhpcy5rb0lubmVyTWFyZ2luKHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLmlubmVySW5kZW50KSk7XG4gIH1cbiAgcHJpdmF0ZSBvblN0YXRlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLmtvSXNDb2xsYXBzZWQodGhpcy5pc0NvbGxhcHNlZCk7XG4gICAgdGhpcy5rb0lzRXhwYW5kZWQodGhpcy5pc0V4cGFuZGVkKTtcbiAgfVxuICBwcml2YXRlIGNoYW5nZUV4cGFuZGVkKCkge1xuICAgIGlmICghdGhpcy5pc0NvbGxhcHNlZCAmJiAhdGhpcy5pc0V4cGFuZGVkKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNDb2xsYXBzZWQpIHtcbiAgICAgIHRoaXMuZXhwYW5kKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sbGFwc2UoKTtcbiAgICB9XG4gIH1cbiAgZW5kTG9hZGluZ0Zyb21Kc29uKCkge1xuICAgIHN1cGVyLmVuZExvYWRpbmdGcm9tSnNvbigpO1xuICAgIHRoaXMua29WaXNpYmxlKHRoaXMuaXNWaXNpYmxlKTtcbiAgICB0aGlzLm9uU3RhdGVDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJsZUNoYW5nZWQoKSB7XG4gICAgc3VwZXIub25WaXNpYmxlQ2hhbmdlZCgpO1xuICAgIHRoaXMua29WaXNpYmxlKHRoaXMuaXNWaXNpYmxlKTtcbiAgfVxuICBwcml2YXRlIGdldEluZGVudFNpemUoaW5kZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChpbmRlbnQgPCAxKSByZXR1cm4gXCJcIjtcbiAgICBpZiAoIXRoaXMuZGF0YSkgcmV0dXJuIFwiXCI7XG4gICAgdmFyIGNzcyA9IHRoaXMuc3VydmV5W1wiY3NzXCJdO1xuICAgIGlmICghY3NzKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gaW5kZW50ICogY3NzLnF1ZXN0aW9uLmluZGVudCArIFwicHhcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFnZSBleHRlbmRzIFBhZ2VNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUGFuZWxJbXBsZW1lbnRvckJhc2UodGhpcyk7XG4gICAgdGhpcy5vbkNyZWF0aW5nKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVJvdygpOiBRdWVzdGlvblJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUm93KHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdQYW5lbChuYW1lOiBzdHJpbmcpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFBhbmVsKG5hbWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ3JlYXRpbmcoKSB7fVxuICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmxvY1RpdGxlLm9uQ2hhbmdlZCgpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwicGFuZWxcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUGFuZWwoKTtcbn0pO1xuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJwYWdlXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFBhZ2UoKTtcbn0pO1xuXG5FbGVtZW50RmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlckVsZW1lbnQoXCJwYW5lbFwiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBQYW5lbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcGFnZS50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25CYXNlIH0gZnJvbSBcIi4uL3F1ZXN0aW9uYmFzZVwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25JbXBsZW1lbnRvckJhc2Uge1xuICBrb1Zpc2libGU6IGFueTtcbiAga29FcnJvcnM6IGFueTtcbiAga29QYWRkaW5nTGVmdDogYW55O1xuICBrb1BhZGRpbmdSaWdodDogYW55O1xuICBrb1JlbmRlcldpZHRoOiBhbnk7XG4gIGtvVGVtcGxhdGVOYW1lOiBhbnk7XG4gIGtvRWxlbWVudFR5cGU6IGFueTtcbiAgY29uc3RydWN0b3IocHVibGljIHF1ZXN0aW9uOiBRdWVzdGlvbkJhc2UpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcXVlc3Rpb24ucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJpc1Zpc2libGVcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uVmlzaWJpbGl0eUNoYW5nZWQoKTtcbiAgICB9KTtcbiAgICBxdWVzdGlvbi5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0aWVzVmFsdWVDaGFuZ2VkKFxuICAgICAgW1wicmVuZGVyV2lkdGhcIiwgXCJpbmRlbnRcIiwgXCJyaWdodEluZGVudFwiXSxcbiAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLm9uUmVuZGVyV2lkdGhDaGFuZ2VkKCk7XG4gICAgICB9XG4gICAgKTtcbiAgICBxdWVzdGlvbi5zdXJ2ZXlMb2FkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25TdXJ2ZXlMb2FkKCk7XG4gICAgfTtcbiAgICB0aGlzLmtvVGVtcGxhdGVOYW1lID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0VGVtcGxhdGVOYW1lKCk7XG4gICAgfSk7XG4gICAgdGhpcy5rb0VsZW1lbnRUeXBlID0ga28ub2JzZXJ2YWJsZShcInN1cnZleS1xdWVzdGlvblwiKTtcbiAgICB0aGlzLmtvVmlzaWJsZSA9IGtvLm9ic2VydmFibGUodGhpcy5xdWVzdGlvbi5pc1Zpc2libGUpO1xuICAgIHRoaXMua29SZW5kZXJXaWR0aCA9IGtvLm9ic2VydmFibGUodGhpcy5xdWVzdGlvbi5yZW5kZXJXaWR0aCk7XG4gICAgdGhpcy5rb0Vycm9ycyA9IGtvLm9ic2VydmFibGVBcnJheSgpO1xuICAgIHRoaXMua29QYWRkaW5nTGVmdCA9IGtvLm9ic2VydmFibGUoXG4gICAgICBzZWxmLmdldEluZGVudFNpemUoc2VsZi5xdWVzdGlvbi5pbmRlbnQpXG4gICAgKTtcbiAgICB0aGlzLmtvUGFkZGluZ1JpZ2h0ID0ga28ub2JzZXJ2YWJsZShcbiAgICAgIHNlbGYuZ2V0SW5kZW50U2l6ZShzZWxmLnF1ZXN0aW9uLnJpZ2h0SW5kZW50KVxuICAgICk7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvRWxlbWVudFR5cGVcIl0gPSB0aGlzLmtvRWxlbWVudFR5cGU7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvVGVtcGxhdGVOYW1lXCJdID0gdGhpcy5rb1RlbXBsYXRlTmFtZTtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29WaXNpYmxlXCJdID0gdGhpcy5rb1Zpc2libGU7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvUmVuZGVyV2lkdGhcIl0gPSB0aGlzLmtvUmVuZGVyV2lkdGg7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvRXJyb3JzXCJdID0gdGhpcy5rb0Vycm9ycztcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29QYWRkaW5nTGVmdFwiXSA9IHRoaXMua29QYWRkaW5nTGVmdDtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29QYWRkaW5nUmlnaHRcIl0gPSB0aGlzLmtvUGFkZGluZ1JpZ2h0O1xuICAgIHRoaXMucXVlc3Rpb25bXCJ1cGRhdGVRdWVzdGlvblwiXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi51cGRhdGVRdWVzdGlvbigpO1xuICAgIH07XG4gICAgdGhpcy5xdWVzdGlvbltcImtvQ3NzXCJdID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNlbGYucXVlc3Rpb24uY3NzQ2xhc3NlcztcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29Sb290Q2xhc3NcIl0gPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc2VsZi5xdWVzdGlvbi5zdXJ2ZXkucXVlc3Rpb25UaXRsZUxvY2F0aW9uID09PSBcImxlZnRcIikge1xuICAgICAgICByZXR1cm4gc2VsZi5xdWVzdGlvbi5jc3NDbGFzc2VzLm1haW5Sb290ICsgXCIgc3ZfcXN0bl9sZWZ0XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZi5xdWVzdGlvbi5jc3NDbGFzc2VzLm1haW5Sb290O1xuICAgIH0pO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVRdWVzdGlvbigpIHt9XG4gIHByb3RlY3RlZCBvblN1cnZleUxvYWQoKSB7XG4gICAgdGhpcy5vblZpc2liaWxpdHlDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmlzaWJpbGl0eUNoYW5nZWQoKSB7XG4gICAgdGhpcy5rb1Zpc2libGUodGhpcy5xdWVzdGlvbi5pc1Zpc2libGUpO1xuICB9XG4gIHByb3RlY3RlZCBvblJlbmRlcldpZHRoQ2hhbmdlZCgpIHtcbiAgICB0aGlzLmtvUmVuZGVyV2lkdGgodGhpcy5xdWVzdGlvbi5yZW5kZXJXaWR0aCk7XG4gICAgdGhpcy5rb1BhZGRpbmdMZWZ0KHRoaXMuZ2V0SW5kZW50U2l6ZSh0aGlzLnF1ZXN0aW9uLmluZGVudCkpO1xuICAgIHRoaXMua29QYWRkaW5nUmlnaHQodGhpcy5nZXRJbmRlbnRTaXplKHRoaXMucXVlc3Rpb24ucmlnaHRJbmRlbnQpKTtcbiAgfVxuICBwcml2YXRlIGdldEluZGVudFNpemUoaW5kZW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChpbmRlbnQgPCAxKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gaW5kZW50ICogdGhpcy5xdWVzdGlvbi5jc3NDbGFzc2VzLmluZGVudCArIFwicHhcIjtcbiAgfVxuICBwcml2YXRlIGdldFRlbXBsYXRlTmFtZSgpOiBzdHJpbmcge1xuICAgIGlmIChcbiAgICAgIHRoaXMucXVlc3Rpb24uY3VzdG9tV2lkZ2V0ICYmXG4gICAgICAhdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQud2lkZ2V0SnNvbi5pc0RlZmF1bHRSZW5kZXJcbiAgICApXG4gICAgICByZXR1cm4gXCJzdXJ2ZXktd2lkZ2V0LVwiICsgdGhpcy5xdWVzdGlvbi5jdXN0b21XaWRnZXQubmFtZTtcbiAgICByZXR1cm4gXCJzdXJ2ZXktcXVlc3Rpb24tXCIgKyB0aGlzLnF1ZXN0aW9uLmdldFRlbXBsYXRlKCk7XG4gIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uYmFzZS50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi4vc3VydmV5XCI7XG5pbXBvcnQgeyBJUGFnZSwgSVF1ZXN0aW9uLCBFdmVudCwgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgeyBQYWdlIH0gZnJvbSBcIi4va29wYWdlXCI7XG5pbXBvcnQgeyBQYWdlTW9kZWwgfSBmcm9tIFwiLi4vcGFnZVwiO1xuaW1wb3J0IHsgc3VydmV5Q3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbmltcG9ydCB7IGtvVGVtcGxhdGUsIFN1cnZleVRlbXBsYXRlVGV4dCB9IGZyb20gXCIuL3RlbXBsYXRlVGV4dFwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25DdXN0b21XaWRnZXQsXG4gIEN1c3RvbVdpZGdldENvbGxlY3Rpb25cbn0gZnJvbSBcIi4uL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0c1wiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuLi9pdGVtdmFsdWVcIjtcbmltcG9ydCB7IFF1ZXN0aW9uUmF0aW5nTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fcmF0aW5nXCI7XG5cbkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2Uub25DdXN0b21XaWRnZXRBZGRlZC5hZGQoY3VzdG9tV2lkZ2V0ID0+IHtcbiAgaWYgKGN1c3RvbVdpZGdldC53aWRnZXRKc29uLmlzRGVmYXVsdFJlbmRlcikgcmV0dXJuO1xuICBpZiAoIWN1c3RvbVdpZGdldC5odG1sVGVtcGxhdGUpXG4gICAgY3VzdG9tV2lkZ2V0Lmh0bWxUZW1wbGF0ZSA9XG4gICAgICBcIjxkaXY+J2h0bWxUZW1wbGF0ZScgYXR0cmlidXRlIGlzIG1pc3NlZC48L2Rpdj5cIjtcbiAgbmV3IFN1cnZleVRlbXBsYXRlVGV4dCgpLnJlcGxhY2VUZXh0KFxuICAgIGN1c3RvbVdpZGdldC5odG1sVGVtcGxhdGUsXG4gICAgXCJ3aWRnZXRcIixcbiAgICBjdXN0b21XaWRnZXQubmFtZVxuICApO1xufSk7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXkgZXh0ZW5kcyBTdXJ2ZXlNb2RlbCB7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IGNzc1R5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VydmV5Q3NzLmN1cnJlbnRUeXBlO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgc2V0IGNzc1R5cGUodmFsdWU6IHN0cmluZykge1xuICAgIHN1cnZleUNzcy5jdXJyZW50VHlwZSA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgcmVuZGVyZWRFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgLy9UT0RPIHJlbW92ZSBpdCwgc2luY2UgdGhlcmUgaXMgb25BZnRlclJlbmRlclN1cnZleVxuICBwdWJsaWMgb25SZW5kZXJlZDogRXZlbnQ8KHNlbmRlcjogU3VydmV5TW9kZWwpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4gYW55LFxuICAgIGFueVxuICA+KCk7XG4gIHByaXZhdGUgaXNGaXJzdFJlbmRlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAga29DdXJyZW50UGFnZTogYW55O1xuICBrb0lzRmlyc3RQYWdlOiBhbnk7XG4gIGtvSXNMYXN0UGFnZTogYW55O1xuICBrb0lzTmF2aWdhdGlvbkJ1dHRvbnNTaG93aW5nOiBhbnk7XG4gIGR1bW15T2JzZXJ2YWJsZTogYW55O1xuICBrb1N0YXRlOiBhbnk7XG4gIGtvUHJvZ3Jlc3M6IGFueTtcbiAga29Qcm9ncmVzc1RleHQ6IGFueTtcbiAga29BZnRlclJlbmRlclBhZ2U6IGFueTtcbiAga29Db21wbGV0ZWRTdGF0ZTogYW55O1xuICBrb0NvbXBsZXRlZFN0YXRlVGV4dDogYW55O1xuICBrb0NvbXBsZXRlZFN0YXRlQ3NzOiBhbnk7XG4gIGtvVGltZXJJbmZvVGV4dDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGpzb25PYmo6IGFueSA9IG51bGwsXG4gICAgcmVuZGVyZWRFbGVtZW50OiBhbnkgPSBudWxsLFxuICAgIGNzczogYW55ID0gbnVsbFxuICApIHtcbiAgICBzdXBlcihqc29uT2JqKTtcbiAgICBpZiAoY3NzKSB7XG4gICAgICB0aGlzLmNzcyA9IGNzcztcbiAgICB9XG4gICAgaWYgKHJlbmRlcmVkRWxlbWVudCkge1xuICAgICAgdGhpcy5yZW5kZXJlZEVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2Yga28gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJrbm9ja291dGpzIGxpYnJhcnkgaXMgbm90IGxvYWRlZC5cIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJ0aW1lU3BlbnRcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uVGltZVNwZW50Q2hhbmdlZCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZW5kZXIocmVuZGVyZWRFbGVtZW50KTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzc05hdmlnYXRpb25Db21wbGV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXZpZ2F0aW9uQ3NzKFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbkJ1dHRvbixcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb24uY29tcGxldGVcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzTmF2aWdhdGlvblByZXYoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmF2aWdhdGlvbkNzcyhcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb25CdXR0b24sXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uLnByZXZcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXQgY3NzTmF2aWdhdGlvblN0YXJ0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE5hdmlnYXRpb25Dc3MoXG4gICAgICB0aGlzLmNzcy5uYXZpZ2F0aW9uQnV0dG9uLFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbi5zdGFydFxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBjc3NOYXZpZ2F0aW9uTmV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROYXZpZ2F0aW9uQ3NzKFxuICAgICAgdGhpcy5jc3MubmF2aWdhdGlvbkJ1dHRvbixcbiAgICAgIHRoaXMuY3NzLm5hdmlnYXRpb24ubmV4dFxuICAgICk7XG4gIH1cbiAgcHVibGljIGdldCBjb21wbGV0ZWRDc3MoKSB7XG4gICAgdmFyIGNzcyA9IHN1cnZleUNzcy5nZXRDc3MoKTtcbiAgICByZXR1cm4gY3NzLmJvZHkgKyBcIiBcIiArIGNzcy5jb21wbGV0ZWRQYWdlO1xuICB9XG4gIHByaXZhdGUgZ2V0TmF2aWdhdGlvbkNzcyhtYWluOiBzdHJpbmcsIGJ0bjogc3RyaW5nKSB7XG4gICAgdmFyIHJlcyA9IFwiXCI7XG4gICAgaWYgKG1haW4pIHJlcyA9IG1haW47XG4gICAgaWYgKGJ0bikgcmVzICs9IFwiIFwiICsgYnRuO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCBjc3MoKTogYW55IHtcbiAgICByZXR1cm4gc3VydmV5Q3NzLmdldENzcygpO1xuICB9XG4gIHB1YmxpYyBzZXQgY3NzKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLm1lcmdlVmFsdWVzKHZhbHVlLCB0aGlzLmNzcyk7XG4gIH1cbiAgcHVibGljIHJlbmRlcihlbGVtZW50OiBhbnkgPSBudWxsKSB7XG4gICAgdGhpcy51cGRhdGVDdXN0b21XaWRnZXRzKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudCA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudCk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIGVsZW1lbnQgPSB0aGlzLnJlbmRlcmVkRWxlbWVudDtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcbiAgICBlbGVtZW50LmlubmVySFRNTCA9IHRoaXMuZ2V0SHRtbFRlbXBsYXRlKCk7XG4gICAgc2VsZi5zdGFydFRpbWVyRnJvbVVJKCk7XG4gICAgc2VsZi5hcHBseUJpbmRpbmcoKTtcbiAgfVxuICBwdWJsaWMga29FdmVudEFmdGVyUmVuZGVyKGVsZW1lbnQsIHN1cnZleSkge1xuICAgIHN1cnZleS5vblJlbmRlcmVkLmZpcmUoc2VsZiwge30pO1xuICAgIHN1cnZleS5hZnRlclJlbmRlclN1cnZleShlbGVtZW50KTtcbiAgfVxuICBwdWJsaWMgbG9hZFN1cnZleUZyb21TZXJ2aWNlKFxuICAgIHN1cnZleUlkOiBzdHJpbmcgPSBudWxsLFxuICAgIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLFxuICAgIHJlbmRlcmVkRWxlbWVudDogYW55ID0gbnVsbFxuICApIHtcbiAgICBpZiAocmVuZGVyZWRFbGVtZW50KSB7XG4gICAgICB0aGlzLnJlbmRlcmVkRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudDtcbiAgICB9XG4gICAgc3VwZXIubG9hZFN1cnZleUZyb21TZXJ2aWNlKHN1cnZleUlkLCBjbGllbnRJZCk7XG4gIH1cbiAgcHJvdGVjdGVkIHNldENvbXBsZXRlZCgpIHtcbiAgICBzdXBlci5zZXRDb21wbGV0ZWQoKTtcbiAgICB0aGlzLnVwZGF0ZUtvQ3VycmVudFBhZ2UoKTtcbiAgfVxuICBwdWJsaWMgc3RhcnQoKSB7XG4gICAgc3VwZXIuc3RhcnQoKTtcbiAgICB0aGlzLnVwZGF0ZUtvQ3VycmVudFBhZ2UoKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFnZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFBhZ2UobmFtZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldEh0bWxUZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBrb1RlbXBsYXRlO1xuICB9XG4gIHByb3RlY3RlZCBvbkJlZm9yZUNyZWF0aW5nKCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmR1bW15T2JzZXJ2YWJsZSA9IGtvLm9ic2VydmFibGUoMCk7XG4gICAgdGhpcy5rb0N1cnJlbnRQYWdlID0ga28ub2JzZXJ2YWJsZSh0aGlzLmN1cnJlbnRQYWdlKTtcbiAgICB0aGlzLmtvSXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcgPSBrby5jb21wdXRlZCgoKSA9PiB7XG4gICAgICB0aGlzLmR1bW15T2JzZXJ2YWJsZSgpO1xuICAgICAgcmV0dXJuIHRoaXMuaXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmc7XG4gICAgfSk7XG4gICAgdGhpcy5rb0lzRmlyc3RQYWdlID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgdGhpcy5kdW1teU9ic2VydmFibGUoKTtcbiAgICAgIHJldHVybiB0aGlzLmlzRmlyc3RQYWdlO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc0xhc3RQYWdlID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgdGhpcy5kdW1teU9ic2VydmFibGUoKTtcbiAgICAgIHJldHVybiB0aGlzLmlzTGFzdFBhZ2U7XG4gICAgfSk7XG4gICAgdGhpcy5rb1Byb2dyZXNzVGV4dCA9IGtvLmNvbXB1dGVkKCgpID0+IHtcbiAgICAgIHRoaXMuZHVtbXlPYnNlcnZhYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5wcm9ncmVzc1RleHQ7XG4gICAgfSk7XG4gICAgdGhpcy5rb1Byb2dyZXNzID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgdGhpcy5kdW1teU9ic2VydmFibGUoKTtcbiAgICAgIHJldHVybiB0aGlzLmdldFByb2dyZXNzKCk7XG4gICAgfSk7XG4gICAgdGhpcy5rb1N0YXRlID0ga28ub2JzZXJ2YWJsZSh0aGlzLnN0YXRlKTtcbiAgICB0aGlzLmtvQ29tcGxldGVkU3RhdGUgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHRoaXMua29Db21wbGV0ZWRTdGF0ZVRleHQgPSBrby5vYnNlcnZhYmxlKFwiXCIpO1xuICAgIHRoaXMua29Db21wbGV0ZWRTdGF0ZUNzcyA9IGtvLm9ic2VydmFibGUoXCJcIik7XG4gICAgdGhpcy5rb1RpbWVySW5mb1RleHQgPSBrby5vYnNlcnZhYmxlKHRoaXMudGltZXJJbmZvVGV4dCk7XG4gICAgdGhpcy5rb0FmdGVyUmVuZGVyUGFnZSA9IGZ1bmN0aW9uKGVsZW1lbnRzLCBjb24pIHtcbiAgICAgIHZhciBlbCA9IFN1cnZleUVsZW1lbnQuR2V0Rmlyc3ROb25UZXh0RWxlbWVudChlbGVtZW50cyk7XG4gICAgICBpZiAoZWwpIHNlbGYuYWZ0ZXJSZW5kZXJQYWdlKGVsKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBjdXJyZW50UGFnZUNoYW5nZWQobmV3VmFsdWU6IFBhZ2VNb2RlbCwgb2xkVmFsdWU6IFBhZ2VNb2RlbCkge1xuICAgIHRoaXMudXBkYXRlS29DdXJyZW50UGFnZSgpO1xuICAgIHN1cGVyLmN1cnJlbnRQYWdlQ2hhbmdlZChuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgIGlmICghdGhpcy5pc0Rlc2lnbk1vZGUpIHRoaXMuc2Nyb2xsVG9Ub3BPblBhZ2VDaGFuZ2UoKTtcbiAgfVxuICBwYWdlVmlzaWJpbGl0eUNoYW5nZWQocGFnZTogSVBhZ2UsIG5ld1ZhbHVlOiBib29sZWFuKSB7XG4gICAgc3VwZXIucGFnZVZpc2liaWxpdHlDaGFuZ2VkKHBhZ2UsIG5ld1ZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZUtvQ3VycmVudFBhZ2UoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Mb2FkU3VydmV5RnJvbVNlcnZpY2UoKSB7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Mb2FkaW5nU3VydmV5RnJvbVNlcnZpY2UoKSB7XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0Q29tcGxldGVkU3RhdGUodmFsdWU6IHN0cmluZywgdGV4dDogc3RyaW5nKSB7XG4gICAgc3VwZXIuc2V0Q29tcGxldGVkU3RhdGUodmFsdWUsIHRleHQpO1xuICAgIHRoaXMua29Db21wbGV0ZWRTdGF0ZSh0aGlzLmNvbXBsZXRlZFN0YXRlKTtcbiAgICB0aGlzLmtvQ29tcGxldGVkU3RhdGVUZXh0KHRoaXMuY29tcGxldGVkU3RhdGVUZXh0KTtcbiAgICB0aGlzLmtvQ29tcGxldGVkU3RhdGVDc3MoXG4gICAgICB0aGlzLmNvbXBsZXRlZFN0YXRlICE9PSBcIlwiID8gdGhpcy5jc3Muc2F2ZURhdGFbdGhpcy5jb21wbGV0ZWRTdGF0ZV0gOiBcIlwiXG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25UaW1lU3BlbnRDaGFuZ2VkKCkge1xuICAgIHRoaXMua29UaW1lckluZm9UZXh0KHRoaXMudGltZXJJbmZvVGV4dCk7XG4gIH1cbiAgcHJpdmF0ZSBhcHBseUJpbmRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnJlbmRlcmVkRWxlbWVudCkgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlS29DdXJyZW50UGFnZSgpO1xuICAgIGtvLmNsZWFuTm9kZSh0aGlzLnJlbmRlcmVkRWxlbWVudCk7XG4gICAgaWYgKCF0aGlzLmlzRmlyc3RSZW5kZXIpIHtcbiAgICAgIHRoaXMudXBkYXRlQ3VycmVudFBhZ2VRdWVzdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5pc0ZpcnN0UmVuZGVyID0gZmFsc2U7XG4gICAga28uYXBwbHlCaW5kaW5ncyh0aGlzLCB0aGlzLnJlbmRlcmVkRWxlbWVudCk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVLb0N1cnJlbnRQYWdlKCkge1xuICAgIGlmICh0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSByZXR1cm47XG4gICAgdGhpcy5kdW1teU9ic2VydmFibGUodGhpcy5kdW1teU9ic2VydmFibGUoKSArIDEpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlICE9PSB0aGlzLmtvQ3VycmVudFBhZ2UoKSkge1xuICAgICAgdGhpcy5rb0N1cnJlbnRQYWdlKHRoaXMuY3VycmVudFBhZ2UpO1xuICAgIH1cbiAgICB0aGlzLmtvU3RhdGUodGhpcy5zdGF0ZSk7XG4gIH1cbiAgcHJpdmF0ZSB1cGRhdGVDdXJyZW50UGFnZVF1ZXN0aW9ucygpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5jdXJyZW50UGFnZSA/IHRoaXMuY3VycmVudFBhZ2UucXVlc3Rpb25zIDogW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxID0gcXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKHEudmlzaWJsZSkgcVtcInVwZGF0ZVF1ZXN0aW9uXCJdKCk7XG4gICAgfVxuICB9XG59XG5cbkxvY2FsaXphYmxlU3RyaW5nLnByb3RvdHlwZVtcIm9uQ3JlYXRpbmdcIl0gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICB0aGlzLmtvUmVSZW5kZXIgPSBrby5vYnNlcnZhYmxlKDApO1xuICB0aGlzLmtvUmVuZGVyZWRIdG1sID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgIHNlbGYua29SZVJlbmRlcigpO1xuICAgIHJldHVybiBzZWxmLnJlbmRlcmVkSHRtbDtcbiAgfSk7XG59O1xuXG5Mb2NhbGl6YWJsZVN0cmluZy5wcm90b3R5cGVbXCJvbkNoYW5nZWRcIl0gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5rb1JlUmVuZGVyKHRoaXMua29SZVJlbmRlcigpICsgMSk7XG59O1xuXG5rby5jb21wb25lbnRzLnJlZ2lzdGVyKFwic3VydmV5XCIsIHtcbiAgdmlld01vZGVsOiB7XG4gICAgY3JlYXRlVmlld01vZGVsOiBmdW5jdGlvbihwYXJhbXMsIGNvbXBvbmVudEluZm8pIHtcbiAgICAgIHZhciBzdXJ2ZXk6IFN1cnZleSA9IGtvLnVud3JhcChwYXJhbXMuc3VydmV5KTtcbiAgICAgIHN1cnZleS5yZW5kZXIoKTtcbiAgICAgIHJldHVybiBwYXJhbXMuc3VydmV5O1xuICAgIH1cbiAgfSxcbiAgdGVtcGxhdGU6IGtvVGVtcGxhdGVcbn0pO1xuXG5rby5iaW5kaW5nSGFuZGxlcnNbXCJzdXJ2ZXlQcm9wXCJdID0ge1xuICB1cGRhdGU6IGZ1bmN0aW9uKGVsZW1lbnQsIHZhbHVlQWNjZXNzb3IsIGFsbEJpbmRpbmdzQWNjZXNzb3IpIHtcbiAgICB2YXIgdmFsdWUgPSBrby51dGlscy51bndyYXBPYnNlcnZhYmxlKHZhbHVlQWNjZXNzb3IoKSkgfHwge307XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcE5hbWUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB2YXIgcHJvcFZhbHVlID0ga28udXRpbHMudW53cmFwT2JzZXJ2YWJsZSh2YWx1ZVtwcm9wTmFtZV0pO1xuICAgICAgICBlbGVtZW50W3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5TdXJ2ZXlNb2RlbC5wbGF0Zm9ybSA9IFwia25vY2tvdXRcIjtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3N1cnZleS50cyIsImltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBIYXNoVGFibGUsIEhlbHBlcnMgfSBmcm9tIFwiLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICBCYXNlLFxuICBJUGFnZSxcbiAgSUNvbmRpdGlvblJ1bm5lcixcbiAgSVN1cnZleSxcbiAgSUVsZW1lbnQsXG4gIElRdWVzdGlvbixcbiAgU3VydmV5RWxlbWVudFxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbmJhc2VcIjtcbmltcG9ydCB7IENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCwgUGFuZWxNb2RlbEJhc2UsIFF1ZXN0aW9uUm93TW9kZWwgfSBmcm9tIFwiLi9wYW5lbFwiO1xuLyoqXG4gKiBUaGUgcGFnZSBvYmplY3QuIEl0IGhhcyBlbGVtZW50cyBjb2xsZWN0aW9uLCB0aGF0IGNvbnRhaW5zIHF1ZXN0aW9ucyBhbmQgcGFuZWxzLlxuICovXG5leHBvcnQgY2xhc3MgUGFnZU1vZGVsIGV4dGVuZHMgUGFuZWxNb2RlbEJhc2UgaW1wbGVtZW50cyBJUGFnZSB7XG4gIHByaXZhdGUgaGFzU2hvd25WYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJcIikge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicGFnZVwiO1xuICB9XG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB2aXNpYmxlIGluZGV4IG9mIHRoZSBwYWdlLiBJdCBoYXMgdmFsdWVzIGZyb20gMCB0byB2aXNpYmxlIHBhZ2UgY291bnQgLSAxLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnZpc2libGVQYWdlc1xuICAgKiBAc2VlIFN1cnZleU1vZGVsLnBhZ2VzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgLTEpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZUluZGV4KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidmlzaWJsZUluZGV4XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIHBhZ2UgaXMgc3RhcnRlZCBwYWdlIGluIHRoZSBzdXJ2ZXkuIEl0IGNhbiBiZSBzaG93biBvbiB0aGUgc3RhcnQgb25seSBhbmQgdGhlIGVuZC11c2VyIGNvdWxkIG5vdCBjb21lYmFjayB0byBpdCBhZnRlciBpdCBwYXNzZWQgaXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzU3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNQYWdlU3RhcnRlZCh0aGlzKTtcbiAgfVxuICBnZXRJc1BhZ2VWaXNpYmxlKGV4Y2VwdGlvblF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1N0YXJ0ZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gc3VwZXIuZ2V0SXNQYWdlVmlzaWJsZShleGNlcHRpb25RdWVzdGlvbik7XG4gIH1cbiAgcHVibGljIGdldCBudW0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm51bVwiLCAtMSk7XG4gIH1cbiAgcHVibGljIHNldCBudW0odmFsOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5udW0gPT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwibnVtXCIsIHZhbCk7XG4gICAgdGhpcy5vbk51bUNoYW5nZWQodmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJoaWRlXCIgdG8gbWFrZSBcIlByZXZcIiwgXCJOZXh0XCIgYW5kIFwiQ29tcGxldGVcIiBidXR0b25zIGFyZSBpbnZpc2libGUgZm9yIHRoaXMgcGFnZS4gU2V0IHRoaXMgcHJvcGVydHkgdG8gXCJzaG93XCIgdG8gbWFrZSB0aGVzZSBidXR0b25zIHZpc2libGUsIGV2ZW4gaWYgc3VydmV5IHNob3dOYXZpZ2F0aW9uQnV0dG9ucyBwcm9wZXJ0eSBpcyBmYWxzZS5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlLnNob3dOYXZpZ2F0aW9uQnV0dG9uc1xuICAgKi9cbiAgcHVibGljIGdldCBuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwibmF2aWdhdGlvbkJ1dHRvbnNWaXNpYmlsaXR5XCIsIFwiaW5oZXJpdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm5hdmlnYXRpb25CdXR0b25zVmlzaWJpbGl0eVwiLCB2YWwudG9Mb3dlckNhc2UoKSk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJlbmRlcmVkVGl0bGUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHN0ciA9IHN1cGVyLmdldFJlbmRlcmVkVGl0bGUoc3RyKTtcbiAgICBpZiAodGhpcy5udW0gPiAwKSB7XG4gICAgICBzdHIgPSB0aGlzLm51bSArIFwiLiBcIiArIHN0cjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICAvKipcbiAgICogVGhlIHByb3BlcnR5IHJldHVybnMgdHJ1ZSwgaWYgdGhlIHBhZ2UgaGFzIGJlZW4gc2hvd24gdG8gdGhlIGVuZC11c2VyLlxuICAgKi9cbiAgcHVibGljIGdldCB3YXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNTaG93blZhbHVlO1xuICB9XG4gIGdldCBoYXNTaG93bigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53YXNTaG93bjtcbiAgfVxuICBwdWJsaWMgc2V0V2FzU2hvd24odmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIGlmICh2YWwgPT0gdGhpcy5oYXNTaG93blZhbHVlKSByZXR1cm47XG4gICAgaWYgKHZhbCA9PSB0cnVlICYmIHRoaXMuYXJlUXVlc3Rpb25zUmFuZG9taXplZCkge1xuICAgICAgdGhpcy5yYW5kb21pemVFbGVtZW50cygpO1xuICAgIH1cbiAgICB0aGlzLmhhc1Nob3duVmFsdWUgPSB2YWw7XG4gIH1cbiAgcHJpdmF0ZSByYW5kb21pemVFbGVtZW50cygpIHtcbiAgICB2YXIgb2xkRWxlbWVudHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9sZEVsZW1lbnRzLnB1c2godGhpcy5lbGVtZW50c1tpXSk7XG4gICAgfVxuICAgIHZhciBuZXdFbGVtZW50cyA9IEhlbHBlcnMucmFuZG9taXplQXJyYXk8SUVsZW1lbnQ+KG9sZEVsZW1lbnRzKTtcbiAgICB0aGlzLmVsZW1lbnRzLnNwbGljZSgwLCB0aGlzLmVsZW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbGVtZW50cy5wdXNoKG5ld0VsZW1lbnRzW2ldKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSByZXR1cm5zIHRydWUsIGlmIHRoZSBlbGVtZW50cyBhcmUgcmFuZG9taXplZCBvbiB0aGUgcGFnZVxuICAgKiBAc2VlIGhhc1Nob3duXG4gICAqIEBzZWUgcXVlc3Rpb25zT3JkZXJcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvbnNPcmRlclxuICAgKi9cbiAgcHVibGljIGdldCBhcmVRdWVzdGlvbnNSYW5kb21pemVkKCk6IGJvb2xlYW4ge1xuICAgIHZhciBvcmRlciA9XG4gICAgICB0aGlzLnF1ZXN0aW9uc09yZGVyID09IFwiZGVmYXVsdFwiICYmIHRoaXMuc3VydmV5XG4gICAgICAgID8gdGhpcy5zdXJ2ZXkucXVlc3Rpb25zT3JkZXJcbiAgICAgICAgOiB0aGlzLnF1ZXN0aW9uc09yZGVyO1xuICAgIHJldHVybiBvcmRlciA9PSBcInJhbmRvbVwiO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byByYW5kb21pemUgcXVlc3Rpb25zLiBTZXQgaXQgdG8gJ3JhbmRvbScgdG8gcmFuZG9taXplIHF1ZXN0aW9ucywgJ2luaXRpYWwnIHRvIGtlZXAgdGhlbSBpbiB0aGUgc2FtZSBvcmRlciBvciAnZGVmYXVsdCcgdG8gdXNlIHRoZSBTdXJ2ZXkgcXVlc3Rpb25zT3JkZXIgcHJvcGVydHlcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5xdWVzdGlvbnNPcmRlclxuICAgKiBAc2VlIGFyZVF1ZXN0aW9uc1JhbmRvbWl6ZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgcXVlc3Rpb25zT3JkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInF1ZXN0aW9uc09yZGVyXCIsIFwiZGVmYXVsdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXN0aW9uc09yZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicXVlc3Rpb25zT3JkZXJcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBpdCB0byBmb2N1cyB0aGUgaW5wdXQgb24gdGhlIGZpcnN0IHF1ZXN0aW9uXG4gICAqL1xuICBwdWJsaWMgZm9jdXNGaXJzdFF1ZXN0aW9uKCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbiA9IHRoaXMucXVlc3Rpb25zW2ldO1xuICAgICAgaWYgKCFxdWVzdGlvbi52aXNpYmxlIHx8ICFxdWVzdGlvbi5oYXNJbnB1dCkgY29udGludWU7XG4gICAgICB0aGlzLnF1ZXN0aW9uc1tpXS5mb2N1cygpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIGl0IHRvIGZvY3VzIHRoZSBpbnB1dCBvZiB0aGUgZmlyc3QgcXVlc3Rpb24gdGhhdCBoYXMgYW4gZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgZm9jdXNGaXJzdEVycm9yUXVlc3Rpb24oKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5xdWVzdGlvbnNbaV0udmlzaWJsZSB8fFxuICAgICAgICB0aGlzLnF1ZXN0aW9uc1tpXS5jdXJyZW50RXJyb3JDb3VudCA9PSAwXG4gICAgICApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdGhpcy5xdWVzdGlvbnNbaV0uZm9jdXModHJ1ZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgaXQgdG8gc2Nyb2xsIHRvIHRoZSBwYWdlIHRvcC5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxUb1RvcCgpIHtcbiAgICBTdXJ2ZXlFbGVtZW50LlNjcm9sbEVsZW1lbnRUb1RvcCh0aGlzLmlkKTtcbiAgfVxuICAvKipcbiAgICogVGltZSBpbiBzZWNvbmRzIGVuZC11c2VyIHNwZW50IG9uIHRoaXMgcGFnZVxuICAgKi9cbiAgcHVibGljIGdldCB0aW1lU3BlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGltZVNwZW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZVNwZW50KHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGltZVNwZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyB0aGF0IGVuZC11c2VyIGhhcyB0byBjb21wbGV0ZSB0aGUgcGFnZS4gSWYgdGhlIHZhbHVlIGlzIDAgb3IgbGVzcywgdGhlIGVuZC11c2VyIGhhcyB1bmxpbWl0ZWQgbnVtYmVyIG9mIHRpbWUgdG8gZmluaXNoIHRoZSBwYWdlLlxuICAgKiBAc2VlIHN0YXJ0VGltZXJcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5tYXhUaW1lVG9GaW5pc2hQYWdlXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFRpbWVUb0ZpbmlzaCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhUaW1lVG9GaW5pc2godmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhUaW1lVG9GaW5pc2hcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25OdW1DaGFuZ2VkKHZhbHVlOiBudW1iZXIpIHt9XG4gIHByb3RlY3RlZCBvblZpc2libGVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkgIT0gbnVsbCkge1xuICAgICAgdGhpcy5zdXJ2ZXkucGFnZVZpc2liaWxpdHlDaGFuZ2VkKHRoaXMsIHRoaXMudmlzaWJsZSk7XG4gICAgfVxuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwicGFnZVwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJuYXZpZ2F0aW9uQnV0dG9uc1Zpc2liaWxpdHlcIixcbiAgICAgIGRlZmF1bHQ6IFwiaW5oZXJpdFwiLFxuICAgICAgY2hvaWNlczogW1wiaW5oZXJpdFwiLCBcInNob3dcIiwgXCJoaWRlXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInF1ZXN0aW9uc09yZGVyXCIsXG4gICAgICBkZWZhdWx0OiBcImRlZmF1bHRcIixcbiAgICAgIGNob2ljZXM6IFtcImRlZmF1bHRcIiwgXCJpbml0aWFsXCIsIFwicmFuZG9tXCJdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwibWF4VGltZVRvRmluaXNoOm51bWJlclwiLCBkZWZhdWx0OiAwIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBQYWdlTW9kZWwoKTtcbiAgfSxcbiAgXCJwYW5lbGJhc2VcIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wYWdlLnRzIiwiaW1wb3J0IHsgQmFzZSwgSVF1ZXN0aW9uLCBFdmVudCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0IHtcbiAgcHVibGljIGh0bWxUZW1wbGF0ZTogc3RyaW5nO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgd2lkZ2V0SnNvbjogYW55KSB7XG4gICAgdGhpcy5odG1sVGVtcGxhdGUgPSB3aWRnZXRKc29uLmh0bWxUZW1wbGF0ZSA/IHdpZGdldEpzb24uaHRtbFRlbXBsYXRlIDogXCJcIjtcbiAgfVxuICBwdWJsaWMgYWZ0ZXJSZW5kZXIocXVlc3Rpb246IElRdWVzdGlvbiwgZWw6IGFueSkge1xuICAgIGlmICh0aGlzLndpZGdldEpzb24uYWZ0ZXJSZW5kZXIpIHRoaXMud2lkZ2V0SnNvbi5hZnRlclJlbmRlcihxdWVzdGlvbiwgZWwpO1xuICB9XG4gIHB1YmxpYyB3aWxsVW5tb3VudChxdWVzdGlvbjogSVF1ZXN0aW9uLCBlbDogYW55KSB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SnNvbi53aWxsVW5tb3VudCkgdGhpcy53aWRnZXRKc29uLndpbGxVbm1vdW50KHF1ZXN0aW9uLCBlbCk7XG4gIH1cbiAgcHVibGljIGlzRml0KHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0xpYnJhcnlMb2FkZWQoKSAmJiB0aGlzLndpZGdldEpzb24uaXNGaXQpXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLmlzRml0KHF1ZXN0aW9uKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuaXNMaWJyYXJ5TG9hZGVkKCkgJiYgdGhpcy53aWRnZXRKc29uLmFjdGl2YXRlZEJ5Q2hhbmdlZCkge1xuICAgICAgdGhpcy53aWRnZXRKc29uLmFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaXNMaWJyYXJ5TG9hZGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLndpZGdldEpzb24ud2lkZ2V0SXNMb2FkZWQpXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLndpZGdldElzTG9hZGVkKCkgPT0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzRGVmYXVsdFJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRKc29uLmlzRGVmYXVsdFJlbmRlcjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbiB7XG4gIHB1YmxpYyBzdGF0aWMgSW5zdGFuY2U6IEN1c3RvbVdpZGdldENvbGxlY3Rpb24gPSBuZXcgQ3VzdG9tV2lkZ2V0Q29sbGVjdGlvbigpO1xuICBwcml2YXRlIHdpZGdldHNWYWx1ZXM6IEFycmF5PFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0PiA9IFtdO1xuICBwcml2YXRlIHdpZGdldHNBY3RpdmF0ZWRCeSA9IHt9O1xuXG4gIHB1YmxpYyBvbkN1c3RvbVdpZGdldEFkZGVkOiBFdmVudDxcbiAgICAoY3VzdG9tV2lkZ2V0OiBRdWVzdGlvbkN1c3RvbVdpZGdldCkgPT4gYW55LFxuICAgIGFueVxuICA+ID0gbmV3IEV2ZW50PChjdXN0b21XaWRnZXQ6IFF1ZXN0aW9uQ3VzdG9tV2lkZ2V0KSA9PiBhbnksIGFueT4oKTtcblxuICBwdWJsaWMgZ2V0IHdpZGdldHMoKTogQXJyYXk8UXVlc3Rpb25DdXN0b21XaWRnZXQ+IHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRzVmFsdWVzO1xuICB9XG4gIHB1YmxpYyBhZGRDdXN0b21XaWRnZXQod2lkZ2V0SnNvbjogYW55LCBhY3RpdmF0ZWRCeTogc3RyaW5nID0gXCJwcm9wZXJ0eVwiKSB7XG4gICAgdmFyIG5hbWUgPSB3aWRnZXRKc29uLm5hbWU7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBuYW1lID0gXCJ3aWRnZXRfXCIgKyB0aGlzLndpZGdldHMubGVuZ3RoICsgMTtcbiAgICB9XG4gICAgdmFyIGN1c3RvbVdpZGdldCA9IG5ldyBRdWVzdGlvbkN1c3RvbVdpZGdldChuYW1lLCB3aWRnZXRKc29uKTtcbiAgICB0aGlzLndpZGdldHNWYWx1ZXMucHVzaChjdXN0b21XaWRnZXQpO1xuICAgIHRoaXMud2lkZ2V0c0FjdGl2YXRlZEJ5W25hbWVdID0gYWN0aXZhdGVkQnk7XG4gICAgY3VzdG9tV2lkZ2V0LmFjdGl2YXRlZEJ5Q2hhbmdlZChhY3RpdmF0ZWRCeSk7XG4gICAgdGhpcy5vbkN1c3RvbVdpZGdldEFkZGVkLmZpcmUoY3VzdG9tV2lkZ2V0LCBudWxsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgd2F5IHRoZSBjdXN0b20gd2lnZXQgaXMgYWN0aXZhdGVkLiBJdCBjYW4gYmUgYWN0aXZhdGVkIGJ5IGEgcHJvcGVydHkgKFwicHJvcGVydHlcIiksIHF1ZXN0aW9uIHR5cGUgKFwidHlwZVwiKSBvciBieSBuZXcvY3VzdG9tIHF1ZXN0aW9uIHR5cGUgKFwiY3VzdG9tdHlwZVwiKS5cbiAgICogQHBhcmFtIHdpZGdldE5hbWUgdGhlIGN1c3RvbSB3aWRnZXQgbmFtZVxuICAgKiBAc2VlIHNldEFjdGl2YXRlZEJ5XG4gICAqL1xuICBwdWJsaWMgZ2V0QWN0aXZhdGVkQnkod2lkZ2V0TmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHJlcyA9IHRoaXMud2lkZ2V0c0FjdGl2YXRlZEJ5W3dpZGdldE5hbWVdO1xuICAgIHJldHVybiByZXMgPyByZXMgOiBcInByb3BlcnR5XCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHdheSB0aGUgY3VzdG9tIHdpZ2V0IGlzIGFjdGl2YXRlZC4gVGhlIGFjdGl2YXRpb24gdHlwZXMgYXJlOiBwcm9wZXJ0eSAoXCJwcm9wZXJ0eVwiKSwgcXVlc3Rpb24gdHlwZSAoXCJ0eXBlXCIpIG9yIG5ldy9jdXN0b20gcXVlc3Rpb24gdHlwZSAoXCJjdXN0b210eXBlXCIpLiBBIGN1c3RvbSB3aWdldCBtYXkgc3VwcG9ydCBhbGwgb3Igb25seSBzb21lIG9mIHRoaXMgYWN0aXZhdGlvbiB0eXBlcy5cbiAgICogQHBhcmFtIHdpZGdldE5hbWVcbiAgICogQHBhcmFtIGFjdGl2YXRlZEJ5IHRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSB2YXJpYW50czogXCJwcm9wZXJ0eVwiLCBcInR5cGVcIiBhbmQgXCJjdXN0b210eXBlXCJcbiAgICovXG4gIHB1YmxpYyBzZXRBY3RpdmF0ZWRCeSh3aWRnZXROYW1lOiBzdHJpbmcsIGFjdGl2YXRlZEJ5OiBzdHJpbmcpIHtcbiAgICBpZiAoIXdpZGdldE5hbWUgfHwgIWFjdGl2YXRlZEJ5KSByZXR1cm47XG4gICAgdmFyIHdpZGdldCA9IHRoaXMuZ2V0Q3VzdG9tV2lkZ2V0QnlOYW1lKHdpZGdldE5hbWUpO1xuICAgIGlmICghd2lkZ2V0KSByZXR1cm47XG4gICAgdGhpcy53aWRnZXRzQWN0aXZhdGVkQnlbd2lkZ2V0TmFtZV0gPSBhY3RpdmF0ZWRCeTtcbiAgICB3aWRnZXQuYWN0aXZhdGVkQnlDaGFuZ2VkKGFjdGl2YXRlZEJ5KTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy53aWRnZXRzVmFsdWVzID0gW107XG4gIH1cbiAgcHVibGljIGdldEN1c3RvbVdpZGdldEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndpZGdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLndpZGdldHNbaV0ubmFtZSA9PSBuYW1lKSByZXR1cm4gdGhpcy53aWRnZXRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwdWJsaWMgZ2V0Q3VzdG9tV2lkZ2V0KHF1ZXN0aW9uOiBJUXVlc3Rpb24pOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndpZGdldHNWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLndpZGdldHNWYWx1ZXNbaV0uaXNGaXQocXVlc3Rpb24pKSByZXR1cm4gdGhpcy53aWRnZXRzVmFsdWVzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0cy50cyIsImltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhbiBpbnB1dCB0ZXh0IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25UZXh0TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGxhY2VIb2xkZXJcIiwgdGhpcyk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBpbnB1dCB0eXBlLlxuICAgKi9cbiAgcHVibGljIGdldCBpbnB1dFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaW5wdXRUeXBlXCIsIFwidGV4dFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlucHV0VHlwZSh2YWw6IHN0cmluZykge1xuICAgIHZhbCA9IHZhbC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh2YWwgPT0gXCJkYXRldGltZV9sb2NhbFwiKSB2YWwgPSBcImRhdGV0aW1lLWxvY2FsXCI7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW5wdXRUeXBlXCIsIHZhbC50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRleHQgaW5wdXQgc2l6ZVxuICAgKi9cbiAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNpemVcIiwgMjUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2l6ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInNpemVcIiwgdmFsKTtcbiAgfVxuICBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5pc0VtcHR5KCkgfHwgdGhpcy52YWx1ZSA9PT0gXCJcIjtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIGlucHV0IHBsYWNlIGhvbGRlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGxhY2VIb2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwbGFjZUhvbGRlclwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NQbGFjZUhvbGRlcigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJwbGFjZUhvbGRlclwiKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0TmV3VmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIG5ld1ZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWVUeXBlKG5ld1ZhbHVlKTtcbiAgICBzdXBlci5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNvcnJlY3RWYWx1ZVR5cGUobmV3VmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKCFuZXdWYWx1ZSkgcmV0dXJuIG5ld1ZhbHVlO1xuICAgIGlmICh0aGlzLmlucHV0VHlwZSA9PSBcIm51bWJlclwiIHx8IHRoaXMuaW5wdXRUeXBlID09IFwicmFuZ2VcIikge1xuICAgICAgcmV0dXJuIHRoaXMuaXNOdW1iZXIobmV3VmFsdWUpID8gcGFyc2VGbG9hdChuZXdWYWx1ZSkgOiBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gbmV3VmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBpc051bWJlcih2YWx1ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSkpICYmIGlzRmluaXRlKHZhbHVlKTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcInRleHRcIixcbiAgW1xuICAgIHtcbiAgICAgIG5hbWU6IFwiaW5wdXRUeXBlXCIsXG4gICAgICBkZWZhdWx0OiBcInRleHRcIixcbiAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgXCJjb2xvclwiLFxuICAgICAgICBcImRhdGVcIixcbiAgICAgICAgXCJkYXRldGltZVwiLFxuICAgICAgICBcImRhdGV0aW1lLWxvY2FsXCIsXG4gICAgICAgIFwiZW1haWxcIixcbiAgICAgICAgXCJtb250aFwiLFxuICAgICAgICBcIm51bWJlclwiLFxuICAgICAgICBcInBhc3N3b3JkXCIsXG4gICAgICAgIFwicmFuZ2VcIixcbiAgICAgICAgXCJ0ZWxcIixcbiAgICAgICAgXCJ0ZXh0XCIsXG4gICAgICAgIFwidGltZVwiLFxuICAgICAgICBcInVybFwiLFxuICAgICAgICBcIndlZWtcIlxuICAgICAgXVxuICAgIH0sXG4gICAgeyBuYW1lOiBcInNpemU6bnVtYmVyXCIsIGRlZmF1bHQ6IDI1IH0sXG4gICAgeyBuYW1lOiBcInBsYWNlSG9sZGVyXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQbGFjZUhvbGRlclwiIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblRleHRNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInRleHRcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25UZXh0TW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl90ZXh0LnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgQmFzZSxcbiAgU3VydmV5RWxlbWVudCxcbiAgSUVsZW1lbnQsXG4gIElRdWVzdGlvbixcbiAgSUNvbmRpdGlvblJ1bm5lcixcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlJbXBsLFxuICBFdmVudCxcbiAgU3VydmV5RXJyb3IsXG4gIElQYW5lbCxcbiAgSVBhZ2Vcbn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DdXN0b21XaWRnZXQgfSBmcm9tIFwiLi9xdWVzdGlvbkN1c3RvbVdpZGdldHNcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBDb25kaXRpb25SdW5uZXIgfSBmcm9tIFwiLi9jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5pbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG5pbXBvcnQgeyBDdXN0b21XaWRnZXRDb2xsZWN0aW9uIH0gZnJvbSBcIi4vcXVlc3Rpb25DdXN0b21XaWRnZXRzXCI7XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciBhbGwgcXVlc3Rpb25zLiBRdWVzdGlvbkJhc2UgZG9lc24ndCBoYXZlIGluZm9ybWF0aW9uIGFib3V0IHRpdGxlLCB2YWx1ZXMsIGVycm9ycyBhbmQgc28gb24uXG4gKiBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGluIHRoZSBRdWVzdGlvbiBjbGFzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQmFzZSBleHRlbmRzIFN1cnZleUVsZW1lbnRcbiAgaW1wbGVtZW50cyBJUXVlc3Rpb24sIElDb25kaXRpb25SdW5uZXIsIElMb2NhbGl6YWJsZU93bmVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcXVlc3Rpb25Db3VudGVyID0gMTAwO1xuICBwcml2YXRlIHN0YXRpYyBnZXRRdWVzdGlvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwic3FfXCIgKyBRdWVzdGlvbkJhc2UucXVlc3Rpb25Db3VudGVyKys7XG4gIH1cbiAgcHJpdmF0ZSBjb25kaXRpb25SdW5uZXI6IENvbmRpdGlvblJ1bm5lciA9IG51bGw7XG4gIHByaXZhdGUgaXNDdXN0b21XaWRnZXRSZXF1ZXN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBjdXN0b21XaWRnZXRWYWx1ZTogUXVlc3Rpb25DdXN0b21XaWRnZXQ7XG4gIGN1c3RvbVdpZGdldERhdGEgPSB7IGlzTmVlZFJlbmRlcjogdHJ1ZSB9O1xuICAvKipcbiAgICogVGhlIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHN1cnZleSBjaGFuZ2UgaXQncyBsb2NhbGVcbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC5sb2NhbGVcbiAgICovXG4gIHB1YmxpYyBsb2NhbGVDaGFuZ2VkOiBFdmVudDwoc2VuZGVyOiBRdWVzdGlvbkJhc2UpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDxcbiAgICAoc2VuZGVyOiBRdWVzdGlvbkJhc2UpID0+IGFueSxcbiAgICBhbnlcbiAgPigpO1xuICBmb2N1c0NhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBzdXJ2ZXlMb2FkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuaWQgPSBRdWVzdGlvbkJhc2UuZ2V0UXVlc3Rpb25JZCgpO1xuICAgIHRoaXMub25DcmVhdGluZygpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicXVlc3Rpb25iYXNlXCI7XG4gIH1cbiAgcHVibGljIHNldFN1cnZleUltcGwodmFsdWU6IElTdXJ2ZXlJbXBsKSB7XG4gICAgc3VwZXIuc2V0U3VydmV5SW1wbCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuc3VydmV5ICYmIHRoaXMuc3VydmV5LmlzRGVzaWduTW9kZSkgdGhpcy5vblZpc2libGVDaGFuZ2VkKCk7XG4gIH1cbiAgLyoqXG4gICAqIEEgcGFyZW50IGVsZW1lbnQuIEl0IGNhbiBiZSBwYW5lbCBvciBwYWdlLlxuICAgKi9cbiAgcHVibGljIGdldCBwYXJlbnQoKTogSVBhbmVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIG51bGwpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFyZW50KHZhbDogSVBhbmVsKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGFyZW50XCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGlzQW5zd2VyQ29ycmVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHBhZ2Ugd2hlcmUgdGhlIHF1ZXN0aW9uIGlzIGxvY2F0ZWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhZ2UoKTogSVBhZ2Uge1xuICAgIHJldHVybiB0aGlzLmdldFBhZ2UodGhpcy5wYXJlbnQpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFnZSh2YWw6IElQYWdlKSB7XG4gICAgdGhpcy5zZXRQYWdlKHRoaXMucGFyZW50LCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBBbHdheXMgcmV0dXJucyBmYWxzZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSBpdCB0byBnZXQvc2V0IHRoZSBxdWVzdGlvbiB2aXNpYmlsaXR5LlxuICAgKiBAc2VlIHZpc2libGVJZlxuICAgKi9cbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdmlzaWJsZSh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsID09IHRoaXMudmlzaWJsZSkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVcIiwgdmFsKTtcbiAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZWQoKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnF1ZXN0aW9uVmlzaWJpbGl0eUNoYW5nZWQoPElRdWVzdGlvbj50aGlzLCB0aGlzLnZpc2libGUpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25WaXNpYmxlQ2hhbmdlZCgpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpc1Zpc2libGVcIiwgdGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICghdGhpcy5pc1Zpc2libGUgJiYgdGhpcy5lcnJvcnMgJiYgdGhpcy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuZXJyb3JzQ2hhbmdlZENhbGxiYWNrKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRydWUgb3IgZmFsc2UuIElmIGl0IHJldHVybnMgdHJ1ZSB0aGUgUXVlc3Rpb24gYmVjb21lcyB2aXNpYmxlIGFuZCBpZiBpdCByZXR1cm5zIGZhbHNlIHRoZSBRdWVzdGlvbiBiZWNvbWVzIGludmlzaWJsZS4gVGhlIGxpYnJhcnkgcnVucyB0aGUgZXhwcmVzc2lvbiBvbiBzdXJ2ZXkgc3RhcnQgYW5kIG9uIGNoYW5naW5nIGEgcXVlc3Rpb24gdmFsdWUuIElmIHRoZSBwcm9wZXJ0eSBpcyBlbXB0eSB0aGVuIHZpc2libGUgcHJvcGVydHkgaXMgdXNlZC5cbiAgICogQHNlZSB2aXNpYmxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVJZigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCB2aXNpYmxlSWYodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSWZcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBxdWVzdGlvbiBpcyB2aXNpYmxlIG9yIHN1cnZleSBpcyBpbiBkZXNpZ24gbW9kZSByaWdodCBub3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlIHx8IHRoaXMuaXNEZXNpZ25Nb2RlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgbm8gaW5wdXQgaW4gdGhlIHF1ZXN0aW9uLiBJdCBhbHdheXMgcmV0dXJucyB0cnVlIGZvciBodG1sIHF1ZXN0aW9uIG9yIHN1cnZleSBpcyBpbiAnZGlzcGxheScgbW9kZS5cbiAgICogQHNlZSBRdWVzdGlvbkh0bWxNb2RlbFxuICAgKiBAc2VlIFN1cnZleU1vZGVsLm1vZGVcbiAgICogQHNlZSBRdWVzdGlvbi5yZWFkT25seVxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlYWRPbmx5KCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB2aXNpYmxlIGluZGV4IG9mIHRoZSBxdWVzdGlvbiBpbiB0aGUgc3VydmV5LiBJdCBjYW4gYmUgZnJvbSAwIHRvIGFsbCB2aXNpYmxlIHF1ZXN0aW9ucyBjb3VudCAtIDFcbiAgICovXG4gIHB1YmxpYyBnZXQgdmlzaWJsZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZpc2libGVJbmRleFwiLCAtMSk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZXJyb3Igb24gcXVlc3Rpb24gdmFsaWRhdGlvbi5cbiAgICogQHBhcmFtIGZpcmVDYWxsYmFjayBzZXQgaXQgdG8gdHJ1ZSB0byBzaG93IGVycm9yIGluIFVJXG4gICAqL1xuICBwdWJsaWMgaGFzRXJyb3JzKGZpcmVDYWxsYmFjazogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gdmFsdWUgaXMgZW1wdHlcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZXJyb3Mgb24gdmFsaWRhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudEVycm9yQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgcXVlc3Rpb24gZG9lc24ndCBoYXZlIGEgdGl0bGUgcHJvcGVydHksIGZvciBleGFtcGxlOiBRdWVzdGlvbkh0bWxNb2RlbFxuICAgKi9cbiAgcHVibGljIGdldCBoYXNUaXRsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIHF1ZXN0aW9uIGRvZXNuJ3QgaGF2ZSBhIGRlc2NyaXB0aW9uIHByb3BlcnR5LCBmb3IgZXhhbXBsZTogUXVlc3Rpb25IdG1sTW9kZWwsIG9yIGRlc2NyaXB0aW9uIHByb3BlcnR5IGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNEZXNjcmlwdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIHF1ZXN0aW9uIGRvZXNuJ3QgaGF2ZSBhbiBpbnB1dCBlbGVtZW50LCBmb3IgZXhhbXBsZTogUXVlc3Rpb25IdG1sTW9kZWxcbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzSW5wdXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUsIGlmIHlvdSBjYW4gaGF2ZSBhIGNvbW1lbnQgZm9yIHRoZSBxdWVzdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaGFzQ29tbWVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWRlbnRpZmljYXRvci4gSXQgaXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImlkXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgaWQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJpZFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGVycm9ycyB0aGF0IGhhcyBpbiB0aGUgcXVlc3Rpb24uIEZvciBleGFtcGxlLCBpc1JlcXVpcmVkIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGdldEFsbEVycm9ycygpOiBBcnJheTxTdXJ2ZXlFcnJvcj4ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpbmsgdG8gdGhlIGN1c3RvbSB3aWRnZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGN1c3RvbVdpZGdldCgpOiBRdWVzdGlvbkN1c3RvbVdpZGdldCB7XG4gICAgaWYgKCF0aGlzLmlzQ3VzdG9tV2lkZ2V0UmVxdWVzdGVkICYmICF0aGlzLmN1c3RvbVdpZGdldFZhbHVlKSB7XG4gICAgICB0aGlzLmlzQ3VzdG9tV2lkZ2V0UmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMudXBkYXRlQ3VzdG9tV2lkZ2V0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmN1c3RvbVdpZGdldFZhbHVlO1xuICB9XG4gIHB1YmxpYyB1cGRhdGVDdXN0b21XaWRnZXQoKSB7XG4gICAgdGhpcy5jdXN0b21XaWRnZXRWYWx1ZSA9IEN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuZ2V0Q3VzdG9tV2lkZ2V0KFxuICAgICAgdGhpc1xuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBRdWVzdGlvbiByZW5kZXJzIG9uIHRoZSBuZXcgbGluZSBpZiB0aGUgcHJvcGVydHkgaXMgdHJ1ZS4gSWYgdGhlIHByb3BlcnR5IGlzIGZhbHNlLCB0aGUgcXVlc3Rpb24gdHJpZXMgdG8gcmVuZGVyIG9uIHRoZSBzYW1lIGxpbmUvcm93IHdpdGggYSBwcmV2aW91cyBxdWVzdGlvbi9wYW5lbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhcnRXaXRoTmV3TGluZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RhcnRXaXRoTmV3TGluZVwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXJ0V2l0aE5ld0xpbmUodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuc3RhcnRXaXRoTmV3TGluZSA9PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzdGFydFdpdGhOZXdMaW5lXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIGNzcyBjbGFzc2VzIHRoYXQgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSBxdWVzdGlvbi4gWW91IG1heSB1c2Ugc3VydmV5LnVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3NlcyBldmVudCB0byBvdmVycmlkZSBjc3MgY2xhc3NlcyBmb3IgYSBxdWVzdGlvbi5cbiAgICogQHNlZSBTdXJ2ZXlNb2RlbC51cGRhdGVRdWVzdGlvbkNzc0NsYXNzZXNcbiAgICovXG4gIHB1YmxpYyBnZXQgY3NzQ2xhc3NlcygpOiBhbnkge1xuICAgIHZhciBzdXJ2ZXlDc3MgPSB0aGlzLmNzcztcbiAgICB2YXIgY2xhc3NlcyA9IHsgZXJyb3I6IHt9IH07XG4gICAgdGhpcy5jb3B5Q3NzQ2xhc3NlcyhjbGFzc2VzLCBzdXJ2ZXlDc3MucXVlc3Rpb24pO1xuICAgIHRoaXMuY29weUNzc0NsYXNzZXMoY2xhc3Nlcy5lcnJvciwgc3VydmV5Q3NzLmVycm9yKTtcbiAgICB0aGlzLnVwZGF0ZUNzc0NsYXNzZXMoY2xhc3Nlcywgc3VydmV5Q3NzKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHtcbiAgICAgIHRoaXMuc3VydmV5LnVwZGF0ZVF1ZXN0aW9uQ3NzQ2xhc3Nlcyh0aGlzLCBjbGFzc2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFJvb3RDc3MoY2xhc3NlczogYW55KSB7XG4gICAgcmV0dXJuIGNsYXNzZXMucXVlc3Rpb24ucm9vdDtcbiAgfVxuICBwcm90ZWN0ZWQgdXBkYXRlQ3NzQ2xhc3NlcyhyZXM6IGFueSwgc3VydmV5Q3NzOiBhbnkpIHtcbiAgICB2YXIgb2JqQ3NzID0gc3VydmV5Q3NzW3RoaXMuZ2V0VHlwZSgpXTtcbiAgICBpZiAob2JqQ3NzID09PSB1bmRlZmluZWQgfHwgb2JqQ3NzID09PSBudWxsKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBvYmpDc3MgPT09IFwic3RyaW5nXCIgfHwgb2JqQ3NzIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICByZXMucm9vdCA9IG9iakNzcztcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIG9iakNzcykge1xuICAgICAgICByZXNba2V5XSA9IG9iakNzc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldCBjc3MoKTogYW55IHtcbiAgICByZXR1cm4gc3VydmV5Q3NzLmdldENzcygpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gc2V0IHRoZSBzcGVjaWZpYyB3aWR0aCB0byB0aGUgcXVlc3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIndpZHRoXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgd2lkdGgodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ3aWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyZWQgd2lkdGggb2YgdGhlIHF1ZXN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCByZW5kZXJXaWR0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyZW5kZXJXaWR0aFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlbmRlcldpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyV2lkdGhcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogU2V0IGl0IGRpZmZlcmVudCBmcm9tIDAgdG8gaW5jcmVhc2UgdGhlIGxlZnQgcGFkZGluZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5kZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImluZGVudFwiLCAwKTtcbiAgfVxuICBwdWJsaWMgc2V0IGluZGVudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImluZGVudFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgZGlmZmVyZW50IGZyb20gMCB0byBpbmNyZWFzZSB0aGUgcmlnaHQgcGFkZGluZy5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmlnaHRJbmRlbnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmlnaHRJbmRlbnRcIiwgMCk7XG4gIH1cbiAgcHVibGljIHNldCByaWdodEluZGVudCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJpZ2h0SW5kZW50XCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIEZvY3VzIHRoZSBxdWVzdGlvbiBpbnB1dC5cbiAgICogQHBhcmFtIG9uRXJyb3IgRm9jdXMgaWYgdGhlcmUgaXMgYW4gZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgZm9jdXMob25FcnJvcjogYm9vbGVhbiA9IGZhbHNlKSB7fVxuICBwcm90ZWN0ZWQgZmlyZUNhbGxiYWNrKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG4gICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNyZWF0aW5nKCkge31cbiAgLyoqXG4gICAqIFJ1biB2aXNpYmxlSWYgYW5kIGVuYWJsZUlmIGV4cHJlc3Npb25zLiBJZiB2aXNpYmxlSWYgb3IvYW5kIGVuYWJsZWRJZiBhcmUgbm90IGVtcHR5LCB0aGVuIHRoZSByZXN1bHRzIG9mIHBlcmZvcm1pbmcgdGhlIGV4cHJlc3Npb24gKHRydWUgb3IgZmFsc2UpIHNldCB0byB0aGUgdmlzaWJsZS9yZWFkT25seSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gdmFsdWVzIFR5cGljYWxseSBzdXJ2ZXkgcmVzdWx0c1xuICAgKiBAc2VlIHZpc2libGVcbiAgICogQHNlZSB2aXNpYmxlSWZcbiAgICogQHNlZSByZWFkT25seVxuICAgKiBAc2VlIGVuYWJsZUlmXG4gICAqL1xuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBpZiAoIXRoaXMudmlzaWJsZUlmKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbmRpdGlvblJ1bm5lcilcbiAgICAgIHRoaXMuY29uZGl0aW9uUnVubmVyID0gbmV3IENvbmRpdGlvblJ1bm5lcih0aGlzLnZpc2libGVJZik7XG4gICAgdGhpcy5jb25kaXRpb25SdW5uZXIuZXhwcmVzc2lvbiA9IHRoaXMudmlzaWJsZUlmO1xuICAgIHRoaXMudmlzaWJsZSA9IHRoaXMuY29uZGl0aW9uUnVubmVyLnJ1bih2YWx1ZXMpO1xuICB9XG4gIC8vSVF1ZXN0aW9uXG4gIHB1YmxpYyBvblN1cnZleVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7fVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuc3VydmV5TG9hZENhbGxiYWNrKTtcbiAgfVxuICBwdWJsaWMgc2V0VmlzaWJsZUluZGV4KHZhbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy52aXNpYmxlSW5kZXggPT0gdmFsKSByZXR1cm4gMTtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2aXNpYmxlSW5kZXhcIiwgdmFsKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBwdWJsaWMgcmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHB1YmxpYyBjbGVhclVudXNlZFZhbHVlcygpIHt9XG4gIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHVibGljIGNsZWFyVmFsdWUoKSB7fVxuICBwdWJsaWMgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCkge31cbiAgcHVibGljIG9uTG9jYWxlQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5vbkxvY2FsZUNoYW5nZWQoKTtcbiAgICB0aGlzLmxvY2FsZUNoYW5nZWQuZmlyZSh0aGlzLCB0aGlzLmdldExvY2FsZSgpKTtcbiAgfVxuICBvblJlYWRPbmx5Q2hhbmdlZCgpIHt9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge31cbiAgbG9jT3duZXI6IElMb2NhbGl6YWJsZU93bmVyID0gbnVsbDtcbiAgLy9JTG9jYWxpemFibGVPd25lclxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdXJ2ZXkgbG9jYWxlXG4gICAqIEBzZWUgU3VydmV5TW9kZWwubG9jYWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5XG4gICAgICA/ICg8SUxvY2FsaXphYmxlT3duZXI+KDxhbnk+dGhpcy5zdXJ2ZXkpKS5nZXRMb2NhbGUoKVxuICAgICAgOiB0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRMb2NhbGUoKSA6IFwiXCI7XG4gIH1cbiAgcHVibGljIGdldE1hcmtkb3duSHRtbCh0ZXh0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlcbiAgICAgID8gKDxJTG9jYWxpemFibGVPd25lcj4oPGFueT50aGlzLnN1cnZleSkpLmdldE1hcmtkb3duSHRtbCh0ZXh0KVxuICAgICAgOiB0aGlzLmxvY093bmVyID8gdGhpcy5sb2NPd25lci5nZXRNYXJrZG93bkh0bWwodGV4dCkgOiBudWxsO1xuICB9XG59XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFwicXVlc3Rpb25iYXNlXCIsIFtcbiAgXCIhbmFtZVwiLFxuICB7IG5hbWU6IFwidmlzaWJsZTpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgXCJ2aXNpYmxlSWY6Y29uZGl0aW9uXCIsXG4gIHsgbmFtZTogXCJ3aWR0aFwiIH0sXG4gIHsgbmFtZTogXCJzdGFydFdpdGhOZXdMaW5lOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IG5hbWU6IFwiaW5kZW50Om51bWJlclwiLCBkZWZhdWx0OiAwLCBjaG9pY2VzOiBbMCwgMSwgMiwgM10gfSxcbiAge1xuICAgIG5hbWU6IFwicGFnZVwiLFxuICAgIGlzU2VyaWFsaXphYmxlOiBmYWxzZSxcbiAgICBjaG9pY2VzOiBmdW5jdGlvbihvYmopIHtcbiAgICAgIHZhciBzdXJ2ZXkgPSBvYmogPyBvYmouc3VydmV5IDogbnVsbDtcbiAgICAgIHJldHVybiBzdXJ2ZXkgPyBzdXJ2ZXkucGFnZXMgOiBbXTtcbiAgICB9XG4gIH1cbl0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uYmFzZS50cyIsImltcG9ydCB7IEJhc2UsIFN1cnZleUVycm9yIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgQ3VzdG9tRXJyb3IsIFJlcXVyZU51bWVyaWNFcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yUmVzdWx0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBhbnksIHB1YmxpYyBlcnJvcjogU3VydmV5RXJyb3IgPSBudWxsKSB7fVxufVxuLyoqXG4gKiBCYXNlIFN1cnZleUpTIHZhbGlkYXRvciBjbGFzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVZhbGlkYXRvciBleHRlbmRzIEJhc2Uge1xuICBwdWJsaWMgdGV4dDogc3RyaW5nID0gXCJcIjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0RXJyb3JUZXh0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMudGV4dCkgcmV0dXJuIHRoaXMudGV4dDtcbiAgICByZXR1cm4gdGhpcy5nZXREZWZhdWx0RXJyb3JUZXh0KG5hbWUpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyA9IG51bGwpOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIElWYWxpZGF0b3JPd25lciB7XG4gIHZhbGlkYXRvcnM6IEFycmF5PFN1cnZleVZhbGlkYXRvcj47XG4gIHZhbGlkYXRlZFZhbHVlOiBhbnk7XG4gIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZztcbn1cbmV4cG9ydCBjbGFzcyBWYWxpZGF0b3JSdW5uZXIge1xuICBwdWJsaWMgcnVuKG93bmVyOiBJVmFsaWRhdG9yT3duZXIpOiBTdXJ2ZXlFcnJvciB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvd25lci52YWxpZGF0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsaWRhdG9yUmVzdWx0ID0gb3duZXIudmFsaWRhdG9yc1tpXS52YWxpZGF0ZShcbiAgICAgICAgb3duZXIudmFsaWRhdGVkVmFsdWUsXG4gICAgICAgIG93bmVyLmdldFZhbGlkYXRvclRpdGxlKClcbiAgICAgICk7XG4gICAgICBpZiAodmFsaWRhdG9yUmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbGlkYXRvclJlc3VsdC5lcnJvcikgcmV0dXJuIHZhbGlkYXRvclJlc3VsdC5lcnJvcjtcbiAgICAgICAgaWYgKHZhbGlkYXRvclJlc3VsdC52YWx1ZSkge1xuICAgICAgICAgIG93bmVyLnZhbGlkYXRlZFZhbHVlID0gdmFsaWRhdG9yUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIG51bWVyaWMgdmFsdWVzLlxuICovXG5leHBvcnQgY2xhc3MgTnVtZXJpY1ZhbGlkYXRvciBleHRlbmRzIFN1cnZleVZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtaW5WYWx1ZTogbnVtYmVyID0gbnVsbCwgcHVibGljIG1heFZhbHVlOiBudW1iZXIgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm51bWVyaWN2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLmlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQobnVsbCwgbmV3IFJlcXVyZU51bWVyaWNFcnJvcigpKTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JSZXN1bHQocGFyc2VGbG9hdCh2YWx1ZSkpO1xuICAgIGlmICh0aGlzLm1pblZhbHVlICE9PSBudWxsICYmIHRoaXMubWluVmFsdWUgPiByZXN1bHQudmFsdWUpIHtcbiAgICAgIHJlc3VsdC5lcnJvciA9IG5ldyBDdXN0b21FcnJvcih0aGlzLmdldEVycm9yVGV4dChuYW1lKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhWYWx1ZSAhPT0gbnVsbCAmJiB0aGlzLm1heFZhbHVlIDwgcmVzdWx0LnZhbHVlKSB7XG4gICAgICByZXN1bHQuZXJyb3IgPSBuZXcgQ3VzdG9tRXJyb3IodGhpcy5nZXRFcnJvclRleHQobmFtZSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiA/IG51bGwgOiByZXN1bHQ7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHZOYW1lID0gbmFtZSA/IG5hbWUgOiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidmFsdWVcIik7XG4gICAgaWYgKHRoaXMubWluVmFsdWUgIT09IG51bGwgJiYgdGhpcy5tYXhWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwibnVtZXJpY01pbk1heFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odk5hbWUsIHRoaXMubWluVmFsdWUsIHRoaXMubWF4VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgICAgLmdldFN0cmluZyhcIm51bWVyaWNNaW5cIilcbiAgICAgICAgICBbXCJmb3JtYXRcIl0odk5hbWUsIHRoaXMubWluVmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgICAuZ2V0U3RyaW5nKFwibnVtZXJpY01heFwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0odk5hbWUsIHRoaXMubWF4VmFsdWUpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGlzTnVtYmVyKHZhbHVlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgJiYgaXNGaW5pdGUodmFsdWUpO1xuICB9XG59XG4vKipcbiAqIFZhbGlkYXRlIHRleHQgdmFsdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0VmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIG1pbkxlbmd0aDogbnVtYmVyID0gMCwgcHVibGljIG1heExlbmd0aDogbnVtYmVyID0gMCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJ0ZXh0dmFsaWRhdG9yXCI7XG4gIH1cbiAgcHVibGljIHZhbGlkYXRlKHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyA9IG51bGwpOiBWYWxpZGF0b3JSZXN1bHQge1xuICAgIGlmICh0aGlzLm1pbkxlbmd0aCA+IDAgJiYgdmFsdWUubGVuZ3RoIDwgdGhpcy5taW5MZW5ndGgpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KFxuICAgICAgICBudWxsLFxuICAgICAgICBuZXcgQ3VzdG9tRXJyb3IodGhpcy5nZXRFcnJvclRleHQobmFtZSkpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXhMZW5ndGggPiAwICYmIHZhbHVlLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmV3IEN1c3RvbUVycm9yKHRoaXMuZ2V0RXJyb3JUZXh0KG5hbWUpKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldERlZmF1bHRFcnJvclRleHQobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWluTGVuZ3RoID4gMCAmJiB0aGlzLm1heExlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgIC5nZXRTdHJpbmcoXCJ0ZXh0TWluTWF4TGVuZ3RoXCIpXG4gICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pbkxlbmd0aCwgdGhpcy5tYXhMZW5ndGgpO1xuICAgIGlmICh0aGlzLm1pbkxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgIC5nZXRTdHJpbmcoXCJ0ZXh0TWluTGVuZ3RoXCIpXG4gICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pbkxlbmd0aCk7XG4gICAgcmV0dXJuIHN1cnZleUxvY2FsaXphdGlvblxuICAgICAgLmdldFN0cmluZyhcInRleHRNYXhMZW5ndGhcIilcbiAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1heExlbmd0aCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFuc3dlckNvdW50VmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIG1pbkNvdW50OiBudW1iZXIgPSBudWxsLCBwdWJsaWMgbWF4Q291bnQ6IG51bWJlciA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiYW5zd2VyY291bnR2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuY29uc3RydWN0b3IgIT0gQXJyYXkpIHJldHVybiBudWxsO1xuICAgIHZhciBjb3VudCA9IHZhbHVlLmxlbmd0aDtcbiAgICBpZiAodGhpcy5taW5Db3VudCAmJiBjb3VudCA8IHRoaXMubWluQ291bnQpIHtcbiAgICAgIHJldHVybiBuZXcgVmFsaWRhdG9yUmVzdWx0KFxuICAgICAgICBudWxsLFxuICAgICAgICBuZXcgQ3VzdG9tRXJyb3IoXG4gICAgICAgICAgdGhpcy5nZXRFcnJvclRleHQoXG4gICAgICAgICAgICBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgICAgICAgLmdldFN0cmluZyhcIm1pblNlbGVjdEVycm9yXCIpXG4gICAgICAgICAgICAgIFtcImZvcm1hdFwiXSh0aGlzLm1pbkNvdW50KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4Q291bnQgJiYgY291bnQgPiB0aGlzLm1heENvdW50KSB7XG4gICAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmV3IEN1c3RvbUVycm9yKFxuICAgICAgICAgIHRoaXMuZ2V0RXJyb3JUZXh0KFxuICAgICAgICAgICAgc3VydmV5TG9jYWxpemF0aW9uXG4gICAgICAgICAgICAgIC5nZXRTdHJpbmcoXCJtYXhTZWxlY3RFcnJvclwiKVxuICAgICAgICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5tYXhDb3VudClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG59XG4vKipcbiAqIFVzZSBpdCB0byB2YWxpZGF0ZSB0aGUgdGV4dCBieSByZWd1bGFyIGV4cHJlc3Npb25zLlxuICovXG5leHBvcnQgY2xhc3MgUmVnZXhWYWxpZGF0b3IgZXh0ZW5kcyBTdXJ2ZXlWYWxpZGF0b3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVnZXg6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmVnZXh2YWxpZGF0b3JcIjtcbiAgfVxuICBwdWJsaWMgdmFsaWRhdGUodmFsdWU6IGFueSwgbmFtZTogc3RyaW5nID0gbnVsbCk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLnJlZ2V4IHx8ICF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHJlID0gbmV3IFJlZ0V4cCh0aGlzLnJlZ2V4KTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuaGFzRXJyb3IocmUsIHZhbHVlW2ldLCBuYW1lKTtcbiAgICAgICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaGFzRXJyb3IocmUsIHZhbHVlLCBuYW1lKTtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9yKHJlOiBSZWdFeHAsIHZhbHVlOiBhbnksIG5hbWU6IHN0cmluZyk6IFZhbGlkYXRvclJlc3VsdCB7XG4gICAgaWYgKHJlLnRlc3QodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gbmV3IFZhbGlkYXRvclJlc3VsdCh2YWx1ZSwgbmV3IEN1c3RvbUVycm9yKHRoaXMuZ2V0RXJyb3JUZXh0KG5hbWUpKSk7XG4gIH1cbn1cbi8qKlxuICogVmFsaWRhdGUgZS1tYWlsIGFkZHJlc3MgaW4gdGhlIHRleHQgaW5wdXRcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYWlsVmFsaWRhdG9yIGV4dGVuZHMgU3VydmV5VmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSByZSA9IC9eKChbXjw+KClcXFtcXF1cXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVxcW1xcXVxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFtePD4oKVtcXF1cXC4sOzpcXHNAXFxcIl0rXFwuKStbXjw+KClbXFxdXFwuLDs6XFxzQFxcXCJdezIsfSkkL2k7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJlbWFpbHZhbGlkYXRvclwiO1xuICB9XG4gIHB1YmxpYyB2YWxpZGF0ZSh2YWx1ZTogYW55LCBuYW1lOiBzdHJpbmcgPSBudWxsKTogVmFsaWRhdG9yUmVzdWx0IHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy5yZS50ZXN0KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JSZXN1bHQodmFsdWUsIG5ldyBDdXN0b21FcnJvcih0aGlzLmdldEVycm9yVGV4dChuYW1lKSkpO1xuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0RXJyb3JUZXh0KG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiaW52YWxpZEVtYWlsXCIpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJzdXJ2ZXl2YWxpZGF0b3JcIiwgW1widGV4dFwiXSk7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcIm51bWVyaWN2YWxpZGF0b3JcIixcbiAgW1wibWluVmFsdWU6bnVtYmVyXCIsIFwibWF4VmFsdWU6bnVtYmVyXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE51bWVyaWNWYWxpZGF0b3IoKTtcbiAgfSxcbiAgXCJzdXJ2ZXl2YWxpZGF0b3JcIlxuKTtcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwidGV4dHZhbGlkYXRvclwiLFxuICBbXCJtaW5MZW5ndGg6bnVtYmVyXCIsIFwibWF4TGVuZ3RoOm51bWJlclwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0VmFsaWRhdG9yKCk7XG4gIH0sXG4gIFwic3VydmV5dmFsaWRhdG9yXCJcbik7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcImFuc3dlcmNvdW50dmFsaWRhdG9yXCIsXG4gIFtcIm1pbkNvdW50Om51bWJlclwiLCBcIm1heENvdW50Om51bWJlclwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBBbnN3ZXJDb3VudFZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJyZWdleHZhbGlkYXRvclwiLFxuICBbXCJyZWdleFwiXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdleFZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJlbWFpbHZhbGlkYXRvclwiLFxuICBbXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBFbWFpbFZhbGlkYXRvcigpO1xuICB9LFxuICBcInN1cnZleXZhbGlkYXRvclwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3ZhbGlkYXRvci50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgU3VydmV5V2luZG93TW9kZWwgfSBmcm9tIFwiLi4vc3VydmV5V2luZG93XCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IFN1cnZleSB9IGZyb20gXCIuL2tvc3VydmV5XCI7XG52YXIga29UZW1wbGF0ZSA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vdGVtcGxhdGVzL3dpbmRvdy93aW5kb3cuaHRtbFwiKTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVdpbmRvdyBleHRlbmRzIFN1cnZleVdpbmRvd01vZGVsIHtcbiAga29FeHBhbmRlZDogYW55O1xuICBrb0V4cGFuZGVkQ3NzOiBhbnk7XG4gIGRvRXhwYW5kOiBhbnk7XG4gIGNvbnN0cnVjdG9yKGpzb25PYmo6IGFueSA9IG51bGwsIGluaXRpYWxNb2RlbDogU3VydmV5TW9kZWwgPSBudWxsKSB7XG4gICAgc3VwZXIoanNvbk9iaiwgaW5pdGlhbE1vZGVsKTtcbiAgICB0aGlzLmtvRXhwYW5kZWQgPSBrby5vYnNlcnZhYmxlKGZhbHNlKTtcbiAgICB0aGlzLmtvRXhwYW5kZWRDc3MgPSBrby5vYnNlcnZhYmxlKHRoaXMuZ2V0QnV0dG9uQ3NzKCkpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmV4cGFuZGVkQ2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvRXhwYW5kZWQoc2VsZi5pc0V4cGFuZGVkKTtcbiAgICAgIHNlbGYua29FeHBhbmRlZENzcyhzZWxmLmdldEJ1dHRvbkNzcygpKTtcbiAgICB9O1xuICAgIHRoaXMuc2hvd2luZ0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5kb1Nob3dpbmdDaGFuZ2VkKCk7XG4gICAgfTtcbiAgICB0aGlzLmRvRXhwYW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmNoYW5nZUV4cGFuZGVkKCk7XG4gICAgfTtcbiAgICB0aGlzLnN1cnZleS5vbkNvbXBsZXRlLmFkZCgoc2VuZGVyOiBTdXJ2ZXlNb2RlbCkgPT4ge1xuICAgICAgc2VsZi5vbkNvbXBsZXRlKCk7XG4gICAgfSk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1cnZleShqc29uT2JqOiBhbnkpOiBTdXJ2ZXlNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBTdXJ2ZXkoanNvbk9iaik7XG4gIH1cbiAgcHJvdGVjdGVkIGdldCB0ZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFsdWUgPyB0aGlzLnRlbXBsYXRlVmFsdWUgOiB0aGlzLmdldERlZmF1bHRUZW1wbGF0ZSgpO1xuICB9XG4gIHByb3RlY3RlZCBzZXQgdGVtcGxhdGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGVWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBkb1Nob3dpbmdDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzU2hvd2luZykge1xuICAgICAgdGhpcy53aW5kb3dFbGVtZW50LmlubmVySFRNTCA9IHRoaXMudGVtcGxhdGU7XG4gICAgICBrby5jbGVhbk5vZGUodGhpcy53aW5kb3dFbGVtZW50KTtcbiAgICAgIGtvLmFwcGx5QmluZGluZ3ModGhpcywgdGhpcy53aW5kb3dFbGVtZW50KTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy53aW5kb3dFbGVtZW50KTtcbiAgICAgICg8U3VydmV5PnRoaXMuc3VydmV5KS5yZW5kZXIoU3VydmV5V2luZG93LnN1cnZleUVsZW1lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLndpbmRvd0VsZW1lbnQpO1xuICAgICAgdGhpcy53aW5kb3dFbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXREZWZhdWx0VGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4ga29UZW1wbGF0ZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGNzcygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnN1cnZleVtcImNzc1wiXTtcbiAgfVxuICBwcml2YXRlIGNoYW5nZUV4cGFuZGVkKCkge1xuICAgIHRoaXMuZXhwYW5kY29sbGFwc2UoIXRoaXMuaXNFeHBhbmRlZCk7XG4gIH1cbiAgcHJpdmF0ZSBvbkNvbXBsZXRlKCkge1xuICAgIHRoaXMuaGlkZSgpO1xuICB9XG4gIHByaXZhdGUgZ2V0QnV0dG9uQ3NzKCkge1xuICAgIHJldHVybiB0aGlzLmtvRXhwYW5kZWQoKVxuICAgICAgPyB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkNvbGxhcHNlZFxuICAgICAgOiB0aGlzLmNzcy53aW5kb3cuaGVhZGVyLmJ1dHRvbkV4cGFuZGVkO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29TdXJ2ZXlXaW5kb3cudHMiLCIvLyByZW1vdmVkIGJ5IGV4dHJhY3QtdGV4dC13ZWJwYWNrLXBsdWdpblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL21haW4uc2Nzc1xuLy8gbW9kdWxlIGlkID0gMzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHsgQmFzZSwgU3VydmV5RXJyb3IsIElUZXh0UHJvY2Vzc29yIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0LCBKc29uT2JqZWN0UHJvcGVydHkgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5cbmNsYXNzIFhtbFBhcnNlciB7XG4gIHByaXZhdGUgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICBwdWJsaWMgYXNzaWduVmFsdWUodGFyZ2V0OiBhbnksIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXS5wdXNoKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldFtuYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBbdGFyZ2V0W25hbWVdXS5jb25jYXQodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDEgJiZcbiAgICAgIE9iamVjdC5rZXlzKHZhbHVlKVswXSA9PT0gbmFtZVxuICAgICkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gdmFsdWVbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgeG1sMkpzb24oeG1sTm9kZTogYW55LCByZXN1bHQ6IGFueSkge1xuICAgIGlmICh4bWxOb2RlLmNoaWxkcmVuICYmIHhtbE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4bWxOb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZE5vZGUgPSB4bWxOb2RlLmNoaWxkcmVuW2ldO1xuICAgICAgICBsZXQgY2hpbGRPYmplY3QgPSB7fTtcbiAgICAgICAgdGhpcy54bWwySnNvbihjaGlsZE5vZGUsIGNoaWxkT2JqZWN0KTtcbiAgICAgICAgdGhpcy5hc3NpZ25WYWx1ZShyZXN1bHQsIGNoaWxkTm9kZS5ub2RlTmFtZSwgY2hpbGRPYmplY3QpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2lnblZhbHVlKHJlc3VsdCwgeG1sTm9kZS5ub2RlTmFtZSwgeG1sTm9kZS50ZXh0Q29udGVudCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBwYXJzZVhtbFN0cmluZyh4bWxTdHJpbmc6IHN0cmluZykge1xuICAgIGxldCB4bWxSb290ID0gdGhpcy5wYXJzZXIucGFyc2VGcm9tU3RyaW5nKHhtbFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcbiAgICBsZXQganNvbiA9IHt9O1xuICAgIHRoaXMueG1sMkpzb24oeG1sUm9vdCwganNvbik7XG4gICAgcmV0dXJuIGpzb247XG4gIH1cbn1cblxuLyoqXG4gKiBBIGRlZmluaXRpb24gZm9yIGZpbGxpbmcgY2hvaWNlcyBmb3IgY2hlY2tib3gsIGRyb3Bkb3duIGFuZCByYWRpb2dyb3VwIHF1ZXN0aW9ucyBmcm9tIHJlc2Z1bGwgc2VydmljZXMuXG4gKiBUaGUgcnVuIG1ldGhvZCBjYWxsIGEgcmVzdGZ1bGwgc2VydmljZSBhbmQgcmVzdWx0cyBjYW4gYmUgZ2V0IG9uIGdldFJFc3VsdENhbGxiYWNrLlxuICovXG5leHBvcnQgY2xhc3MgQ2hvaWNlc1Jlc3RmdWxsIGV4dGVuZHMgQmFzZSB7XG4gIHByaXZhdGUgc3RhdGljIGl0ZW1zUmVzdWx0ID0ge307XG4gIHB1YmxpYyBzdGF0aWMgb25CZWZvcmVTZW5kUmVxdWVzdDogKFxuICAgIHNlbmRlcjogQ2hvaWNlc1Jlc3RmdWxsLFxuICAgIG9wdGlvbnM6IHsgcmVxdWVzdDogWE1MSHR0cFJlcXVlc3QgfVxuICApID0+IHZvaWQ7XG4gIHByaXZhdGUgc3RhdGljIGdldENhY2hlZEl0ZW1zUmVzdWx0KG9iajogQ2hvaWNlc1Jlc3RmdWxsKTogYm9vbGVhbiB7XG4gICAgdmFyIGhhc2ggPSBvYmoub2JqSGFzaDtcbiAgICB2YXIgcmVzID0gQ2hvaWNlc1Jlc3RmdWxsLml0ZW1zUmVzdWx0W2hhc2hdO1xuICAgIGlmICghcmVzKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG9iai5nZXRSZXN1bHRDYWxsYmFjaykge1xuICAgICAgb2JqLmdldFJlc3VsdENhbGxiYWNrKHJlcyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgbGFzdE9iakhhc2g6IHN0cmluZyA9IFwiXCI7XG4gIHByb3RlY3RlZCBwcm9jZXNzZWRVcmw6IHN0cmluZyA9IFwiXCI7XG4gIHByb3RlY3RlZCBwcm9jZXNzZWRQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgZ2V0UmVzdWx0Q2FsbGJhY2s6IChpdGVtczogQXJyYXk8SXRlbVZhbHVlPikgPT4gdm9pZDtcbiAgcHVibGljIGVycm9yOiBTdXJ2ZXlFcnJvciA9IG51bGw7XG4gIHB1YmxpYyBvd25lcjogQmFzZTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgcnVuKHRleHRQcm9jZXNzb3I6IElUZXh0UHJvY2Vzc29yID0gbnVsbCkge1xuICAgIGlmICghdGhpcy51cmwgfHwgIXRoaXMuZ2V0UmVzdWx0Q2FsbGJhY2spIHJldHVybjtcbiAgICB0aGlzLnByb2Nlc3NlZFRleHQodGV4dFByb2Nlc3Nvcik7XG4gICAgaWYgKCF0aGlzLnByb2Nlc3NlZFVybCkge1xuICAgICAgdGhpcy5nZXRSZXN1bHRDYWxsYmFjayhbXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmxhc3RPYmpIYXNoID09IHRoaXMub2JqSGFzaCkgcmV0dXJuO1xuICAgIHRoaXMubGFzdE9iakhhc2ggPSB0aGlzLm9iakhhc2g7XG4gICAgaWYgKHRoaXMudXNlQ2hhbmdlZEl0ZW1zUmVzdWx0cygpKSByZXR1cm47XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgdGhpcy5zZW5kUmVxdWVzdCgpO1xuICB9XG4gIHByb3RlY3RlZCB1c2VDaGFuZ2VkSXRlbXNSZXN1bHRzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBDaG9pY2VzUmVzdGZ1bGwuZ2V0Q2FjaGVkSXRlbXNSZXN1bHQodGhpcyk7XG4gIH1cbiAgcHJpdmF0ZSBwcm9jZXNzZWRUZXh0KHRleHRQcm9jZXNzb3I6IElUZXh0UHJvY2Vzc29yKSB7XG4gICAgaWYgKHRleHRQcm9jZXNzb3IpIHtcbiAgICAgIHZhciBwVXJsID0gdGV4dFByb2Nlc3Nvci5wcm9jZXNzVGV4dEV4KHRoaXMudXJsKTtcbiAgICAgIHZhciBwUGF0aCA9IHRleHRQcm9jZXNzb3IucHJvY2Vzc1RleHRFeCh0aGlzLnBhdGgpO1xuICAgICAgaWYgKCFwVXJsLmhhc0FsbFZhbHVlc09uTGFzdFJ1biB8fCAhcFBhdGguaGFzQWxsVmFsdWVzT25MYXN0UnVuKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkVXJsID0gXCJcIjtcbiAgICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoID0gXCJcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkVXJsID0gcFVybC50ZXh0O1xuICAgICAgICB0aGlzLnByb2Nlc3NlZFBhdGggPSBwUGF0aC50ZXh0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2Nlc3NlZFVybCA9IHRoaXMudXJsO1xuICAgICAgdGhpcy5wcm9jZXNzZWRQYXRoID0gdGhpcy5wYXRoO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgcGFyc2VSZXNwb25zZShyZXNwb25zZSkge1xuICAgIGxldCBwYXJzZWRSZXNwb25zZTtcbiAgICBpZiAoXG4gICAgICAhIXJlc3BvbnNlICYmXG4gICAgICB0eXBlb2YgcmVzcG9uc2UuaW5kZXhPZiA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICByZXNwb25zZS5pbmRleE9mKFwiPFwiKSA9PT0gMFxuICAgICkge1xuICAgICAgdmFyIHBhcnNlciA9IG5ldyBYbWxQYXJzZXIoKTtcbiAgICAgIHBhcnNlZFJlc3BvbnNlID0gcGFyc2VyLnBhcnNlWG1sU3RyaW5nKHJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkUmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZFJlc3BvbnNlO1xuICB9XG4gIHByb3RlY3RlZCBzZW5kUmVxdWVzdCgpIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgdGhpcy5wcm9jZXNzZWRVcmwpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgIHNlbGYub25Mb2FkKHNlbGYucGFyc2VSZXNwb25zZSh4aHIucmVzcG9uc2UpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGYub25FcnJvcih4aHIuc3RhdHVzVGV4dCwgeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgb3B0aW9ucyA9IHsgcmVxdWVzdDogeGhyIH07XG4gICAgaWYgKCEhQ2hvaWNlc1Jlc3RmdWxsLm9uQmVmb3JlU2VuZFJlcXVlc3QpIHtcbiAgICAgIENob2ljZXNSZXN0ZnVsbC5vbkJlZm9yZVNlbmRSZXF1ZXN0KHRoaXMsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBvcHRpb25zLnJlcXVlc3Quc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY2hvaWNlc0J5VXJsXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy51cmwgJiYgIXRoaXMucGF0aCAmJiAhdGhpcy52YWx1ZU5hbWUgJiYgIXRoaXMudGl0bGVOYW1lO1xuICB9XG4gIHB1YmxpYyBnZXRDdXN0b21Qcm9wZXJ0aWVzTmFtZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXMoKTtcbiAgICB2YXIgcmVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcy5wdXNoKHRoaXMuZ2V0Q3VzdG9tUHJvcGVydHlOYW1lKHByb3BlcnRpZXNbaV0ubmFtZSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgZ2V0Q3VzdG9tUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJvcGVydHlOYW1lICsgXCJOYW1lXCI7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDdXN0b21Qcm9wZXJ0aWVzKCk6IEFycmF5PEpzb25PYmplY3RQcm9wZXJ0eT4ge1xuICAgIHZhciBwcm9wZXJ0aWVzID0gSnNvbk9iamVjdC5tZXRhRGF0YS5nZXRQcm9wZXJ0aWVzKHRoaXMuaXRlbVZhbHVlVHlwZSk7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJ2YWx1ZVwiIHx8IHByb3BlcnRpZXNbaV0ubmFtZSA9PT0gXCJ0ZXh0XCIpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgcmVzLnB1c2gocHJvcGVydGllc1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIHNldERhdGEoanNvbjogYW55KSB7XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIGlmIChqc29uLnVybCkgdGhpcy51cmwgPSBqc29uLnVybDtcbiAgICBpZiAoanNvbi5wYXRoKSB0aGlzLnBhdGggPSBqc29uLnBhdGg7XG4gICAgaWYgKGpzb24udmFsdWVOYW1lKSB0aGlzLnZhbHVlTmFtZSA9IGpzb24udmFsdWVOYW1lO1xuICAgIGlmIChqc29uLnRpdGxlTmFtZSkgdGhpcy50aXRsZU5hbWUgPSBqc29uLnRpdGxlTmFtZTtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoanNvbltwcm9wZXJ0aWVzW2ldXSkgdGhpc1twcm9wZXJ0aWVzW2ldXSA9IGpzb25bcHJvcGVydGllc1tpXV07XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXREYXRhKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHJlcyA9IHt9O1xuICAgIGlmICh0aGlzLnVybCkgcmVzW1widXJsXCJdID0gdGhpcy51cmw7XG4gICAgaWYgKHRoaXMucGF0aCkgcmVzW1wicGF0aFwiXSA9IHRoaXMucGF0aDtcbiAgICBpZiAodGhpcy52YWx1ZU5hbWUpIHJlc1tcInZhbHVlTmFtZVwiXSA9IHRoaXMudmFsdWVOYW1lO1xuICAgIGlmICh0aGlzLnRpdGxlTmFtZSkgcmVzW1widGl0bGVOYW1lXCJdID0gdGhpcy50aXRsZU5hbWU7XG4gICAgdmFyIHByb3BlcnRpZXMgPSB0aGlzLmdldEN1c3RvbVByb3BlcnRpZXNOYW1lcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXNbcHJvcGVydGllc1tpXV0pIHJlc1twcm9wZXJ0aWVzW2ldXSA9IHRoaXNbcHJvcGVydGllc1tpXV07XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcHVibGljIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidXJsXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXJsKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidXJsXCIsIHZhbCk7XG4gIH1cbiAgcHVibGljIGdldCBwYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInBhdGhcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBwYXRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicGF0aFwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlTmFtZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdGl0bGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInRpdGxlTmFtZVwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlTmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInRpdGxlTmFtZVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgaXRlbVZhbHVlVHlwZSgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5vd25lcikgcmV0dXJuIFwiaXRlbXZhbHVlXCI7XG4gICAgdmFyIHByb3AgPSBKc29uT2JqZWN0Lm1ldGFEYXRhLmZpbmRQcm9wZXJ0eShcbiAgICAgIHRoaXMub3duZXIuZ2V0VHlwZSgpLFxuICAgICAgXCJjaG9pY2VzXCJcbiAgICApO1xuICAgIGlmICghcHJvcCkgcmV0dXJuIFwiaXRlbXZhbHVlXCI7XG4gICAgaWYgKHByb3AudHlwZSA9PSBcIml0ZW12YWx1ZXNcIikgcmV0dXJuIFwiaXRlbXZhbHVlXCI7XG4gICAgcmV0dXJuIHByb3AudHlwZTtcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy51cmwgPSBcIlwiO1xuICAgIHRoaXMucGF0aCA9IFwiXCI7XG4gICAgdGhpcy52YWx1ZU5hbWUgPSBcIlwiO1xuICAgIHRoaXMudGl0bGVOYW1lID0gXCJcIjtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllc05hbWVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpc1twcm9wZXJ0aWVzW2ldXSkgdGhpc1twcm9wZXJ0aWVzW2ldXSA9IFwiXCI7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkxvYWQocmVzdWx0OiBhbnkpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICByZXN1bHQgPSB0aGlzLmdldFJlc3VsdEFmdGVyUGF0aChyZXN1bHQpO1xuICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0W1wibGVuZ3RoXCJdKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgaXRlbVZhbHVlID0gcmVzdWx0W2ldO1xuICAgICAgICBpZiAoIWl0ZW1WYWx1ZSkgY29udGludWU7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoaXRlbVZhbHVlKTtcbiAgICAgICAgdmFyIHRpdGxlID0gdGhpcy5nZXRUaXRsZShpdGVtVmFsdWUpO1xuICAgICAgICB2YXIgaXRlbSA9IG5ldyBJdGVtVmFsdWUodmFsdWUsIHRpdGxlKTtcbiAgICAgICAgdGhpcy5zZXRDdXN0b21Qcm9wZXJ0aWVzKGl0ZW0sIGl0ZW1WYWx1ZSk7XG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3IgPSBuZXcgQ3VzdG9tRXJyb3IoXG4gICAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJ1cmxHZXRDaG9pY2VzRXJyb3JcIilcbiAgICAgICk7XG4gICAgfVxuICAgIENob2ljZXNSZXN0ZnVsbC5pdGVtc1Jlc3VsdFt0aGlzLm9iakhhc2hdID0gaXRlbXM7XG4gICAgdGhpcy5nZXRSZXN1bHRDYWxsYmFjayhpdGVtcyk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRDdXN0b21Qcm9wZXJ0aWVzKGl0ZW06IEl0ZW1WYWx1ZSwgaXRlbVZhbHVlOiBhbnkpIHtcbiAgICB2YXIgcHJvcGVydGllcyA9IHRoaXMuZ2V0Q3VzdG9tUHJvcGVydGllcygpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHByb3AgPSBwcm9wZXJ0aWVzW2ldO1xuICAgICAgdmFyIHZhbCA9IHRoaXMuZ2V0VmFsdWVDb3JlKFxuICAgICAgICBpdGVtVmFsdWUsXG4gICAgICAgIHRoaXMuZ2V0UHJvcGVydHlCaW5kaW5nKHByb3AubmFtZSlcbiAgICAgICk7XG4gICAgICBpZiAoIXRoaXMuaXNWYWx1ZUVtcHR5KHZhbCkpIHtcbiAgICAgICAgaXRlbVtwcm9wLm5hbWVdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFByb3BlcnR5QmluZGluZyhwcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzW3RoaXMuZ2V0Q3VzdG9tUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSldKVxuICAgICAgcmV0dXJuIHRoaXNbdGhpcy5nZXRDdXN0b21Qcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lKV07XG4gICAgaWYgKHRoaXNbcHJvcGVydHlOYW1lXSkgcmV0dXJuIHRoaXNbcHJvcGVydHlOYW1lXTtcbiAgICByZXR1cm4gcHJvcGVydHlOYW1lO1xuICB9XG4gIHByaXZhdGUgb25FcnJvcihzdGF0dXM6IHN0cmluZywgcmVzcG9uc2U6IHN0cmluZykge1xuICAgIHRoaXMuZXJyb3IgPSBuZXcgQ3VzdG9tRXJyb3IoXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgLmdldFN0cmluZyhcInVybFJlcXVlc3RFcnJvclwiKVxuICAgICAgICBbXCJmb3JtYXRcIl0oc3RhdHVzLCByZXNwb25zZSlcbiAgICApO1xuICAgIHRoaXMuZ2V0UmVzdWx0Q2FsbGJhY2soW10pO1xuICB9XG4gIHByaXZhdGUgZ2V0UmVzdWx0QWZ0ZXJQYXRoKHJlc3VsdDogYW55KSB7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgaWYgKCF0aGlzLnByb2Nlc3NlZFBhdGgpIHJldHVybiByZXN1bHQ7XG4gICAgdmFyIHBhdGhlcyA9IHRoaXMuZ2V0UGF0aGVzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdFtwYXRoZXNbaV1dO1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByaXZhdGUgZ2V0UGF0aGVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciBwYXRoZXMgPSBbXTtcbiAgICBpZiAodGhpcy5wcm9jZXNzZWRQYXRoLmluZGV4T2YoXCI7XCIpID4gLTEpIHtcbiAgICAgIHBhdGhlcyA9IHRoaXMucGF0aC5zcGxpdChcIjtcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhlcyA9IHRoaXMucHJvY2Vzc2VkUGF0aC5zcGxpdChcIixcIik7XG4gICAgfVxuICAgIGlmIChwYXRoZXMubGVuZ3RoID09IDApIHBhdGhlcy5wdXNoKHRoaXMucHJvY2Vzc2VkUGF0aCk7XG4gICAgcmV0dXJuIHBhdGhlcztcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlKGl0ZW06IGFueSk6IGFueSB7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGhpcy52YWx1ZU5hbWUpIHJldHVybiB0aGlzLmdldFZhbHVlQ29yZShpdGVtLCB0aGlzLnZhbHVlTmFtZSk7XG4gICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIE9iamVjdCkpIHJldHVybiBpdGVtO1xuICAgIHZhciBsZW4gPSBPYmplY3Qua2V5cyhpdGVtKS5sZW5ndGg7XG4gICAgaWYgKGxlbiA8IDEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBpdGVtW09iamVjdC5rZXlzKGl0ZW0pWzBdXTtcbiAgfVxuICBwcml2YXRlIGdldFRpdGxlKGl0ZW06IGFueSk6IGFueSB7XG4gICAgdmFyIHRpdGxlID0gdGhpcy50aXRsZU5hbWUgPyB0aGlzLnRpdGxlTmFtZSA6IFwidGl0bGVcIjtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZUNvcmUoaXRlbSwgdGl0bGUpO1xuICB9XG4gIHByaXZhdGUgZ2V0VmFsdWVDb3JlKGl0ZW06IGFueSwgcHJvcGVydHk6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcbiAgICBpZiAocHJvcGVydHkuaW5kZXhPZihcIi5cIikgPCAwKSByZXR1cm4gaXRlbVtwcm9wZXJ0eV07XG4gICAgdmFyIHByb3BlcnRpZXMgPSBwcm9wZXJ0eS5zcGxpdChcIi5cIik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtID0gaXRlbVtwcm9wZXJ0aWVzW2ldXTtcbiAgICAgIGlmICghaXRlbSkgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9XG4gIHByaXZhdGUgZ2V0IG9iakhhc2goKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucHJvY2Vzc2VkVXJsICtcbiAgICAgIFwiO1wiICtcbiAgICAgIHRoaXMucHJvY2Vzc2VkUGF0aCArXG4gICAgICBcIjtcIiArXG4gICAgICB0aGlzLnZhbHVlTmFtZSArXG4gICAgICBcIjtcIiArXG4gICAgICB0aGlzLnRpdGxlTmFtZVxuICAgICk7XG4gIH1cbn1cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwiY2hvaWNlc0J5VXJsXCIsXG4gIFtcInVybFwiLCBcInBhdGhcIiwgXCJ2YWx1ZU5hbWVcIiwgXCJ0aXRsZU5hbWVcIl0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgQ2hvaWNlc1Jlc3RmdWxsKCk7XG4gIH1cbik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY2hvaWNlc1Jlc3RmdWxsLnRzIiwiaW1wb3J0IHtcbiAgQ29uZGl0aW9uLFxuICBDb25kaXRpb25Ob2RlLFxuICBPcGVyYW5kLFxuICBGdW5jdGlvbk9wZXJhbmQsXG4gIEV4cHJlc3Npb25PcGVyYW5kLFxuICBDb25kaXRpb25PcGVyYW5kXG59IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcblxuZXhwb3J0IGNsYXNzIENvbmRpdGlvbnNQYXJzZXJFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBhdDogbnVtYmVyLCBwdWJsaWMgY29kZTogc3RyaW5nKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgQ29uZGl0aW9uc1BhcnNlciB7XG4gIHJlYWRvbmx5IEVSUk9SX09wZXJhdG9yRXhwZWN0ZWQgPSBcIk9QRVJBVE9SX0VYUEVDVEVEXCI7XG4gIHJlYWRvbmx5IEVSUk9SX1JpZ2h0UGFydEV4cGVjdGVkID0gXCJSSUdIVFBBUlRfRVhQRUNURURcIjtcbiAgcmVhZG9ubHkgRVJST1JfRXhwcmVzc2lvbkV4cGVjdGVkID0gXCJFWFBSRVNTSU9OX0VYUEVDVEVEXCI7XG4gIHJlYWRvbmx5IEVSUk9SX0VuZEV4cGVjdGVkID0gXCJFTkRfRVhQRUNURURcIjtcbiAgcHJpdmF0ZSB0ZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgcm9vdDogQ29uZGl0aW9uTm9kZTtcbiAgcHJpdmF0ZSBleHByZXNzaW9uTm9kZXM6IEFycmF5PGFueT47XG4gIHByaXZhdGUgbm9kZTogYW55O1xuICBwcml2YXRlIGF0OiBudW1iZXI7XG4gIHByaXZhdGUgbGVuZ3RoOiBudW1iZXI7XG4gIHByaXZhdGUgZXJyb3JWYWx1ZTogQ29uZGl0aW9uc1BhcnNlckVycm9yO1xuICBwdWJsaWMgcGFyc2UodGV4dDogc3RyaW5nLCByb290OiBDb25kaXRpb25Ob2RlKTogYm9vbGVhbiB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0aWVzKHRleHQsIHJvb3QpO1xuICAgIHJldHVybiB0aGlzLnBhcnNlVGV4dCgpO1xuICB9XG4gIHB1YmxpYyBjcmVhdGVDb25kaXRpb24odGV4dDogc3RyaW5nKTogQ29uZGl0aW9uTm9kZSB7XG4gICAgdmFyIHJvb3QgPSBuZXcgQ29uZGl0aW9uTm9kZSgpO1xuICAgIGlmICghdGhpcy5wYXJzZSh0ZXh0LCByb290KSkge1xuICAgICAgcm9vdCA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9XG4gIHB1YmxpYyBwYXJzZUV4cHJlc3Npb24odGV4dDogc3RyaW5nKTogT3BlcmFuZCB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0aWVzKHRleHQsIG5ldyBDb25kaXRpb25Ob2RlKCkpO1xuICAgIHJldHVybiB0aGlzLnJlYWRFeHByZXNzaW9uT3BlcmFuZCgpO1xuICB9XG4gIHB1YmxpYyBnZXQgZXJyb3IoKTogQ29uZGl0aW9uc1BhcnNlckVycm9yIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvclZhbHVlO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlRXJyb3IoY29kZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZXJyb3JWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuZXJyb3JWYWx1ZSA9IG5ldyBDb25kaXRpb25zUGFyc2VyRXJyb3IodGhpcy5hdCwgY29kZSk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRQcm9wZXJ0aWVzKHRleHQ6IHN0cmluZywgcm9vdDogQ29uZGl0aW9uTm9kZSkge1xuICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgdGhpcy5hdCA9IDA7XG4gICAgdGhpcy5sZW5ndGggPSB0aGlzLnRleHQubGVuZ3RoO1xuICAgIHRoaXMucm9vdCA9IHJvb3Q7XG4gICAgdGhpcy5yb290LmNsZWFyKCk7XG4gICAgdGhpcy5ub2RlID0gdGhpcy5yb290O1xuICAgIHRoaXMuZXhwcmVzc2lvbk5vZGVzID0gW107XG4gICAgdGhpcy5leHByZXNzaW9uTm9kZXMucHVzaCh0aGlzLm5vZGUpO1xuICAgIHRoaXMuZXJyb3JWYWx1ZSA9IG51bGw7XG4gIH1cbiAgcHVibGljIHRvU3RyaW5nKHJvb3Q6IENvbmRpdGlvbk5vZGUpOiBzdHJpbmcge1xuICAgIHJldHVybiByb290LnRvU3RyaW5nKCk7XG4gIH1cbiAgcHJpdmF0ZSBwYXJzZVRleHQoKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IHRoaXMucmVhZENvbmRpdGlvbnMoKTtcbiAgICBpZiAodGhpcy5hdCA8IHRoaXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNyZWF0ZUVycm9yKHRoaXMuRVJST1JfRW5kRXhwZWN0ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzICYmIHRoaXMuYXQgPj0gdGhpcy5sZW5ndGg7XG4gIH1cbiAgcHJpdmF0ZSByZWFkQ29uZGl0aW9ucygpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzID0gdGhpcy5yZWFkQ29uZGl0aW9uKCk7XG4gICAgaWYgKCFyZXMpIHJldHVybiByZXM7XG4gICAgdmFyIGNvbm5lY3RpdmUgPSB0aGlzLnJlYWRDb25uZWN0aXZlKCk7XG4gICAgaWYgKGNvbm5lY3RpdmUpIHtcbiAgICAgIHRoaXMuYWRkQ29ubmVjdGl2ZShjb25uZWN0aXZlKTtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRDb25kaXRpb25zKCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgcmVhZENvbmRpdGlvbigpOiBib29sZWFuIHtcbiAgICB2YXIgZXhwUmVzID0gdGhpcy5yZWFkRXhwcmVzc2lvbigpO1xuICAgIGlmIChleHBSZXMgPCAwKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGV4cFJlcyA9PSAxKSByZXR1cm4gdHJ1ZTtcbiAgICB2YXIgbGVmdCA9IHRoaXMucmVhZEV4cHJlc3Npb25PcGVyYW5kKCk7XG4gICAgaWYgKCFsZWZ0KSB7XG4gICAgICB0aGlzLmNyZWF0ZUVycm9yKHRoaXMuRVJST1JfRXhwcmVzc2lvbkV4cGVjdGVkKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIG9wID0gdGhpcy5yZWFkT3BlcmF0b3IoKTtcbiAgICBpZiAoIW9wKSB7XG4gICAgICBpZiAobGVmdC5pc0Jvb2xlYW4pIHtcbiAgICAgICAgdmFyIGMgPSBuZXcgQ29uZGl0aW9uKCk7XG4gICAgICAgIGMubGVmdCA9IGxlZnQ7XG4gICAgICAgIHRoaXMuYWRkQ29uZGl0aW9uKGMpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY3JlYXRlRXJyb3IodGhpcy5FUlJPUl9PcGVyYXRvckV4cGVjdGVkKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGMgPSBuZXcgQ29uZGl0aW9uKCk7XG4gICAgYy5sZWZ0ID0gbGVmdDtcbiAgICBjLm9wZXJhdG9yID0gb3A7XG4gICAgaWYgKCFDb25kaXRpb24uaXNOb1JpZ2h0T3BlcmF0aW9uKG9wKSkge1xuICAgICAgdmFyIHJpZ2h0ID0gdGhpcy5yZWFkRXhwcmVzc2lvbk9wZXJhbmQoKTtcbiAgICAgIGlmICghcmlnaHQpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVFcnJvcih0aGlzLkVSUk9SX1JpZ2h0UGFydEV4cGVjdGVkKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYy5yaWdodCA9IHJpZ2h0O1xuICAgIH1cbiAgICB0aGlzLmFkZENvbmRpdGlvbihjKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHJlYWRPcGVyYW5kKCk6IE9wZXJhbmQge1xuICAgIHZhciBzdHIgPSB0aGlzLnJlYWRTdHJpbmcoKTtcbiAgICBpZiAoIXN0cikgcmV0dXJuIG51bGw7XG4gICAgdmFyIHBhcmFtcyA9IHRoaXMucmVhZFBhcmFtZXRlcnMoKTtcbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICB2YXIgcmVzID0gbmV3IEZ1bmN0aW9uT3BlcmFuZChzdHIpO1xuICAgICAgcmVzLnBhcmFtZXRlcnMgPSBwYXJhbXM7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE9wZXJhbmQoc3RyKTtcbiAgfVxuICBwcml2YXRlIHJlYWRFeHByZXNzaW9uKCk6IG51bWJlciB7XG4gICAgdGhpcy5za2lwKCk7XG4gICAgaWYgKHRoaXMuYXQgPj0gdGhpcy5sZW5ndGggfHwgdGhpcy5jaCAhPSBcIihcIikgcmV0dXJuIDA7XG4gICAgdGhpcy5hdCsrO1xuICAgIHRoaXMucHVzaEV4cHJlc3Npb24oKTtcbiAgICB2YXIgcmVzID0gdGhpcy5yZWFkQ29uZGl0aW9ucygpO1xuICAgIGlmIChyZXMpIHtcbiAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgcmVzID0gdGhpcy5jaCA9PSA8c3RyaW5nPlwiKVwiO1xuICAgICAgdGhpcy5hdCsrO1xuICAgICAgdGhpcy5wb3BFeHByZXNzaW9uKCk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHByaXZhdGUgcmVhZEV4cHJlc3Npb25PcGVyYW5kKFxuICAgIHByZXZFeHByOiBFeHByZXNzaW9uT3BlcmFuZCA9IG51bGwsXG4gICAgc3RhY2s6IEFycmF5PEV4cHJlc3Npb25PcGVyYW5kPiA9IG51bGxcbiAgKTogT3BlcmFuZCB7XG4gICAgdGhpcy5za2lwKCk7XG4gICAgaWYgKHRoaXMuYXQgPj0gdGhpcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHZhciBpc09wZW5CcmFja2V0ID0gdGhpcy5pc09wZW5CcmFja2V0KHRoaXMuY2gpO1xuICAgIGlmIChpc09wZW5CcmFja2V0KSB7XG4gICAgICB0aGlzLmF0Kys7XG4gICAgICB0aGlzLnB1c2hFeHByZXNzaW9uKCk7XG4gICAgfVxuICAgIHZhciBhID0gdGhpcy5yZWFkT3BlcmFuZCgpO1xuICAgIGlmICghYSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIG9wZXJhdG9yID0gdGhpcy5yZWFkT3BlcmFuZE9wZXJhdG9yKCk7XG4gICAgaWYgKCFvcGVyYXRvcikge1xuICAgICAgaWYgKHByZXZFeHByICE9IG51bGwpIHtcbiAgICAgICAgcHJldkV4cHIucmlnaHQgPSBhO1xuICAgICAgICBhID0gcHJldkV4cHI7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc0Nsb3NlQnJhY2tldCh0aGlzLmNoKSkge1xuICAgICAgICBwcmV2RXhwciA9IHN0YWNrICYmIHN0YWNrLmxlbmd0aCA+IDAgPyBzdGFjay5wb3AoKSA6IG51bGw7XG4gICAgICAgIHZhciBzYXZlQXQgPSB0aGlzLmF0O1xuICAgICAgICB0aGlzLmF0Kys7XG4gICAgICAgIG9wZXJhdG9yID0gdGhpcy5yZWFkT3BlcmFuZE9wZXJhdG9yKCk7XG4gICAgICAgIHZhciBkb1BvcEV4cHJlc3Npb24gPVxuICAgICAgICAgIG9wZXJhdG9yIHx8IChwcmV2RXhwciAmJiBwcmV2RXhwcltcImlzT3BlbkJyYWNrZXRcIl0pO1xuICAgICAgICBpZiAoIW9wZXJhdG9yKSB7XG4gICAgICAgICAgdGhpcy5hdCA9IHNhdmVBdCArIChkb1BvcEV4cHJlc3Npb24gPyAxIDogMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvUG9wRXhwcmVzc2lvbikge1xuICAgICAgICAgIHRoaXMucG9wRXhwcmVzc2lvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3BlcmF0b3IpIHtcbiAgICAgICAgdmFyIGV4cHIgPSBuZXcgRXhwcmVzc2lvbk9wZXJhbmQoKTtcbiAgICAgICAgZXhwci5sZWZ0ID0gcHJldkV4cHIgPyBwcmV2RXhwciA6IGE7XG4gICAgICAgIGV4cHIub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEV4cHJlc3Npb25PcGVyYW5kKGV4cHIsIHN0YWNrKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICB2YXIgZXhwciA9IG5ldyBFeHByZXNzaW9uT3BlcmFuZCgpO1xuICAgIGV4cHJbXCJpc09wZW5CcmFja2V0XCJdID0gaXNPcGVuQnJhY2tldDtcbiAgICBleHByLmxlZnQgPSBhO1xuICAgIGV4cHIub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICBpZiAoIXN0YWNrKSB7XG4gICAgICBzdGFjayA9IFtdO1xuICAgIH1cbiAgICBpZiAoc3RhY2subGVuZ3RoID09IDAgfHwgaXNPcGVuQnJhY2tldCkge1xuICAgICAgc3RhY2sucHVzaChleHByKTtcbiAgICB9XG4gICAgaWYgKHByZXZFeHByKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFpc09wZW5CcmFja2V0ICYmXG4gICAgICAgICh0aGlzLmlzSGlnaFByaW9yaXR5T3BlcmFuZChwcmV2RXhwci5vcGVyYXRvcikgfHxcbiAgICAgICAgICAhdGhpcy5pc0hpZ2hQcmlvcml0eU9wZXJhbmQob3BlcmF0b3IpKVxuICAgICAgKSB7XG4gICAgICAgIHByZXZFeHByLnJpZ2h0ID0gYTtcbiAgICAgICAgZXhwci5sZWZ0ID0gcHJldkV4cHI7XG4gICAgICAgIHZhciBpbmRleCA9IHN0YWNrLmluZGV4T2YocHJldkV4cHIpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgIHN0YWNrW2luZGV4XSA9IGV4cHI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZXZFeHByLnJpZ2h0ID0gdGhpcy5yZWFkRXhwcmVzc2lvbk9wZXJhbmQoZXhwciwgc3RhY2spO1xuICAgICAgICByZXR1cm4gcHJldkV4cHI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlYWRFeHByZXNzaW9uT3BlcmFuZChleHByLCBzdGFjayk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY2goKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0LmNoYXJBdCh0aGlzLmF0KTtcbiAgfVxuICBwcml2YXRlIHNraXAoKSB7XG4gICAgd2hpbGUgKHRoaXMuYXQgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmlzU3BhY2UodGhpcy5jaCkpIHRoaXMuYXQrKztcbiAgfVxuICBwcml2YXRlIGlzU3BhY2UoYzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGMgPT0gXCIgXCIgfHwgYyA9PSBcIlxcblwiIHx8IGMgPT0gXCJcXHRcIiB8fCBjID09IFwiXFxyXCI7XG4gIH1cbiAgcHJpdmF0ZSBpc1F1b3RlcyhjOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYyA9PSBcIidcIiB8fCBjID09ICdcIic7XG4gIH1cbiAgcHJpdmF0ZSBpc0NvbW1hKGM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjID09IFwiLFwiO1xuICB9XG4gIHByaXZhdGUgaXNPcGVyYXRvckNoYXIoYzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGMgPT0gXCI+XCIgfHxcbiAgICAgIGMgPT0gXCI8XCIgfHxcbiAgICAgIGMgPT0gXCI9XCIgfHxcbiAgICAgIGMgPT0gXCIhXCIgfHxcbiAgICAgIGMgPT0gXCIrXCIgfHxcbiAgICAgIGMgPT0gXCItXCIgfHxcbiAgICAgIGMgPT0gXCIqXCIgfHxcbiAgICAgIGMgPT0gXCIvXCIgfHxcbiAgICAgIGMgPT0gXCIlXCJcbiAgICApO1xuICB9XG4gIHByaXZhdGUgaXNPcGVuQnJhY2tldChjOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYyA9PSBcIihcIjtcbiAgfVxuICBwcml2YXRlIGlzQ2xvc2VCcmFja2V0KGM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjID09IFwiKVwiO1xuICB9XG4gIHByaXZhdGUgaXNCcmFja2V0cyhjOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc09wZW5CcmFja2V0KGMpIHx8IHRoaXMuaXNDbG9zZUJyYWNrZXQoYyk7XG4gIH1cbiAgcHJpdmF0ZSByZWFkU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgdGhpcy5za2lwKCk7XG4gICAgaWYgKHRoaXMuYXQgPj0gdGhpcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHZhciBzdGFydCA9IHRoaXMuYXQ7XG4gICAgdmFyIGhhc1F1b3RlcyA9IHRoaXMuaXNRdW90ZXModGhpcy5jaCk7XG4gICAgdmFyIGhhc0JyYWNlcyA9IHRoaXMuY2ggPT0gXCJ7XCI7XG4gICAgaWYgKGhhc1F1b3RlcykgdGhpcy5hdCsrO1xuICAgIHZhciBpc0ZpcnN0T3BDaCA9IHRoaXMuaXNPcGVyYXRvckNoYXIodGhpcy5jaCk7XG4gICAgdmFyIGlzUHJldkVzcGFwZSA9IGZhbHNlO1xuICAgIHdoaWxlICh0aGlzLmF0IDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgIGlmIChoYXNCcmFjZXMpIHtcbiAgICAgICAgdmFyIGlzQnJhY2UgPSB0aGlzLmNoID09IFwifVwiO1xuICAgICAgICB0aGlzLmF0Kys7XG4gICAgICAgIGlmIChpc0JyYWNlKSBicmVhaztcbiAgICAgICAgZWxzZSBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghaGFzUXVvdGVzICYmIHRoaXMuaXNTcGFjZSh0aGlzLmNoKSkgYnJlYWs7XG4gICAgICBpZiAodGhpcy5pc1F1b3Rlcyh0aGlzLmNoKSAmJiAhaXNQcmV2RXNwYXBlKSB7XG4gICAgICAgIGlmIChoYXNRdW90ZXMpIHRoaXMuYXQrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoIWhhc1F1b3Rlcykge1xuICAgICAgICBpZiAodGhpcy5jaCAhPSBcIi1cIiAmJiBpc0ZpcnN0T3BDaCAhPSB0aGlzLmlzT3BlcmF0b3JDaGFyKHRoaXMuY2gpKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAodGhpcy5pc0JyYWNrZXRzKHRoaXMuY2gpIHx8IHRoaXMuaXNDb21tYSh0aGlzLmNoKSkgYnJlYWs7XG4gICAgICB9XG4gICAgICBpc1ByZXZFc3BhcGUgPSB0aGlzLmNoID09PSBcIlxcXFxcIjtcbiAgICAgIHRoaXMuYXQrKztcbiAgICB9XG4gICAgaWYgKHRoaXMuYXQgPD0gc3RhcnQpIHJldHVybiBudWxsO1xuICAgIHZhciByZXMgPSB0aGlzLnRleHQuc3Vic3RyKHN0YXJ0LCB0aGlzLmF0IC0gc3RhcnQpO1xuICAgIGlmIChyZXMpIHtcbiAgICAgIGlmIChyZXMubGVuZ3RoID4gMSAmJiB0aGlzLmlzUXVvdGVzKHJlc1swXSkpIHtcbiAgICAgICAgdmFyIGxlbiA9IHJlcy5sZW5ndGggLSAxO1xuICAgICAgICBpZiAodGhpcy5pc1F1b3RlcyhyZXNbcmVzLmxlbmd0aCAtIDFdKSkgbGVuLS07XG4gICAgICAgIHJlcyA9IHJlcy5zdWJzdHIoMSwgbGVuKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIHJlYWRQYXJhbWV0ZXIoKTogT3BlcmFuZCB7XG4gICAgdmFyIG9wZW5lZEJyYWNrZXRzID0gMDtcbiAgICB2YXIgc3RhcnRJbmRleCA9IHRoaXMuYXQ7XG4gICAgd2hpbGUgKHRoaXMuYXQgPCB0aGlzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuaXNPcGVuQnJhY2tldCh0aGlzLmNoKSkgb3BlbmVkQnJhY2tldHMrKztcbiAgICAgIGlmICh0aGlzLmlzQ2xvc2VCcmFja2V0KHRoaXMuY2gpKSBvcGVuZWRCcmFja2V0cy0tO1xuICAgICAgaWYgKG9wZW5lZEJyYWNrZXRzIDwgMCkgYnJlYWs7XG4gICAgICBpZiAob3BlbmVkQnJhY2tldHMgPT09IDAgJiYgdGhpcy5jaCA9PT0gXCIsXCIpIGJyZWFrO1xuICAgICAgdGhpcy5hdCsrO1xuICAgIH1cbiAgICB2YXIgcGFyYW1TdHIgPSB0aGlzLnRleHQuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIHRoaXMuYXQpO1xuICAgIGlmICghcGFyYW1TdHIpIHJldHVybiBudWxsO1xuICAgIHZhciBwYXJzZXIgPSBuZXcgQ29uZGl0aW9uc1BhcnNlcigpO1xuICAgIHZhciBub2RlID0gbmV3IENvbmRpdGlvbk5vZGUoKTtcbiAgICBpZiAocGFyc2VyLnBhcnNlKHBhcmFtU3RyLCBub2RlKSkge1xuICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb25PcGVyYW5kKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihwYXJhbVN0cik7XG4gIH1cbiAgcHJpdmF0ZSByZWFkUGFyYW1ldGVycygpOiBBcnJheTxPcGVyYW5kPiB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbkJyYWNrZXQodGhpcy5jaCkpIHJldHVybiBudWxsO1xuICAgIHZhciBwYXJhbXMgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5hdCA8IHRoaXMubGVuZ3RoICYmICF0aGlzLmlzQ2xvc2VCcmFja2V0KHRoaXMuY2gpKSB7XG4gICAgICB0aGlzLmF0Kys7XG4gICAgICB2YXIgb3BlcmFuZCA9IHRoaXMucmVhZFBhcmFtZXRlcigpOyAvL3RoaXMucmVhZEV4cHJlc3Npb25PcGVyYW5kKCk7XG4gICAgICBpZiAob3BlcmFuZCkge1xuICAgICAgICBwYXJhbXMucHVzaChvcGVyYW5kKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hdCsrO1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cbiAgcHJpdmF0ZSBpc0hpZ2hQcmlvcml0eU9wZXJhbmQob3A6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBvcCA9PSBcIipcIiB8fCBvcCA9PSBcIi9cIiB8fCBvcCA9PSBcIiVcIjtcbiAgfVxuICBwcml2YXRlIHJlYWRPcGVyYW5kT3BlcmF0b3IoKTogc3RyaW5nIHtcbiAgICB0aGlzLnNraXAoKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNoID09IFwiK1wiIHx8XG4gICAgICB0aGlzLmNoID09IFwiLVwiIHx8XG4gICAgICB0aGlzLmNoID09IFwiKlwiIHx8XG4gICAgICB0aGlzLmNoID09IFwiL1wiIHx8XG4gICAgICB0aGlzLmNoID09IFwiJVwiXG4gICAgKSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5jaDtcbiAgICAgIHRoaXMuYXQrKztcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByaXZhdGUgcmVhZE9wZXJhdG9yKCk6IHN0cmluZyB7XG4gICAgdGhpcy5za2lwKCk7XG4gICAgdmFyIGN1ckF0ID0gdGhpcy5hdDtcbiAgICB2YXIgb3AgPSB0aGlzLnJlYWRTdHJpbmcoKTtcbiAgICBpZiAoIW9wKSByZXR1cm4gbnVsbDtcbiAgICBvcCA9IG9wLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG9wID09IFwiPlwiKSBvcCA9IFwiZ3JlYXRlclwiO1xuICAgIGlmIChvcCA9PSBcIjxcIikgb3AgPSBcImxlc3NcIjtcbiAgICBpZiAob3AgPT0gXCI+PVwiIHx8IG9wID09IFwiPT5cIikgb3AgPSBcImdyZWF0ZXJvcmVxdWFsXCI7XG4gICAgaWYgKG9wID09IFwiPD1cIiB8fCBvcCA9PSBcIj08XCIpIG9wID0gXCJsZXNzb3JlcXVhbFwiO1xuICAgIGlmIChvcCA9PSBcIj1cIiB8fCBvcCA9PSBcIj09XCIpIG9wID0gXCJlcXVhbFwiO1xuICAgIGlmIChvcCA9PSBcIjw+XCIgfHwgb3AgPT0gXCIhPVwiKSBvcCA9IFwibm90ZXF1YWxcIjtcbiAgICBpZiAob3AgPT0gXCJlcXVhbHNcIikgb3AgPSBcImVxdWFsXCI7XG4gICAgaWYgKG9wID09IFwibm90ZXF1YWxzXCIpIG9wID0gXCJub3RlcXVhbHNcIjtcbiAgICBpZiAob3AgPT0gXCJjb250YWluXCIgfHwgb3AgPT0gXCIqPVwiKSBvcCA9IFwiY29udGFpbnNcIjtcbiAgICBpZiAob3AgPT0gXCJub3Rjb250YWluXCIpIG9wID0gXCJub3Rjb250YWluc1wiO1xuICAgIGlmIChDb25kaXRpb24uaXNDb3JyZWN0T3BlcmF0b3Iob3ApKSByZXR1cm4gb3A7XG4gICAgdGhpcy5hdCA9IGN1ckF0O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByaXZhdGUgcmVhZENvbm5lY3RpdmUoKTogc3RyaW5nIHtcbiAgICB2YXIgY29uID0gdGhpcy5yZWFkU3RyaW5nKCk7XG4gICAgaWYgKCFjb24pIHJldHVybiBudWxsO1xuICAgIGNvbiA9IGNvbi50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChjb24gPT0gXCImXCIgfHwgY29uID09IFwiJiZcIikgY29uID0gXCJhbmRcIjtcbiAgICBpZiAoY29uID09IFwifFwiIHx8IGNvbiA9PSBcInx8XCIpIGNvbiA9IFwib3JcIjtcbiAgICBpZiAoY29uICE9IFwiYW5kXCIgJiYgY29uICE9IFwib3JcIikgY29uID0gbnVsbDtcbiAgICByZXR1cm4gY29uO1xuICB9XG4gIHByaXZhdGUgcHVzaEV4cHJlc3Npb24oKSB7XG4gICAgdmFyIG5vZGUgPSBudWxsO1xuICAgIHRoaXMuZXhwcmVzc2lvbk5vZGVzLnB1c2gobm9kZSk7XG4gICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgfVxuICBwcml2YXRlIG1ha2VOb2RlQ29uZGl0aW9uKCkge1xuICAgIGlmICghdGhpcy5ub2RlIHx8ICF0aGlzLm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMubm9kZSA9IG5ldyBDb25kaXRpb25Ob2RlKCk7XG4gICAgICB0aGlzLmV4cHJlc3Npb25Ob2Rlc1t0aGlzLmV4cHJlc3Npb25Ob2Rlcy5sZW5ndGggLSAxXSA9IHRoaXMubm9kZTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBwb3BFeHByZXNzaW9uKCkge1xuICAgIHZhciBub2RlID0gdGhpcy5leHByZXNzaW9uTm9kZXMucG9wKCk7XG4gICAgdGhpcy5ub2RlID0gdGhpcy5leHByZXNzaW9uTm9kZXNbdGhpcy5leHByZXNzaW9uTm9kZXMubGVuZ3RoIC0gMV07XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIHRoaXMubWFrZU5vZGVDb25kaXRpb24oKTtcbiAgICAgIHRoaXMubm9kZS5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGFkZENvbmRpdGlvbihjOiBDb25kaXRpb24pIHtcbiAgICB0aGlzLm1ha2VOb2RlQ29uZGl0aW9uKCk7XG4gICAgdGhpcy5ub2RlLmNoaWxkcmVuLnB1c2goYyk7XG4gIH1cbiAgcHJpdmF0ZSBhZGRDb25uZWN0aXZlKGNvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5tYWtlTm9kZUNvbmRpdGlvbigpO1xuICAgIGlmICh0aGlzLm5vZGUuY2hpbGRyZW4ubGVuZ3RoIDwgMikge1xuICAgICAgdGhpcy5ub2RlLmNvbm5lY3RpdmUgPSBjb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm5vZGUuY29ubmVjdGl2ZSAhPSBjb24pIHtcbiAgICAgICAgdmFyIG9sZENvbiA9IHRoaXMubm9kZS5jb25uZWN0aXZlO1xuICAgICAgICB2YXIgb2xkQ2hpbGRyZW4gPSB0aGlzLm5vZGUuY2hpbGRyZW47XG4gICAgICAgIHRoaXMubm9kZS5jbGVhcigpO1xuICAgICAgICB0aGlzLm5vZGUuY29ubmVjdGl2ZSA9IGNvbjtcbiAgICAgICAgdmFyIG9sZE5vZGUgPSBuZXcgQ29uZGl0aW9uTm9kZSgpO1xuICAgICAgICBvbGROb2RlLmNvbm5lY3RpdmUgPSBvbGRDb247XG4gICAgICAgIG9sZE5vZGUuY2hpbGRyZW4gPSBvbGRDaGlsZHJlbjtcbiAgICAgICAgdGhpcy5ub2RlLmNoaWxkcmVuLnB1c2gob2xkTm9kZSk7XG4gICAgICAgIHZhciBuZXdOb2RlID0gbmV3IENvbmRpdGlvbk5vZGUoKTtcbiAgICAgICAgdGhpcy5ub2RlLmNoaWxkcmVuLnB1c2gobmV3Tm9kZSk7XG4gICAgICAgIHRoaXMubm9kZSA9IG5ld05vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29uZGl0aW9uc1BhcnNlci50cyIsIi8qKlxuICogVGhlIGNsYXNzIGNvbnRhaW5zIG1ldGhvZHMgdG8gd29yayB3aXRoIHd3dy5keHN1cnZleS5jb20gc2VydmljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIGR4U3VydmV5U2VydmljZSB7XG4gIHB1YmxpYyBzdGF0aWMgc2VydmljZVVybDogc3RyaW5nID0gXCJodHRwczovL2R4c3VydmV5YXBpLmF6dXJld2Vic2l0ZXMubmV0L2FwaS9TdXJ2ZXlcIjtcbiAgLy9wdWJsaWMgc3RhdGljIHNlcnZpY2VVcmw6IHN0cmluZyA9IFwiaHR0cDovL2xvY2FsaG9zdDo1MDQ4OC9hcGkvU3VydmV5XCI7XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgcHVibGljIGxvYWRTdXJ2ZXkoXG4gICAgc3VydmV5SWQ6IHN0cmluZyxcbiAgICBvbkxvYWQ6IChzdWNjZXNzOiBib29sZWFuLCByZXN1bHQ6IHN0cmluZywgcmVzcG9uc2U6IGFueSkgPT4gdm9pZFxuICApIHtcbiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyLm9wZW4oXG4gICAgICBcIkdFVFwiLFxuICAgICAgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyBcIi9nZXRTdXJ2ZXk/c3VydmV5SWQ9XCIgKyBzdXJ2ZXlJZFxuICAgICk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgIG9uTG9hZCh4aHIuc3RhdHVzID09IDIwMCwgcmVzdWx0LCB4aHIucmVzcG9uc2UpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoKTtcbiAgfVxuICBwdWJsaWMgZ2V0U3VydmV5SnNvbkFuZElzQ29tcGxldGVkKFxuICAgIHN1cnZleUlkOiBzdHJpbmcsXG4gICAgY2xpZW50SWQ6IHN0cmluZyxcbiAgICBvbkxvYWQ6IChcbiAgICAgIHN1Y2Nlc3M6IGJvb2xlYW4sXG4gICAgICBzdXJ2ZXlKc29uOiBhbnksXG4gICAgICByZXN1bHQ6IHN0cmluZyxcbiAgICAgIHJlc3BvbnNlOiBhbnlcbiAgICApID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKFxuICAgICAgXCJHRVRcIixcbiAgICAgIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICtcbiAgICAgICAgXCIvZ2V0U3VydmV5QW5kSXNDb21wbGV0ZWQ/c3VydmV5SWQ9XCIgK1xuICAgICAgICBzdXJ2ZXlJZCArXG4gICAgICAgIFwiJmNsaWVudElkPVwiICtcbiAgICAgICAgY2xpZW50SWRcbiAgICApO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICB2YXIgc3VydmV5SnNvbiA9IHJlc3VsdCA/IHJlc3VsdC5zdXJ2ZXkgOiBudWxsO1xuICAgICAgdmFyIGlzQ29tcGxldGVkID0gcmVzdWx0ID8gcmVzdWx0LmlzQ29tcGxldGVkIDogbnVsbDtcbiAgICAgIG9uTG9hZCh4aHIuc3RhdHVzID09IDIwMCwgc3VydmV5SnNvbiwgaXNDb21wbGV0ZWQsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBzZW5kUmVzdWx0KFxuICAgIHBvc3RJZDogc3RyaW5nLFxuICAgIHJlc3VsdDogSlNPTixcbiAgICBvblNlbmRSZXN1bHQ6IChzdWNjZXNzOiBib29sZWFuLCByZXNwb25zZTogYW55KSA9PiB2b2lkLFxuICAgIGNsaWVudElkOiBzdHJpbmcgPSBudWxsLFxuICAgIGlzUGFydGlhbENvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub3BlbihcIlBPU1RcIiwgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyBcIi9wb3N0L1wiKTtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIik7XG4gICAgdmFyIGRhdGEgPSB7IHBvc3RJZDogcG9zdElkLCBzdXJ2ZXlSZXN1bHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCkgfTtcbiAgICBpZiAoY2xpZW50SWQpIGRhdGFbXCJjbGllbnRJZFwiXSA9IGNsaWVudElkO1xuICAgIGlmIChpc1BhcnRpYWxDb21wbGV0ZWQpIGRhdGFbXCJpc1BhcnRpYWxDb21wbGV0ZWRcIl0gPSB0cnVlO1xuICAgIHZhciBkYXRhU3RyaW5naWZ5OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgeGhyLm9ubG9hZCA9IHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW9uU2VuZFJlc3VsdCkgcmV0dXJuO1xuICAgICAgb25TZW5kUmVzdWx0KHhoci5zdGF0dXMgPT0gMjAwLCB4aHIucmVzcG9uc2UpO1xuICAgIH07XG4gICAgeGhyLnNlbmQoZGF0YVN0cmluZ2lmeSk7XG4gIH1cbiAgcHVibGljIHNlbmRGaWxlKFxuICAgIHBvc3RJZDogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUsXG4gICAgb25TZW5kRmlsZTogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3BvbnNlOiBhbnkpID0+IHZvaWRcbiAgKSB7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vbmxvYWQgPSB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFvblNlbmRGaWxlKSByZXR1cm47XG4gICAgICBvblNlbmRGaWxlKHhoci5zdGF0dXMgPT0gMjAwLCBKU09OLnBhcnNlKHhoci5yZXNwb25zZSkpO1xuICAgIH07XG4gICAgeGhyLm9wZW4oXCJQT1NUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvdXBsb2FkL1wiLCB0cnVlKTtcbiAgICB2YXIgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXCJmaWxlXCIsIGZpbGUpO1xuICAgIGZvcm1EYXRhLmFwcGVuZChcInBvc3RJZFwiLCBwb3N0SWQpO1xuICAgIHhoci5zZW5kKGZvcm1EYXRhKTtcbiAgfVxuICBwdWJsaWMgZ2V0UmVzdWx0KFxuICAgIHJlc3VsdElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9uR2V0UmVzdWx0OiAoXG4gICAgICBzdWNjZXNzOiBib29sZWFuLFxuICAgICAgZGF0YTogYW55LFxuICAgICAgZGF0YUxpc3Q6IEFycmF5PGFueT4sXG4gICAgICByZXNwb25zZTogYW55XG4gICAgKSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgZGF0YSA9IFwicmVzdWx0SWQ9XCIgKyByZXN1bHRJZCArIFwiJm5hbWU9XCIgKyBuYW1lO1xuICAgIHhoci5vcGVuKFwiR0VUXCIsIGR4U3VydmV5U2VydmljZS5zZXJ2aWNlVXJsICsgXCIvZ2V0UmVzdWx0P1wiICsgZGF0YSk7XG4gICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgICAgdmFyIGxpc3QgPSBudWxsO1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlKTtcbiAgICAgICAgbGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0LlF1ZXN0aW9uUmVzdWx0KSB7XG4gICAgICAgICAgdmFyIGVsID0geyBuYW1lOiBrZXksIHZhbHVlOiByZXN1bHQuUXVlc3Rpb25SZXN1bHRba2V5XSB9O1xuICAgICAgICAgIGxpc3QucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uR2V0UmVzdWx0KHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIGxpc3QsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG4gIHB1YmxpYyBpc0NvbXBsZXRlZChcbiAgICByZXN1bHRJZDogc3RyaW5nLFxuICAgIGNsaWVudElkOiBzdHJpbmcsXG4gICAgb25Jc0NvbXBsZXRlZDogKHN1Y2Nlc3M6IGJvb2xlYW4sIHJlc3VsdDogc3RyaW5nLCByZXNwb25zZTogYW55KSA9PiB2b2lkXG4gICkge1xuICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB2YXIgZGF0YSA9IFwicmVzdWx0SWQ9XCIgKyByZXN1bHRJZCArIFwiJmNsaWVudElkPVwiICsgY2xpZW50SWQ7XG4gICAgeGhyLm9wZW4oXCJHRVRcIiwgZHhTdXJ2ZXlTZXJ2aWNlLnNlcnZpY2VVcmwgKyBcIi9pc0NvbXBsZXRlZD9cIiArIGRhdGEpO1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbnVsbDtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCkge1xuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBvbklzQ29tcGxldGVkKHhoci5zdGF0dXMgPT0gMjAwLCByZXN1bHQsIHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIuc2VuZCgpO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZHhTdXJ2ZXlTZXJ2aWNlLnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25GYWN0b3J5IHtcbiAgcHVibGljIHN0YXRpYyBJbnN0YW5jZTogRnVuY3Rpb25GYWN0b3J5ID0gbmV3IEZ1bmN0aW9uRmFjdG9yeSgpO1xuICBwcml2YXRlIGZ1bmN0aW9uSGFzaDogSGFzaFRhYmxlPChwYXJhbXM6IGFueVtdKSA9PiBhbnk+ID0ge307XG5cbiAgcHVibGljIHJlZ2lzdGVyKG5hbWU6IHN0cmluZywgZnVuYzogKHBhcmFtczogYW55W10pID0+IGFueSkge1xuICAgIHRoaXMuZnVuY3Rpb25IYXNoW25hbWVdID0gZnVuYztcbiAgfVxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5mdW5jdGlvbkhhc2ggPSB7fTtcbiAgfVxuICBwdWJsaWMgZ2V0QWxsKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5mdW5jdGlvbkhhc2gpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQuc29ydCgpO1xuICB9XG4gIHB1YmxpYyBydW4obmFtZTogc3RyaW5nLCBwYXJhbXM6IGFueVtdKTogYW55IHtcbiAgICB2YXIgZnVuYyA9IHRoaXMuZnVuY3Rpb25IYXNoW25hbWVdO1xuICAgIGlmICghZnVuYykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGZ1bmMocGFyYW1zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdW0ocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIHZhciByZXMgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgIHJlcyArPSBwYXJhbXNbaV07XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcInN1bVwiLCBzdW0pO1xuXG5mdW5jdGlvbiBzdW1JbkFycmF5KHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAocGFyYW1zLmxlbmd0aCAhPSAyKSByZXR1cm4gMDtcbiAgdmFyIGFyciA9IHBhcmFtc1swXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFycikpIHJldHVybjtcbiAgdmFyIG5hbWUgPSBwYXJhbXNbMV07XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiAmJiAhKG5hbWUgaW5zdGFuY2VvZiBTdHJpbmcpKSByZXR1cm4gMDtcbiAgdmFyIHJlcyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBhcnJbaV07XG4gICAgaWYgKGl0ZW0gJiYgaXRlbVs8c3RyaW5nPm5hbWVdKSB7XG4gICAgICByZXMgKz0gaXRlbVs8c3RyaW5nPm5hbWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuRnVuY3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyKFwic3VtSW5BcnJheVwiLCBzdW1JbkFycmF5KTtcblxuZnVuY3Rpb24gaWlmKHBhcmFtczogYW55W10pOiBhbnkge1xuICBpZiAoIXBhcmFtcyAmJiBwYXJhbXMubGVuZ3RoICE9PSAzKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIHBhcmFtc1swXSA/IHBhcmFtc1sxXSA6IHBhcmFtc1syXTtcbn1cbkZ1bmN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlcihcImlpZlwiLCBpaWYpO1xuXG5mdW5jdGlvbiBhZ2UocGFyYW1zOiBhbnlbXSk6IGFueSB7XG4gIGlmICghcGFyYW1zICYmIHBhcmFtcy5sZW5ndGggPCAxKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFwYXJhbXNbMF0pIHJldHVybiBudWxsO1xuICB2YXIgYmlydGhEYXkgPSBuZXcgRGF0ZShwYXJhbXNbMF0pO1xuICB2YXIgYWdlRGlmTXMgPSBEYXRlLm5vdygpIC0gYmlydGhEYXkuZ2V0VGltZSgpO1xuICB2YXIgYWdlRGF0ZSA9IG5ldyBEYXRlKGFnZURpZk1zKTsgLy8gbWlsaXNlY29uZHMgZnJvbSBlcG9jaFxuICByZXR1cm4gTWF0aC5hYnMoYWdlRGF0ZS5nZXRVVENGdWxsWWVhcigpIC0gMTk3MCk7XG59XG5GdW5jdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXIoXCJhZ2VcIiwgYWdlKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mdW5jdGlvbnNmYWN0b3J5LnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSxcbiAgTWF0cml4RHJvcGRvd25DZWxsXG59IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93bmJhc2VcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeEJhc2VJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uSW1wbGVtZW50b3Ige1xuICBrb0NlbGxBZnRlclJlbmRlcjogYW55O1xuICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29DZWxsQWZ0ZXJSZW5kZXIgPSBmdW5jdGlvbihlbCwgY29uKSB7XG4gICAgICByZXR1cm4gc2VsZi5jZWxsQWZ0ZXJSZW5kZXIoZWwsIGNvbik7XG4gICAgfTtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29DZWxsQWZ0ZXJSZW5kZXJcIl0gPSB0aGlzLmtvQ2VsbEFmdGVyUmVuZGVyO1xuICB9XG4gIHByaXZhdGUgY2VsbEFmdGVyUmVuZGVyKGVsZW1lbnRzLCBjb24pIHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24uc3VydmV5KSByZXR1cm47XG4gICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgdmFyIGNlbGwgPSA8TWF0cml4RHJvcGRvd25DZWxsPmNvbjtcbiAgICBpZiAoY2VsbC5xdWVzdGlvbi5jdXN0b21XaWRnZXQpIHtcbiAgICAgIGNlbGwucXVlc3Rpb24uY3VzdG9tV2lkZ2V0LmFmdGVyUmVuZGVyKGNlbGwucXVlc3Rpb24sIGVsKTtcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICBjZWxsOiBjZWxsLFxuICAgICAgY2VsbFF1ZXN0aW9uOiBjZWxsLnF1ZXN0aW9uLFxuICAgICAgaHRtbEVsZW1lbnQ6IGVsLFxuICAgICAgcm93OiBjZWxsLnJvdyxcbiAgICAgIGNvbHVtbjogY2VsbC5jb2x1bW5cbiAgICB9O1xuICAgIHRoaXMucXVlc3Rpb24uc3VydmV5Lm1hdHJpeEFmdGVyQ2VsbFJlbmRlcih0aGlzLnF1ZXN0aW9uLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEcm9wZG93biBleHRlbmRzIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25NYXRyaXhCYXNlSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJtYXRyaXhkcm9wZG93blwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duKFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4ZHJvcGRvd25cIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uTWF0cml4RHJvcGRvd24obmFtZSk7XG4gIHEuY2hvaWNlcyA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgcS5yb3dzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRSb3dzO1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLmFkZERlZmF1bHRDb2x1bW5zKHEpO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd24udHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX3RleHRcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblRleHRJbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uSW1wbGVtZW50b3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVWYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIudXBkYXRlVmFsdWUobmV3VmFsdWUpO1xuICAgIGlmIChuZXdWYWx1ZSAhPT0gdGhpcy5xdWVzdGlvbi52YWx1ZSkge1xuICAgICAgdGhpcy5rb1ZhbHVlKHRoaXMucXVlc3Rpb24udmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25UZXh0IGV4dGVuZHMgUXVlc3Rpb25UZXh0TW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uVGV4dEltcGxlbWVudG9yKHRoaXMpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwidGV4dFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblRleHQoXCJcIik7XG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJ0ZXh0XCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fdGV4dC50cyIsImV4cG9ydCB2YXIga29UZW1wbGF0ZSA9IHJlcXVpcmUoXCJodG1sLWxvYWRlcj9pbnRlcnBvbGF0ZSF2YWwtbG9hZGVyIS4vdGVtcGxhdGVzL2VudHJ5Lmh0bWxcIik7XG5cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlUZW1wbGF0ZVRleHQge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgcHVibGljIGFkZFRleHQobmV3VGV4dDogc3RyaW5nLCBpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBpZCA9IHRoaXMuZ2V0SWQoaWQsIG5hbWUpO1xuICAgIHRoaXMudGV4dCA9XG4gICAgICB0aGlzLnRleHQgK1xuICAgICAgJzxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiICcgK1xuICAgICAgaWQgK1xuICAgICAgXCI+XCIgK1xuICAgICAgbmV3VGV4dCArXG4gICAgICBcIjwvc2NyaXB0PlwiO1xuICB9XG4gIHB1YmxpYyByZXBsYWNlVGV4dChcbiAgICByZXBsYWNlVGV4dDogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSBudWxsXG4gICkge1xuICAgIHZhciBwb3NJZCA9IHRoaXMuZ2V0SWQoaWQsIHF1ZXN0aW9uVHlwZSk7XG4gICAgdmFyIHBvcyA9IHRoaXMudGV4dC5pbmRleE9mKHBvc0lkKTtcbiAgICBpZiAocG9zIDwgMCkge1xuICAgICAgdGhpcy5hZGRUZXh0KHJlcGxhY2VUZXh0LCBpZCwgcXVlc3Rpb25UeXBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcG9zID0gdGhpcy50ZXh0LmluZGV4T2YoXCI+XCIsIHBvcyk7XG4gICAgaWYgKHBvcyA8IDApIHJldHVybjtcbiAgICB2YXIgc3RhcnRQb3MgPSBwb3MgKyAxO1xuICAgIHZhciBlbmRTdHJpbmcgPSBcIjwvc2NyaXB0PlwiO1xuICAgIHBvcyA9IHRoaXMudGV4dC5pbmRleE9mKGVuZFN0cmluZywgc3RhcnRQb3MpO1xuICAgIGlmIChwb3MgPCAwKSByZXR1cm47XG4gICAgdGhpcy50ZXh0ID1cbiAgICAgIHRoaXMudGV4dC5zdWJzdHIoMCwgc3RhcnRQb3MpICsgcmVwbGFjZVRleHQgKyB0aGlzLnRleHQuc3Vic3RyKHBvcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGdldElkKGlkOiBzdHJpbmcsIHF1ZXN0aW9uVHlwZTogc3RyaW5nKSB7XG4gICAgdmFyIHJlc3VsdCA9ICdpZD1cInN1cnZleS0nICsgaWQ7XG4gICAgaWYgKHF1ZXN0aW9uVHlwZSkge1xuICAgICAgcmVzdWx0ICs9IFwiLVwiICsgcXVlc3Rpb25UeXBlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0ICsgJ1wiJztcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4ga29UZW1wbGF0ZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0IHRleHQodmFsdWU6IHN0cmluZykge1xuICAgIGtvVGVtcGxhdGUgPSB2YWx1ZTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlVGV4dC50cyIsImltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBib29sZWFuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Cb29sZWFuTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwibGFiZWxcIiwgdGhpcywgdHJ1ZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlc3Rpb24gY2hlY2sgd2lsbCBiZSByZW5kZXJlZCBpbiBpbmRldGVybWluYXRlIG1vZGUuIHZhbHVlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGdldCBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGFzVGl0bGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1RpdGxlO1xuICB9XG4gIHN1cHBvcnRHb05leHRQYWdlQXV0b21hdGljKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQvc2V0IHF1ZXN0aW9uIHZhbHVlIGluIDMgbW9kZXM6IGluZGV0ZXJtaW5hdGUgKHZhbHVlIGlzIGVtcHR5KSwgdHJ1ZSAoY2hlY2sgaXMgc2V0KSBhbmQgZmFsc2UgKGNoZWNrIGlzIHVuc2V0KS5cbiAgICogQHNlZSB2YWx1ZVRydWVcbiAgICogQHNlZSB2YWx1ZUZhbHNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNoZWNrZWRWYWx1ZSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzRW1wdHkoKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPT0gdGhpcy5nZXRWYWx1ZVRydWUoKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNoZWNrZWRWYWx1ZSh2YWw6IGFueSkge1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbCA9PSB0cnVlID8gdGhpcy5nZXRWYWx1ZVRydWUoKSA6IHRoaXMuZ2V0VmFsdWVGYWxzZSgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IHN0YXRlIG9mIHRoZSBjaGVjazogXCJpbmRldGVybWluYXRlXCIgLSBkZWZhdWx0ICh2YWx1ZSBpcyBlbXB0eS9udWxsKSwgXCJ0cnVlXCIgLSB2YWx1ZSBlcXVhbHMgdmFsdWVUcnVlIG9yIHRydWUsIFwiZmFsc2VcIiAtIHZhbHVlIGVxdWFscyB2YWx1ZUZhbHNlIG9yIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIGdldCBkZWZhdWx0VmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGVmYXVsdFZhbHVlXCIsIFwiaW5kZXRlcm1pbmF0ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlZmF1bHRWYWx1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRlZmF1bHRWYWx1ZVwiLCB2YWwpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVXaXRoRGVmYXVsdHMoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNoZWNrYm94IGxhYmVsLiBJZiBpdCBpcyBlbXB0eSBhbmQgc2hvd1RpdGxlIGlzIGZhbHNlIHRoZW4gdGl0bGUgaXMgcmVuZGVyZWRcbiAgICogQHNlZSBzaG93VGl0bGVcbiAgICogQHNlZSB0aXRsZVxuICAgKi9cbiAgcHVibGljIGdldCBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxhYmVsXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbGFiZWwodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImxhYmVsXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0xhYmVsKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImxhYmVsXCIpO1xuICB9XG4gIGdldCBsb2NEaXNwbGF5TGFiZWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIGlmICh0aGlzLmxvY0xhYmVsLnRleHQpIHJldHVybiB0aGlzLmxvY0xhYmVsO1xuICAgIHJldHVybiB0aGlzLnNob3dUaXRsZSA/IHRoaXMubG9jTGFiZWwgOiB0aGlzLmxvY1RpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIHNob3cgdGhlIHF1ZXN0aW9uIHRpdGxlLiBJdCBpcyBoaWRkZW4gYnkgZGVmYXVsdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1RpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93VGl0bGVcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93VGl0bGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1RpdGxlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5LCBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGZyb20gdHJ1ZSB3aGVuIGNoZWNrIGlzIHNldC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmFsdWVUcnVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInZhbHVlVHJ1ZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlVHJ1ZSh2YWw6IGFueSkge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInZhbHVlVHJ1ZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSwgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmcm9tIGZhbHNlIHdoZW4gY2hlY2sgaXMgdW5zZXQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbHVlRmFsc2UoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidmFsdWVGYWxzZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZhbHVlRmFsc2UodmFsOiBhbnkpIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJ2YWx1ZUZhbHNlXCIsIHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZVRydWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVRydWUgPyB0aGlzLnZhbHVlVHJ1ZSA6IHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBnZXRWYWx1ZUZhbHNlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVGYWxzZSA/IHRoaXMudmFsdWVGYWxzZSA6IGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBzZXREZWZhdWx0VmFsdWUoKSB7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09IFwidHJ1ZVwiKSB0aGlzLmNoZWNrZWRWYWx1ZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlID09IFwiZmFsc2VcIikgdGhpcy5jaGVja2VkVmFsdWUgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUgPT0gXCJpbmRldGVybWluYXRlXCIpIHRoaXMudmFsdWUgPSBudWxsO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwiYm9vbGVhblwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJkZWZhdWx0VmFsdWU6ZHJvcGRvd25cIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJib29sZWFuRGVmYXVsdFZhbHVlXCIsXG4gICAgICBkZWZhdWx0OiBcImluZGV0ZXJtaW5hdGVcIixcbiAgICAgIGNob2ljZXM6IFtcImluZGV0ZXJtaW5hdGVcIiwgXCJmYWxzZVwiLCBcInRydWVcIl1cbiAgICB9LFxuICAgIHsgbmFtZTogXCJsYWJlbDp0ZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NMYWJlbFwiIH0sXG4gICAgXCJzaG93VGl0bGU6Ym9vbGVhblwiLFxuICAgIFwidmFsdWVUcnVlXCIsXG4gICAgXCJ2YWx1ZUZhbHNlXCJcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkJvb2xlYW5Nb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImJvb2xlYW5cIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuTW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9ib29sZWFuLnRzIiwiaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBIZWxwZXJzIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgY2hlY2tib3ggcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgaXRlbXMgPSB0aGlzLnZpc2libGVDaG9pY2VzO1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlO1xuICAgIHZhciBzdHIgPSBcIlwiO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsU3RyID0gdGhpcy5nZXREaXNwbGF5VmFsdWUoaXRlbXMsIHZhbHVlc1tpXSk7XG4gICAgICBpZiAodmFsU3RyKSB7XG4gICAgICAgIGlmIChzdHIpIHN0ciArPSBcIiwgXCI7XG4gICAgICAgIHN0ciArPSB2YWxTdHI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgcHVibGljIGlzQW5zd2VyQ29ycmVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gSGVscGVycy5pc0FycmF5Q29udGFpbnNFcXVhbCh0aGlzLnZhbHVlLCB0aGlzLmNvcnJlY3RBbnN3ZXIpO1xuICB9XG4gIHByb3RlY3RlZCBnZXRIYXNPdGhlcih2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsIHx8ICFBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdmFsLmluZGV4T2YodGhpcy5vdGhlckl0ZW0udmFsdWUpID49IDA7XG4gIH1cbiAgcHJvdGVjdGVkIHZhbHVlRnJvbURhdGEodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICghdmFsKSByZXR1cm4gdmFsO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gW3ZhbF07XG4gICAgcmV0dXJuIHN1cGVyLnZhbHVlRnJvbURhdGEodmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgdmFsdWVGcm9tRGF0YUNvcmUodmFsOiBhbnkpOiBhbnkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsW2ldID09IHRoaXMub3RoZXJJdGVtLnZhbHVlKSByZXR1cm4gdmFsO1xuICAgICAgaWYgKHRoaXMuaGFzVW5rbm93blZhbHVlKHZhbFtpXSkpIHtcbiAgICAgICAgdGhpcy5jb21tZW50ID0gdmFsW2ldO1xuICAgICAgICB2YXIgbmV3VmFsID0gdmFsLnNsaWNlKCk7XG4gICAgICAgIG5ld1ZhbFtpXSA9IHRoaXMub3RoZXJJdGVtLnZhbHVlO1xuICAgICAgICByZXR1cm4gbmV3VmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsO1xuICB9XG4gIHByb3RlY3RlZCB2YWx1ZVRvRGF0YUNvcmUodmFsOiBhbnkpOiBhbnkge1xuICAgIGlmICghdmFsIHx8ICF2YWwubGVuZ3RoKSByZXR1cm4gdmFsO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodmFsW2ldID09IHRoaXMub3RoZXJJdGVtLnZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmdldENvbW1lbnQoKSkge1xuICAgICAgICAgIHZhciBuZXdWYWwgPSB2YWwuc2xpY2UoKTtcbiAgICAgICAgICBuZXdWYWxbaV0gPSB0aGlzLmdldENvbW1lbnQoKTtcbiAgICAgICAgICByZXR1cm4gbmV3VmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjaGVja2JveFwiO1xuICB9XG59XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcImNoZWNrYm94XCIsXG4gIFtdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJjaGVja2JveGJhc2VcIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiY2hlY2tib3hcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2NoZWNrYm94LnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgY29tbWVudCBxdWVzdGlvblxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Db21tZW50TW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGxhY2VIb2xkZXJcIiwgdGhpcyk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIHNldCB0aGUgaW5wdXQgcGxhY2UgaG9sZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBwbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgcGxhY2VIb2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBsYWNlSG9sZGVyXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY1BsYWNlSG9sZGVyKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBsYWNlSG9sZGVyXCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaHRtbCByb3dzIGF0dHJpYnV0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcm93cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIsIDQpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm93cyh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJvd3NcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGh0bWwgY29scyBhdHRyaWJ1dGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiY29sc1wiLCA1MCk7XG4gIH1cbiAgcHVibGljIHNldCBjb2xzKHZhbDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sc1wiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiY29tbWVudFwiO1xuICB9XG4gIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLmlzRW1wdHkoKSB8fCB0aGlzLnZhbHVlID09PSBcIlwiO1xuICB9XG59XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcImNvbW1lbnRcIixcbiAgW1xuICAgIHsgbmFtZTogXCJjb2xzOm51bWJlclwiLCBkZWZhdWx0OiA1MCB9LFxuICAgIHsgbmFtZTogXCJyb3dzOm51bWJlclwiLCBkZWZhdWx0OiA0IH0sXG4gICAgeyBuYW1lOiBcInBsYWNlSG9sZGVyXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQbGFjZUhvbGRlclwiIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkNvbW1lbnRNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJjb21tZW50XCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tbWVudE1vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fY29tbWVudC50cyIsImltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uU2VsZWN0QmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIGRyb3Bkb3duIHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgZXh0ZW5kcyBRdWVzdGlvblNlbGVjdEJhc2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIsIHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXQgdGhlIG9wdGlvbnMgY2FwdGlvbiBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCB2YWx1ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGFrZW4gZnJvbSBsb2NhbGl6YXRpb24gc3RyaW5ncy5cbiAgICovXG4gIHB1YmxpYyBnZXQgb3B0aW9uc0NhcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJvcHRpb25zQ2FwdGlvblwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcIm9wdGlvbnNDYXB0aW9uXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wdGlvbnNDYXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJvcHRpb25zQ2FwdGlvblwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NPcHRpb25zQ2FwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJvcHRpb25zQ2FwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImRyb3Bkb3duXCI7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwiZHJvcGRvd25cIixcbiAgW3sgbmFtZTogXCJvcHRpb25zQ2FwdGlvblwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jT3B0aW9uc0NhcHRpb25cIiB9XSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkRyb3Bkb3duTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwic2VsZWN0YmFzZVwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJkcm9wZG93blwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25Ecm9wZG93bk1vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fZHJvcGRvd24udHMiLCJpbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGFuIHF1ZXN0aW9uIHRoYXQgcmVuZGVycyBlbXB0eSBcImRpdlwiIHRhZy4gSXQgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIHNvbWUgY3VzdG9tIHdpZGdldHNcbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRW1wdHlNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZW1wdHlcIjtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcImVtcHR5XCIsXG4gIFtdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRW1wdHlNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX2VtcHR5LnRzIiwiaW1wb3J0IHsgSGFzaFRhYmxlIH0gZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgRXhwcmVzc2lvblJ1bm5lciB9IGZyb20gXCIuL2NvbmRpdGlvbnNcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBleHByZXNzaW9uIHF1ZXN0aW9uLiBJdCBpcyBhIHJlYWQtb25seSBxdWVzdGlvbi4gSXQgY2FsY3VsYXRlcyB2YWx1ZSBiYXNlZCBvbiBlcHhyZXNzaW9uIHByb3BlcnR5LlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbiB7XG4gIHByaXZhdGUgZXhwcmVzc2lvbklzUnVubmluZzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBleHByZXNzaW9uUnVubmVyOiBFeHByZXNzaW9uUnVubmVyO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImZvcm1hdFwiLCB0aGlzKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5yZWdpc3RlckZ1bmN0aW9uT25Qcm9wZXJ0eVZhbHVlQ2hhbmdlZChcImV4cHJlc3Npb25cIiwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc2VsZi5leHByZXNzaW9uUnVubmVyKSB7XG4gICAgICAgIHNlbGYuZXhwcmVzc2lvblJ1bm5lciA9IG5ldyBFeHByZXNzaW9uUnVubmVyKHNlbGYuZXhwcmVzc2lvbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJleHByZXNzaW9uXCI7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGRpc3BsYXkgdGhlIHZhbHVlIGluIHlvdXIgb3duIGZvcm1hdC4gTWFrZSBzdXJlIHlvdSBoYXZlIFwiezB9XCIgc3Vic3RyaW5nIGluIHlvdXIgc3RyaW5nLCB0byBkaXNwbGF5IHRoZSBhY3R1YWwgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImZvcm1hdFwiLCBcIlwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZvcm1hdCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiZm9ybWF0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0Zvcm1hdCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJmb3JtYXRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBFeHByZXNzaW9uIHRoYXQgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHF1ZXN0aW9uIHZhbHVlLiBZb3UgbWF5IHVzZSBzdGFuZGFyZCBvcGVyYXRvcnMgbGlrZSArLCAtLCAqIGFuZCAvLCBzcXVhcmVzICgpLiBIZXJlIGlzIHRoZSBleGFtcGxlIG9mIGFjY2Vzc2luZyB0aGUgcXVlc3Rpb24gdmFsdWUge3F1ZXN0aW9ubmFtZX0uXG4gICAqIDxici8+RXhhbXBsZTogXCIoe3F1YW50aXR5fSAqIHtwcmljZX0pICogKDEwMCAtIHtkaXNjb3VudH0pIC8gMTAwXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJleHByZXNzaW9uXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXhwcmVzc2lvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImV4cHJlc3Npb25cIiwgdmFsKTtcbiAgfVxuICBwdWJsaWMgcnVuQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICBzdXBlci5ydW5Db25kaXRpb24odmFsdWVzKTtcbiAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbiB8fCB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcpIHJldHVybjtcbiAgICB0aGlzLmV4cHJlc3Npb25Jc1J1bm5pbmcgPSB0cnVlO1xuICAgIGlmICghdGhpcy5leHByZXNzaW9uUnVubmVyKVxuICAgICAgdGhpcy5leHByZXNzaW9uUnVubmVyID0gbmV3IEV4cHJlc3Npb25SdW5uZXIodGhpcy5leHByZXNzaW9uKTtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5leHByZXNzaW9uUnVubmVyLnJ1bih2YWx1ZXMpO1xuICAgIHRoaXMuZXhwcmVzc2lvbklzUnVubmluZyA9IGZhbHNlO1xuICB9XG4gIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgdmFyIHZhbCA9IHRoaXMuaXNWYWx1ZUVtcHR5KHRoaXMudmFsdWUpID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB0aGlzLnZhbHVlO1xuICAgIGlmICh0aGlzLmlzVmFsdWVFbXB0eSh2YWwpKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgc3RyID0gdGhpcy5nZXRWYWx1ZUFzU3RyKHZhbCk7XG4gICAgaWYgKCF0aGlzLmZvcm1hdCkgcmV0dXJuIHN0cjtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRbXCJmb3JtYXRcIl0oc3RyKTtcbiAgfVxuICAvKipcbiAgICogWW91IG1heSBzZXQgdGhpcyBwcm9wZXJ0eSB0byBcImRlY2ltYWxcIiwgXCJjdXJyZW5jeVwiIG9yIFwicGVyY2VudFwiLiBJZiB5b3Ugc2V0IGl0IHRvIFwiY3VycmVuY3lcIiwgeW91IG1heSB1c2UgdGhlIGN1cnJlbmN5IHByb3BlcnR5IHRvIGRpc3BsYXkgdGhlIHZhbHVlIGluIGN1cnJlbmN5IGRpZmZlcmVudCBmcm9tIFVTRC5cbiAgICogQHNlZSBjdXJyZW5jeVxuICAgKi9cbiAgcHVibGljIGdldCBkaXNwbGF5U3R5bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVN0eWxlXCIsIFwibm9uZVwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRpc3BsYXlTdHlsZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlTdHlsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgaXQgdG8gZGlzcGxheSB0aGUgdmFsdWUgaW4gdGhlIGN1cnJlbmN5IGRpZmZlcmVuIGZyb20gVVNELiBUaGUgZGlzcGxheVN0eXBlIHNob3VsZCBiZSBzZXQgdG8gXCJjdXJyZW5jeVwiLlxuICAgKiBAc2VlIGRpc3BsYXlTdHlsZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW5jeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJjdXJyZW5jeVwiLCBcIlVTRFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbmN5KHZhbDogc3RyaW5nKSB7XG4gICAgaWYgKGdldEN1cnJlY3lDb2RlcygpLmluZGV4T2YodmFsKSA8IDApIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjdXJyZW5jeVwiLCB2YWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgdXNlR3JvdXBpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInVzZUdyb3VwaW5nXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgdXNlR3JvdXBpbmcodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidXNlR3JvdXBpbmdcIiwgdmFsKTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0VmFsdWVBc1N0cih2YWw6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kaXNwbGF5U3R5bGUgIT0gXCJub25lXCIgJiZcbiAgICAgICFpc05hTihwYXJzZUZsb2F0KHZhbCkpICYmXG4gICAgICBpc0Zpbml0ZSh2YWwpXG4gICAgKSB7XG4gICAgICB2YXIgbG9jYWxlID0gdGhpcy5nZXRMb2NhbGUoKTtcbiAgICAgIGlmICghbG9jYWxlKSBsb2NhbGUgPSBcImVuXCI7XG4gICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgc3R5bGU6IHRoaXMuZGlzcGxheVN0eWxlLFxuICAgICAgICBjdXJyZW5jeTogdGhpcy5jdXJyZW5jeSxcbiAgICAgICAgdXNlR3JvdXBpbmc6IHRoaXMudXNlR3JvdXBpbmdcbiAgICAgIH07XG4gICAgICByZXR1cm4gdmFsLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB2YWwudG9TdHJpbmcoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDdXJyZWN5Q29kZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gIHJldHVybiBbXG4gICAgXCJBRURcIixcbiAgICBcIkFGTlwiLFxuICAgIFwiQUxMXCIsXG4gICAgXCJBTURcIixcbiAgICBcIkFOR1wiLFxuICAgIFwiQU9BXCIsXG4gICAgXCJBUlNcIixcbiAgICBcIkFVRFwiLFxuICAgIFwiQVdHXCIsXG4gICAgXCJBWk5cIixcbiAgICBcIkJBTVwiLFxuICAgIFwiQkJEXCIsXG4gICAgXCJCRFRcIixcbiAgICBcIkJHTlwiLFxuICAgIFwiQkhEXCIsXG4gICAgXCJCSUZcIixcbiAgICBcIkJNRFwiLFxuICAgIFwiQk5EXCIsXG4gICAgXCJCT0JcIixcbiAgICBcIkJPVlwiLFxuICAgIFwiQlJMXCIsXG4gICAgXCJCU0RcIixcbiAgICBcIkJUTlwiLFxuICAgIFwiQldQXCIsXG4gICAgXCJCWU5cIixcbiAgICBcIkJaRFwiLFxuICAgIFwiQ0FEXCIsXG4gICAgXCJDREZcIixcbiAgICBcIkNIRVwiLFxuICAgIFwiQ0hGXCIsXG4gICAgXCJDSFdcIixcbiAgICBcIkNMRlwiLFxuICAgIFwiQ0xQXCIsXG4gICAgXCJDTllcIixcbiAgICBcIkNPUFwiLFxuICAgIFwiQ09VXCIsXG4gICAgXCJDUkNcIixcbiAgICBcIkNVQ1wiLFxuICAgIFwiQ1VQXCIsXG4gICAgXCJDVkVcIixcbiAgICBcIkNaS1wiLFxuICAgIFwiREpGXCIsXG4gICAgXCJES0tcIixcbiAgICBcIkRPUFwiLFxuICAgIFwiRFpEXCIsXG4gICAgXCJFR1BcIixcbiAgICBcIkVSTlwiLFxuICAgIFwiRVRCXCIsXG4gICAgXCJFVVJcIixcbiAgICBcIkZKRFwiLFxuICAgIFwiRktQXCIsXG4gICAgXCJHQlBcIixcbiAgICBcIkdFTFwiLFxuICAgIFwiR0hTXCIsXG4gICAgXCJHSVBcIixcbiAgICBcIkdNRFwiLFxuICAgIFwiR05GXCIsXG4gICAgXCJHVFFcIixcbiAgICBcIkdZRFwiLFxuICAgIFwiSEtEXCIsXG4gICAgXCJITkxcIixcbiAgICBcIkhSS1wiLFxuICAgIFwiSFRHXCIsXG4gICAgXCJIVUZcIixcbiAgICBcIklEUlwiLFxuICAgIFwiSUxTXCIsXG4gICAgXCJJTlJcIixcbiAgICBcIklRRFwiLFxuICAgIFwiSVJSXCIsXG4gICAgXCJJU0tcIixcbiAgICBcIkpNRFwiLFxuICAgIFwiSk9EXCIsXG4gICAgXCJKUFlcIixcbiAgICBcIktFU1wiLFxuICAgIFwiS0dTXCIsXG4gICAgXCJLSFJcIixcbiAgICBcIktNRlwiLFxuICAgIFwiS1BXXCIsXG4gICAgXCJLV0RcIixcbiAgICBcIktZRFwiLFxuICAgIFwiS1pUXCIsXG4gICAgXCJMQUtcIixcbiAgICBcIkxCUFwiLFxuICAgIFwiTEtSXCIsXG4gICAgXCJMUkRcIixcbiAgICBcIkxTTFwiLFxuICAgIFwiTFlEXCIsXG4gICAgXCJNQURcIixcbiAgICBcIk1ETFwiLFxuICAgIFwiTUdBXCIsXG4gICAgXCJNS0RcIixcbiAgICBcIk1NS1wiLFxuICAgIFwiTU5UXCIsXG4gICAgXCJNT1BcIixcbiAgICBcIk1ST1wiLFxuICAgIFwiTVVSXCIsXG4gICAgXCJNVlJcIixcbiAgICBcIk1XS1wiLFxuICAgIFwiTVhOXCIsXG4gICAgXCJNWFZcIixcbiAgICBcIk1ZUlwiLFxuICAgIFwiTVpOXCIsXG4gICAgXCJOQURcIixcbiAgICBcIk5HTlwiLFxuICAgIFwiTklPXCIsXG4gICAgXCJOT0tcIixcbiAgICBcIk5QUlwiLFxuICAgIFwiTlpEXCIsXG4gICAgXCJPTVJcIixcbiAgICBcIlBBQlwiLFxuICAgIFwiUEVOXCIsXG4gICAgXCJQR0tcIixcbiAgICBcIlBIUFwiLFxuICAgIFwiUEtSXCIsXG4gICAgXCJQTE5cIixcbiAgICBcIlBZR1wiLFxuICAgIFwiUUFSXCIsXG4gICAgXCJST05cIixcbiAgICBcIlJTRFwiLFxuICAgIFwiUlVCXCIsXG4gICAgXCJSV0ZcIixcbiAgICBcIlNBUlwiLFxuICAgIFwiU0JEXCIsXG4gICAgXCJTQ1JcIixcbiAgICBcIlNER1wiLFxuICAgIFwiU0VLXCIsXG4gICAgXCJTR0RcIixcbiAgICBcIlNIUFwiLFxuICAgIFwiU0xMXCIsXG4gICAgXCJTT1NcIixcbiAgICBcIlNSRFwiLFxuICAgIFwiU1NQXCIsXG4gICAgXCJTVERcIixcbiAgICBcIlNWQ1wiLFxuICAgIFwiU1lQXCIsXG4gICAgXCJTWkxcIixcbiAgICBcIlRIQlwiLFxuICAgIFwiVEpTXCIsXG4gICAgXCJUTVRcIixcbiAgICBcIlRORFwiLFxuICAgIFwiVE9QXCIsXG4gICAgXCJUUllcIixcbiAgICBcIlRURFwiLFxuICAgIFwiVFdEXCIsXG4gICAgXCJUWlNcIixcbiAgICBcIlVBSFwiLFxuICAgIFwiVUdYXCIsXG4gICAgXCJVU0RcIixcbiAgICBcIlVTTlwiLFxuICAgIFwiVVlJXCIsXG4gICAgXCJVWVVcIixcbiAgICBcIlVaU1wiLFxuICAgIFwiVkVGXCIsXG4gICAgXCJWTkRcIixcbiAgICBcIlZVVlwiLFxuICAgIFwiV1NUXCIsXG4gICAgXCJYQUZcIixcbiAgICBcIlhBR1wiLFxuICAgIFwiWEFVXCIsXG4gICAgXCJYQkFcIixcbiAgICBcIlhCQlwiLFxuICAgIFwiWEJDXCIsXG4gICAgXCJYQkRcIixcbiAgICBcIlhDRFwiLFxuICAgIFwiWERSXCIsXG4gICAgXCJYT0ZcIixcbiAgICBcIlhQRFwiLFxuICAgIFwiWFBGXCIsXG4gICAgXCJYUFRcIixcbiAgICBcIlhTVVwiLFxuICAgIFwiWFRTXCIsXG4gICAgXCJYVUFcIixcbiAgICBcIlhYWFwiLFxuICAgIFwiWUVSXCIsXG4gICAgXCJaQVJcIixcbiAgICBcIlpBUlwiLFxuICAgIFwiWk1XXCIsXG4gICAgXCJaV0xcIlxuICBdO1xufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcImV4cHJlc3Npb25cIixcbiAgW1xuICAgIFwiZXhwcmVzc2lvbjpleHByZXNzaW9uXCIsXG4gICAgeyBuYW1lOiBcImZvcm1hdFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jRm9ybWF0XCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImRpc3BsYXlTdHlsZVwiLFxuICAgICAgZGVmYXVsdDogXCJkZWNpbWFsXCIsXG4gICAgICBjaG9pY2VzOiBbXCJub25lXCIsIFwiZGVjaW1hbFwiLCBcImN1cnJlbmN5XCIsIFwicGVyY2VudFwiXVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjdXJyZW5jeVwiLFxuICAgICAgY2hvaWNlczogKCkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0Q3VycmVjeUNvZGVzKCk7XG4gICAgICB9LFxuICAgICAgZGVmYXVsdDogXCJVU0RcIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcInVzZUdyb3VwaW5nOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJjb21tZW50VGV4dFwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJlbmFibGVJZlwiLCB2aXNpYmxlOiBmYWxzZSB9LFxuICAgIHsgbmFtZTogXCJpc1JlcXVpcmVkXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlYWRPbmx5XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInJlcXVpcmVkRXJyb3JUZXh0XCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInZhbGlkYXRvcnNcIiwgdmlzaWJsZTogZmFsc2UgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImV4cHJlc3Npb25cIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25FeHByZXNzaW9uTW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9leHByZXNzaW9uLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgU3VydmV5RXJyb3IgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciwgRXhjZWVkU2l6ZUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuL3N1cnZleVN0cmluZ3NcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIGZpbGUgcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRmlsZU1vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBwcml2YXRlIGlzVXBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHByZXZpZXdWYWx1ZUxvYWRlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgcHJldmlld1ZhbHVlOiBhbnlbXSA9IFtdO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmaWxlXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBzaG93IHRoZSBwcmV2aWV3IGZvciB0aGUgaW1hZ2UgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNob3dQcmV2aWV3KCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldmlld1wiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UHJldmlldyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJzaG93UHJldmlld1wiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSwgdG8gYWxsb3cgc2VsZWN0IG11bHRpcGxlIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd011bHRpcGxlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd011bHRpcGxlXCIsIGZhbHNlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93TXVsdGlwbGUodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dNdWx0aXBsZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW1hZ2UgaGVpZ2h0LlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZUhlaWdodCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpbWFnZUhlaWdodFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IGltYWdlSGVpZ2h0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VIZWlnaHRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGltYWdlIHdpZHRoLlxuICAgKi9cbiAgcHVibGljIGdldCBpbWFnZVdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImltYWdlV2lkdGhcIik7XG4gIH1cbiAgcHVibGljIHNldCBpbWFnZVdpZHRoKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaW1hZ2VXaWR0aFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IGRvIG5vdCB3YW50IHRvIHNlcmlhbGl6ZSBmaWxlIGNvbnRlbnQgYXMgdGV4dCBpbiB0aGUgc3VydmV5LmRhdGEuXG4gICAqIEluIHRoaXMgY2FzZSwgeW91IGhhdmUgdG8gd3JpdGUgdGhlIGNvZGUgb25VcGxvYWRGaWxlIGV2ZW50IHRvIHN0b3JlIHRoZSBmaWxlIGNvbnRlbnQuXG4gICAqIEBzZWUgU3VydmV5TW9kZWwub25VcGxvYWRGaWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0b3JlRGF0YUFzVGV4dCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic3RvcmVEYXRhQXNUZXh0XCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RvcmVEYXRhQXNUZXh0KHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInN0b3JlRGF0YUFzVGV4dFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzZXR1cCB0aGUgbWF4aW11bSBhbGxvd2VkIGZpbGUgc2l6ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtYXhTaXplXCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4U2l6ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFNpemVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGNsZWFuIGZpbGVzIHZhbHVlIGJ1dHRvbiBjYXB0aW9uLlxuICAgKi9cbiAgZ2V0IGNsZWFuQnV0dG9uQ2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwiY2xlYW5DYXB0aW9uXCIpO1xuICB9XG4gIC8qKlxuICAgKiBDbGVhciB2YWx1ZSBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wcmV2aWV3VmFsdWUgPSBbXTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnByZXZpZXdWYWx1ZUxvYWRlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogTG9hZCBmaWxlIHByb2dyYW1tYXRpY2FsbHkuXG4gICAqIEBwYXJhbSBmaWxlXG4gICAqL1xuICBwdWJsaWMgbG9hZEZpbGUoZmlsZTogRmlsZSkge1xuICAgIHRoaXMubG9hZEZpbGVzKFtmaWxlXSk7XG4gIH1cbiAgLyoqXG4gICAqIExvYWQgbXVsdGlwbGUgZmlsZXMgcHJvZ3JhbW1hdGljYWxseS5cbiAgICogQHBhcmFtIGZpbGVzXG4gICAqL1xuICBwdWJsaWMgbG9hZEZpbGVzKGZpbGVzOiBGaWxlW10pIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnN1cnZleSAmJlxuICAgICAgIWZpbGVzLmV2ZXJ5KGZpbGUgPT5cbiAgICAgICAgdGhpcy5zdXJ2ZXkudXBsb2FkRmlsZShcbiAgICAgICAgICB0aGlzLm5hbWUsXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICB0aGlzLnN0b3JlRGF0YUFzVGV4dCxcbiAgICAgICAgICBzdGF0dXMgPT4gKHRoaXMuaXNVcGxvYWRpbmcgPSBzdGF0dXMgPT09IFwidXBsb2FkaW5nXCIpXG4gICAgICAgIClcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRGaWxlc1ZhbHVlKGZpbGVzKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RmlsZVZhbHVlKGZpbGU6IEZpbGUpIHtcbiAgICB0aGlzLnNldEZpbGVzVmFsdWUoW2ZpbGVdKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0RmlsZXNWYWx1ZShmaWxlczogRmlsZVtdKSB7XG4gICAgaWYgKCFGaWxlUmVhZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5zaG93UHJldmlldyAmJiAhdGhpcy5zdG9yZURhdGFBc1RleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGZpbGVzLmV2ZXJ5KGZpbGUgPT4gdGhpcy5jaGVja0ZpbGVGb3JFcnJvcnMoZmlsZSkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJldmlld1ZhbHVlID0gW107XG4gICAgZmlsZXMuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgIGxldCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN0b3JlRGF0YUFzVGV4dCkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSAodGhpcy52YWx1ZSB8fCBbXSkuY29uY2F0KFtmaWxlUmVhZGVyLnJlc3VsdF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3dQcmV2aWV3ICYmIHRoaXMuaXNGaWxlSW1hZ2UoZmlsZSkpIHtcbiAgICAgICAgICB0aGlzLnByZXZpZXdWYWx1ZSA9IHRoaXMucHJldmlld1ZhbHVlLmNvbmNhdChbZmlsZVJlYWRlci5yZXN1bHRdKTtcbiAgICAgICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnByZXZpZXdWYWx1ZUxvYWRlZENhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DaGVja0ZvckVycm9ycyhlcnJvcnM6IEFycmF5PFN1cnZleUVycm9yPikge1xuICAgIHN1cGVyLm9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzKTtcbiAgICBpZiAodGhpcy5pc1VwbG9hZGluZykge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG5ldyBDdXN0b21FcnJvcihzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwidXBsb2FkaW5nRmlsZVwiKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY2hlY2tGaWxlRm9yRXJyb3JzKGZpbGU6IEZpbGUpOiBib29sZWFuIHtcbiAgICB2YXIgZXJyb3JMZW5ndGggPSB0aGlzLmVycm9ycyA/IHRoaXMuZXJyb3JzLmxlbmd0aCA6IDA7XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICBpZiAodGhpcy5tYXhTaXplID4gMCAmJiBmaWxlLnNpemUgPiB0aGlzLm1heFNpemUpIHtcbiAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IEV4Y2VlZFNpemVFcnJvcih0aGlzLm1heFNpemUpKTtcbiAgICB9XG4gICAgaWYgKGVycm9yTGVuZ3RoICE9IHRoaXMuZXJyb3JzLmxlbmd0aCB8fCB0aGlzLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmVycm9yc0NoYW5nZWRDYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGggPiAwO1xuICB9XG4gIHByaXZhdGUgaXNGaWxlSW1hZ2UoZmlsZTogRmlsZSkge1xuICAgIGlmICghZmlsZSB8fCAhZmlsZS50eXBlKSByZXR1cm47XG4gICAgdmFyIHN0ciA9IGZpbGUudHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBzdHIuaW5kZXhPZihcImltYWdlXCIpID09IDA7XG4gIH1cbn1cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwiZmlsZVwiLFxuICBbXG4gICAgXCJzaG93UHJldmlldzpib29sZWFuXCIsXG4gICAgXCJhbGxvd011bHRpcGxlOmJvb2xlYW5cIixcbiAgICBcImltYWdlSGVpZ2h0XCIsXG4gICAgXCJpbWFnZVdpZHRoXCIsXG4gICAgeyBuYW1lOiBcInN0b3JlRGF0YUFzVGV4dDpib29sZWFuXCIsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBcIm1heFNpemU6bnVtYmVyXCJcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbkZpbGVNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJmaWxlXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRmlsZU1vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fZmlsZS50cyIsImltcG9ydCB7IFF1ZXN0aW9uQmFzZSB9IGZyb20gXCIuL3F1ZXN0aW9uYmFzZVwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGh0bWwgcXVlc3Rpb24uIFVubGlrZSBvdGhlciBxdWVzdGlvbnMgaXQgZG9lc24ndCBoYXZlIHZhbHVlIGFuZCB0aXRsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uSHRtbE1vZGVsIGV4dGVuZHMgUXVlc3Rpb25CYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJodG1sXCIsIHRoaXMpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiaHRtbFwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImh0bWxcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBodG1sKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJodG1sXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0h0bWwoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiaHRtbFwiKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHByb2Nlc3NlZEh0bWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucHJvY2Vzc0h0bWwodGhpcy5odG1sKSA6IHRoaXMuaHRtbDtcbiAgfVxufVxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJodG1sXCIsXG4gIFt7IG5hbWU6IFwiaHRtbDpodG1sXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NIdG1sXCIgfV0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25IdG1sTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25iYXNlXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImh0bWxcIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25IdG1sTW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9odG1sLnRzIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFN1cnZleUVycm9yIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4vc3VydmV5U3RyaW5nc1wiO1xuaW1wb3J0IHsgQ3VzdG9tRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1hdHJpeERhdGEge1xuICBvbk1hdHJpeFJvd0NoYW5nZWQocm93OiBNYXRyaXhSb3dNb2RlbCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhSb3dNb2RlbCB7XG4gIHByaXZhdGUgZGF0YTogSU1hdHJpeERhdGE7XG4gIHByaXZhdGUgaXRlbTogSXRlbVZhbHVlO1xuICBwcm90ZWN0ZWQgcm93VmFsdWU6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgcHVibGljIGZ1bGxOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogSU1hdHJpeERhdGEsXG4gICAgdmFsdWU6IGFueVxuICApIHtcbiAgICB0aGlzLml0ZW0gPSBpdGVtO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5yb3dWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLml0ZW0udmFsdWU7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS50ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS5sb2NUZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucm93VmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCB2YWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5yb3dWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGlmICh0aGlzLmRhdGEpIHRoaXMuZGF0YS5vbk1hdHJpeFJvd0NoYW5nZWQodGhpcyk7XG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHt9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBzaW1wbGUgbWF0cml4IHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhNb2RlbCBleHRlbmRzIFF1ZXN0aW9uIGltcGxlbWVudHMgSU1hdHJpeERhdGEge1xuICBwcml2YXRlIGNvbHVtbnNWYWx1ZTogQXJyYXk8SXRlbVZhbHVlPjtcbiAgcHJpdmF0ZSByb3dzVmFsdWU6IEFycmF5PEl0ZW1WYWx1ZT47XG4gIHByaXZhdGUgaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICBwcml2YXRlIGdlbmVyYXRlZFZpc2libGVSb3dzOiBBcnJheTxNYXRyaXhSb3dNb2RlbD47XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNvbHVtbnNWYWx1ZSA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcImNvbHVtbnNcIik7XG4gICAgdGhpcy5yb3dzVmFsdWUgPSB0aGlzLmNyZWF0ZUl0ZW1WYWx1ZXMoXCJyb3dzXCIpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibWF0cml4XCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0FsbG93VGl0bGVMZWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgaWYgeW91IHdhbnQgYSB1c2VyIHRvIGFuc3dlciBhbGwgcm93cy5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNBbGxSb3dSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiaXNBbGxSb3dSZXF1aXJlZFwiLCBmYWxzZSk7XG4gIH1cbiAgcHVibGljIHNldCBpc0FsbFJvd1JlcXVpcmVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImlzQWxsUm93UmVxdWlyZWRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcm93LlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNSb3dzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJvd3NWYWx1ZS5sZW5ndGggPiAwO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBjb2x1bW5zLiBBIGNvbHVtbiBoYXMgYSB2YWx1ZSBhbmQgYW4gb3B0aW9uYWwgdGV4dFxuICAgKi9cbiAgZ2V0IGNvbHVtbnMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1uc1ZhbHVlO1xuICB9XG4gIHNldCBjb2x1bW5zKG5ld1ZhbHVlOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sdW1uc1wiLCBuZXdWYWx1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHJvd3MuIEEgcm93IGhhcyBhIHZhbHVlIGFuZCBhbiBvcHRpb25hbCB0ZXh0XG4gICAqL1xuICBnZXQgcm93cygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yb3dzVmFsdWU7XG4gIH1cbiAgc2V0IHJvd3MobmV3VmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJyb3dzXCIsIG5ld1ZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiByb3dzIGFzIG1vZGVsIG9iamVjdHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpc2libGVSb3dzKCk6IEFycmF5PE1hdHJpeFJvd01vZGVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxNYXRyaXhSb3dNb2RlbD4oKTtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdGhpcy5yb3dzW2ldLnZhbHVlKSBjb250aW51ZTtcbiAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICB0aGlzLmNyZWF0ZU1hdHJpeFJvdyhcbiAgICAgICAgICB0aGlzLnJvd3NbaV0sXG4gICAgICAgICAgdGhpcy5uYW1lICsgXCJfXCIgKyB0aGlzLnJvd3NbaV0udmFsdWUudG9TdHJpbmcoKSxcbiAgICAgICAgICB2YWxbdGhpcy5yb3dzW2ldLnZhbHVlXVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXN1bHQucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyhuZXcgSXRlbVZhbHVlKG51bGwpLCB0aGlzLm5hbWUsIHZhbCkpO1xuICAgIH1cbiAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzVmFsdWVzSW5BbGxSb3dzKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBzdXBlci5vbkNoZWNrRm9yRXJyb3JzKGVycm9ycyk7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3JJblJvd3MoKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG5ldyBDdXN0b21FcnJvcihzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVxdWlyZWRJbkFsbFJvd3NFcnJvclwiKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJblJvd3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzQWxsUm93UmVxdWlyZWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXRoaXMuaGFzVmFsdWVzSW5BbGxSb3dzKCk7XG4gIH1cbiAgcHJpdmF0ZSBoYXNWYWx1ZXNJbkFsbFJvd3MoKTogYm9vbGVhbiB7XG4gICAgdmFyIHJvd3MgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzO1xuICAgIGlmICghcm93cykgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgaWYgKCFyb3dzKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB2YWwgPSByb3dzW2ldLnZhbHVlO1xuICAgICAgaWYgKCF2YWwpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU1hdHJpeFJvdyhcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgZnVsbE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICk6IE1hdHJpeFJvd01vZGVsIHtcbiAgICByZXR1cm4gbmV3IE1hdHJpeFJvd01vZGVsKGl0ZW0sIGZ1bGxOYW1lLCB0aGlzLCB2YWx1ZSk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNSb3dDaGFuZ2luZyB8fFxuICAgICAgIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgfHxcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MubGVuZ3RoID09IDBcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcbiAgICB2YXIgdmFsID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbCkgdmFsID0ge307XG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1swXS52YWx1ZSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldO1xuICAgICAgICB2YXIgcm93VmFsID0gdmFsW3Jvdy5uYW1lXSA/IHZhbFtyb3cubmFtZV0gOiBudWxsO1xuICAgICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW2ldLnZhbHVlID0gcm93VmFsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlzUm93Q2hhbmdpbmcgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZ2V0IGRpc3BsYXlWYWx1ZSgpOiBhbnkge1xuICAgIHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsdWVzKSByZXR1cm4gdmFsdWVzO1xuICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZXMpIHtcbiAgICAgIHZhbHVlc1trZXldID0gSXRlbVZhbHVlLmdldFRleHRPckh0bWxCeVZhbHVlKHRoaXMuY29sdW1ucywgdmFsdWVzW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIC8vSU1hdHJpeERhdGFcbiAgb25NYXRyaXhSb3dDaGFuZ2VkKHJvdzogTWF0cml4Um93TW9kZWwpIHtcbiAgICBpZiAodGhpcy5pc1Jvd0NoYW5naW5nKSByZXR1cm47XG4gICAgdGhpcy5pc1Jvd0NoYW5naW5nID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMuaGFzUm93cykge1xuICAgICAgdGhpcy5zZXROZXdWYWx1ZShyb3cudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgaWYgKCFuZXdWYWx1ZSkge1xuICAgICAgICBuZXdWYWx1ZSA9IHt9O1xuICAgICAgfVxuICAgICAgbmV3VmFsdWVbcm93Lm5hbWVdID0gcm93LnZhbHVlO1xuICAgICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuaXNSb3dDaGFuZ2luZyA9IGZhbHNlO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwibWF0cml4XCIsXG4gIFtcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbHVtbnM6aXRlbXZhbHVlc1wiLFxuICAgICAgb25HZXRWYWx1ZTogZnVuY3Rpb24ob2JqOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIEl0ZW1WYWx1ZS5nZXREYXRhKG9iai5jb2x1bW5zKTtcbiAgICAgIH0sXG4gICAgICBvblNldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSwgdmFsdWU6IGFueSkge1xuICAgICAgICBvYmouY29sdW1ucyA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzOml0ZW12YWx1ZXNcIixcbiAgICAgIG9uR2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBJdGVtVmFsdWUuZ2V0RGF0YShvYmoucm93cyk7XG4gICAgICB9LFxuICAgICAgb25TZXRWYWx1ZTogZnVuY3Rpb24ob2JqOiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgb2JqLnJvd3MgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiaXNBbGxSb3dSZXF1aXJlZDpib29sZWFuXCJcbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeE1vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibWF0cml4XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeE1vZGVsKG5hbWUpO1xuICBxLnJvd3MgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdFJvd3M7XG4gIHEuY29sdW1ucyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q29sdW1zO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX21hdHJpeC50cyIsImltcG9ydCB7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsXG4gIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICBJTWF0cml4RHJvcGRvd25EYXRhXG59IGZyb20gXCIuL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuL2l0ZW12YWx1ZVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbmV4cG9ydCBjbGFzcyBNYXRyaXhEcm9wZG93blJvd01vZGVsIGV4dGVuZHMgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2Uge1xuICBwcml2YXRlIGl0ZW06IEl0ZW1WYWx1ZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgZGF0YTogSU1hdHJpeERyb3Bkb3duRGF0YSxcbiAgICB2YWx1ZTogYW55XG4gICkge1xuICAgIHN1cGVyKGRhdGEsIHZhbHVlKTtcbiAgICB0aGlzLml0ZW0gPSBpdGVtO1xuICAgIHRoaXMuYnVpbGRDZWxscygpO1xuICB9XG4gIHB1YmxpYyBnZXQgcm93TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS50ZXh0O1xuICB9XG4gIHB1YmxpYyBnZXQgbG9jVGV4dCgpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbS5sb2NUZXh0O1xuICB9XG59XG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgbWF0cml4IGRyb3Bkb3duIHF1ZXN0aW9uLiBZb3UgbWF5IHVzZSBhIGRyb3Bkb3duLCBjaGVja2JveCwgcmFkaW9ncm91cCwgdGV4dCBhbmQgY29tbWVudCBxdWVzdGlvbnMgYXMgYSBjZWxsIGVkaXRvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlXG4gIGltcGxlbWVudHMgSU1hdHJpeERyb3Bkb3duRGF0YSB7XG4gIHByaXZhdGUgcm93c1ZhbHVlOiBBcnJheTxJdGVtVmFsdWU+O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLnJvd3NWYWx1ZSA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcInJvd3NcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVnaXN0ZXJGdW5jdGlvbk9uUHJvcGVydHlWYWx1ZUNoYW5nZWQoXCJyb3dzXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5nZW5lcmF0ZWRWaXNpYmxlUm93cyA9IG51bGw7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhkcm9wZG93blwiO1xuICB9XG4gIHB1YmxpYyBnZXQgZGlzcGxheVZhbHVlKCk6IGFueSB7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWx1ZXMpIHJldHVybiB2YWx1ZXM7XG4gICAgdmFyIHJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJvd1ZhbHVlID0gdGhpcy5yb3dzW2ldLnZhbHVlO1xuICAgICAgdmFyIHZhbCA9IHZhbHVlc1tyb3dWYWx1ZV07XG4gICAgICBpZiAoIXZhbCkgY29udGludWU7XG4gICAgICB2YWx1ZXNbcm93VmFsdWVdID0gdGhpcy5nZXRSb3dEaXNwbGF5VmFsdWUocm93c1tpXSwgdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiByb3dzLiBBIHJvdyBoYXMgYSB2YWx1ZSBhbmQgYW4gb3B0aW9uYWwgdGV4dFxuICAgKi9cbiAgcHVibGljIGdldCByb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJvd3NWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHJvd3ModmFsOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicm93c1wiLCB2YWwpO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbD4ge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXk8TWF0cml4RHJvcGRvd25Sb3dNb2RlbD4oKTtcbiAgICBpZiAoIXRoaXMucm93cyB8fCB0aGlzLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzdWx0O1xuICAgIHZhciB2YWwgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsKSB2YWwgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCF0aGlzLnJvd3NbaV0udmFsdWUpIGNvbnRpbnVlO1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5jcmVhdGVNYXRyaXhSb3codGhpcy5yb3dzW2ldLCB2YWxbdGhpcy5yb3dzW2ldLnZhbHVlXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVNYXRyaXhSb3coXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogTWF0cml4RHJvcGRvd25Sb3dNb2RlbCB7XG4gICAgdmFyIHJvdyA9IG5ldyBNYXRyaXhEcm9wZG93blJvd01vZGVsKGl0ZW0udmFsdWUsIGl0ZW0sIHRoaXMsIHZhbHVlKTtcbiAgICB0aGlzLm9uTWF0cml4Um93Q3JlYXRlZChyb3cpO1xuICAgIHJldHVybiByb3c7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJtYXRyaXhkcm9wZG93blwiLFxuICBbXG4gICAge1xuICAgICAgbmFtZTogXCJyb3dzOml0ZW12YWx1ZXNcIixcbiAgICAgIG9uR2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55KSB7XG4gICAgICAgIHJldHVybiBJdGVtVmFsdWUuZ2V0RGF0YShvYmoucm93cyk7XG4gICAgICB9LFxuICAgICAgb25TZXRWYWx1ZTogZnVuY3Rpb24ob2JqOiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgb2JqLnJvd3MgPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsKFwiXCIpO1xuICB9LFxuICBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGRyb3Bkb3duXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWwobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgcS5yb3dzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDb2x1bXM7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd24udHMiLCJpbXBvcnQge1xuICBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlLFxuICBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgSU1hdHJpeERyb3Bkb3duRGF0YSxcbiAgTWF0cml4RHJvcGRvd25Db2x1bW5cbn0gZnJvbSBcIi4vcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25iYXNlXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBCYXNlLCBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEN1c3RvbUVycm9yIH0gZnJvbSBcIi4vZXJyb3JcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeER5bmFtaWNSb3dNb2RlbCBleHRlbmRzIE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlIHtcbiAgY29uc3RydWN0b3IocHVibGljIGluZGV4OiBudW1iZXIsIGRhdGE6IElNYXRyaXhEcm9wZG93bkRhdGEsIHZhbHVlOiBhbnkpIHtcbiAgICBzdXBlcihkYXRhLCB2YWx1ZSk7XG4gICAgdGhpcy5idWlsZENlbGxzKCk7XG4gIH1cbiAgcHVibGljIGdldCByb3dOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmlkO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBtYXRyaXggZHltYW5pYyBxdWVzdGlvbi4gWW91IG1heSB1c2UgYSBkcm9wZG93biwgY2hlY2tib3gsIHJhZGlvZ3JvdXAsIHRleHQgYW5kIGNvbW1lbnQgcXVlc3Rpb25zIGFzIGEgY2VsbCBlZGl0b3JzLlxuICogQW4gZW5kLXVzZXIgbWF5IGR5bmFtaWNhbGx5IGFkZC9yZW1vdmUgcm93cywgdW5saWtlIGluIG1hdHJpeCBkcm9wZG93biBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZVxuICBpbXBsZW1lbnRzIElNYXRyaXhEcm9wZG93bkRhdGEge1xuICBwdWJsaWMgc3RhdGljIE1heFJvd0NvdW50ID0gMTAwO1xuICBwcml2YXRlIHJvd0NvdW50ZXIgPSAwO1xuICBwcml2YXRlIHJvd0NvdW50VmFsdWU6IG51bWJlciA9IDI7XG4gIHJvd0NvdW50Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwiY29uZmlybURlbGV0ZVRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImFkZFJvd1RleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInJlbW92ZVJvd1RleHRcIiwgdGhpcyk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJtYXRyaXhkeW5hbWljXCI7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byB0cnVlLCB0byBzaG93IGEgY29uZmlybWF0aW9uIGRpYWxvZyBvbiByZW1vdmluZyBhIHJvd1xuICAgKiBAc2VlIENvbmZpcm1EZWxldGVUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbmZpcm1EZWxldGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbmZpcm1EZWxldGVcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29uZmlybURlbGV0ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBhIGNvbHVtbiBuYW1lIGFuZCB0aGUgbGlicmFyeSBzaG93cyBkdXBsaWNhdGlvbiBlcnJvciwgaWYgdGhlcmUgYXJlIHNhbWUgdmFsdWVzIGluIGRpZmZlcmVudCByb3dzIGluIHRoZSBjb2x1bW4uXG4gICAqIEBzZWUga2V5RHVwbGljYXRpb25FcnJvclxuICAgKi9cbiAgcHVibGljIGdldCBrZXlOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImtleU5hbWVcIiwgXCJcIik7XG4gIH1cbiAgcHVibGljIHNldCBrZXlOYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwia2V5TmFtZVwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIG1hdHJpeC5cbiAgICogQHNlZSBtaW5Sb3dDb3VudFxuICAgKiBAc2VlIG1heFJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucm93Q291bnRWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IHJvd0NvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwuTWF4Um93Q291bnQpIHJldHVybjtcbiAgICB2YXIgcHJldlZhbHVlID0gdGhpcy5yb3dDb3VudFZhbHVlO1xuICAgIHRoaXMucm93Q291bnRWYWx1ZSA9IHZhbDtcbiAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IHZhbCkge1xuICAgICAgdmFyIHFWYWwgPSB0aGlzLnZhbHVlO1xuICAgICAgcVZhbC5zcGxpY2UodmFsKTtcbiAgICAgIHRoaXMudmFsdWUgPSBxVmFsO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIGlmICh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLnNwbGljZSh2YWwpO1xuICAgICAgZm9yICh2YXIgaSA9IHByZXZWYWx1ZTsgaSA8IHZhbDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MucHVzaCh0aGlzLmNyZWF0ZU1hdHJpeFJvdyhudWxsKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucm93Q291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSByb3cgY291bnQuIEEgdXNlciBjb3VsZCBub3QgZGVsZXRlIGEgcm93IGlmIHRoZSByb3dDb3VudCBlcXVhbHMgdG8gbWluUm93Q291bnRcbiAgICogQHNlZSByb3dDb3VudFxuICAgKiBAc2VlIG1heFJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pblJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcIm1pblJvd0NvdW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluUm93Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMCkgdmFsID0gMDtcbiAgICBpZiAodmFsID09IHRoaXMubWluUm93Q291bnQgfHwgdmFsID4gdGhpcy5tYXhSb3dDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pblJvd0NvdW50XCIsIHZhbCk7XG4gICAgaWYgKHRoaXMucm93Q291bnQgPCB2YWwpIHRoaXMucm93Q291bnQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHJvdyBjb3VudC4gQSB1c2VyIGNvdWxkIG5vdCBhZGQgYSByb3cgaWYgdGhlIHJvd0NvdW50IGVxdWFscyB0byBtYXhSb3dDb3VudFxuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqIEBzZWUgbWluUm93Q291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4Um93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgXCJtYXhSb3dDb3VudFwiLFxuICAgICAgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwuTWF4Um93Q291bnRcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4Um93Q291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDw9IDApIHJldHVybjtcbiAgICBpZiAodmFsID4gUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwuTWF4Um93Q291bnQpXG4gICAgICB2YWwgPSBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbC5NYXhSb3dDb3VudDtcbiAgICBpZiAodmFsID09IHRoaXMubWF4Um93Q291bnQgfHwgdmFsIDwgdGhpcy5taW5Sb3dDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1heFJvd0NvdW50XCIsIHZhbCk7XG4gICAgaWYgKHRoaXMucm93Q291bnQgPiB2YWwpIHRoaXMucm93Q291bnQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgYSBuZXcgcm93IGNhbiBiZSBhZGRlZC5cbiAgICogQHNlZSBtYXhSb3dDb3VudFxuICAgKiBAc2VlIGNhblJlbW92ZVJvd1xuICAgKiBAc2VlIHJvd0NvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNhbkFkZFJvdygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yb3dDb3VudCA8IHRoaXMubWF4Um93Q291bnQ7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSwgaWYgYSByb3cgY2FuIGJlIHJlbW92ZWQuXG4gICAqIEBzZWUgbWluUm93Q291bnRcbiAgICogQHNlZSBjYW5BZGRSb3dcbiAgICogQHNlZSByb3dDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBjYW5SZW1vdmVSb3coKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucm93Q291bnQgPiB0aGlzLm1pblJvd0NvdW50O1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBhZGQgYSBuZXcgcm93LlxuICAgKi9cbiAgcHVibGljIGFkZFJvdygpIHtcbiAgICBpZiAoIXRoaXMuY2FuQWRkUm93KSByZXR1cm47XG4gICAgdmFyIHByZXZSb3dDb3VudCA9IHRoaXMucm93Q291bnQ7XG4gICAgdGhpcy5yb3dDb3VudCA9IHRoaXMucm93Q291bnQgKyAxO1xuICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgIHRoaXMucnVuQ2VsbHNDb25kaXRpb24odGhpcy5kYXRhLmdldEFsbFZhbHVlcygpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICBpZiAocHJldlJvd0NvdW50ICsgMSA9PSB0aGlzLnJvd0NvdW50KSB0aGlzLnN1cnZleS5tYXRyaXhSb3dBZGRlZCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSByb3cgYnkgaXQncyBpbmRleC4gSWYgY29uZmlybURlbGV0ZSBpcyB0cnVlLCBzaG93IGEgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgKiBAcGFyYW0gaW5kZXggYSByb3cgaW5kZXgsIGZyb20gMCB0byByb3dDb3VudCAtIDFcbiAgICogQHNlZSByZW1vdmVSb3dcbiAgICogQHNlZSBjb25maXJtRGVsZXRlXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUm93VUkodmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5jb25maXJtRGVsZXRlIHx8IGNvbmZpcm0odGhpcy5jb25maXJtRGVsZXRlVGV4dCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlUm93KHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSByb3cgYnkgaXQncyBpbmRleC5cbiAgICogQHBhcmFtIGluZGV4IGEgcm93IGluZGV4LCBmcm9tIDAgdG8gcm93Q291bnQgLSAxXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUm93KGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVtb3ZlUm93KSByZXR1cm47XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLnJvd0NvdW50KSByZXR1cm47XG4gICAgaWYgKHRoaXMuc3VydmV5KSB7XG4gICAgICB2YXIgcm93ID0gdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1xuICAgICAgICA/IHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3NbaW5kZXhdXG4gICAgICAgIDogbnVsbDtcbiAgICAgIHRoaXMuc3VydmV5Lm1hdHJpeFJvd1JlbW92ZWQodGhpcywgaW5kZXgsIHJvdyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzICYmIGluZGV4IDwgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3Muc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIHZhciB2YWwgPSB0aGlzLmNyZWF0ZU5ld1ZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgdmFsLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB2YWwgPSB0aGlzLmRlbGV0ZVJvd1ZhbHVlKHZhbCwgbnVsbCk7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsO1xuICAgIH1cbiAgICB0aGlzLnJvd0NvdW50VmFsdWUtLTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnJvd0NvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQgc2hvd2luZyBpbiB0aGUgY29uZmlybWF0aW9uIGRlbGV0ZSBkaWFsb2cgb24gcmVtb3ZpbmcgYSByb3cuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbmZpcm1EZWxldGVUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwiY29uZmlybURlbGV0ZVRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJjb25maXJtRGVsZXRlXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbmZpcm1EZWxldGVUZXh0KHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJjb25maXJtRGVsZXRlVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NDb25maXJtRGVsZXRlVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbmZpcm1EZWxldGVUZXh0XCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkdXBsaWNhdGlvbiB2YWx1ZSBlcnJvciB0ZXh0LiBTZXQgaXQgdG8gc2hvdyB0aGUgdGV4dCBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdC5cbiAgICogQHNlZSBrZXlOYW1lXG4gICAqL1xuICBwdWJsaWMgZ2V0IGtleUR1cGxpY2F0aW9uRXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwia2V5RHVwbGljYXRpb25FcnJvclwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBrZXlEdXBsaWNhdGlvbkVycm9yKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0tleUR1cGxpY2F0aW9uRXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYWRkIHJvdyBidXR0b24gdGV4dC5cbiAgICovXG4gIHB1YmxpYyBnZXQgYWRkUm93VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcImFkZFJvd1RleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJhZGRSb3dcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgYWRkUm93VGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwiYWRkUm93VGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NBZGRSb3dUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwiYWRkUm93VGV4dFwiKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHJlbW92ZSByb3cgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlbW92ZVJvd1RleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJyZW1vdmVSb3dUZXh0XCIsXG4gICAgICBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKFwicmVtb3ZlUm93XCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHJlbW92ZVJvd1RleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInJlbW92ZVJvd1RleHRcIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jUmVtb3ZlUm93VGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInJlbW92ZVJvd1RleHRcIik7XG4gIH1cbiAgcHVibGljIGdldCBkaXNwbGF5VmFsdWUoKTogYW55IHtcbiAgICB2YXIgdmFsdWVzID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIXZhbHVlcykgcmV0dXJuIHZhbHVlcztcbiAgICB2YXIgcm93cyA9IHRoaXMudmlzaWJsZVJvd3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCByb3dzLmxlbmd0aCAmJiBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsID0gdmFsdWVzW2ldO1xuICAgICAgaWYgKCF2YWwpIGNvbnRpbnVlO1xuICAgICAgdmFsdWVzW2ldID0gdGhpcy5nZXRSb3dEaXNwbGF5VmFsdWUocm93c1tpXSwgdmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvdGVjdGVkIG9uQ2hlY2tGb3JFcnJvcnMoZXJyb3JzOiBBcnJheTxTdXJ2ZXlFcnJvcj4pIHtcbiAgICBzdXBlci5vbkNoZWNrRm9yRXJyb3JzKGVycm9ycyk7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3JJblJvd3MoKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIG5ldyBDdXN0b21FcnJvcihcbiAgICAgICAgICBzdXJ2ZXlMb2NhbGl6YXRpb25cbiAgICAgICAgICAgIC5nZXRTdHJpbmcoXCJtaW5Sb3dDb3VudEVycm9yXCIpXG4gICAgICAgICAgICBbXCJmb3JtYXRcIl0odGhpcy5taW5Sb3dDb3VudClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgdmFyIHByZXZWYWx1ZSA9IHN1cGVyLmhhc0Vycm9ycyhmaXJlQ2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzLmlzVmFsdWVEdXBsaWNhdGVkKCkgfHwgcHJldlZhbHVlO1xuICB9XG4gIHByaXZhdGUgaGFzRXJyb3JJblJvd3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWluUm93Q291bnQgPD0gMCB8fCAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICB2YXIgc2V0Um93Q291bnQgPSAwO1xuICAgIGZvciAoXG4gICAgICB2YXIgcm93SW5kZXggPSAwO1xuICAgICAgcm93SW5kZXggPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDtcbiAgICAgIHJvd0luZGV4KytcbiAgICApIHtcbiAgICAgIHZhciByb3cgPSB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzW3Jvd0luZGV4XTtcbiAgICAgIGlmICghcm93LmlzRW1wdHkpIHNldFJvd0NvdW50Kys7XG4gICAgfVxuICAgIHJldHVybiBzZXRSb3dDb3VudCA8IHRoaXMubWluUm93Q291bnQ7XG4gIH1cbiAgcHJpdmF0ZSBpc1ZhbHVlRHVwbGljYXRlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMua2V5TmFtZSB8fCAhdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cykgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBjb2x1bW4gPSB0aGlzLmdldENvbHVtbk5hbWUodGhpcy5rZXlOYW1lKTtcbiAgICBpZiAoIWNvbHVtbikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBrZXlWYWx1ZXMgPSBbXTtcbiAgICB2YXIgcmVzID0gZmFsc2U7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMgPVxuICAgICAgICB0aGlzLmlzVmFsdWVEdXBsaWNhdGVkSW5Sb3coXG4gICAgICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93c1tpXSxcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAga2V5VmFsdWVzXG4gICAgICAgICkgfHwgcmVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHByaXZhdGUgaXNWYWx1ZUR1cGxpY2F0ZWRJblJvdyhcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlLFxuICAgIGNvbHVtbjogTWF0cml4RHJvcGRvd25Db2x1bW4sXG4gICAga2V5VmFsdWVzOiBBcnJheTxhbnk+XG4gICk6IGJvb2xlYW4ge1xuICAgIHZhciBxdWVzdGlvbiA9IHJvdy5nZXRRdWVzdGlvbkJ5Q29sdW1uKGNvbHVtbik7XG4gICAgaWYgKCFxdWVzdGlvbiB8fCBxdWVzdGlvbi5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsdWUgPSBxdWVzdGlvbi52YWx1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlID09IGtleVZhbHVlc1tpXSkge1xuICAgICAgICBxdWVzdGlvbi5hZGRFcnJvcihuZXcgQ3VzdG9tRXJyb3IodGhpcy5rZXlEdXBsaWNhdGlvbkVycm9yKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBrZXlWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBnZW5lcmF0ZVJvd3MoKTogQXJyYXk8TWF0cml4RHluYW1pY1Jvd01vZGVsPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheTxNYXRyaXhEeW5hbWljUm93TW9kZWw+KCk7XG4gICAgaWYgKHRoaXMucm93Q291bnQgPT09IDApIHJldHVybiByZXN1bHQ7XG4gICAgdmFyIHZhbCA9IHRoaXMuY3JlYXRlTmV3VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvd0NvdW50OyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKHRoaXMuY3JlYXRlTWF0cml4Um93KHRoaXMuZ2V0Um93VmFsdWVCeUluZGV4KHZhbCwgaSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTWF0cml4Um93KHZhbHVlOiBhbnkpOiBNYXRyaXhEeW5hbWljUm93TW9kZWwge1xuICAgIHZhciByb3cgPSBuZXcgTWF0cml4RHluYW1pY1Jvd01vZGVsKHRoaXMucm93Q291bnRlcisrLCB0aGlzLCB2YWx1ZSk7XG4gICAgdGhpcy5vbk1hdHJpeFJvd0NyZWF0ZWQocm93KTtcbiAgICByZXR1cm4gcm93O1xuICB9XG4gIHByb3RlY3RlZCBvbkJlZm9yZVZhbHVlQ2hhbmdlZCh2YWw6IGFueSkge1xuICAgIHZhciBuZXdSb3dDb3VudCA9IHZhbCAmJiBBcnJheS5pc0FycmF5KHZhbCkgPyB2YWwubGVuZ3RoIDogMDtcbiAgICBpZiAobmV3Um93Q291bnQgPD0gdGhpcy5yb3dDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMucm93Q291bnRWYWx1ZSA9IG5ld1Jvd0NvdW50O1xuICAgIGlmICh0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlZFZpc2libGVSb3dzID0gbnVsbDtcbiAgICAgIHRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MgPSB0aGlzLnZpc2libGVSb3dzO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3VmFsdWUoY3VyVmFsdWU6IGFueSk6IGFueSB7XG4gICAgdmFyIHJlc3VsdCA9IGN1clZhbHVlO1xuICAgIGlmICghcmVzdWx0KSByZXN1bHQgPSBbXTtcbiAgICB2YXIgciA9IFtdO1xuICAgIGlmIChyZXN1bHQubGVuZ3RoID4gdGhpcy5yb3dDb3VudCkgcmVzdWx0LnNwbGljZSh0aGlzLnJvd0NvdW50IC0gMSk7XG4gICAgZm9yICh2YXIgaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCB0aGlzLnJvd0NvdW50OyBpKyspIHtcbiAgICAgIHJlc3VsdC5wdXNoKHt9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcm90ZWN0ZWQgZGVsZXRlUm93VmFsdWUoXG4gICAgbmV3VmFsdWU6IGFueSxcbiAgICByb3c6IE1hdHJpeERyb3Bkb3duUm93TW9kZWxCYXNlXG4gICk6IGFueSB7XG4gICAgdmFyIGlzRW1wdHkgPSB0cnVlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhuZXdWYWx1ZVtpXSkubGVuZ3RoID4gMCkge1xuICAgICAgICBpc0VtcHR5ID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNFbXB0eSA/IG51bGwgOiBuZXdWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um93VmFsdWVCeUluZGV4KHF1ZXN0aW9uVmFsdWU6IGFueSwgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCBxdWVzdGlvblZhbHVlLmxlbmd0aFxuICAgICAgPyBxdWVzdGlvblZhbHVlW2luZGV4XVxuICAgICAgOiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBnZXRSb3dWYWx1ZUNvcmUoXG4gICAgcm93OiBNYXRyaXhEcm9wZG93blJvd01vZGVsQmFzZSxcbiAgICBxdWVzdGlvblZhbHVlOiBhbnksXG4gICAgY3JlYXRlOiBib29sZWFuID0gZmFsc2VcbiAgKTogYW55IHtcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkVmlzaWJsZVJvd3MpIHJldHVybiB7fTtcbiAgICByZXR1cm4gdGhpcy5nZXRSb3dWYWx1ZUJ5SW5kZXgoXG4gICAgICBxdWVzdGlvblZhbHVlLFxuICAgICAgdGhpcy5nZW5lcmF0ZWRWaXNpYmxlUm93cy5pbmRleE9mKHJvdylcbiAgICApO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwibWF0cml4ZHluYW1pY1wiLFxuICBbXG4gICAgeyBuYW1lOiBcInJvd0NvdW50Om51bWJlclwiLCBkZWZhdWx0OiAyIH0sXG4gICAgeyBuYW1lOiBcIm1pblJvd0NvdW50Om51bWJlclwiLCBkZWZhdWx0OiAwIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtYXhSb3dDb3VudDpudW1iZXJcIixcbiAgICAgIGRlZmF1bHQ6IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsLk1heFJvd0NvdW50XG4gICAgfSxcbiAgICB7IG5hbWU6IFwia2V5TmFtZVwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jS2V5RHVwbGljYXRpb25FcnJvclwiXG4gICAgfSxcbiAgICB7IG5hbWU6IFwiY29uZmlybURlbGV0ZTpib29sZWFuXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbmZpcm1EZWxldGVUZXh0XCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jQ29uZmlybURlbGV0ZVRleHRcIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcImFkZFJvd1RleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0FkZFJvd1RleHRcIiB9LFxuICAgIHsgbmFtZTogXCJyZW1vdmVSb3dUZXh0XCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NSZW1vdmVSb3dUZXh0XCIgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsKFwiXCIpO1xuICB9LFxuICBcIm1hdHJpeGRyb3Bkb3duYmFzZVwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm1hdHJpeGR5bmFtaWNcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsKG5hbWUpO1xuICBxLmNob2ljZXMgPSBbMSwgMiwgMywgNCwgNV07XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fbWF0cml4ZHluYW1pYy50cyIsImltcG9ydCB7XG4gIEJhc2UsXG4gIElTdXJ2ZXlEYXRhLFxuICBJU3VydmV5SW1wbCxcbiAgSVN1cnZleSxcbiAgSVRleHRQcm9jZXNzb3Jcbn0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5VmFsaWRhdG9yLCBJVmFsaWRhdG9yT3duZXIsIFZhbGlkYXRvclJ1bm5lciB9IGZyb20gXCIuL3ZhbGlkYXRvclwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi9xdWVzdGlvbl90ZXh0XCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFcnJvciB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IEFuc3dlclJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi9lcnJvclwiO1xuaW1wb3J0IHsgSUxvY2FsaXphYmxlT3duZXIsIExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTXVsdGlwbGVUZXh0RGF0YSB7XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xuICBnZXRUZXh0UHJvY2Vzc29yKCk6IElUZXh0UHJvY2Vzc29yO1xuICBnZXRBbGxWYWx1ZXMoKTogYW55O1xuICBnZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIHNldE11bHRpcGxlVGV4dFZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk7XG4gIGdldElzUmVxdWlyZWRUZXh0KCk6IHN0cmluZztcbiAgZ2V0TG9jYWxlKCk6IHN0cmluZztcbiAgZ2V0TWFya2Rvd25IdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCBleHRlbmRzIEJhc2VcbiAgaW1wbGVtZW50cyBJVmFsaWRhdG9yT3duZXIsIElTdXJ2ZXlEYXRhLCBJU3VydmV5SW1wbCB7XG4gIHByaXZhdGUgZWRpdG9yVmFsdWU6IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICBwcml2YXRlIGRhdGE6IElNdWx0aXBsZVRleHREYXRhO1xuXG4gIHZhbHVlQ2hhbmdlZENhbGxiYWNrOiAobmV3VmFsdWU6IGFueSkgPT4gdm9pZDtcbiAgdmFsaWRhdG9yczogQXJyYXk8U3VydmV5VmFsaWRhdG9yPiA9IG5ldyBBcnJheTxTdXJ2ZXlWYWxpZGF0b3I+KCk7XG5cbiAgY29uc3RydWN0b3IobmFtZTogYW55ID0gbnVsbCwgdGl0bGU6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZWRpdG9yVmFsdWUgPSB0aGlzLmNyZWF0ZUVkaXRvcihuYW1lKTtcbiAgICB0aGlzLmVkaXRvci50aXRsZUxvY2F0aW9uID0gXCJsZWZ0XCI7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwibXVsdGlwbGV0ZXh0aXRlbVwiO1xuICB9XG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuaWQ7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpdGVtIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IubmFtZTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLmVkaXRvci5uYW1lID0gdmFsO1xuICB9XG4gIHB1YmxpYyBnZXQgZWRpdG9yKCk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3JWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlRWRpdG9yKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dE1vZGVsKG5hbWUpO1xuICB9XG4gIHNldERhdGEoZGF0YTogSU11bHRpcGxlVGV4dERhdGEpIHtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLmVkaXRvci5zZXRTdXJ2ZXlJbXBsKHRoaXMpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSwgdG8gbWFrZSB0aGUgaXRlbSBhIHJlcXVpcmVkLiBJZiBhIHVzZXIgZG9lc24ndCBmaWxsIHRoZSBpdGVtIHRoZW4gYSB2YWxpZGF0aW9uIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBpc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5pc1JlcXVpcmVkO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNSZXF1aXJlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVkaXRvci5pc1JlcXVpcmVkID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaW5wdXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmlucHV0VHlwZTtcbiAgfVxuICBwdWJsaWMgc2V0IGlucHV0VHlwZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuZWRpdG9yLmlucHV0VHlwZSA9IHZhbDtcbiAgfVxuICAvKipcbiAgICogSXRlbSB0aXRsZS4gSWYgaXQgaXMgZW1wdHksIHRoZSBpdGVtIG5hbWUgaXMgcmVuZGVyZWQgYXMgdGl0bGUuIFRoaXMgcHJvcGVydHkgc3VwcG9ydHMgbWFya2Rvd24uXG4gICAqIEBzZWUgbmFtZVxuICAgKi9cbiAgcHVibGljIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci50aXRsZTtcbiAgfVxuICBwdWJsaWMgc2V0IHRpdGxlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3IudGl0bGUgPSB2YWw7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5sb2NUaXRsZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGV4dCBvciBodG1sIGZvciByZW5kZXJpbmcgdGhlIHRpdGxlLlxuICAgKi9cbiAgcHVibGljIGdldCBmdWxsVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IuZnVsbFRpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgcGxhY2UgaG9sZGVyLlxuICAgKi9cbiAgcHVibGljIGdldCBwbGFjZUhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmVkaXRvci5wbGFjZUhvbGRlcjtcbiAgfVxuICBwdWJsaWMgc2V0IHBsYWNlSG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3IucGxhY2VIb2xkZXIgPSB2YWw7XG4gIH1cbiAgZ2V0IGxvY1BsYWNlSG9sZGVyKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0b3IubG9jUGxhY2VIb2xkZXI7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhID8gdGhpcy5kYXRhLmdldE11bHRpcGxlVGV4dFZhbHVlKHRoaXMubmFtZSkgOiBudWxsO1xuICB9XG4gIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLmRhdGEgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kYXRhLnNldE11bHRpcGxlVGV4dFZhbHVlKHRoaXMubmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKSB0aGlzLnZhbHVlQ2hhbmdlZENhbGxiYWNrKG5ld1ZhbHVlKTtcbiAgfVxuICAvL0lTdXJ2ZXlJbXBsXG4gIGdlU3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0U3VydmV5KCkgOiBudWxsO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0VGV4dFByb2Nlc3NvcigpIDogbnVsbDtcbiAgfVxuICAvL0lTdXJ2ZXlEYXRhXG4gIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmRhdGEpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0TXVsdGlwbGVUZXh0VmFsdWUobmFtZSk7XG4gIH1cbiAgc2V0VmFsdWUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhLnNldE11bHRpcGxlVGV4dFZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgZ2V0Q29tbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHNldENvbW1lbnQobmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKSB7fVxuICBnZXRBbGxWYWx1ZXMoKTogYW55IHtcbiAgICBpZiAodGhpcy5kYXRhKSByZXR1cm4gdGhpcy5kYXRhLmdldEFsbFZhbHVlcygpO1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG4gIC8vSVZhbGlkYXRvck93bmVyXG4gIGdldFZhbGlkYXRvclRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGl0bGU7XG4gIH1cbiAgZ2V0IHZhbGlkYXRlZFZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cbiAgc2V0IHZhbGlkYXRlZFZhbHVlKHZhbDogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgfVxufVxuXG4vKipcbiAqIEEgTW9kZWwgZm9yIGEgbXVsdGlwbGUgdGV4dCBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWwgZXh0ZW5kcyBRdWVzdGlvblxuICBpbXBsZW1lbnRzIElNdWx0aXBsZVRleHREYXRhIHtcbiAgY29sQ291bnRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgaXRlbXNWYWx1ZXM6IEFycmF5PE11bHRpcGxlVGV4dEl0ZW1Nb2RlbD4gPSBuZXcgQXJyYXk8XG4gICAgTXVsdGlwbGVUZXh0SXRlbU1vZGVsXG4gID4oKTtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLml0ZW1zVmFsdWVzID0gdGhpcy5jcmVhdGVOZXdBcnJheShcIml0ZW1zXCIsIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgIGl0ZW0uc2V0RGF0YShzZWxmKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiaXRlbXNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwiY29sQ291bnRcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgICB9KTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIm11bHRpcGxldGV4dFwiO1xuICB9XG4gIHB1YmxpYyBzZXRTdXJ2ZXlJbXBsKHZhbHVlOiBJU3VydmV5SW1wbCkge1xuICAgIHN1cGVyLnNldFN1cnZleUltcGwodmFsdWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5zZXREYXRhKHRoaXMpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0IGlzQWxsb3dUaXRsZUxlZnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGVuZExvYWRpbmdGcm9tSnNvbigpIHtcbiAgICBzdXBlci5lbmRMb2FkaW5nRnJvbUpzb24oKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgaW5wdXQgaXRlbXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IEFycmF5PE11bHRpcGxlVGV4dEl0ZW1Nb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zVmFsdWVzO1xuICB9XG4gIHB1YmxpYyBzZXQgaXRlbXModmFsOiBBcnJheTxNdWx0aXBsZVRleHRJdGVtTW9kZWw+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiaXRlbXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogQWRkIGEgbmV3IHRleHQgaXRlbS5cbiAgICogQHBhcmFtIG5hbWUgYSBpdGVtIG5hbWVcbiAgICogQHBhcmFtIHRpdGxlIGEgaXRlbSB0aXRsZSAob3B0aW9uYWwpXG4gICAqL1xuICBwdWJsaWMgYWRkSXRlbShuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcgPSBudWxsKTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuY3JlYXRlVGV4dEl0ZW0obmFtZSwgdGl0bGUpO1xuICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICBwdWJsaWMgb25Mb2NhbGVDaGFuZ2VkKCkge1xuICAgIHN1cGVyLm9uTG9jYWxlQ2hhbmdlZCgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5vbkxvY2FsZUNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuaXRlbXNbaV0udmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucy4gSXRlbXMgYXJlIHJlbmRyZWQgaW4gb25lIGxpbmUgaWYgdGhlIHZhbHVlIGlzIDAuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbENvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbENvdW50XCIsIDEpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29sQ291bnQodmFsOiBudW1iZXIpIHtcbiAgICBpZiAodmFsIDwgMSB8fCB2YWwgPiA0KSByZXR1cm47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiY29sQ291bnRcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdGV4dCBpbnB1dCBzaXplLlxuICAgKi9cbiAgcHVibGljIGdldCBpdGVtU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJpdGVtU2l6ZVwiLCAyNSk7XG4gIH1cbiAgcHVibGljIHNldCBpdGVtU2l6ZSh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIml0ZW1TaXplXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVuZGVyZWQgcm93cy5cbiAgICovXG4gIHB1YmxpYyBnZXRSb3dzKCk6IEFycmF5PGFueT4ge1xuICAgIHZhciBjb2xDb3VudCA9IHRoaXMuY29sQ291bnQ7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5pdGVtcztcbiAgICB2YXIgcm93cyA9IFtdO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGluZGV4ID09IDApIHtcbiAgICAgICAgcm93cy5wdXNoKFtdKTtcbiAgICAgIH1cbiAgICAgIHJvd3Nbcm93cy5sZW5ndGggLSAxXS5wdXNoKGl0ZW1zW2ldKTtcbiAgICAgIGluZGV4Kys7XG4gICAgICBpZiAoaW5kZXggPj0gY29sQ291bnQpIHtcbiAgICAgICAgaW5kZXggPSAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm93cztcbiAgfVxuICBwcml2YXRlIGlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgc3VwZXIub25WYWx1ZUNoYW5nZWQoKTtcbiAgICB0aGlzLm9uSXRlbVZhbHVlQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVUZXh0SXRlbShuYW1lOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwge1xuICAgIHJldHVybiBuZXcgTXVsdGlwbGVUZXh0SXRlbU1vZGVsKG5hbWUsIHRpdGxlKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25JdGVtVmFsdWVDaGFuZ2VkKCkge1xuICAgIGlmICh0aGlzLmlzTXVsdGlwbGVJdGVtVmFsdWVDaGFuZ2luZykgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW1WYWx1ZSA9IG51bGw7XG4gICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLml0ZW1zW2ldLm5hbWUgaW4gdGhpcy52YWx1ZSkge1xuICAgICAgICBpdGVtVmFsdWUgPSB0aGlzLnZhbHVlW3RoaXMuaXRlbXNbaV0ubmFtZV07XG4gICAgICB9XG4gICAgICB0aGlzLml0ZW1zW2ldLm9uVmFsdWVDaGFuZ2VkKGl0ZW1WYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBydW5WYWxpZGF0b3JzKCk6IFN1cnZleUVycm9yIHtcbiAgICB2YXIgZXJyb3IgPSBzdXBlci5ydW5WYWxpZGF0b3JzKCk7XG4gICAgaWYgKGVycm9yICE9IG51bGwpIHJldHVybiBlcnJvcjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVycm9yID0gbmV3IFZhbGlkYXRvclJ1bm5lcigpLnJ1bih0aGlzLml0ZW1zW2ldKTtcbiAgICAgIGlmIChlcnJvciAhPSBudWxsKSByZXR1cm4gZXJyb3I7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHByb3RlY3RlZCBvbkNoZWNrRm9yRXJyb3JzKGVycm9yczogQXJyYXk8U3VydmV5RXJyb3I+KSB7XG4gICAgc3VwZXIub25DaGVja0ZvckVycm9ycyhlcnJvcnMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgICAgaWYgKGl0ZW0uaXNSZXF1aXJlZCAmJiAhaXRlbS52YWx1ZSkge1xuICAgICAgICBlcnJvcnMucHVzaChuZXcgQW5zd2VyUmVxdWlyZWRFcnJvcigpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9JTXVsdGlwbGVUZXh0RGF0YVxuICBnZXRNdWx0aXBsZVRleHRWYWx1ZShuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMudmFsdWUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnZhbHVlW25hbWVdO1xuICB9XG4gIHNldE11bHRpcGxlVGV4dFZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuaXNNdWx0aXBsZUl0ZW1WYWx1ZUNoYW5naW5nID0gdHJ1ZTtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghbmV3VmFsdWUpIHtcbiAgICAgIG5ld1ZhbHVlID0ge307XG4gICAgfVxuICAgIG5ld1ZhbHVlW25hbWVdID0gdmFsdWU7XG4gICAgdGhpcy5zZXROZXdWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5pc011bHRpcGxlSXRlbVZhbHVlQ2hhbmdpbmcgPSBmYWxzZTtcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5O1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzLnRleHRQcm9jZXNzb3I7XG4gIH1cbiAgZ2V0QWxsVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0QWxsVmFsdWVzKCkgOiBudWxsO1xuICB9XG4gIGdldElzUmVxdWlyZWRUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5ID8gdGhpcy5zdXJ2ZXkucmVxdWlyZWRUZXh0IDogXCJcIjtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcIm11bHRpcGxldGV4dGl0ZW1cIixcbiAgW1xuICAgIFwibmFtZVwiLFxuICAgIFwiaXNSZXF1aXJlZDpib29sZWFuXCIsXG4gICAgeyBuYW1lOiBcInBsYWNlSG9sZGVyXCIsIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NQbGFjZUhvbGRlclwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJpbnB1dFR5cGVcIixcbiAgICAgIGRlZmF1bHQ6IFwidGV4dFwiLFxuICAgICAgY2hvaWNlczogW1xuICAgICAgICBcImNvbG9yXCIsXG4gICAgICAgIFwiZGF0ZVwiLFxuICAgICAgICBcImRhdGV0aW1lXCIsXG4gICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIixcbiAgICAgICAgXCJlbWFpbFwiLFxuICAgICAgICBcIm1vbnRoXCIsXG4gICAgICAgIFwibnVtYmVyXCIsXG4gICAgICAgIFwicGFzc3dvcmRcIixcbiAgICAgICAgXCJyYW5nZVwiLFxuICAgICAgICBcInRlbFwiLFxuICAgICAgICBcInRleHRcIixcbiAgICAgICAgXCJ0aW1lXCIsXG4gICAgICAgIFwidXJsXCIsXG4gICAgICAgIFwid2Vla1wiXG4gICAgICBdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwidGl0bGVcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1RpdGxlXCIgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInZhbGlkYXRvcnM6dmFsaWRhdG9yc1wiLFxuICAgICAgYmFzZUNsYXNzTmFtZTogXCJzdXJ2ZXl2YWxpZGF0b3JcIixcbiAgICAgIGNsYXNzTmFtZVBhcnQ6IFwidmFsaWRhdG9yXCJcbiAgICB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgTXVsdGlwbGVUZXh0SXRlbU1vZGVsKFwiXCIpO1xuICB9XG4pO1xuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcIm11bHRpcGxldGV4dFwiLFxuICBbXG4gICAgeyBuYW1lOiBcIiFpdGVtczp0ZXh0aXRlbXNcIiwgY2xhc3NOYW1lOiBcIm11bHRpcGxldGV4dGl0ZW1cIiB9LFxuICAgIHsgbmFtZTogXCJpdGVtU2l6ZTpudW1iZXJcIiwgZGVmYXVsdDogMjUgfSxcbiAgICB7IG5hbWU6IFwiY29sQ291bnQ6bnVtYmVyXCIsIGRlZmF1bHQ6IDEsIGNob2ljZXM6IFsxLCAyLCAzLCA0XSB9XG4gIF0sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbChcIlwiKTtcbiAgfSxcbiAgXCJxdWVzdGlvblwiXG4pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcIm11bHRpcGxldGV4dFwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbChuYW1lKTtcbiAgcS5hZGRJdGVtKFwidGV4dDFcIik7XG4gIHEuYWRkSXRlbShcInRleHQyXCIpO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3F1ZXN0aW9uX211bHRpcGxldGV4dC50cyIsImltcG9ydCB7IEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gIElFbGVtZW50LFxuICBCYXNlLFxuICBTdXJ2ZXlFbGVtZW50LFxuICBTdXJ2ZXlFcnJvcixcbiAgSVN1cnZleURhdGEsXG4gIElTdXJ2ZXksXG4gIElTdXJ2ZXlJbXBsLFxuICBJVGV4dFByb2Nlc3NvclxufSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi9zdXJ2ZXlTdHJpbmdzXCI7XG5pbXBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi9sb2NhbGl6YWJsZXN0cmluZ1wiO1xuaW1wb3J0IHsgVGV4dFByZVByb2Nlc3NvciwgVGV4dFByZVByb2Nlc3NvclZhbHVlIH0gZnJvbSBcIi4vdGV4dFByZVByb2Nlc3NvclwiO1xuaW1wb3J0IHsgUHJvY2Vzc1ZhbHVlIH0gZnJvbSBcIi4vY29uZGl0aW9uUHJvY2Vzc1ZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBQYW5lbE1vZGVsLCBQYW5lbE1vZGVsQmFzZSB9IGZyb20gXCIuL3BhbmVsXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBDdXN0b21FcnJvciB9IGZyb20gXCIuL2Vycm9yXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YSB7XG4gIGdldEl0ZW1JbmRleChpdGVtOiBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0pOiBudW1iZXI7XG4gIGdldFBhbmVsSXRlbURhdGEoaXRlbTogUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtKTogYW55O1xuICBzZXRQYW5lbEl0ZW1EYXRhKGl0ZW06IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSwgbmFtZTogc3RyaW5nLCB2YWw6IGFueSk7XG4gIGdldFN1cnZleSgpOiBJU3VydmV5O1xufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtXG4gIGltcGxlbWVudHMgSVN1cnZleURhdGEsIElTdXJ2ZXlJbXBsLCBJVGV4dFByb2Nlc3NvciB7XG4gIHB1YmxpYyBzdGF0aWMgSXRlbVZhcmlhYmxlTmFtZSA9IFwicGFuZWxcIjtcbiAgcHVibGljIHN0YXRpYyBJbmRleFZhcmlhYmxlTmFtZSA9IFwicGFuZWxJbmRleFwiO1xuICBwcml2YXRlIHBhbmVsVmFsdWU6IFBhbmVsTW9kZWw7XG4gIHByaXZhdGUgZGF0YTogSVF1ZXN0aW9uUGFuZWxEeW5hbWljRGF0YTtcbiAgcHJpdmF0ZSB0ZXh0UHJlUHJvY2Vzc29yO1xuICBjb25zdHJ1Y3RvcihkYXRhOiBJUXVlc3Rpb25QYW5lbER5bmFtaWNEYXRhLCBwYW5lbDogUGFuZWxNb2RlbCkge1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5wYW5lbFZhbHVlID0gcGFuZWw7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMudGV4dFByZVByb2Nlc3NvciA9IG5ldyBUZXh0UHJlUHJvY2Vzc29yKCk7XG4gICAgdGhpcy50ZXh0UHJlUHJvY2Vzc29yLm9uUHJvY2VzcyA9IGZ1bmN0aW9uKFxuICAgICAgdGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWVcbiAgICApIHtcbiAgICAgIHNlbGYuZ2V0UHJvY2Vzc2VkVGV4dFZhbHVlKHRleHRWYWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLnBhbmVsLnNldFN1cnZleUltcGwodGhpcyk7XG4gICAgdGhpcy5wYW5lbC51cGRhdGVDdXN0b21XaWRnZXRzKCk7XG4gIH1cbiAgcHVibGljIGdldCBwYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbFZhbHVlO1xuICB9XG4gIHB1YmxpYyBydW5Db25kaXRpb24odmFsdWVzOiBIYXNoVGFibGU8YW55Pikge1xuICAgIHRoaXMucGFuZWwucnVuQ29uZGl0aW9uKHZhbHVlcyk7XG4gIH1cbiAgcHVibGljIGdldFZhbHVlKG5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZGF0YS5nZXRQYW5lbEl0ZW1EYXRhKHRoaXMpO1xuICAgIHJldHVybiB2YWx1ZXNbbmFtZV07XG4gIH1cbiAgcHVibGljIHNldFZhbHVlKG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIHRoaXMuZGF0YS5zZXRQYW5lbEl0ZW1EYXRhKHRoaXMsIG5hbWUsIG5ld1ZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0Q29tbWVudChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLmdldFZhbHVlKG5hbWUgKyBCYXNlLmNvbW1lbnRQcmVmaXgpO1xuICAgIHJldHVybiByZXN1bHQgPyByZXN1bHQgOiBcIlwiO1xuICB9XG4gIHB1YmxpYyBzZXRDb21tZW50KG5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0VmFsdWUobmFtZSArIEJhc2UuY29tbWVudFByZWZpeCwgbmV3VmFsdWUpO1xuICB9XG4gIHB1YmxpYyBvblN1cnZleVZhbHVlQ2hhbmdlZCgpIHtcbiAgICB2YXIgcXVlc3Rpb25zID0gdGhpcy5wYW5lbC5xdWVzdGlvbnM7XG4gICAgdmFyIHZhbHVlcyA9IHRoaXMuZGF0YS5nZXRQYW5lbEl0ZW1EYXRhKHRoaXMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcSA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgIHEub25TdXJ2ZXlWYWx1ZUNoYW5nZWQodmFsdWVzW3EuZ2V0VmFsdWVOYW1lKCldKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHNldFZpc2libGVJbmRleChpbmRleDogbnVtYmVyLCBzaG93SW5kZXg6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBTdXJ2ZXlFbGVtZW50LnNldFZpc2libGVJbmRleChcbiAgICAgIHRoaXMucGFuZWwucXVlc3Rpb25zLFxuICAgICAgaW5kZXgsXG4gICAgICBzaG93SW5kZXhcbiAgICApO1xuICB9XG5cbiAgZ2V0QWxsVmFsdWVzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZXRQYW5lbEl0ZW1EYXRhKHRoaXMpO1xuICB9XG4gIGdlU3VydmV5RGF0YSgpOiBJU3VydmV5RGF0YSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgZ2V0U3VydmV5KCk6IElTdXJ2ZXkge1xuICAgIHJldHVybiB0aGlzLmRhdGEgPyB0aGlzLmRhdGEuZ2V0U3VydmV5KCkgOiBudWxsO1xuICB9XG4gIGdldFRleHRQcm9jZXNzb3IoKTogSVRleHRQcm9jZXNzb3Ige1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8vSVRleHRQcm9jZXNzb3JcbiAgcHJpdmF0ZSBnZXRQcm9jZXNzZWRUZXh0VmFsdWUodGV4dFZhbHVlOiBUZXh0UHJlUHJvY2Vzc29yVmFsdWUpIHtcbiAgICBpZiAodGV4dFZhbHVlLm5hbWUgPT0gUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkluZGV4VmFyaWFibGVOYW1lKSB7XG4gICAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSB0cnVlO1xuICAgICAgdGV4dFZhbHVlLnZhbHVlID0gdGhpcy5kYXRhLmdldEl0ZW1JbmRleCh0aGlzKSArIDE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBmaXJzdE5hbWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0Rmlyc3ROYW1lKHRleHRWYWx1ZS5uYW1lKTtcbiAgICB0ZXh0VmFsdWUuaXNFeGlzdHMgPSBmaXJzdE5hbWUgPT0gUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWU7XG4gICAgaWYgKCF0ZXh0VmFsdWUpIHJldHVybjtcbiAgICAvL25hbWUgc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHBhbmVsXG4gICAgdGV4dFZhbHVlLm5hbWUgPSB0ZXh0VmFsdWUubmFtZS5yZXBsYWNlKFxuICAgICAgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWUgKyBcIi5cIixcbiAgICAgIFwiXCJcbiAgICApO1xuICAgIHZhciBmaXJzdE5hbWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0Rmlyc3ROYW1lKHRleHRWYWx1ZS5uYW1lKTtcbiAgICB2YXIgcXVlc3Rpb24gPSA8UXVlc3Rpb24+dGhpcy5wYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKGZpcnN0TmFtZSk7XG4gICAgdmFyIHZhbHVlcyA9IHt9O1xuICAgIGlmIChxdWVzdGlvbikge1xuICAgICAgdmFsdWVzW2ZpcnN0TmFtZV0gPSB0ZXh0VmFsdWUucmV0dXJuRGlzcGxheVZhbHVlXG4gICAgICAgID8gcXVlc3Rpb24uZGlzcGxheVZhbHVlXG4gICAgICAgIDogcXVlc3Rpb24udmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhbGxWYWx1ZXMgPSB0aGlzLmdldEFsbFZhbHVlcygpO1xuICAgICAgaWYgKGFsbFZhbHVlcykge1xuICAgICAgICB2YWx1ZXNbZmlyc3ROYW1lXSA9IGFsbFZhbHVlc1tmaXJzdE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICB0ZXh0VmFsdWUudmFsdWUgPSBuZXcgUHJvY2Vzc1ZhbHVlKCkuZ2V0VmFsdWUodGV4dFZhbHVlLm5hbWUsIHZhbHVlcyk7XG4gIH1cbiAgcHJvY2Vzc1RleHQodGV4dDogc3RyaW5nLCByZXR1cm5EaXNwbGF5VmFsdWU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHRleHQgPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IucHJvY2Vzcyh0ZXh0LCByZXR1cm5EaXNwbGF5VmFsdWUpO1xuICAgIHZhciBzdXJ2ZXkgPSB0aGlzLmdldFN1cnZleSgpO1xuICAgIHJldHVybiBzdXJ2ZXkgPyBzdXJ2ZXkucHJvY2Vzc1RleHQodGV4dCwgcmV0dXJuRGlzcGxheVZhbHVlKSA6IHRleHQ7XG4gIH1cbiAgcHJvY2Vzc1RleHRFeCh0ZXh0OiBzdHJpbmcpOiBhbnkge1xuICAgIHRleHQgPSB0aGlzLnByb2Nlc3NUZXh0KHRleHQsIHRydWUpO1xuICAgIHZhciBoYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPSB0aGlzLnRleHRQcmVQcm9jZXNzb3IuaGFzQWxsVmFsdWVzT25MYXN0UnVuO1xuICAgIHZhciByZXMgPSB7IGhhc0FsbFZhbHVlc09uTGFzdFJ1bjogdHJ1ZSwgdGV4dDogdGV4dCB9O1xuICAgIGlmICh0aGlzLmdldFN1cnZleSgpKSB7XG4gICAgICByZXMgPSB0aGlzLmdldFN1cnZleSgpLnByb2Nlc3NUZXh0RXgodGV4dCk7XG4gICAgfVxuICAgIHJlcy5oYXNBbGxWYWx1ZXNPbkxhc3RSdW4gPVxuICAgICAgcmVzLmhhc0FsbFZhbHVlc09uTGFzdFJ1biAmJiBoYXNBbGxWYWx1ZXNPbkxhc3RSdW47XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBvbkFueVZhbHVlQ2hhbmdlZChuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBhbmVsLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIHRoaXMucGFuZWwub25BbnlWYWx1ZUNoYW5nZWQoUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtLkl0ZW1WYXJpYWJsZU5hbWUpO1xuICB9XG59XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSBwYW5lbCBkeW1hbmljIHF1ZXN0aW9uLiBZb3Ugc2V0dXAgdGhlIHRlbXBsYXRlIHBhbmVsLCBidXQgYWRkaW5nIGVsZW1lbnRzIChhbnkgcXVlc3Rpb24gb3IgYSBwYW5lbCkgYW5kIGFzc2lnbiBhIHRleHQgdG8gaXQncyB0aXRsZSwgYW5kIHRoaXMgcGFuZWwgd2lsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgb24gY3JlYXRpbmcgZHluYW1pYyBwYW5lbHMuIFRoZSBudW1iZXIgb2YgcGFuZWxzIGlzIGRlZmluZWQgYnkgcGFuZWxDb3VudCBwcm9wZXJ0eS5cbiAqIEFuIGVuZC11c2VyIG1heSBkeW5hbWljYWxseSBhZGQvcmVtb3ZlIHBhbmVscywgdW5sZXNzIHlvdSBmb3JiaWRkZW4gdGhpcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwgZXh0ZW5kcyBRdWVzdGlvblxuICBpbXBsZW1lbnRzIElRdWVzdGlvblBhbmVsRHluYW1pY0RhdGEge1xuICBwdWJsaWMgc3RhdGljIE1heFBhbmVsQ291bnQgPSAxMDA7XG4gIHByaXZhdGUgdGVtcGxhdGVWYWx1ZTogUGFuZWxNb2RlbDtcbiAgcHJpdmF0ZSBpdGVtc1ZhbHVlOiBBcnJheTxRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0+ID0gbmV3IEFycmF5PFxuICAgIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbVxuICA+KCk7XG4gIHByaXZhdGUgbG9hZGluZ1BhbmVsQ291bnQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBvbGRUZW1wbGF0ZVJvd3NDaGFuZ2VkQ2FsbGJhY2s6IGFueTtcbiAgcHJpdmF0ZSBjdXJyZW50SW5kZXhWYWx1ZTogbnVtYmVyID0gLTE7XG5cbiAgcmVuZGVyTW9kZUNoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgcGFuZWxDb3VudENoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcbiAgY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICB0aGlzLnRlbXBsYXRlVmFsdWUgPSB0aGlzLmNyZWF0ZUFuZFNldHVwTmV3UGFuZWxPYmplY3QoKTtcbiAgICB0aGlzLnRlbXBsYXRlLnJlbmRlcldpZHRoID0gXCIxMDAlXCI7XG4gICAgdGhpcy50ZW1wbGF0ZS5zZWxlY3RlZEVsZW1lbnRJbkRlc2lnbiA9IHRoaXM7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMub2xkVGVtcGxhdGVSb3dzQ2hhbmdlZENhbGxiYWNrID0gdGhpcy50ZW1wbGF0ZS5yb3dzQ2hhbmdlZENhbGxiYWNrO1xuICAgIHRoaXMudGVtcGxhdGUucm93c0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi50ZW1wbGF0ZU9uUm93c0NoYW5nZWQoKTtcbiAgICAgIGlmIChzZWxmLm9sZFRlbXBsYXRlUm93c0NoYW5nZWRDYWxsYmFjaylcbiAgICAgICAgc2VsZi5vbGRUZW1wbGF0ZVJvd3NDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgICB9O1xuXG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcImNvbmZpcm1EZWxldGVUZXh0XCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJrZXlEdXBsaWNhdGlvbkVycm9yXCIsIHRoaXMpO1xuICAgIHRoaXMuY3JlYXRlTG9jYWxpemFibGVTdHJpbmcoXCJwYW5lbEFkZFRleHRcIiwgdGhpcyk7XG4gICAgdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsUmVtb3ZlVGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxQcmV2VGV4dFwiLCB0aGlzKTtcbiAgICB0aGlzLmNyZWF0ZUxvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxOZXh0VGV4dFwiLCB0aGlzKTtcbiAgfVxuICBwdWJsaWMgc2V0U3VydmV5SW1wbCh2YWx1ZTogSVN1cnZleUltcGwpIHtcbiAgICBzdXBlci5zZXRTdXJ2ZXlJbXBsKHZhbHVlKTtcbiAgICB0aGlzLnRlbXBsYXRlLnNldFN1cnZleUltcGwodGhpcy5zdXJ2ZXlJbXBsKTtcbiAgfVxuICBwcml2YXRlIHRlbXBsYXRlT25Sb3dzQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbikgcmV0dXJuO1xuICAgIHRoaXMucmVidWlsZFBhbmVscygpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicGFuZWxkeW5hbWljXCI7XG4gIH1cbiAgcHVibGljIGdldCBpc0FsbG93VGl0bGVMZWZ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwdWJsaWMgcmVtb3ZlRWxlbWVudChlbGVtZW50OiBJRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLnJlbW92ZUVsZW1lbnQoZWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIFBhbmVsLiBUaGlzIHBhbmVsIGlzIHVzZWQgYXMgYSB0ZW1wbGF0ZSBvbiBjcmVhdGlnbiBkeW5hbWljIHBhbmVsc1xuICAgKiBAc2VlICB0ZW1wbGF0ZUVsZW1lbnRzXG4gICAqIEBzZWUgdGVtcGxhdGVUaXRsZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgdGVtcGxhdGUoKTogUGFuZWxNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIFBhbmVsIGVsZW1lbnRzLCBxdWVzdGlvbnMgYW5kIHBhbmVscy5cbiAgICogQHNlZSAgdGVtcGxhdGVFbGVtZW50c1xuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZUVsZW1lbnRzKCk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuZWxlbWVudHM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBQYW5lbCB0aXRsZSBwcm9wZXJ0eS5cbiAgICogQHNlZSAgdGVtcGxhdGVFbGVtZW50c1xuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZVRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUudGl0bGU7XG4gIH1cbiAgcHVibGljIHNldCB0ZW1wbGF0ZVRpdGxlKG5ld1ZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRlbXBsYXRlLnRpdGxlID0gbmV3VmFsdWU7XG4gIH1cbiAgZ2V0IGxvY1RlbXBsYXRlVGl0bGUoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLmxvY1RpdGxlO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgUGFuZWwgZGVzY3JpcHRpb24gcHJvcGVydHkuXG4gICAqIEBzZWUgIHRlbXBsYXRlRWxlbWVudHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSB0ZW1wbGF0ZVRpdGxlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRlbXBsYXRlRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5kZXNjcmlwdGlvbjtcbiAgfVxuICBwdWJsaWMgc2V0IHRlbXBsYXRlRGVzY3JpcHRpb24obmV3VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMudGVtcGxhdGUuZGVzY3JpcHRpb24gPSBuZXdWYWx1ZTtcbiAgfVxuICBnZXQgbG9jVGVtcGxhdGVEZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUubG9jRGVzY3JpcHRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGl0ZW1zKCk6IEFycmF5PFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zVmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBhcnJheSBvZiBkeW5hbWljIHBhbmVscyBjcmVhdGVkIGJhc2VkIG9uIHBhbmVsIHRlbXBsYXRlXG4gICAqIEBzZWUgdGVtcGxhdGVcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVscygpOiBBcnJheTxQYW5lbE1vZGVsPiB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzLnB1c2godGhpcy5pdGVtc1tpXS5wYW5lbCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBpbmRleCBvZiBjdXJyZW50IGFjdGl2ZSBkeW5hbWljYWwgcGFuZWwgd2hlbiB0aGUgcmVuZGVyTW9kZSBpcyBub3QgXCJsaXN0XCIuIElmIHRoZXJlIGlzIG5vIGR5bWFtaWMgcGFuZWwgKHBhbmVsQ291bnQgPSAwKSBvciByZW5kZXJNb2RlIGVxdWFscyBcImxpc3RcIiBpdCByZXR1cm5zIC0xLCBvdGhlcndpc2UgaXQgcmV0dXJucyBhIHZhbHVlIGZyb20gMCB0byBwYW5lbENvdW50IC0gMS5cbiAgICogQHNlZSBjdXJyZW50UGFuZWxcbiAgICogQHNlZSBwYW5lbHNcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgcmVuZGVyTW9kZVxuICAgKi9cbiAgcHVibGljIGdldCBjdXJyZW50SW5kZXgoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5pc1JlbmRlck1vZGVMaXN0KSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4VmFsdWUgPCAwICYmIHRoaXMucGFuZWxDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4VmFsdWUgPSAwO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXJyZW50SW5kZXhWYWx1ZSA+PSB0aGlzLnBhbmVsQ291bnQpIHtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4VmFsdWUgPSB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50SW5kZXhWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1cnJlbnRJbmRleCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPj0gdGhpcy5wYW5lbENvdW50KSB2YWwgPSB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICAgIHRoaXMuY3VycmVudEluZGV4VmFsdWUgPSB2YWw7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5jdXJyZW50SW5kZXhDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBhY3RpdmUgZHluYW1pY2FsIHBhbmVsIHdoZW4gdGhlIHJlbmRlck1vZGUgaXMgbm90IFwibGlzdFwiLiBJZiB0aGVyZSBpcyBubyBkeW1hbWljIHBhbmVsIChwYW5lbENvdW50ID0gMCkgb3IgcmVuZGVyTW9kZSBlcXVhbHMgXCJsaXN0XCIgaXQgcmV0dXJucyBudWxsLlxuICAgKiBAc2VlIGN1cnJlbkluZGV4XG4gICAqIEBzZWUgcGFuZWxzXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhbmVsKCk6IFBhbmVsTW9kZWwge1xuICAgIHZhciBpbmRleCA9IHRoaXMuY3VycmVudEluZGV4O1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5wYW5lbHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5wYW5lbHNbaW5kZXhdO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgaXQgdG8gdHJ1ZSwgdG8gc2hvdyBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgb24gcmVtb3ZpbmcgYSBwYW5lbFxuICAgKiBAc2VlIENvbmZpcm1EZWxldGVUZXh0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbmZpcm1EZWxldGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcImNvbmZpcm1EZWxldGVcIiwgZmFsc2UpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29uZmlybURlbGV0ZSh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJjb25maXJtRGVsZXRlXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBpdCB0byBhIHF1ZXN0aW9uIG5hbWUgdXNlZCBpbiB0aGUgdGVtcGxhdGUgcGFuZWwgYW5kIHRoZSBsaWJyYXJ5IHNob3dzIGR1cGxpY2F0aW9uIGVycm9yLCBpZiB0aGVyZSBhcmUgc2FtZSB2YWx1ZXMgaW4gZGlmZmVyZW50IHBhbmVscyBvZiB0aGlzIHF1ZXN0aW9uLlxuICAgKiBAc2VlIGtleUR1cGxpY2F0aW9uRXJyb3JcbiAgICovXG4gIHB1YmxpYyBnZXQga2V5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJrZXlOYW1lXCIsIFwiXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5TmFtZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcImtleU5hbWVcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVXNlIHRoaXMgcHJvcGVydHkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRleHQgc2hvd2luZyBpbiB0aGUgY29uZmlybWF0aW9uIGRlbGV0ZSBkaWFsb2cgb24gcmVtb3ZpbmcgYSBwYW5lbC5cbiAgICovXG4gIHB1YmxpYyBnZXQgY29uZmlybURlbGV0ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImNvbmZpcm1EZWxldGVcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgY29uZmlybURlbGV0ZVRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcImNvbmZpcm1EZWxldGVUZXh0XCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY0NvbmZpcm1EZWxldGVUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImNvbmZpcm1EZWxldGVUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgZHVwbGljYXRpb24gdmFsdWUgZXJyb3IgdGV4dC4gU2V0IGl0IHRvIHNob3cgdGhlIHRleHQgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQuXG4gICAqIEBzZWUga2V5TmFtZVxuICAgKi9cbiAgcHVibGljIGdldCBrZXlEdXBsaWNhdGlvbkVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcbiAgICAgIFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQga2V5RHVwbGljYXRpb25FcnJvcih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwia2V5RHVwbGljYXRpb25FcnJvclwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NLZXlEdXBsaWNhdGlvbkVycm9yKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcImtleUR1cGxpY2F0aW9uRXJyb3JcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBwcmV2aW91cyBidXR0b24gdGV4dC4gUHJldmlvdXMgYnV0dG9uIHNob3dzIHRoZSBwcmV2aW91cyBwYW5lbCwgY2hhbmdlIHRoZSBjdXJyZW50UGFuZWwsIHdoZW4gdGhlIHJlbmRlck1vZGUgZG9lc24ndCBlcXVhbCB0byBcImxpc3RcIi5cbiAgICogQHNlZSBjdXJyZW50UGFuZWxcbiAgICogQHNlZSBjdXJyZW50SW5kZXhcbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsUHJldlRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhbmVsUHJldlRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwYWdlUHJldlRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxQcmV2VGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxQcmV2VGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NQYW5lbFByZXZUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsUHJldlRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBuZXh0IGJ1dHRvbiB0ZXh0LiBOZXh0IGJ1dHRvbiBzaG93cyB0aGUgbmV4dCBwYW5lbCwgY2hhbmdlIHRoZSBjdXJyZW50UGFuZWwsIHdoZW4gdGhlIHJlbmRlck1vZGUgZG9lc24ndCBlcXVhbCB0byBcImxpc3RcIi5cbiAgICogQHNlZSBjdXJyZW50UGFuZWxcbiAgICogQHNlZSBjdXJyZW50SW5kZXhcbiAgICogQHNlZSByZW5kZXJNb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsTmV4dFRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhbmVsTmV4dFRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJwYWdlTmV4dFRleHRcIilcbiAgICApO1xuICB9XG4gIHB1YmxpYyBzZXQgcGFuZWxOZXh0VGV4dCh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwicGFuZWxOZXh0VGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NQYW5lbE5leHRUZXh0KCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcInBhbmVsTmV4dFRleHRcIik7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhZGQgcGFuZWwgYnV0dG9uIHRleHQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhbmVsQWRkVGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXG4gICAgICBcInBhbmVsQWRkVGV4dFwiLFxuICAgICAgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZyhcImFkZFBhbmVsXCIpXG4gICAgKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBhbmVsQWRkVGV4dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJwYW5lbEFkZFRleHRcIiwgdmFsdWUpO1xuICB9XG4gIGdldCBsb2NQYW5lbEFkZFRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxBZGRUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgcmVtb3ZlIHBhbmVsIGJ1dHRvbiB0ZXh0LlxuICAgKi9cbiAgcHVibGljIGdldCBwYW5lbFJlbW92ZVRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFxuICAgICAgXCJwYW5lbFJlbW92ZVRleHRcIixcbiAgICAgIHN1cnZleUxvY2FsaXphdGlvbi5nZXRTdHJpbmcoXCJyZW1vdmVQYW5lbFwiKVxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbFJlbW92ZVRleHQodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldExvY2FsaXphYmxlU3RyaW5nVGV4dChcInBhbmVsUmVtb3ZlVGV4dFwiLCB2YWwpO1xuICB9XG4gIGdldCBsb2NQYW5lbFJlbW92ZVRleHQoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nKFwicGFuZWxSZW1vdmVUZXh0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcmVuZGVyTW9kZSBlcXVhbHMgdG8gXCJwcm9ncmVzc1RvcFwiIG9yIFwicHJvZ3Jlc3NUb3BCb3R0b21cIlxuICAgKi9cbiAgcHVibGljIGdldCBpc1Byb2dyZXNzVG9wU2hvd2luZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5yZW5kZXJNb2RlID09IFwicHJvZ3Jlc3NUb3BcIiB8fCB0aGlzLnJlbmRlck1vZGUgPT0gXCJwcm9ncmVzc1RvcEJvdHRvbVwiXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHJlbmRlck1vZGUgZXF1YWxzIHRvIFwicHJvZ3Jlc3NCb3R0b21cIiBvciBcInByb2dyZXNzVG9wQm90dG9tXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNQcm9ncmVzc0JvdHRvbVNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucmVuZGVyTW9kZSA9PSBcInByb2dyZXNzQm90dG9tXCIgfHxcbiAgICAgIHRoaXMucmVuZGVyTW9kZSA9PSBcInByb2dyZXNzVG9wQm90dG9tXCJcbiAgICApO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiBjdXJyZW50SW5kZXggaXMgbW9yZSB0aGFuIDAuXG4gICAqIEBzZWUgY3VycmVuSW5kZXhcbiAgICogQHNlZSBjdXJyZW5QYW5lbFxuICAgKi9cbiAgcHVibGljIGdldCBpc1ByZXZCdXR0b25TaG93aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbmRleCA+IDA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIGN1cnJlbnRJbmRleCBpcyBtb3JlIHRoYW4gb3IgZXF1YWwgMCBhbmQgbGVzcyB0aGVuIHBhbmVsQ291bnQgLSAxLlxuICAgKiBAc2VlIGN1cnJlbkluZGV4XG4gICAqIEBzZWUgY3VycmVuUGFuZWxcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTmV4dEJ1dHRvblNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEluZGV4ID49IDAgJiYgdGhpcy5jdXJyZW50SW5kZXggPCB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiBzaG93UmFuZ2VJblByb2dyZXNzIGVxdWFscyB0byB0cnVlLCByZW5kZXJNb2RlIGRvZXNuJ3QgZXF1YWwgdG8gXCJsaXN0XCIgYW5kIHBhbmVsQ291bnQgaXMgPj0gMi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSYW5nZVNob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc2hvd1JhbmdlSW5Qcm9ncmVzcyAmJlxuICAgICAgKHRoaXMuY3VycmVudEluZGV4ID49IDAgJiYgdGhpcy5wYW5lbENvdW50ID4gMSlcbiAgICApO1xuICB9XG4gIHB1YmxpYyBnZXRFbGVtZW50c0luRGVzaWduKGluY2x1ZGVIaWRkZW46IGJvb2xlYW4gPSBmYWxzZSk6IEFycmF5PElFbGVtZW50PiB7XG4gICAgcmV0dXJuIGluY2x1ZGVIaWRkZW4gPyBbdGhpcy50ZW1wbGF0ZV0gOiB0aGlzLnRlbXBsYXRlRWxlbWVudHM7XG4gIH1cbiAgLyoqXG4gICAqIFVzZSB0aGlzIHByb3BlcnR5IHRvIGdldC9zZXQgdGhlIG51bWJlciBvZiBkeW5hbWljIHBhbmVscy5cbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIG1pblBhbmVsQ291bnRcbiAgICogQHNlZSBtYXhQYW5lbENvdW50XG4gICAqIEBzZWUgYWRkUGFuZWxcbiAgICogQHNlZSByZW1vdmVQYW5lbFxuICAgKiBAc2VlIHJlbW92ZVBhbmVsVUlcbiAgICovXG4gIHB1YmxpYyBnZXQgcGFuZWxDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlzTG9hZGluZ0Zyb21Kc29uIHx8IHRoaXMuaXNEZXNpZ25Nb2RlXG4gICAgICA/IHRoaXMubG9hZGluZ1BhbmVsQ291bnRcbiAgICAgIDogdGhpcy5pdGVtcy5sZW5ndGg7XG4gIH1cbiAgcHVibGljIHNldCBwYW5lbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IDApIHJldHVybjtcbiAgICBpZiAodGhpcy5pc0xvYWRpbmdGcm9tSnNvbiB8fCB0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgdGhpcy5sb2FkaW5nUGFuZWxDb3VudCA9IHZhbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbCA9PSB0aGlzLml0ZW1zLmxlbmd0aCB8fCB0aGlzLmlzRGVzaWduTW9kZSkgcmV0dXJuO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnBhbmVsQ291bnQ7IGkgPCB2YWw7IGkrKykge1xuICAgICAgdGhpcy5pdGVtcy5wdXNoKHRoaXMuY3JlYXRlTmV3SXRlbSgpKTtcbiAgICB9XG4gICAgaWYgKHZhbCA8IHRoaXMucGFuZWxDb3VudCkgdGhpcy5pdGVtcy5zcGxpY2UodmFsLCB0aGlzLnBhbmVsQ291bnQgLSB2YWwpO1xuICAgIHRoaXMuc2V0VmFsdWVCYXNlZE9uUGFuZWxDb3VudCgpO1xuICAgIHRoaXMucmVSdW5Db25kaXRpb24oKTtcbiAgICB0aGlzLmZpcmVDYWxsYmFjayh0aGlzLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2spO1xuICB9XG4gIHByaXZhdGUgc2V0VmFsdWVCYXNlZE9uUGFuZWxDb3VudCgpIHtcbiAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghdmFsdWUgfHwgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB2YWx1ZSA9IFtdO1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT0gdGhpcy5wYW5lbENvdW50KSByZXR1cm47XG4gICAgZm9yICh2YXIgaSA9IHZhbHVlLmxlbmd0aDsgaSA8IHRoaXMucGFuZWxDb3VudDsgaSsrKSB2YWx1ZS5wdXNoKHt9KTtcbiAgICBpZiAodmFsdWUubGVuZ3RoID4gdGhpcy5wYW5lbENvdW50KVxuICAgICAgdmFsdWUuc3BsaWNlKHRoaXMucGFuZWxDb3VudCwgdmFsdWUubGVuZ3RoIC0gdGhpcy5wYW5lbENvdW50KTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHBhbmVsIGNvdW50LiBBIHVzZXIgY291bGQgbm90IGRlbGV0ZSBhIHBhbmVsIGlmIHRoZSBwYW5lbENvdW50IGVxdWFscyB0byBtaW5QYW5lbENvdW50XG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIG1heFBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgbWluUGFuZWxDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJtaW5QYW5lbENvdW50XCIsIDApO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluUGFuZWxDb3VudCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPCAwKSB2YWwgPSAwO1xuICAgIGlmICh2YWwgPT0gdGhpcy5taW5QYW5lbENvdW50IHx8IHZhbCA+IHRoaXMubWF4UGFuZWxDb3VudCkgcmV0dXJuO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcIm1pblBhbmVsQ291bnRcIiwgdmFsKTtcbiAgICBpZiAodGhpcy5wYW5lbENvdW50IDwgdmFsKSB0aGlzLnBhbmVsQ291bnQgPSB2YWw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHBhbmVsIGNvdW50LiBBIHVzZXIgY291bGQgbm90IGFkZCBhIHBhbmVsIGlmIHRoZSBwYW5lbENvdW50IGVxdWFscyB0byBtYXhQYW5lbENvdW50XG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIG1pblBhbmVsQ291bnRcbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4UGFuZWxDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXG4gICAgICBcIm1heFBhbmVsQ291bnRcIixcbiAgICAgIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwuTWF4UGFuZWxDb3VudFxuICAgICk7XG4gIH1cbiAgcHVibGljIHNldCBtYXhQYW5lbENvdW50KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8PSAwKSByZXR1cm47XG4gICAgaWYgKHZhbCA+IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwuTWF4UGFuZWxDb3VudClcbiAgICAgIHZhbCA9IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwuTWF4UGFuZWxDb3VudDtcbiAgICBpZiAodmFsID09IHRoaXMubWF4UGFuZWxDb3VudCB8fCB2YWwgPCB0aGlzLm1pblBhbmVsQ291bnQpIHJldHVybjtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJtYXhQYW5lbENvdW50XCIsIHZhbCk7XG4gICAgaWYgKHRoaXMucGFuZWxDb3VudCA+IHZhbCkgdGhpcy5wYW5lbENvdW50ID0gdmFsO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZSB0byBoaWRlIHRoZSAnQWRkIE5ldycgYnV0dG9uXG4gICAqIEBzZWUgYWxsb3dSZW1vdmVQYW5lbFxuICAgKi9cbiAgcHVibGljIGdldCBhbGxvd0FkZFBhbmVsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJhbGxvd0FkZFBhbmVsXCIsIHRydWUpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxsb3dBZGRQYW5lbCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldFByb3BlcnR5VmFsdWUoXCJhbGxvd0FkZFBhbmVsXCIsIHZhbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIGhpZGUgdGhlICdSZW1vdmUnIGJ1dHRvblxuICAgKiBAc2VlIGFsbG93QWRkUGFuZWxcbiAgICovXG4gIHB1YmxpYyBnZXQgYWxsb3dSZW1vdmVQYW5lbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dSZW1vdmVQYW5lbFwiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFsbG93UmVtb3ZlUGFuZWwodmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwiYWxsb3dSZW1vdmVQYW5lbFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSBkaWZmZXJlbnQgZnJvbSBcImRlZmF1bHRcIiB0byBzZXQgdGhlIHNwZWNpZmljIHF1ZXN0aW9uIHRpdGxlIGxvY2F0aW9uIGZvciB0aGUgdGVtcGxhdGUgcXVlc3Rpb25zLlxuICAgKiBAc2VlIFN1cnZleU1vZGVsLnF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKiBAc2VlIFBhbmVsTW9kZWxCYXNlLnF1ZXN0aW9uVGl0bGVMb2NhdGlvblxuICAgKi9cbiAgcHVibGljIGdldCB0ZW1wbGF0ZVRpdGxlTG9jYXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwidGVtcGxhdGVUaXRsZUxvY2F0aW9uXCIsIFwiZGVmYXVsdFwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRlbXBsYXRlVGl0bGVMb2NhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwidGVtcGxhdGVUaXRsZUxvY2F0aW9uXCIsIHZhbHVlLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIC8qKlxuICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSB0byBzaG93L2hpZGUgdGhlIG51bWJlcnMgaW4gdGl0bGVzIGluIHF1ZXN0aW9ucyBpbnNpZGUgYSBkeW5hbWljIHBhbmVsLlxuICAgKiBCeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyBcIm9mZlwiLiBZb3UgbWF5IHNldCBpdCB0byBcIm9uUGFuZWxcIiBhbmQgdGhlIGZpcnN0IHF1ZXN0aW9uIGluc2lkZSBhIGR5bmFtaWMgcGFuZWwgd2lsbCBzdGFydCB3aXRoIDEgb3IgXCJvblN1cnZleVwiIHRvIGluY2x1ZGUgbmVzdGVkIHF1ZXN0aW9ucyBpbiBkeW1hbWljIHBhbmVscyBpbnRvIGdsb2JhbCBzdXJ2ZXkgcXVlc3Rpb24gbnVtYmVyaW5nLlxuICAgKi9cbiAgcHVibGljIGdldCBzaG93UXVlc3Rpb25OdW1iZXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInNob3dRdWVzdGlvbk51bWJlcnNcIiwgXCJvZmZcIik7XG4gIH1cbiAgcHVibGljIHNldCBzaG93UXVlc3Rpb25OdW1iZXJzKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLCB2YWwpO1xuICAgIGlmICghdGhpcy5pc0xvYWRpbmdGcm9tSnNvbiAmJiB0aGlzLnN1cnZleSkge1xuICAgICAgdGhpcy5zdXJ2ZXkucXVlc3Rpb25WaXNpYmlsaXR5Q2hhbmdlZCh0aGlzLCB0aGlzLnZpc2libGUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU2hvd3MgdGhlIHJhbmdlIGZyb20gMSB0byBwYW5lbENvdW50IHdoZW4gcmVuZGVyTW9kZSBkb2Vzbid0IGVxdWFsIHRvIFwibGlzdFwiLiBTZXQgdG8gZmFsc2UgdG8gaGlkZSB0aGlzIGVsZW1lbnQuXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2hvd1JhbmdlSW5Qcm9ncmVzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1JhbmdlSW5Qcm9ncmVzc1wiLCB0cnVlKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNob3dSYW5nZUluUHJvZ3Jlc3ModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwic2hvd1JhbmdlSW5Qcm9ncmVzc1wiLCB2YWwpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMuY3VycmVudEluZGV4Q2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogQnkgZGVmYXVsdCB0aGUgcHJvcGVydHkgZXF1YWxzIHRvIFwibGlzdFwiIGFuZCBhbGwgZHluYW1pYyBwYW5lbHMgYXJlIHJlbmRlcmVkIG9uZSBieSBvbmUgb24gdGhlIHBhZ2UuIFlvdSBtYXkgY2hhbmdlIGl0IHRvOiBcInByb2dyZXNzVG9wXCIsIFwicHJvZ3Jlc3NCb3R0b21cIiBvciBcInByb2dyZXNzVG9wQm90dG9tXCIgdG8gcmVuZGVyIG9ubHkgb25lIGR5bmFtaWMgcGFuZWwgYXQgb25jZS4gVGhlIHByb2dyZXNzIGFuZCBuYXZpZ2F0aW9uIGVsZW1lbnRzIGNhbiBiZSByZW5kcmVkIG9uIHRvcCwgYm90dG9tIG9yIGJvdGguXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlbmRlck1vZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyTW9kZVwiLCBcImxpc3RcIik7XG4gIH1cbiAgcHVibGljIHNldCByZW5kZXJNb2RlKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmVuZGVyTW9kZVwiLCB2YWwpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucmVuZGVyTW9kZUNoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHJlbmRlck1vZGUgZXF1YWxzIHRvIFwibGlzdFwiLlxuICAgKiBAc2VlIHJlbmRlck1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNSZW5kZXJNb2RlTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJNb2RlID09IFwibGlzdFwiO1xuICB9XG4gIHB1YmxpYyBzZXRWaXNpYmxlSW5kZXgodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgdmFyIHN0YXJ0SW5kZXggPSB0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgPT0gXCJvblN1cnZleVwiID8gdmFsdWUgOiAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNvdW50ZXIgPSB0aGlzLml0ZW1zW2ldLnNldFZpc2libGVJbmRleChcbiAgICAgICAgc3RhcnRJbmRleCxcbiAgICAgICAgdGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzICE9IFwib2ZmXCJcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5zaG93UXVlc3Rpb25OdW1iZXJzID09IFwib25TdXJ2ZXlcIikge1xuICAgICAgICBzdGFydEluZGV4ICs9IGNvdW50ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyLnNldFZpc2libGVJbmRleCh0aGlzLnNob3dRdWVzdGlvbk51bWJlcnMgIT0gXCJvblN1cnZleVwiID8gdmFsdWUgOiAtMSk7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1F1ZXN0aW9uTnVtYmVycyAhPSBcIm9uU3VydmV5XCIgPyAxIDogc3RhcnRJbmRleCAtIHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiBhbiBlbmQgdXNlciBtYXkgYWRkIGEgbmV3IHBhbmVsLiBUaGUgcXVlc3Rpb24gaXMgbm90IHJlYWQgb25seSBhbmQgcGFuZWxDb3VudCBsZXNzIHRoYW4gbWF4UGFuZWxDb3VudFxuICAgKiBAc2VlIGlzUmVhZE9ubHlcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgbWF4UGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBjYW5BZGRQYW5lbCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWxsb3dBZGRQYW5lbCAmJlxuICAgICAgIXRoaXMuaXNSZWFkT25seSAmJlxuICAgICAgdGhpcy5wYW5lbENvdW50IDwgdGhpcy5tYXhQYW5lbENvdW50XG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIHdoZW4gYW4gZW5kIHVzZXIgbWF5IHJlbW92ZSBhIHBhbmVsLiBUaGUgcXVlc3Rpb24gaXMgbm90IHJlYWQgb25seSBhbmQgcGFuZWxDb3VudCBpcyBtb3JlIHRoYW4gbWluUGFuZWxDb3VudFxuICAgKiBAc2VlIGlzUmVhZE9ubHlcbiAgICogQHNlZSBwYW5lbENvdW50XG4gICAqIEBzZWUgbWluUGFuZWxDb3VudFxuICAgKi9cbiAgcHVibGljIGdldCBjYW5SZW1vdmVQYW5lbCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5zdXJ2ZXkgJiYgdGhpcy5zdXJ2ZXkuaXNEZXNpZ25Nb2RlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWxsb3dSZW1vdmVQYW5lbCAmJlxuICAgICAgIXRoaXMuaXNSZWFkT25seSAmJlxuICAgICAgdGhpcy5wYW5lbENvdW50ID4gdGhpcy5taW5QYW5lbENvdW50XG4gICAgKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVidWlsZFBhbmVscygpIHtcbiAgICB2YXIgaXRlbXMgPSBuZXcgQXJyYXk8UXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtPigpO1xuICAgIGlmICh0aGlzLmlzRGVzaWduTW9kZSkge1xuICAgICAgaXRlbXMucHVzaChuZXcgUXVlc3Rpb25QYW5lbER5bmFtaWNJdGVtKHRoaXMsIHRoaXMudGVtcGxhdGUpKTtcbiAgICAgIGlmICh0aGlzLm9sZFRlbXBsYXRlUm93c0NoYW5nZWRDYWxsYmFjaykge1xuICAgICAgICB0aGlzLm9sZFRlbXBsYXRlUm93c0NoYW5nZWRDYWxsYmFjaygpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWJ1aWxkVGVtcGxhdGVSb3dzSW5FbGVtZW50cyh0aGlzLnRlbXBsYXRlLmVsZW1lbnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVsQ291bnQ7IGkrKykge1xuICAgICAgICBpdGVtcy5wdXNoKHRoaXMuY3JlYXRlTmV3SXRlbSgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pdGVtc1ZhbHVlID0gaXRlbXM7XG4gICAgdGhpcy5yZVJ1bkNvbmRpdGlvbigpO1xuICAgIHRoaXMuZmlyZUNhbGxiYWNrKHRoaXMucGFuZWxDb3VudENoYW5nZWRDYWxsYmFjayk7XG4gIH1cbiAgcHJpdmF0ZSByZWJ1aWxkVGVtcGxhdGVSb3dzSW5FbGVtZW50cyhlbGVtZW50czogQXJyYXk8SUVsZW1lbnQ+KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFlbGVtZW50c1tpXS5pc1BhbmVsKSBjb250aW51ZTtcbiAgICAgIHZhciBwYW5lbCA9IDxQYW5lbE1vZGVsQmFzZT4oPGFueT5lbGVtZW50c1tpXSk7XG4gICAgICBpZiAocGFuZWwucm93c0NoYW5nZWRDYWxsYmFjaykgcGFuZWwucm93c0NoYW5nZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5yZWJ1aWxkVGVtcGxhdGVSb3dzSW5FbGVtZW50cyhwYW5lbC5lbGVtZW50cyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgZHluYW1pYyBwYW5lbCBiYXNlZCBvbiB0aGUgdGVtcGxhdGUgUGFuZWwuIEl0IGNoZWNrcyBpZiBjYW5BZGRQYW5lbCByZXR1cm5zIHRydWUgYW5kIHRoZW4gY2FsbHMgYWRkUGFuZWwgbWV0aG9kLlxuICAgKiBAc2VlIHRlbXBsYXRlXG4gICAqIEBzZWUgcGFuZWxDb3VudFxuICAgKiBAc2VlIHBhbmVsc1xuICAgKiBAc2VlIGNhbkFkZFBhbmVsXG4gICAqL1xuICBwdWJsaWMgYWRkUGFuZWxVSSgpOiBQYW5lbE1vZGVsIHtcbiAgICBpZiAoIXRoaXMuY2FuQWRkUGFuZWwpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLmFkZFBhbmVsKCk7XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBkeW5hbWljIHBhbmVsIGJhc2VkIG9uIHRoZSB0ZW1wbGF0ZSBQYW5lbC5cbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKiBAc2VlIHBhbmVsQ291bnRcbiAgICogQHNlZSBwYW5lbHNcbiAgICovXG4gIHB1YmxpYyBhZGRQYW5lbCgpOiBQYW5lbE1vZGVsIHtcbiAgICB0aGlzLnBhbmVsQ291bnQrKztcbiAgICBpZiAoIXRoaXMuaXNSZW5kZXJNb2RlTGlzdCkge1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLnBhbmVsQ291bnQgLSAxO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LmR5bmFtaWNQYW5lbEFkZGVkKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLml0ZW1zW3RoaXMucGFuZWxDb3VudCAtIDFdLnBhbmVsO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsIHJlbW92ZVBhbmVsIGZ1bmN0aW9uLiBEbyBub3RoaW5nIGlzIGNhblJlbW92ZVBhbmVsIHJldHVybnMgZmFsc2UuIElmIGNvbmZpcm1EZWxldGUgc2V0IHRvIHRydWUsIGl0IHNob3dzIHRoZSBjb25maXJtYXRpb24gZGlhbG9nIGZpcnN0LlxuICAgKiBAcGFyYW0gdmFsdWUgYSBwYW5lbCBvciBwYW5lbCBpbmRleFxuICAgKiBAc2VlIHJlbW92ZVBhbmVsXG4gICAqIEBzZWUgY29uZmlybURlbGV0ZVxuICAgKiBAc2VlIGNvbmZpcm1EZWxldGVUZXh0XG4gICAqIEBzZWUgY2FuUmVtb3ZlUGFuZWxcbiAgICpcbiAgICovXG4gIHB1YmxpYyByZW1vdmVQYW5lbFVJKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVtb3ZlUGFuZWwpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29uZmlybURlbGV0ZSB8fCBjb25maXJtKHRoaXMuY29uZmlybURlbGV0ZVRleHQpKSB7XG4gICAgICB0aGlzLnJlbW92ZVBhbmVsKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBkeW5hbWljIHBhbmVsIGZyb20gdGhlIHBhbmVscyBhcnJheS5cbiAgICogQHBhcmFtIHZhbHVlIGEgcGFuZWwgb3IgcGFuZWwgaW5kZXhcbiAgICogQHNlZSBwYW5lbHNcbiAgICogQHNlZSB0ZW1wbGF0ZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhbmVsKHZhbHVlOiBhbnkpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmdldFBhbmVsSW5kZXgodmFsdWUpO1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5wYW5lbENvdW50KSByZXR1cm47XG4gICAgdGhpcy5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCF2YWx1ZSB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaW5kZXggPj0gdmFsdWUubGVuZ3RoKSByZXR1cm47XG4gICAgdmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5wYW5lbENvdW50Q2hhbmdlZENhbGxiYWNrKTtcbiAgICBpZiAodGhpcy5zdXJ2ZXkpIHRoaXMuc3VydmV5LmR5bmFtaWNQYW5lbFJlbW92ZWQodGhpcywgaW5kZXgpO1xuICB9XG4gIHByaXZhdGUgZ2V0UGFuZWxJbmRleCh2YWw6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKCFpc05hTihwYXJzZUZsb2F0KHZhbCkpICYmIGlzRmluaXRlKHZhbCkpIHJldHVybiB2YWw7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5pdGVtc1tpXSA9PT0gdmFsIHx8IHRoaXMuaXRlbXNbaV0ucGFuZWwgPT09IHZhbCkgcmV0dXJuIGk7XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlMb2FkKCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmdQYW5lbENvdW50ID4gMCkge1xuICAgICAgdGhpcy5wYW5lbENvdW50ID0gdGhpcy5sb2FkaW5nUGFuZWxDb3VudDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEZXNpZ25Nb2RlKSB7XG4gICAgICB0aGlzLnJlYnVpbGRQYW5lbHMoKTtcbiAgICB9XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gIH1cbiAgcHVibGljIHJ1bkNvbmRpdGlvbih2YWx1ZXM6IEhhc2hUYWJsZTxhbnk+KSB7XG4gICAgc3VwZXIucnVuQ29uZGl0aW9uKHZhbHVlcyk7XG4gICAgdGhpcy5ydW5QYW5lbHNDb25kaXRpb24odmFsdWVzKTtcbiAgfVxuICBwcml2YXRlIHJlUnVuQ29uZGl0aW9uKCkge1xuICAgIGlmICghdGhpcy5kYXRhKSByZXR1cm47XG4gICAgdGhpcy5ydW5Db25kaXRpb24odGhpcy5kYXRhLmdldEFsbFZhbHVlcygpKTtcbiAgfVxuICBwcm90ZWN0ZWQgcnVuUGFuZWxzQ29uZGl0aW9uKHZhbHVlczogSGFzaFRhYmxlPGFueT4pIHtcbiAgICB2YXIgbmV3VmFsdWVzID0ge307XG4gICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIG5ld1ZhbHVlcyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWVzKSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgbmV3VmFsdWVzW1xuICAgICAgICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSXRlbVZhcmlhYmxlTmFtZVxuICAgICAgXSA9IHRoaXMuZ2V0UGFuZWxJdGVtRGF0YSh0aGlzLml0ZW1zW2ldKTtcbiAgICAgIG5ld1ZhbHVlc1tRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0uSW5kZXhWYXJpYWJsZU5hbWVdID0gaTtcbiAgICAgIHRoaXMuaXRlbXNbaV0ucnVuQ29uZGl0aW9uKG5ld1ZhbHVlcyk7XG4gICAgfVxuICB9XG4gIG9uQW55VmFsdWVDaGFuZ2VkKG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyLm9uQW55VmFsdWVDaGFuZ2VkKG5hbWUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pdGVtc1tpXS5vbkFueVZhbHVlQ2hhbmdlZChuYW1lKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGhhc0Vycm9ycyhmaXJlQ2FsbGJhY2s6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgdmFyIGVycm9zSW5QYW5lbHMgPSB0aGlzLmhhc0Vycm9ySW5QYW5lbHMoZmlyZUNhbGxiYWNrKTtcbiAgICByZXR1cm4gc3VwZXIuaGFzRXJyb3JzKGZpcmVDYWxsYmFjaykgfHwgZXJyb3NJblBhbmVscztcbiAgfVxuICBwdWJsaWMgY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCkge1xuICAgIHN1cGVyLmNsZWFyVmFsdWVJZkludmlzaWJsZSgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBxdWVzdGlvbnMgPSB0aGlzLnBhbmVsc1tpXS5xdWVzdGlvbnM7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHF1ZXN0aW9ucy5sZW5ndGg7IGorKykge1xuICAgICAgICBxdWVzdGlvbnNbal0uY2xlYXJWYWx1ZUlmSW52aXNpYmxlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRBbGxFcnJvcnMoKTogQXJyYXk8U3VydmV5RXJyb3I+IHtcbiAgICB2YXIgcmVzdWx0ID0gc3VwZXIuZ2V0QWxsRXJyb3JzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhbmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXN0aW9ucyA9IHRoaXMucGFuZWxzW2ldLnF1ZXN0aW9ucztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBlcnJvcnMgPSBxdWVzdGlvbnNbal0uZ2V0QWxsRXJyb3JzKCk7XG4gICAgICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuY29uY2F0KGVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBwcml2YXRlIGhhc0Vycm9ySW5QYW5lbHMoZmlyZUNhbGxiYWNrOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IGZhbHNlO1xuICAgIHZhciBwYW5lbHMgPSB0aGlzLnBhbmVscztcbiAgICB2YXIga2V5VmFsdWVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYW5lbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwbmxFcnJvciA9IHBhbmVsc1tpXS5oYXNFcnJvcnMoZmlyZUNhbGxiYWNrKTtcbiAgICAgIHBubEVycm9yID0gdGhpcy5pc1ZhbHVlRHVwbGljYXRlZChwYW5lbHNbaV0sIGtleVZhbHVlcykgfHwgcG5sRXJyb3I7XG4gICAgICBpZiAoIXRoaXMuaXNSZW5kZXJNb2RlTGlzdCAmJiBwbmxFcnJvciAmJiAhcmVzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gaTtcbiAgICAgIH1cbiAgICAgIHJlcyA9IHBubEVycm9yIHx8IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBwcml2YXRlIGlzVmFsdWVEdXBsaWNhdGVkKHBhbmVsOiBQYW5lbE1vZGVsLCBrZXlWYWx1ZXM6IEFycmF5PGFueT4pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMua2V5TmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBxdWVzdGlvbiA9IDxRdWVzdGlvbj5wYW5lbC5nZXRRdWVzdGlvbkJ5VmFsdWVOYW1lKHRoaXMua2V5TmFtZSk7XG4gICAgaWYgKCFxdWVzdGlvbiB8fCBxdWVzdGlvbi5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTtcbiAgICB2YXIgdmFsdWUgPSBxdWVzdGlvbi52YWx1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlID09IGtleVZhbHVlc1tpXSkge1xuICAgICAgICBxdWVzdGlvbi5hZGRFcnJvcihuZXcgQ3VzdG9tRXJyb3IodGhpcy5rZXlEdXBsaWNhdGlvbkVycm9yKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBrZXlWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVOZXdJdGVtKCk6IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW0odGhpcywgdGhpcy5jcmVhdGVOZXdQYW5lbCgpKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlTmV3UGFuZWwoKTogUGFuZWxNb2RlbCB7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5jcmVhdGVBbmRTZXR1cE5ld1BhbmVsT2JqZWN0KCk7XG4gICAgdmFyIGpPYmogPSBuZXcgSnNvbk9iamVjdCgpO1xuICAgIHZhciBqc29uID0gak9iai50b0pzb25PYmplY3QodGhpcy50ZW1wbGF0ZSk7XG4gICAgak9iai50b09iamVjdChqc29uLCBwYW5lbCk7XG4gICAgcGFuZWwucmVuZGVyV2lkdGggPSBcIjEwMCVcIjtcbiAgICByZXR1cm4gcGFuZWw7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZUFuZFNldHVwTmV3UGFuZWxPYmplY3QoKTogUGFuZWxNb2RlbCB7XG4gICAgdmFyIHBhbmVsID0gdGhpcy5jcmVhdGVOZXdQYW5lbE9iamVjdCgpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBwYW5lbC5vbkdldFF1ZXN0aW9uVGl0bGVMb2NhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNlbGYuZ2V0VGVtcGxhdGVRdWVzdGlvblRpdGxlTG9jYXRpb24oKTtcbiAgICB9O1xuICAgIHJldHVybiBwYW5lbDtcbiAgfVxuICBwcml2YXRlIGdldFRlbXBsYXRlUXVlc3Rpb25UaXRsZUxvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVGl0bGVMb2NhdGlvbiAhPSBcImRlZmF1bHRcIlxuICAgICAgPyB0aGlzLnRlbXBsYXRlVGl0bGVMb2NhdGlvblxuICAgICAgOiB0aGlzLmdldFRpdGxlTG9jYXRpb25Db3JlKCk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhbmVsT2JqZWN0KCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiBuZXcgUGFuZWxNb2RlbCgpO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHtcbiAgICBpZiAodGhpcy5pc1ZhbHVlQ2hhbmdpbmdJbnRlcm5hbGx5KSByZXR1cm47XG4gICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgdmFyIG5ld1BhbmVsQ291bnQgPSB2YWwgJiYgQXJyYXkuaXNBcnJheSh2YWwpID8gdmFsLmxlbmd0aCA6IDA7XG4gICAgaWYgKG5ld1BhbmVsQ291bnQgPD0gdGhpcy5wYW5lbENvdW50KSByZXR1cm47XG4gICAgdGhpcy5wYW5lbENvdW50ID0gbmV3UGFuZWxDb3VudDtcbiAgfVxuICBwdWJsaWMgb25TdXJ2ZXlWYWx1ZUNoYW5nZWQobmV3VmFsdWU6IGFueSkge1xuICAgIHN1cGVyLm9uU3VydmV5VmFsdWVDaGFuZ2VkKG5ld1ZhbHVlKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0ub25TdXJ2ZXlWYWx1ZUNoYW5nZWQoKTtcbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIG9uU2V0RGF0YSgpIHtcbiAgICBzdXBlci5vblNldERhdGEoKTtcbiAgICBpZiAodGhpcy5pc0Rlc2lnbk1vZGUpIHtcbiAgICAgIHRoaXMudGVtcGxhdGUuc2V0U3VydmV5SW1wbCh0aGlzLnN1cnZleUltcGwpO1xuICAgICAgaWYgKCF0aGlzLmlzTG9hZGluZ0Zyb21Kc29uKSB7XG4gICAgICAgIHRoaXMucmVidWlsZFBhbmVscygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvL0lRdWVzdGlvblBhbmVsRHluYW1pY0RhdGFcbiAgZ2V0SXRlbUluZGV4KGl0ZW06IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgfVxuICBnZXRQYW5lbEl0ZW1EYXRhKGl0ZW06IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSk6IGFueSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgIHZhciBxVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChcbiAgICAgIGluZGV4IDwgMCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShxVmFsdWUpICYmXG4gICAgICBxVmFsdWUubGVuZ3RoID4gdGhpcy5pdGVtcy5sZW5ndGhcbiAgICApIHtcbiAgICAgIGluZGV4ID0gcVZhbHVlLmxlbmd0aCAtIDE7XG4gICAgfVxuICAgIGlmIChpbmRleCA8IDApIHJldHVybiB7fTtcbiAgICBpZiAoIXFWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShxVmFsdWUpIHx8IHFWYWx1ZS5sZW5ndGggPD0gaW5kZXgpIHJldHVybiB7fTtcbiAgICByZXR1cm4gcVZhbHVlW2luZGV4XTtcbiAgfVxuICBzZXRQYW5lbEl0ZW1EYXRhKGl0ZW06IFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbSwgbmFtZTogc3RyaW5nLCB2YWw6IGFueSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPCAwKSBpbmRleCA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgIHZhciBxVmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmICghcVZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHFWYWx1ZSkpIHtcbiAgICAgIHFWYWx1ZSA9IFtdO1xuICAgIH1cbiAgICBpZiAocVZhbHVlLmxlbmd0aCA8PSBpbmRleCkge1xuICAgICAgZm9yICh2YXIgaSA9IHFWYWx1ZS5sZW5ndGg7IGkgPD0gaW5kZXg7IGkrKykge1xuICAgICAgICBxVmFsdWUucHVzaCh7fSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcVZhbHVlW2luZGV4XSkgcVZhbHVlW2luZGV4XSA9IHt9O1xuICAgIGlmICghdGhpcy5pc1ZhbHVlRW1wdHkodmFsKSkge1xuICAgICAgcVZhbHVlW2luZGV4XVtuYW1lXSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHFWYWx1ZVtpbmRleF1bbmFtZV07XG4gICAgfVxuICAgIHRoaXMuaXNWYWx1ZUNoYW5naW5nSW50ZXJuYWxseSA9IHRydWU7XG4gICAgdGhpcy52YWx1ZSA9IHFWYWx1ZTtcbiAgICB0aGlzLmlzVmFsdWVDaGFuZ2luZ0ludGVybmFsbHkgPSBmYWxzZTtcbiAgfVxuICBnZXRTdXJ2ZXkoKTogSVN1cnZleSB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5O1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwicGFuZWxkeW5hbWljXCIsXG4gIFtcbiAgICB7IG5hbWU6IFwidGVtcGxhdGVFbGVtZW50c1wiLCBhbHRlcm5hdGl2ZU5hbWU6IFwicXVlc3Rpb25zXCIsIHZpc2libGU6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiBcInRlbXBsYXRlVGl0bGU6dGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jVGVtcGxhdGVUaXRsZVwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ0ZW1wbGF0ZURlc2NyaXB0aW9uOnRleHRcIixcbiAgICAgIHNlcmlhbGl6YXRpb25Qcm9wZXJ0eTogXCJsb2NUZW1wbGF0ZURlc2NyaXB0aW9uXCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJhbGxvd0FkZFBhbmVsOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJhbGxvd1JlbW92ZVBhbmVsOmJvb2xlYW5cIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicGFuZWxDb3VudDpudW1iZXJcIixcbiAgICAgIGRlZmF1bHQ6IDAsXG4gICAgICBjaG9pY2VzOiBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdXG4gICAgfSxcbiAgICB7IG5hbWU6IFwibWluUGFuZWxDb3VudDpudW1iZXJcIiwgZGVmYXVsdDogMCB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4UGFuZWxDb3VudDpudW1iZXJcIixcbiAgICAgIGRlZmF1bHQ6IFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwuTWF4UGFuZWxDb3VudFxuICAgIH0sXG4gICAgeyBuYW1lOiBcImtleU5hbWVcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwia2V5RHVwbGljYXRpb25FcnJvclwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0tleUR1cGxpY2F0aW9uRXJyb3JcIlxuICAgIH0sXG4gICAgeyBuYW1lOiBcImNvbmZpcm1EZWxldGU6Ym9vbGVhblwiIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJjb25maXJtRGVsZXRlVGV4dFwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY0NvbmZpcm1EZWxldGVUZXh0XCJcbiAgICB9LFxuICAgIHsgbmFtZTogXCJwYW5lbEFkZFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsQWRkVGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsUmVtb3ZlVGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFuZWxSZW1vdmVUZXh0XCIgfSxcbiAgICB7IG5hbWU6IFwicGFuZWxQcmV2VGV4dFwiLCBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jUGFuZWxQcmV2VGV4dFwiIH0sXG4gICAgeyBuYW1lOiBcInBhbmVsTmV4dFRleHRcIiwgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY1BhbmVsTmV4dFRleHRcIiB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwic2hvd1F1ZXN0aW9uTnVtYmVyc1wiLFxuICAgICAgZGVmYXVsdDogXCJvZmZcIixcbiAgICAgIGNob2ljZXM6IFtcIm9mZlwiLCBcIm9uUGFuZWxcIiwgXCJvblN1cnZleVwiXVxuICAgIH0sXG4gICAgeyBuYW1lOiBcInNob3dSYW5nZUluUHJvZ3Jlc3NcIiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmVuZGVyTW9kZVwiLFxuICAgICAgZGVmYXVsdDogXCJsaXN0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJsaXN0XCIsIFwicHJvZ3Jlc3NUb3BcIiwgXCJwcm9ncmVzc0JvdHRvbVwiLCBcInByb2dyZXNzVG9wQm90dG9tXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcInRlbXBsYXRlVGl0bGVMb2NhdGlvblwiLFxuICAgICAgZGVmYXVsdDogXCJkZWZhdWx0XCIsXG4gICAgICBjaG9pY2VzOiBbXCJkZWZhdWx0XCIsIFwidG9wXCIsIFwiYm90dG9tXCIsIFwibGVmdFwiXVxuICAgIH1cbiAgXSxcbiAgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsKFwiXCIpO1xuICB9LFxuICBcInF1ZXN0aW9uXCJcbik7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInBhbmVsZHluYW1pY1wiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcXVlc3Rpb25fcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25DaGVja2JveEJhc2UgfSBmcm9tIFwiLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSByYWRpb2dyb3VwIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwgZXh0ZW5kcyBRdWVzdGlvbkNoZWNrYm94QmFzZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInJhZGlvZ3JvdXBcIjtcbiAgfVxuICBzdXBwb3J0R29OZXh0UGFnZUF1dG9tYXRpYygpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcInJhZGlvZ3JvdXBcIixcbiAgW10sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwiY2hlY2tib3hiYXNlXCJcbik7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmFkaW9ncm91cFwiLCBuYW1lID0+IHtcbiAgdmFyIHEgPSBuZXcgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9yYWRpb2dyb3VwLnRzIiwiaW1wb3J0IHsgSXRlbVZhbHVlIH0gZnJvbSBcIi4vaXRlbXZhbHVlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gXCIuL2xvY2FsaXphYmxlc3RyaW5nXCI7XG5cbi8qKlxuICogQSBNb2RlbCBmb3IgYSByYXRpbmcgcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblJhdGluZ01vZGVsIGV4dGVuZHMgUXVlc3Rpb24ge1xuICBwdWJsaWMgc3RhdGljIE1heGltdW1SYXRlVmFsdWVDb3VudDogbnVtYmVyID0gMjA7XG4gIHByaXZhdGUgcmF0ZXM6IEFycmF5PEl0ZW1WYWx1ZT47XG5cbiAgcmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjazogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgdGhpcy5yYXRlcyA9IHRoaXMuY3JlYXRlSXRlbVZhbHVlcyhcInJhdGVzXCIpO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25PblByb3BlcnR5VmFsdWVDaGFuZ2VkKFwicmF0ZXNcIiwgZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLnJhdGVWYWx1ZXNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgIH0pO1xuICAgIHRoaXMub25Qcm9wZXJ0eUNoYW5nZWQuYWRkKGZ1bmN0aW9uKHNlbmRlciwgb3B0aW9ucykge1xuICAgICAgaWYgKFxuICAgICAgICBvcHRpb25zLm5hbWUgPT0gXCJyYXRlTWluXCIgfHxcbiAgICAgICAgb3B0aW9ucy5uYW1lID09IFwicmF0ZU1heFwiIHx8XG4gICAgICAgIG9wdGlvbnMubmFtZSA9PSBcInJhdGVTdGVwXCJcbiAgICAgICkge1xuICAgICAgICBzZWxmLmZpcmVDYWxsYmFjayhzZWxmLnJhdGVWYWx1ZXNDaGFuZ2VkQ2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIGxvY01pblJhdGVEZXNjcmlwdGlvblZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwibWluUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgdmFyIGxvY01heFJhdGVEZXNjcmlwdGlvblZhbHVlID0gdGhpcy5jcmVhdGVMb2NhbGl6YWJsZVN0cmluZyhcbiAgICAgIFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICB0aGlzLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgbG9jTWluUmF0ZURlc2NyaXB0aW9uVmFsdWUub25HZXRUZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dCA/IHRleHQgKyBcIiBcIiA6IHRleHQ7XG4gICAgfTtcbiAgICBsb2NNYXhSYXRlRGVzY3JpcHRpb25WYWx1ZS5vbkdldFRleHRDYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgIHJldHVybiB0ZXh0ID8gXCIgXCIgKyB0ZXh0IDogdGV4dDtcbiAgICB9O1xuICB9XG4gIHB1YmxpYyBvblN1cnZleUxvYWQoKSB7XG4gICAgc3VwZXIub25TdXJ2ZXlMb2FkKCk7XG4gICAgdGhpcy5maXJlQ2FsbGJhY2sodGhpcy5yYXRlVmFsdWVzQ2hhbmdlZENhbGxiYWNrKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgcmF0ZSBpdGVtcy4gRXZlcnkgaXRlbSBoYXMgdmFsdWUgYW5kIHRleHQuIElmIHRleHQgaXMgZW1wdHksIHRoZSB2YWx1ZSBpcyByZW5kZXJlZC4gVGhlIGl0ZW0gdGV4dCBzdXBwb3J0cyBtYXJrZG93bi4gSWYgaXQgaXMgZW1wdHkgdGhlIGFycmF5IGlzIGdlbmVyYXRlZCBieSB1c2luZyByYXRlTWluLCByYXRlTWF4IGFuZCByYXRlU3RlcCBwcm9wZXJ0aWVzLlxuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlTWF4XG4gICAqIEBzZWUgcmF0ZVN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcmF0ZVZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5yYXRlcztcbiAgfVxuICBwdWJsaWMgc2V0IHJhdGVWYWx1ZXModmFsOiBBcnJheTxhbnk+KSB7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZXNcIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgcmF0aW5nLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxLlxuICAgKiBAc2VlIHJhdGVWYWx1ZXNcbiAgICogQHNlZSByYXRlTWF4XG4gICAqIEBzZWUgcmF0ZVN0ZXBcbiAgICovXG4gIHB1YmxpYyBnZXQgcmF0ZU1pbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5VmFsdWUoXCJyYXRlTWluXCIsIDEpO1xuICB9XG4gIHB1YmxpYyBzZXQgcmF0ZU1pbih2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPiB0aGlzLnJhdGVNYXggLSB0aGlzLnJhdGVTdGVwKSB2YWwgPSB0aGlzLnJhdGVNYXggLSB0aGlzLnJhdGVTdGVwO1xuICAgIHRoaXMuc2V0UHJvcGVydHlWYWx1ZShcInJhdGVNaW5cIiwgdmFsKTtcbiAgfVxuICAvKipcbiAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGdlbmVyYXRlIHJhdGUgdmFsdWVzIGlmIHJhdGVWYWx1ZXMgYXJyYXkgaXMgZW1wdHkuIEl0IGlzIHRoZSBsYXN0IHZhbHVlIGluIHRoZSByYXRpbmcuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuXG4gICAqIEBzZWUgcmF0ZVZhbHVlc1xuICAgKiBAc2VlIHJhdGVNaW5cbiAgICogQHNlZSByYXRlU3RlcFxuICAgKi9cbiAgcHVibGljIGdldCByYXRlTWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShcInJhdGVNYXhcIiwgNSk7XG4gIH1cbiAgcHVibGljIHNldCByYXRlTWF4KHZhbDogbnVtYmVyKSB7XG4gICAgaWYgKHZhbCA8IHRoaXMucmF0ZU1pbiArIHRoaXMucmF0ZVN0ZXApIHZhbCA9IHRoaXMucmF0ZU1pbiArIHRoaXMucmF0ZVN0ZXA7XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZU1heFwiLCB2YWwpO1xuICB9XG4gIC8qKlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gZ2VuZXJhdGUgcmF0ZSB2YWx1ZXMgaWYgcmF0ZVZhbHVlcyBhcnJheSBpcyBlbXB0eS4gSXQgaXMgdGhlIHN0ZXAgdmFsdWUuIFRoZSBudW1iZXIgb2YgcmF0ZSB2YWx1ZXMgYXJlIChyYXRlTWF4IC0gcmF0ZU1pbikgLyByYXRlU3RlcC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS5cbiAgICogQHNlZSByYXRlVmFsdWVzXG4gICAqIEBzZWUgcmF0ZU1pblxuICAgKiBAc2VlIHJhdGVNYXhcbiAgICovXG4gIHB1YmxpYyBnZXQgcmF0ZVN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZVN0ZXBcIiwgMSk7XG4gIH1cbiAgcHVibGljIHNldCByYXRlU3RlcCh2YWw6IG51bWJlcikge1xuICAgIGlmICh2YWwgPD0gMCkgdmFsID0gMTtcbiAgICBpZiAodmFsID4gdGhpcy5yYXRlTWF4IC0gdGhpcy5yYXRlTWluKSB2YWwgPSB0aGlzLnJhdGVNYXggLSB0aGlzLnJhdGVNaW47XG4gICAgdGhpcy5zZXRQcm9wZXJ0eVZhbHVlKFwicmF0ZVN0ZXBcIiwgdmFsKTtcbiAgfVxuICBnZXQgdmlzaWJsZVJhdGVWYWx1ZXMoKTogSXRlbVZhbHVlW10ge1xuICAgIGlmICh0aGlzLnJhdGVWYWx1ZXMubGVuZ3RoID4gMCkgcmV0dXJuIHRoaXMucmF0ZVZhbHVlcztcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIHZhbHVlID0gdGhpcy5yYXRlTWluO1xuICAgIHdoaWxlIChcbiAgICAgIHZhbHVlIDw9IHRoaXMucmF0ZU1heCAmJlxuICAgICAgcmVzLmxlbmd0aCA8IFF1ZXN0aW9uUmF0aW5nTW9kZWwuTWF4aW11bVJhdGVWYWx1ZUNvdW50XG4gICAgKSB7XG4gICAgICByZXMucHVzaChuZXcgSXRlbVZhbHVlKHZhbHVlKSk7XG4gICAgICB2YWx1ZSArPSB0aGlzLnJhdGVTdGVwO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwicmF0aW5nXCI7XG4gIH1cbiAgc3VwcG9ydEdvTmV4dFBhZ2VBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHVibGljIHN1cHBvcnRDb21tZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHB1YmxpYyBzdXBwb3J0T3RoZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiBtaW5pbXVtIChmaXJzdCkgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWluUmF0ZURlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibWluUmF0ZURlc2NyaXB0aW9uXCIpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluUmF0ZURlc2NyaXB0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMb2NhbGl6YWJsZVN0cmluZ1RleHQoXCJtaW5SYXRlRGVzY3JpcHRpb25cIiwgdmFsKTtcbiAgfVxuICBnZXQgbG9jTWluUmF0ZURlc2NyaXB0aW9uKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMb2NhbGl6YWJsZVN0cmluZyhcIm1pblJhdGVEZXNjcmlwdGlvblwiKTtcbiAgfVxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIG1heGltdW0gKGxhc3QpIGl0ZW0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1heFJhdGVEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldExvY2FsaXphYmxlU3RyaW5nVGV4dChcIm1heFJhdGVEZXNjcmlwdGlvblwiKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heFJhdGVEZXNjcmlwdGlvbih2YWw6IHN0cmluZykge1xuICAgIHRoaXMuc2V0TG9jYWxpemFibGVTdHJpbmdUZXh0KFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsIHZhbCk7XG4gIH1cbiAgZ2V0IGxvY01heFJhdGVEZXNjcmlwdGlvbigpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxpemFibGVTdHJpbmcoXCJtYXhSYXRlRGVzY3JpcHRpb25cIik7XG4gIH1cbn1cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXG4gIFwicmF0aW5nXCIsXG4gIFtcbiAgICBcImhhc0NvbW1lbnQ6Ym9vbGVhblwiLFxuICAgIHtcbiAgICAgIG5hbWU6IFwicmF0ZVZhbHVlczppdGVtdmFsdWVzXCIsXG4gICAgICBvbkdldFZhbHVlOiBmdW5jdGlvbihvYmo6IGFueSkge1xuICAgICAgICByZXR1cm4gSXRlbVZhbHVlLmdldERhdGEob2JqLnJhdGVWYWx1ZXMpO1xuICAgICAgfSxcbiAgICAgIG9uU2V0VmFsdWU6IGZ1bmN0aW9uKG9iajogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIG9iai5yYXRlVmFsdWVzID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IG5hbWU6IFwicmF0ZU1pbjpudW1iZXJcIiwgZGVmYXVsdDogMSB9LFxuICAgIHsgbmFtZTogXCJyYXRlTWF4Om51bWJlclwiLCBkZWZhdWx0OiA1IH0sXG4gICAgeyBuYW1lOiBcInJhdGVTdGVwOm51bWJlclwiLCBkZWZhdWx0OiAxIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJtaW5SYXRlRGVzY3JpcHRpb25cIixcbiAgICAgIGFsdGVybmF0aXZlTmFtZTogXCJtaW5pbnVtUmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICBzZXJpYWxpemF0aW9uUHJvcGVydHk6IFwibG9jTWluUmF0ZURlc2NyaXB0aW9uXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwibWF4UmF0ZURlc2NyaXB0aW9uXCIsXG4gICAgICBhbHRlcm5hdGl2ZU5hbWU6IFwibWF4aW11bVJhdGVEZXNjcmlwdGlvblwiLFxuICAgICAgc2VyaWFsaXphdGlvblByb3BlcnR5OiBcImxvY01heFJhdGVEZXNjcmlwdGlvblwiXG4gICAgfVxuICBdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uUmF0aW5nTW9kZWwoXCJcIik7XG4gIH0sXG4gIFwicXVlc3Rpb25cIlxuKTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwicmF0aW5nXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUmF0aW5nTW9kZWwobmFtZSk7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9xdWVzdGlvbl9yYXRpbmcudHMiLCJleHBvcnQgY2xhc3MgU3R5bGVzTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIFN1cnZleUpTU3R5bGVzU2hlZXRJZCA9IFwic3VydmV5anNcIjtcblxuICBwdWJsaWMgc3RhdGljIFN0eWxlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAvLyBcIi5zdl9ib290c3RyYXBfY3NzXCI6XG4gICAgLy8gICBcInBvc2l0aW9uOiByZWxhdGl2ZTsgd2lkdGg6IDEwMCU7IGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjRcIixcbiAgICAvLyBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9jdXN0b21faGVhZGVyXCI6XG4gICAgLy8gICBcInBvc2l0aW9uOiBhYnNvbHV0ZTsgd2lkdGg6IDEwMCU7IGhlaWdodDogMjc1cHg7IGJhY2tncm91bmQtY29sb3I6ICNlN2U3ZTc7XCIsXG4gICAgLy8gXCIuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfY29udGFpbmVyXCI6XG4gICAgLy8gICBcIm1heC13aWR0aDogODAlOyBtYXJnaW46IGF1dG87IHBvc2l0aW9uOiByZWxhdGl2ZTsgY29sb3I6ICM2ZDcwNzI7IHBhZGRpbmc6IDAgMWVtO1wiLFxuICAgIC8vIFwiLnN2X2Jvb3RzdHJhcF9jc3MgLnBhbmVsLWJvZHlcIjpcbiAgICAvLyAgIFwiYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7IHBhZGRpbmc6IDFlbSAxZW0gNWVtIDFlbTsgYm9yZGVyLXRvcDogMnB4IHNvbGlkIGxpZ2h0Z3JheTtcIixcbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xc3RuXCI6IFwicGFkZGluZzogMC41ZW0gMWVtIDEuNWVtIDFlbTtcIixcbiAgICBcIi5zdl9ib290c3RyYXBfY3NzIC5zdl9xY2JjIGlucHV0W3R5cGU9Y2hlY2tib3hdLCAuc3ZfYm9vdHN0cmFwX2NzcyAuc3ZfcWNiYyBpbnB1dFt0eXBlPXJhZGlvXVwiOlxuICAgICAgXCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyBtYXJnaW4tdG9wOiAtMXB4XCIsXG5cbiAgICBcIi5zdl9ib290c3RyYXBtYXRlcmlhbF9jc3MgLnN2X3FfcmFkaW9ncm91cF9jb250cm9sX2xhYmVsXCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZTsgcG9zaXRpb246IHN0YXRpYztcIixcblxuICAgIFwiLnN2X3FzdG5cIjogXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOiB0b3A7XCIsXG4gICAgXCIucHJvZ3Jlc3NcIjogXCJ3aWR0aDogNjAlO1wiLFxuICAgIFwiLnByb2dyZXNzLWJhclwiOiBcIndpZHRoOiBhdXRvOyBtYXJnaW4tbGVmdDogMnB4OyBtYXJnaW4tcmlnaHQ6IDJweDtcIixcbiAgICBcIi5zdl9wX2NvbnRhaW5lclwiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IHRvcDtcIixcbiAgICBcIi5zdl9xYmxuIC5jaGVja2JveC1tYXRlcmlhbFwiOiBcIm1hcmdpbi1yaWdodDogM3B4O1wiLFxuICAgIFwiLnN2X3FjYnggLmNoZWNrYm94LW1hdGVyaWFsXCI6IFwibWFyZ2luLXJpZ2h0OiA1cHg7XCIsXG4gICAgXCIuc3ZfcWNieCAuY2hlY2tib3ggbGFiZWxcIjogXCJqdXN0aWZ5LWNvbnRlbnQ6IGxlZnQ7IGRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xc3RuIC5yYWRpbyBsYWJlbFwiOiBcImp1c3RpZnktY29udGVudDogbGVmdDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FzdG4gbGFiZWwuc3ZfcV9tX2xhYmVsXCI6IFwicG9zaXRpb246IGFic29sdXRlOyBtYXJnaW46IDA7XCIsXG4gICAgXCIuc3ZfcV9tdF9pdGVtX3ZhbHVlXCI6IFwiZmxvYXQ6IGxlZnQ7XCIsXG4gICAgXCIuc3ZfcXN0bi5zdl9xc3RuX2xlZnRcIjogXCJtYXJnaW4tdG9wOiAwLjc1ZW07XCIsXG4gICAgXCIuc3ZfcXN0biAudGl0bGUtbGVmdFwiOiBcImZsb2F0OiBsZWZ0OyBtYXJnaW4tcmlnaHQ6IDFlbTtcIixcbiAgICBcIi5zdl9xc3RuIC5jb250ZW50LWxlZnRcIjogXCJvdmVyZmxvdzogaGlkZGVuXCIsXG4gICAgXCIuc3ZfcV9yYWRpb2dyb3VwX2lubGluZSAuc3ZfcV9yYWRpb2dyb3VwX290aGVyXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FfY2hlY2tib3hfaW5saW5lIC5zdl9xX2NoZWNrYm94X290aGVyXCI6IFwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiLFxuICAgIFwiLnN2X3FfY2hlY2tib3hfaW5saW5lLCAuc3ZfcV9yYWRpb2dyb3VwX2lubGluZVwiOiBcImxpbmUtaGVpZ2h0OiAyLjVlbTtcIixcbiAgICBcIi5mb3JtLWlubGluZSAuc3ZfcV9jaGVja2JveF9pbmxpbmU6bm90KDpsYXN0LWNoaWxkKVwiOiBcIm1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLmZvcm0taW5saW5lIC5zdl9xX3JhZGlvZ3JvdXBfaW5saW5lOm5vdCg6bGFzdC1jaGlsZClcIjpcbiAgICAgIFwibWFyZ2luLXJpZ2h0OiAxZW07XCIsXG4gICAgXCIuc3ZfcXN0biBmaWVsZHNldFwiOiBcImJvcmRlcjogbm9uZTsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwO1wiLFxuICAgIFwiZmllbGRzZXQuZm9ybS1pbmxpbmVcIjogXCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XCIsXG4gICAgXCIuc3ZfcXN0biAuc3ZfcV9maWxlX3BsYWNlaG9sZGVyXCI6IFwiZGlzcGxheTpub25lXCIsXG5cbiAgICBcIi5zdl9wX3RpdGxlXCI6IFwiY3Vyc29yOiBwb2ludGVyOyBwYWRkaW5nLWxlZnQ6IDFlbTsgcGFkZGluZy1ib3R0b206IDAuM2VtO1wiLFxuICAgIFwiLnN2X3BfdGl0bGUgLnN2X3BhbmVsX2ljb25cIjogXCJmbG9hdDogcmlnaHQ7IG1hcmdpbi1yaWdodDogMWVtO1wiLFxuICAgIFwiLnN2X3BfdGl0bGUgLnN2X3BhbmVsX2ljb246OmJlZm9yZVwiOlxuICAgICAgXCJjb250ZW50OiAnJzsgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOyBwYWRkaW5nOiAwLjVlbTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQRDk0Yld3Z2RtVnljMmx2YmowaU1TNHdJaUJsYm1OdlpHbHVaejBpZFhSbUxUZ2lQejROQ2p3aExTMGdSMlZ1WlhKaGRHOXlPaUJCWkc5aVpTQkpiR3gxYzNSeVlYUnZjaUF5TWk0d0xqRXNJRk5XUnlCRmVIQnZjblFnVUd4MVp5MUpiaUF1SUZOV1J5QldaWEp6YVc5dU9pQTJMakF3SUVKMWFXeGtJREFwSUNBdExUNE5Danh6ZG1jZ2RtVnljMmx2YmowaU1TNHhJaUJwWkQwaVRHRjVaWEpmTVNJZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUlnZUQwaU1IQjRJaUI1UFNJd2NIZ2lEUW9KSUhacFpYZENiM2c5SWpBZ01DQXhNQ0F4TUNJZ2MzUjViR1U5SW1WdVlXSnNaUzFpWVdOclozSnZkVzVrT201bGR5QXdJREFnTVRBZ01UQTdJaUI0Yld3NmMzQmhZMlU5SW5CeVpYTmxjblpsSWo0TkNqeHpkSGxzWlNCMGVYQmxQU0owWlhoMEwyTnpjeUkrRFFvSkxuTjBNSHRtYVd4c09pTTJSRGN3TnpJN2ZRMEtQQzl6ZEhsc1pUNE5Danh3YjJ4NVoyOXVJR05zWVhOelBTSnpkREFpSUhCdmFXNTBjejBpTWl3eUlEQXNOQ0ExTERrZ01UQXNOQ0E0TERJZ05TdzFJQ0l2UGcwS1BDOXpkbWMrRFFvPSk7XCIsXG4gICAgXCIuc3ZfcF90aXRsZSAuc3ZfcGFuZWxfaWNvbi5zdl9leHBhbmRlZDo6YmVmb3JlXCI6XG4gICAgICBcInRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XCIsXG5cbiAgICBcIi5zdl9xX2ZpbGUgPiBpbnB1dFt0eXBlPWZpbGVdLCAuc3ZfcV9maWxlID4gYnV0dG9uXCI6XG4gICAgICBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xX2ZpbGVfcHJldmlld1wiOiBcImRpc3BsYXk6IGlubGluZS1ibG9jaztcIixcbiAgICBcIi5zdl9xX2ZpbGVfcmVtb3ZlX2J1dHRvblwiOiBcImxpbmUtaGVpZ2h0OiBub3JtYWw7XCJcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIFRoZW1lQ29sb3JzOiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfSA9IHtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNlN2U3ZTdcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjRmNGY0XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjMWFiMzk0XCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzBhYTM4NFwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNmQ3MDcyXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjNmQ3MDcyXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIlxuICAgIH0sXG4gICAgb3JhbmdlOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiM0YTRhNGFcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZjhmOGY4XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjZjc4MTE5XCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiI2U3NzEwOVwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjNGE0YTRhXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjZjc4MTE5XCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIlxuICAgIH0sXG4gICAgZGFya2JsdWU6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Q5ZDhkZFwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmNmY3ZjJcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiMzYzRmNmRcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMmMzZjVkXCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiM0YTRhNGFcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiM2ZDcwNzJcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiXG4gICAgfSxcbiAgICBkYXJrcm9zZToge1xuICAgICAgXCIkaGVhZGVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZGRkMmNlXCIsXG4gICAgICBcIiRib2R5LWNvbnRhaW5lci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2Y3ZWZlZFwiLFxuXG4gICAgICBcIiRtYWluLWNvbG9yXCI6IFwiIzY4NjU2ZVwiLFxuICAgICAgXCIkbWFpbi1ob3Zlci1jb2xvclwiOiBcIiM1ODU1NWVcIixcbiAgICAgIFwiJGJvZHktYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiRpbnB1dHMtYmFja2dyb3VuZC1jb2xvclwiOiBcIndoaXRlXCIsXG4gICAgICBcIiR0ZXh0LWNvbG9yXCI6IFwiIzRhNGE0YVwiLFxuICAgICAgXCIkaGVhZGVyLWNvbG9yXCI6IFwiIzZkNzA3MlwiLFxuICAgICAgXCIkYm9yZGVyLWNvbG9yXCI6IFwiI2U3ZTdlN1wiLFxuXG4gICAgICBcIiRlcnJvci1jb2xvclwiOiBcIiNlZDU1NjVcIixcbiAgICAgIFwiJGVycm9yLWJhY2tncm91bmQtY29sb3JcIjogXCIjZmQ2NTc1XCJcbiAgICB9LFxuICAgIHN0b25lOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNjZGNjZDJcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZWZlZGY0XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjMGYwZjMzXCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzE5MTk1NVwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjMGYwZjMzXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjMGYwZjMzXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIlxuICAgIH0sXG4gICAgd2ludGVyOiB7XG4gICAgICBcIiRoZWFkZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiM4MmI4ZGFcIixcbiAgICAgIFwiJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3JcIjogXCIjZGFlMWU3XCIsXG5cbiAgICAgIFwiJG1haW4tY29sb3JcIjogXCIjM2MzYjQwXCIsXG4gICAgICBcIiRtYWluLWhvdmVyLWNvbG9yXCI6IFwiIzFlMWQyMFwiLFxuICAgICAgXCIkYm9keS1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwid2hpdGVcIixcbiAgICAgIFwiJHRleHQtY29sb3JcIjogXCIjMDAwXCIsXG4gICAgICBcIiRoZWFkZXItY29sb3JcIjogXCIjMDAwXCIsXG4gICAgICBcIiRib3JkZXItY29sb3JcIjogXCIjZTdlN2U3XCIsXG5cbiAgICAgIFwiJGVycm9yLWNvbG9yXCI6IFwiI2VkNTU2NVwiLFxuICAgICAgXCIkZXJyb3ItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmZDY1NzVcIlxuICAgIH0sXG4gICAgd2ludGVyc3RvbmU6IHtcbiAgICAgIFwiJGhlYWRlci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiIzMyMzIzMlwiLFxuICAgICAgXCIkYm9keS1jb250YWluZXItYmFja2dyb3VuZC1jb2xvclwiOiBcIiNmOGY4ZjhcIixcblxuICAgICAgXCIkbWFpbi1jb2xvclwiOiBcIiM1YWM4ZmFcIixcbiAgICAgIFwiJG1haW4taG92ZXItY29sb3JcIjogXCIjMDZhMWU3XCIsXG4gICAgICBcIiRib2R5LWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkaW5wdXRzLWJhY2tncm91bmQtY29sb3JcIjogXCJ3aGl0ZVwiLFxuICAgICAgXCIkdGV4dC1jb2xvclwiOiBcIiMwMDBcIixcbiAgICAgIFwiJGhlYWRlci1jb2xvclwiOiBcIiNmZmZcIixcbiAgICAgIFwiJGJvcmRlci1jb2xvclwiOiBcIiNlN2U3ZTdcIixcblxuICAgICAgXCIkZXJyb3ItY29sb3JcIjogXCIjZWQ1NTY1XCIsXG4gICAgICBcIiRlcnJvci1iYWNrZ3JvdW5kLWNvbG9yXCI6IFwiI2ZkNjU3NVwiXG4gICAgfVxuICB9O1xuICBwdWJsaWMgc3RhdGljIFRoZW1lQ3NzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIFwiLnN2X2RlZmF1bHRfY3NzXCI6IFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBoclwiOiBcImJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIGlucHV0W3R5cGU9J2J1dHRvbiddLCAuc3ZfZGVmYXVsdF9jc3MgYnV0dG9uXCI6XG4gICAgICBcImNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSdidXR0b24nXTpob3ZlciwgLnN2X2RlZmF1bHRfY3NzIGJ1dHRvbjpob3ZlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjtcIixcblxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9oZWFkZXJcIjogXCJjb2xvcjogJGhlYWRlci1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfY3VzdG9tX2hlYWRlclwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkaGVhZGVyLWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X2NvbnRhaW5lclwiOiBcImNvbG9yOiAkdGV4dC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfYm9keVwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkYm9keS1iYWNrZ3JvdW5kLWNvbG9yOyBib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9wcm9ncmVzc1wiOiBcImJhY2tncm91bmQtY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Byb2dyZXNzX2JhclwiOiBcImJhY2tncm91bmQtY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Bfcm9vdCA+IC5zdl9yb3dcIjogXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3Bfcm9vdCA+IC5zdl9yb3c6bnRoLWNoaWxkKG9kZClcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcF9yb290ID4gLnN2X3JvdzpudGgtY2hpbGQoZXZlbilcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJGJvZHktY29udGFpbmVyLWJhY2tncm91bmQtY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9vdGhlciBpbnB1dFwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX3RleHRfcm9vdFwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX2Ryb3Bkb3duX2NvbnRyb2xcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSd0ZXh0J11cIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBzZWxlY3RcIjpcbiAgICAgIFwiY29sb3I6ICR0ZXh0LWNvbG9yOyBib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7IGJhY2tncm91bmQtY29sb3I6ICRpbnB1dHMtYmFja2dyb3VuZC1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyB0ZXh0YXJlYVwiOlxuICAgICAgXCJjb2xvcjogJHRleHQtY29sb3I7IGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjsgYmFja2dyb3VuZC1jb2xvcjogJGlucHV0cy1iYWNrZ3JvdW5kLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX290aGVyIGlucHV0OmZvY3VzXCI6IFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV90ZXh0X3Jvb3Q6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIC5zdl9xX2Ryb3Bkb3duX2NvbnRyb2w6Zm9jdXNcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkbWFpbi1jb2xvcjtcIixcbiAgICBcIi5zdl9kZWZhdWx0X2NzcyBpbnB1dFt0eXBlPSd0ZXh0J106Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHNlbGVjdDpmb2N1c1wiOiBcImJvcmRlci1jb2xvcjogJG1haW4tY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGV4dGFyZWE6Zm9jdXNcIjogXCJib3JkZXItY29sb3I6ICRtYWluLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3NlbGVjdF93cmFwcGVyXCI6XG4gICAgICBcImJhY2tncm91bmQtY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3NlbGVjdF93cmFwcGVyOjpiZWZvcmVcIjpcbiAgICAgIFwiYmFja2dyb3VuZC1jb2xvcjogJG1haW4tY29sb3I7XCIsXG5cbiAgICBcIi5zdl9kZWZhdWx0X2NzcyAuc3ZfcV9yYXRpbmdfaXRlbS5hY3RpdmUgLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiOlxuICAgICAgXCJiYWNrZ3JvdW5kLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgYm9yZGVyLWNvbG9yOiAkbWFpbi1ob3Zlci1jb2xvcjsgY29sb3I6ICRib2R5LWJhY2tncm91bmQtY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfcmF0aW5nX2l0ZW0gLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgLnN2X3FfcmF0aW5nX2l0ZW0gLnN2X3FfcmF0aW5nX2l0ZW1fdGV4dDpob3ZlclwiOlxuICAgICAgXCJib3JkZXItY29sb3I6ICRtYWluLWhvdmVyLWNvbG9yO1wiLFxuXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGFibGUuc3ZfcV9tYXRyaXggdHJcIjogXCJib3JkZXItY29sb3I6ICRib3JkZXItY29sb3I7XCIsXG4gICAgXCIuc3ZfZGVmYXVsdF9jc3MgdGFibGUuc3ZfcV9tYXRyaXhfZHJvcGRvd24gdHJcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiLFxuICAgIFwiLnN2X2RlZmF1bHRfY3NzIHRhYmxlLnN2X3FfbWF0cml4X2R5bmFtaWMgdHJcIjpcbiAgICAgIFwiYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1wiXG4gIH07XG5cbiAgcHJpdmF0ZSBzaGVldDogQ1NTU3R5bGVTaGVldCA9IG51bGw7XG5cbiAgc3RhdGljIGZpbmRTaGVldChzdHlsZVNoZWV0SWQ6IHN0cmluZykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChkb2N1bWVudC5zdHlsZVNoZWV0c1tpXS5vd25lck5vZGVbXCJpZFwiXSA9PT0gc3R5bGVTaGVldElkKSB7XG4gICAgICAgIHJldHVybiA8Q1NTU3R5bGVTaGVldD5kb2N1bWVudC5zdHlsZVNoZWV0c1tpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlU2hlZXQoc3R5bGVTaGVldElkOiBzdHJpbmcpIHtcbiAgICBsZXQgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgc3R5bGUuaWQgPSBzdHlsZVNoZWV0SWQ7XG4gICAgLy8gQWRkIGEgbWVkaWEgKGFuZC9vciBtZWRpYSBxdWVyeSkgaGVyZSBpZiB5b3UnZCBsaWtlIVxuICAgIC8vIHN0eWxlLnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIFwic2NyZWVuXCIpXG4gICAgLy8gc3R5bGUuc2V0QXR0cmlidXRlKFwibWVkaWFcIiwgXCJvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aCA6IDEwMjRweClcIilcbiAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKSk7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgcmV0dXJuIDxDU1NTdHlsZVNoZWV0PnN0eWxlLnNoZWV0O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBhcHBseVRoZW1lKFxuICAgIHRoZW1lTmFtZTogc3RyaW5nID0gXCJkZWZhdWx0XCIsXG4gICAgdGhlbWVTZWxlY3Rvcjogc3RyaW5nID0gXCIuc3ZfbWFpblwiXG4gICkge1xuICAgIGxldCBzaGVldCA9IFN0eWxlc01hbmFnZXIuZmluZFNoZWV0KHRoZW1lTmFtZSArIHRoZW1lU2VsZWN0b3IpO1xuICAgIGlmICghc2hlZXQpIHtcbiAgICAgIHNoZWV0ID0gU3R5bGVzTWFuYWdlci5jcmVhdGVTaGVldCh0aGVtZU5hbWUgKyB0aGVtZVNlbGVjdG9yKTtcbiAgICAgIGxldCB0aGVtZSA9XG4gICAgICAgIFN0eWxlc01hbmFnZXIuVGhlbWVDb2xvcnNbdGhlbWVOYW1lXSB8fFxuICAgICAgICBTdHlsZXNNYW5hZ2VyLlRoZW1lQ29sb3JzW1wiZGVmYXVsdFwiXTtcbiAgICAgIE9iamVjdC5rZXlzKFN0eWxlc01hbmFnZXIuVGhlbWVDc3MpLmZvckVhY2goc2VsZWN0b3IgPT4ge1xuICAgICAgICBsZXQgY3NzUnVsZVRleHQgPSBTdHlsZXNNYW5hZ2VyLlRoZW1lQ3NzW3NlbGVjdG9yXTtcbiAgICAgICAgT2JqZWN0LmtleXModGhlbWUpLmZvckVhY2goXG4gICAgICAgICAgY29sb3JWYXJpYWJsZU5hbWUgPT5cbiAgICAgICAgICAgIChjc3NSdWxlVGV4dCA9IGNzc1J1bGVUZXh0LnJlcGxhY2UoXG4gICAgICAgICAgICAgIG5ldyBSZWdFeHAoXCJcXFxcXCIgKyBjb2xvclZhcmlhYmxlTmFtZSwgXCJnXCIpLFxuICAgICAgICAgICAgICB0aGVtZVtjb2xvclZhcmlhYmxlTmFtZV1cbiAgICAgICAgICAgICkpXG4gICAgICAgICk7XG4gICAgICAgIHNoZWV0Lmluc2VydFJ1bGUoXG4gICAgICAgICAgdGhlbWVTZWxlY3RvciArIHNlbGVjdG9yICsgXCIgeyBcIiArIGNzc1J1bGVUZXh0ICsgXCIgfVwiLFxuICAgICAgICAgIDBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc2hlZXQgPSBTdHlsZXNNYW5hZ2VyLmZpbmRTaGVldChTdHlsZXNNYW5hZ2VyLlN1cnZleUpTU3R5bGVzU2hlZXRJZCk7XG4gICAgaWYgKCF0aGlzLnNoZWV0KSB7XG4gICAgICB0aGlzLnNoZWV0ID0gU3R5bGVzTWFuYWdlci5jcmVhdGVTaGVldChcbiAgICAgICAgU3R5bGVzTWFuYWdlci5TdXJ2ZXlKU1N0eWxlc1NoZWV0SWRcbiAgICAgICk7XG4gICAgICB0aGlzLmluaXRpYWxpemVTdHlsZXModGhpcy5zaGVldCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVTdHlsZXMoc2hlZXQ6IENTU1N0eWxlU2hlZXQpIHtcbiAgICBPYmplY3Qua2V5cyhTdHlsZXNNYW5hZ2VyLlN0eWxlcykuZm9yRWFjaChzZWxlY3RvciA9PlxuICAgICAgc2hlZXQuaW5zZXJ0UnVsZShcbiAgICAgICAgc2VsZWN0b3IgKyBcIiB7IFwiICsgU3R5bGVzTWFuYWdlci5TdHlsZXNbc2VsZWN0b3JdICsgXCIgfVwiLFxuICAgICAgICAwXG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N0eWxlc21hbmFnZXIudHMiLCJpbXBvcnQgeyBCYXNlIH0gZnJvbSBcIi4vYmFzZVwiO1xuaW1wb3J0IHsgU3VydmV5TW9kZWwgfSBmcm9tIFwiLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IExvY2FsaXphYmxlU3RyaW5nIH0gZnJvbSBcIi4vbG9jYWxpemFibGVzdHJpbmdcIjtcblxuLyoqXG4gKiBBIE1vZGVsIGZvciBhIHN1cnZleSBydW5uaW5nIGluIHRoZSBXaW5kb3cuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlXaW5kb3dNb2RlbCBleHRlbmRzIEJhc2Uge1xuICBwdWJsaWMgc3RhdGljIHN1cnZleUVsZW1lbnROYW1lID0gXCJ3aW5kb3dTdXJ2ZXlKU1wiO1xuICBwcml2YXRlIGlzRXhwYW5kZWRWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGlzU2hvd2luZ1ZhbHVlOiBib29sZWFuO1xuICBzdXJ2ZXlWYWx1ZTogU3VydmV5TW9kZWw7XG4gIHdpbmRvd0VsZW1lbnQ6IEhUTUxEaXZFbGVtZW50O1xuXG4gIHRlbXBsYXRlVmFsdWU6IHN0cmluZztcbiAgZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG4gIHNob3dpbmdDaGFuZ2VkQ2FsbGJhY2s6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoanNvbk9iajogYW55LCBpbml0aWFsTW9kZWw6IFN1cnZleU1vZGVsID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKGluaXRpYWxNb2RlbCkge1xuICAgICAgdGhpcy5zdXJ2ZXlWYWx1ZSA9IGluaXRpYWxNb2RlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdXJ2ZXlWYWx1ZSA9IHRoaXMuY3JlYXRlU3VydmV5KGpzb25PYmopO1xuICAgIH1cbiAgICB0aGlzLnN1cnZleVZhbHVlLnNob3dUaXRsZSA9IGZhbHNlO1xuICAgIGlmIChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgZG9jdW1lbnQpIHtcbiAgICAgIHRoaXMud2luZG93RWxlbWVudCA9IDxIVE1MRGl2RWxlbWVudD5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIndpbmRvd1wiO1xuICB9XG4gIC8qKlxuICAgKiBBIHN1cnZleSBvYmplY3QuXG4gICAqIEBzZWUgU3VydmV5TW9kZWxcbiAgICovXG4gIHB1YmxpYyBnZXQgc3VydmV5KCk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXlWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHNob3dpbmcuIFNldCBpdCB0byB0cnVlIHRvIHNob3cgdGhlIHdpbmRvdyBhbmQgZmFsc2UgdG8gaGlkZSBpdC5cbiAgICogQHNlZSBzaG93XG4gICAqIEBzZWUgaGlkZVxuICAgKi9cbiAgcHVibGljIGdldCBpc1Nob3dpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNTaG93aW5nVmFsdWU7XG4gIH1cbiAgcHVibGljIHNldCBpc1Nob3dpbmcodmFsOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuaXNTaG93aW5nID09IHZhbCkgcmV0dXJuO1xuICAgIHRoaXMuaXNTaG93aW5nVmFsdWUgPSB2YWw7XG4gICAgaWYgKHRoaXMuc2hvd2luZ0NoYW5nZWRDYWxsYmFjaykgdGhpcy5zaG93aW5nQ2hhbmdlZENhbGxiYWNrKCk7XG4gIH1cbiAgLyoqXG4gICAqIFNob3cgdGhlIHdpbmRvd1xuICAgKiBAc2VlIGhpZGVcbiAgICogQHNlZSBpc1Nob3dpbmdcbiAgICovXG4gIHB1YmxpYyBzaG93KCkge1xuICAgIHRoaXMuaXNTaG93aW5nID0gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogSGlkZSB0aGUgd2luZG93XG4gICAqIEBzZWUgc2hvd1xuICAgKiBAc2VlIGlzU2hvd2luZ1xuICAgKi9cbiAgcHVibGljIGhpZGUoKSB7XG4gICAgdGhpcy5pc1Nob3dpbmcgPSBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZXhwYW5kZWQuIFNldCBpdCB0byB0cnVlIHRvIGV4cGFuZCB0aGUgd2luZG93IG9yIGZhbHNlIHRvIGNvbGxhcHNlIGl0LlxuICAgKiBAc2VlIGV4cGFuZFxuICAgKiBAc2VlIGNvbGxhcHNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRXhwYW5kZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNFeHBhbmRlZFZhbHVlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNFeHBhbmRlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsKSB0aGlzLmV4cGFuZCgpO1xuICAgIGVsc2UgdGhpcy5jb2xsYXBzZSgpO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgd2luZG93IGFuZCBzdXJ2ZXkgdGl0bGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VydmV5LnRpdGxlO1xuICB9XG4gIHB1YmxpYyBzZXQgdGl0bGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc3VydmV5LnRpdGxlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGxvY1RpdGxlKCk6IExvY2FsaXphYmxlU3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdXJ2ZXkubG9jVGl0bGU7XG4gIH1cbiAgLyoqXG4gICAqIEV4cGFuZCB0aGUgd2luZG93IHRvIHNob3cgdGhlIHN1cnZleS5cbiAgICovXG4gIHB1YmxpYyBleHBhbmQoKSB7XG4gICAgdGhpcy5leHBhbmRjb2xsYXBzZSh0cnVlKTtcbiAgfVxuICAvKipcbiAgICogQ29sbGFwc2UgdGhlIHdpbmRvdyBhbmQgc2hvdyBzdXJ2ZXkgdGl0bGUgb25seS5cbiAgICovXG4gIHB1YmxpYyBjb2xsYXBzZSgpIHtcbiAgICB0aGlzLmV4cGFuZGNvbGxhcHNlKGZhbHNlKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlU3VydmV5KGpzb25PYmo6IGFueSk6IFN1cnZleU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleU1vZGVsKGpzb25PYmopO1xuICB9XG4gIHByb3RlY3RlZCBleHBhbmRjb2xsYXBzZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmlzRXhwYW5kZWRWYWx1ZSA9PSB2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuaXNFeHBhbmRlZFZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2spIHRoaXMuZXhwYW5kZWRDaGFuZ2VkQ2FsbGJhY2soKTtcbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleVdpbmRvdy50cyIsImltcG9ydCB7IEV2ZW50IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5leHBvcnQgdmFyIHN1cnZleVRpbWVyRnVuY3Rpb25zID0ge1xuICBzZXRJbnRlcnZhbDogZnVuY3Rpb24oZnVuYzogKCkgPT4gYW55KTogbnVtYmVyIHtcbiAgICByZXR1cm4gd2luZG93LnNldEludGVydmFsKGZ1bmMsIDEwMDApO1xuICB9LFxuICBjbGVhckludGVydmFsOiBmdW5jdGlvbih0aW1lcklkOiBudW1iZXIpIHtcbiAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aW1lcklkKTtcbiAgfVxufTtcblxuZXhwb3J0IGNsYXNzIFN1cnZleVRpbWVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VWYWx1ZTogU3VydmV5VGltZXIgPSBudWxsO1xuICBwdWJsaWMgc3RhdGljIGdldCBpbnN0YW5jZSgpIHtcbiAgICBpZiAoIVN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUpIHtcbiAgICAgIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWUgPSBuZXcgU3VydmV5VGltZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIFN1cnZleVRpbWVyLmluc3RhbmNlVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBsaXN0ZW5lckNvdW50ZXIgPSAwO1xuICBwcml2YXRlIHRpbWVySWQgPSAtMTtcbiAgcHVibGljIG9uVGltZXI6IEV2ZW50PCgpID0+IGFueSwgYW55PiA9IG5ldyBFdmVudDwoKSA9PiBhbnksIGFueT4oKTtcbiAgcHVibGljIHN0YXJ0KGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLmFkZChmdW5jKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGltZXJJZCA8IDApIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHRoaXMudGltZXJJZCA9IHN1cnZleVRpbWVyRnVuY3Rpb25zLnNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBzZWxmLmRvVGltZXIoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmxpc3RlbmVyQ291bnRlcisrO1xuICB9XG4gIHB1YmxpYyBzdG9wKGZ1bmM6ICgpID0+IGFueSA9IG51bGwpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgdGhpcy5vblRpbWVyLnJlbW92ZShmdW5jKTtcbiAgICB9XG4gICAgdGhpcy5saXN0ZW5lckNvdW50ZXItLTtcbiAgICBpZiAodGhpcy5saXN0ZW5lckNvdW50ZXIgPT0gMCAmJiB0aGlzLnRpbWVySWQgPiAtMSkge1xuICAgICAgc3VydmV5VGltZXJGdW5jdGlvbnMuY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVySWQpO1xuICAgICAgdGhpcy50aW1lcklkID0gLTE7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBkb1RpbWVyKCkge1xuICAgIGlmICh0aGlzLnRpbWVySWQgPCAwKSByZXR1cm47XG4gICAgdGhpcy5vblRpbWVyLmZpcmUodGhpcywge30pO1xuICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3VydmV5dGltZXIudHMiLCIvLyBtb2RlbFxuZXhwb3J0ICogZnJvbSBcIi4vY2h1bmtzL21vZGVsXCI7XG5cbi8vIGxvY2FsaXphdGlvblxuaW1wb3J0IFwiLi9jaHVua3MvbG9jYWxpemF0aW9uXCI7XG5cbi8vIGhlbHBlcnNcbmV4cG9ydCAqIGZyb20gXCIuL2NodW5rcy9oZWxwZXJzXCI7XG5cbi8vIGNzcyBzdGFuZGFyZFxuZXhwb3J0IHsgZGVmYXVsdFN0YW5kYXJkQ3NzIH0gZnJvbSBcIi4uL2RlZmF1bHRDc3MvY3Nzc3RhbmRhcmRcIjtcbi8vIGNzcyBib290c3RyYXBcbmV4cG9ydCB7IGRlZmF1bHRCb290c3RyYXBDc3MgfSBmcm9tIFwiLi4vZGVmYXVsdENzcy9jc3Nib290c3RyYXBcIjtcbi8vIGNzcyBib290c3RyYXAgKyBtYXRlcmlhbFxuZXhwb3J0IHtcbiAgZGVmYXVsdEJvb3RzdHJhcE1hdGVyaWFsQ3NzXG59IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc2Jvb3RzdHJhcG1hdGVyaWFsXCI7XG4vLyBzdHlsZXNcbmltcG9ydCBcIi4uL21haW4uc2Nzc1wiO1xuXG4vLyBrbm9ja291dFxuZXhwb3J0IHsgU3VydmV5IH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvc3VydmV5XCI7XG5leHBvcnQgeyBTdXJ2ZXkgYXMgTW9kZWwgfSBmcm9tIFwiLi4va25vY2tvdXQva29zdXJ2ZXlcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUm93LCBQYWdlLCBQYW5lbCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3BhZ2VcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3JCYXNlIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25iYXNlXCI7XG5leHBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25cIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uU2VsZWN0QmFzZUltcGxlbWVudG9yXG59IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcbmV4cG9ydCB7XG4gIFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3Jcbn0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fYmFzZXNlbGVjdFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25DaGVja2JveCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2NoZWNrYm94XCI7XG5leHBvcnQgeyBRdWVzdGlvbkNvbW1lbnQgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9jb21tZW50XCI7XG5leHBvcnQgeyBRdWVzdGlvbkRyb3Bkb3duIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fZHJvcGRvd25cIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRmlsZSB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2ZpbGVcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSHRtbCB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2h0bWxcIjtcbmV4cG9ydCB7IE1hdHJpeFJvdywgUXVlc3Rpb25NYXRyaXggfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uTWF0cml4RHJvcGRvd24gfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhEeW5hbWljSW1wbGVtZW50b3IsXG4gIFF1ZXN0aW9uTWF0cml4RHluYW1pY1xufSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkeW5hbWljXCI7XG5leHBvcnQgeyBRdWVzdGlvblBhbmVsRHluYW1pYyB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX3BhbmVsZHluYW1pY1wiO1xuZXhwb3J0IHtcbiAgTXVsdGlwbGVUZXh0SXRlbSxcbiAgUXVlc3Rpb25NdWx0aXBsZVRleHRJbXBsZW1lbnRvcixcbiAgUXVlc3Rpb25NdWx0aXBsZVRleHRcbn0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fbXVsdGlwbGV0ZXh0XCI7XG5leHBvcnQgeyBRdWVzdGlvblJhZGlvZ3JvdXAgfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9yYWRpb2dyb3VwXCI7XG5leHBvcnQgeyBRdWVzdGlvblJhdGluZyB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX3JhdGluZ1wiO1xuZXhwb3J0IHsgUXVlc3Rpb25UZXh0IH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fdGV4dFwiO1xuZXhwb3J0IHsgUXVlc3Rpb25Cb29sZWFuIH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvcXVlc3Rpb25fYm9vbGVhblwiO1xuZXhwb3J0IHsgUXVlc3Rpb25FbXB0eSB9IGZyb20gXCIuLi9rbm9ja291dC9rb3F1ZXN0aW9uX2VtcHR5XCI7XG5leHBvcnQgeyBRdWVzdGlvbkV4cHJlc3Npb24gfSBmcm9tIFwiLi4va25vY2tvdXQva29xdWVzdGlvbl9leHByZXNzaW9uXCI7XG5leHBvcnQgeyBTdXJ2ZXlXaW5kb3cgfSBmcm9tIFwiLi4va25vY2tvdXQva29TdXJ2ZXlXaW5kb3dcIjtcbmV4cG9ydCB7IFN1cnZleVRlbXBsYXRlVGV4dCB9IGZyb20gXCIuLi9rbm9ja291dC90ZW1wbGF0ZVRleHRcIjtcblxuLy9VbmNvbW1lbnQgdG8gaW5jbHVkZSB0aGUgXCJkYXRlXCIgcXVlc3Rpb24gdHlwZS5cbi8vZXhwb3J0IHtRdWVzdGlvbkRhdGV9IGZyb20gXCIuLi9wbHVnaW5zL2tub2Nrb3V0L2tvcXVlc3Rpb25fZGF0ZVwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMva25vY2tvdXQudHMiLCJpbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuLi9kZWZhdWx0Q3NzL2Nzc3N0YW5kYXJkXCI7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVTdXJ2ZXlQcm9wcyA9IChzdXJ2ZXk6IFN1cnZleU1vZGVsLCBuZXdQcm9wczogYW55KSA9PiB7XG4gIGZvciAodmFyIGtleSBpbiBuZXdQcm9wcykge1xuICAgIGlmIChrZXkgPT0gXCJtb2RlbFwiIHx8IGtleSA9PSBcImNoaWxkcmVuXCIpIGNvbnRpbnVlO1xuICAgIGlmIChrZXkgPT0gXCJjc3NcIikge1xuICAgICAgc3VydmV5Lm1lcmdlVmFsdWVzKG5ld1Byb3BzLmNzcywgc3VydmV5Q3NzLmdldENzcygpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoa2V5LmluZGV4T2YoXCJvblwiKSA9PSAwICYmIHN1cnZleVtrZXldICYmIHN1cnZleVtrZXldLmFkZCkge1xuICAgICAgbGV0IGZ1bmNCb2R5ID0gbmV3UHJvcHNba2V5XTtcbiAgICAgIGxldCBmdW5jID0gZnVuY3Rpb24oc2VuZGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGZ1bmNCb2R5KHNlbmRlciwgb3B0aW9ucyk7XG4gICAgICB9O1xuICAgICAgc3VydmV5W2tleV0uYWRkKGZ1bmMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXJ2ZXlba2V5XSA9IG5ld1Byb3BzW2tleV07XG4gICAgfVxuICB9XG5cbiAgaWYgKG5ld1Byb3BzICYmIG5ld1Byb3BzLmRhdGEpXG4gICAgc3VydmV5Lm9uVmFsdWVDaGFuZ2VkLmFkZCgoc2VuZGVyLCBvcHRpb25zKSA9PiB7XG4gICAgICBuZXdQcm9wcy5kYXRhW29wdGlvbnMubmFtZV0gPSBvcHRpb25zLnZhbHVlO1xuICAgIH0pO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy91dGlscy91cGRhdGVTdXJ2ZXlQcm9wcy50cyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV81OF9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcImpRdWVyeVwiLFwiY29tbW9uanMyXCI6XCJqcXVlcnlcIixcImNvbW1vbmpzXCI6XCJqcXVlcnlcIixcImFtZFwiOlwianF1ZXJ5XCJ9XG4vLyBtb2R1bGUgaWQgPSA1OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktY29tbWVudFxcXCI+XFxuICAgIDwhLS0ga28gaWZub3Q6IHF1ZXN0aW9uLmtvSXNSZWFkT25seSAtLT5cXG4gICAgPGlucHV0IGRhdGEtYmluZD1cXFwidmFsdWU6ICRkYXRhLnF1ZXN0aW9uLmtvQ29tbWVudCwgdmlzaWJsZTogJGRhdGEudmlzaWJsZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmNvbW1lbnQsIGF0dHI6IHsgJ2FyaWEtbGFiZWwnOiAhIXF1ZXN0aW9uLmxvY1RpdGxlICYmIHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbCB9XFxcIiAvPlxcbiAgICA8IS0tIC9rbyAtLT5cXG4gICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29Jc1JlYWRPbmx5IC0tPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGV4dDogJGRhdGEucXVlc3Rpb24ua29Db21tZW50LCB2aXNpYmxlOiAkZGF0YS52aXNpYmxlLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY29tbWVudFxcXCI+PC9kaXY+XFxuICAgIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlxcblwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9jb21tZW50Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktY29udGVudCcsIGFmdGVyUmVuZGVyOiBrb0V2ZW50QWZ0ZXJSZW5kZXIgfSAtLT5cXG48IS0tIC9rbyAtLT5cXG48c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1jb250ZW50XFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLnJvb3QsIGFmdGVyUmVuZGVyOiBrb0V2ZW50QWZ0ZXJSZW5kZXJcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwic3ZfY3VzdG9tX2hlYWRlclxcXCI+PC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJzdl9jb250YWluZXJcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5oZWFkZXIsIHZpc2libGU6ICh0aXRsZS5sZW5ndGggPiAwKSAmJiBzaG93VGl0bGUgJiYga29TdGF0ZSgpID09ICdydW5uaW5nJ1xcXCI+XFxuICAgICAgICAgICAgICAgIDxoMz5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NUaXRsZSB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwvaDM+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJzdGFydGluZ1xcXCIgLS0+XFxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiYXR0cjogeyBpZDogc3RhcnRlZFBhZ2UuaWQgfSwgdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1wYWdlJywgZGF0YTogc3RhcnRlZFBhZ2UsIGFmdGVyUmVuZGVyOiBrb0FmdGVyUmVuZGVyUGFnZSB9XFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvSXNOYXZpZ2F0aW9uQnV0dG9uc1Nob3dpbmcsIGNzczogY3NzLmZvb3RlclxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcInZhbHVlOiBzdGFydFN1cnZleVRleHQsIGNsaWNrOiBzdGFydCwgY3NzOiBjc3NOYXZpZ2F0aW9uU3RhcnRcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwicnVubmluZ1xcXCIgLS0+XFxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLmJvZHlcXFwiPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc1RpbWVyUGFuZWxTaG93aW5nT25Ub3AgLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS10aW1lcnBhbmVsJ30gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHNob3dQcm9ncmVzc0JhciA9PSd0b3AnLCB0ZW1wbGF0ZTogJ3N1cnZleS1wcm9ncmVzcydcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiYXR0cjogeyBpZDoga29DdXJyZW50UGFnZSgpLmlkIH0sIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcGFnZScsIGRhdGE6IGtvQ3VycmVudFBhZ2UsIGFmdGVyUmVuZGVyOiBrb0FmdGVyUmVuZGVyUGFnZSB9XFxcIj48L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cXFwibWFyZ2luLXRvcDoxZW1cXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogc2hvd1Byb2dyZXNzQmFyID09J2JvdHRvbScsIHRlbXBsYXRlOiAnc3VydmV5LXByb2dyZXNzJ1xcXCI+PC9kaXY+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGlzVGltZXJQYW5lbFNob3dpbmdPbkJvdHRvbSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXRpbWVycGFuZWwnfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Jc05hdmlnYXRpb25CdXR0b25zU2hvd2luZywgY3NzOiBjc3MuZm9vdGVyXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwidmFsdWU6IHBhZ2VQcmV2VGV4dCwgY2xpY2s6IHByZXZQYWdlLCB2aXNpYmxlOiAha29Jc0ZpcnN0UGFnZSgpICYmIGlzU2hvd1ByZXZCdXR0b24sIGNzczogY3NzTmF2aWdhdGlvblByZXZcXFwiXFxuICAgICAgICAgICAgICAgICAgICAvPlxcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgZGF0YS1iaW5kPVxcXCJ2YWx1ZTogcGFnZU5leHRUZXh0LCBjbGljazogbmV4dFBhZ2UsIHZpc2libGU6ICFrb0lzTGFzdFBhZ2UoKSwgY3NzOiBjc3NOYXZpZ2F0aW9uTmV4dFxcXCIgLz5cXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwidmFsdWU6IGNvbXBsZXRlVGV4dCwgY2xpY2s6IGNvbXBsZXRlTGFzdFBhZ2UsIHZpc2libGU6IGtvSXNMYXN0UGFnZSgpICYmIGlzRWRpdE1vZGUsIGNzczogY3NzTmF2aWdhdGlvbkNvbXBsZXRlXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgLz5cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJjb21wbGV0ZWRcXFwiICYmIHNob3dDb21wbGV0ZWRQYWdlIC0tPlxcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJodG1sOiBwcm9jZXNzZWRDb21wbGV0ZWRIdG1sLCBjc3M6IGNvbXBsZXRlZENzc1xcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvQ29tcGxldGVkU3RhdGUoKSAhPSAnJywgY3NzOiBjc3Muc2F2ZURhdGEucm9vdFxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGtvQ29tcGxldGVkU3RhdGVDc3NcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OmtvQ29tcGxldGVkU3RhdGVUZXh0XFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvQ29tcGxldGVkU3RhdGUoKSA9PSAnZXJyb3InLCB2YWx1ZTogZ2V0TG9jU3RyaW5nKCdzYXZlQWdhaW5CdXR0b24nKSwgY2xpY2s6IGRvQ29tcGxldGUsIGNzczogY3NzLnNhdmVEYXRhLnNhdmVBZ2FpbkJ1dHRvblxcXCJcXG4gICAgICAgICAgICAgICAgICAgIC8+XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwiY29tcGxldGVkYmVmb3JlXFxcIiAtLT5cXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiaHRtbDogcHJvY2Vzc2VkQ29tcGxldGVkQmVmb3JlSHRtbCwgY3NzOiBjc3MuYm9keVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjoga29TdGF0ZSgpID09IFxcXCJsb2FkaW5nXFxcIiAtLT5cXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiaHRtbDogcHJvY2Vzc2VkTG9hZGluZ0h0bWwsIGNzczogY3NzLmJvZHlcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IGtvU3RhdGUoKSA9PSBcXFwiZW1wdHlcXFwiIC0tPlxcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ0ZXh0OmVtcHR5U3VydmV5VGV4dCwgY3NzOiBjc3MuYm9keVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL2luZGV4Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDYwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1tYXRyaXhjZWxsXFxcIj5cXG4gICAgPHRkIGRhdGEtYmluZD1cXFwiY3NzOiAkY29udGV4dC5xdWVzdGlvbi5rb0NzcygpLml0ZW1WYWx1ZVxcXCI+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogY2VsbC5xdWVzdGlvbi5rb1Zpc2libGVcXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi1lcnJvcnMnLCBkYXRhOiBjZWxsLnF1ZXN0aW9uIH0gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBxdWVzdGlvbi5rb1RlbXBsYXRlTmFtZSgpLCBkYXRhOiBjZWxsLnF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJyB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvdGQ+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL21hdHJpeGNlbGwuaHRtbFxuLy8gbW9kdWxlIGlkID0gNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXBhZ2VcXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBkYXRhLmNzcy5wYWdlLnJvb3RcXFwiPlxcbiAgICAgICAgPGg0IGRhdGEtYmluZD1cXFwidmlzaWJsZTogKHByb2Nlc3NlZFRpdGxlLmxlbmd0aCA+IDApICYmIGRhdGEuc2hvd1BhZ2VUaXRsZXMsIGNzczogZGF0YS5jc3MucGFnZVRpdGxlXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jVGl0bGUgfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvaDQ+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogaGFzRGVzY3JpcHRpb24sIGNzczogZGF0YS5jc3MucGFnZURlc2NyaXB0aW9uXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXJvd3MnLCBkYXRhOiAkZGF0YX0gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3BhZ2UuaHRtbFxuLy8gbW9kdWxlIGlkID0gNjJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXBhbmVsXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInN0eWxlOnsgd2lkdGg6IGtvUmVuZGVyV2lkdGggfSwgYXR0cjoge2lkOiBpZH0sIGNzczogY3NzQ2xhc3Nlcy5wYW5lbC5jb250YWluZXJcXFwiPlxcbiAgICAgICAgPGg0IGRhdGEtYmluZD1cXFwidmlzaWJsZTogKHByb2Nlc3NlZFRpdGxlLmxlbmd0aCA+IDApLCBjc3M6IGNzc0NsYXNzZXMucGFuZWwudGl0bGUsIGNsaWNrOiBkb0V4cGFuZFxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY1RpdGxlIH0gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcInN2X3BhbmVsX2ljb25cXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29Jc0NvbGxhcHNlZCgpIHx8IGtvSXNFeHBhbmRlZCgpICxjc3M6IHtzdl9leHBhbmRlZDogIWtvSXNDb2xsYXBzZWQoKX1cXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwvaDQ+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogaGFzRGVzY3JpcHRpb24sIGNzczogY3NzQ2xhc3Nlcy5wYW5lbC5kZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY0Rlc2NyaXB0aW9uIH0gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi1lcnJvcnMnLCBkYXRhOiAkZGF0YSB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogIWtvSXNDb2xsYXBzZWQoKSwgc3R5bGU6IHsgcGFkZGluZ0xlZnQ6IGtvSW5uZXJNYXJnaW4gfVxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXJvd3MnLCBkYXRhOiAkZGF0YX0gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3BhbmVsLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDYzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1wcm9ncmVzc1xcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IGNzcy5wcm9ncmVzc1xcXCI+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBjc3MucHJvZ3Jlc3NCYXIsIHN0eWxlOnt3aWR0aDoga29Qcm9ncmVzcygpICsgJyUnfVxcXCJcXG4gICAgICAgICAgICByb2xlPVxcXCJwcm9ncmVzc2JhclxcXCIgYXJpYS12YWx1ZW1pbj1cXFwiMFxcXCIgYXJpYS12YWx1ZW1heD1cXFwiMTAwXFxcIj5cXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6a29Qcm9ncmVzc1RleHRcXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcHJvZ3Jlc3MuaHRtbFxuLy8gbW9kdWxlIGlkID0gNjRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWJvb2xlYW5cXFwiPlxcbiAgICA8Zm9ybSBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgIDxsYWJlbCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uZ2V0SXRlbUNzcygpXFxcIj5cXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwiY2hlY2tib3hcXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge25hbWU6IHF1ZXN0aW9uLm5hbWUsIGlkOiBxdWVzdGlvbi5pbnB1dElkLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0sIGNoZWNrZWQ6IHF1ZXN0aW9uLmtvQ2hlY2tlZFZhbHVlLCBzdXJ2ZXlQcm9wOiB7aW5kZXRlcm1pbmF0ZTogcXVlc3Rpb24ua29JbmRldGVybWluYXRlfSwgZW5hYmxlOiAhcXVlc3Rpb24ua29Jc1JlYWRPbmx5KClcXFwiIC8+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNoZWNrYm94LW1hdGVyaWFsXFxcIj48c3BhbiBjbGFzcz1cXFwiY2hlY2tcXFwiPjwvc3Bhbj48L3NwYW4+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY0Rpc3BsYXlMYWJlbCB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9sYWJlbD5cXG4gICAgPC9mb3JtPlxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1ib29sZWFuLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDY1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1jaGVja2JveFxcXCI+XFxuICAgIDxmaWVsZHNldCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi5rb1Zpc2libGVDaG9pY2VzLCBhczogJ2l0ZW0nLCBhZnRlclJlbmRlcjogcXVlc3Rpb24ua29BZnRlclJlbmRlcn0gIC0tPlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInN0eWxlOntkaXNwbGF5OiAnaW5saW5lLWJsb2NrJywgd2lkdGg6IHF1ZXN0aW9uLmtvV2lkdGh9LCBjc3M6IHF1ZXN0aW9uLmdldEl0ZW1DbGFzcyhpdGVtKVxcXCI+XFxuICAgICAgICAgICAgPGxhYmVsIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmxhYmVsXFxcIj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XFxcImNoZWNrYm94XFxcIiBkYXRhLWJpbmQ9XFxcImF0dHI6IHtuYW1lOiBxdWVzdGlvbi5uYW1lLCB2YWx1ZTogaXRlbS52YWx1ZSwgaWQ6ICgkaW5kZXgoKSA9PSAwKSA/IHF1ZXN0aW9uLmlucHV0SWQgOiAnJywgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwgfSwgY2hlY2tlZDogcXVlc3Rpb24ua29WYWx1ZSwgZW5hYmxlOiAhcXVlc3Rpb24ua29Jc1JlYWRPbmx5KCksIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgLz5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNoZWNrYm94LW1hdGVyaWFsXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJjaGVja1xcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmNvbnRyb2xMYWJlbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogaXRlbS5sb2NUZXh0IH0gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgIDwvbGFiZWw+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzT3RoZXIgJiYgKCRpbmRleCgpID09IHF1ZXN0aW9uLmtvVmlzaWJsZUNob2ljZXMoKS5sZW5ndGgtMSkgLS0+XFxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktY29tbWVudCcsIGRhdGE6IHsncXVlc3Rpb24nOiBxdWVzdGlvbiwgJ3Zpc2libGUnOiBxdWVzdGlvbi5rb090aGVyVmlzaWJsZSB9IH0sIGNzczogcXVlc3Rpb24ua29Dc3MoKS5vdGhlclxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPGxlZ2VuZCBzdHlsZT1cXFwiZGlzcGxheTogbm9uZTtcXFwiIGRhdGEtYmluZD1cXFwidGV4dDogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sXFxcIj48L2xlZ2VuZD5cXG4gICAgPC9maWVsZHNldD5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tY2hlY2tib3guaHRtbFxuLy8gbW9kdWxlIGlkID0gNjZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWNvbW1lbnRcXFwiPlxcbiAgICA8dGV4dGFyZWEgdHlwZT1cXFwidGV4dFxcXCIgZGF0YS1iaW5kPVxcXCJhdHRyOiB7J3JlYWRvbmx5JzogcXVlc3Rpb24ua29Jc1JlYWRPbmx5KCksIGNvbHM6IHF1ZXN0aW9uLmNvbHMsIHJvd3M6IHF1ZXN0aW9uLnJvd3MsIGlkOiBxdWVzdGlvbi5pbnB1dElkLCBwbGFjZWhvbGRlcjogcXVlc3Rpb24ucGxhY2VIb2xkZXIsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfSwgdmFsdWU6cXVlc3Rpb24ua29WYWx1ZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPjwvdGV4dGFyZWE+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWNvbW1lbnQuaHRtbFxuLy8gbW9kdWxlIGlkID0gNjdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWRyb3Bkb3duXFxcIj5cXG4gICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24ua29Jc1JlYWRPbmx5IC0tPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnNlbGVjdFdyYXBwZXJcXFwiPlxcbiAgICAgICAgPHNlbGVjdCBkYXRhLWJpbmQ9XFxcImF0dHI6IHtpZDogcXVlc3Rpb24uaW5wdXRJZCwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWx9LCBvcHRpb25zOiBxdWVzdGlvbi5rb1Zpc2libGVDaG9pY2VzLCBvcHRpb25zVGV4dDogJ3RleHQnLCBvcHRpb25zVmFsdWU6ICd2YWx1ZScsIHZhbHVlOiBxdWVzdGlvbi5rb1ZhbHVlLCBvcHRpb25zQ2FwdGlvbjogcXVlc3Rpb24ub3B0aW9uc0NhcHRpb24sIGNzczogcXVlc3Rpb24ua29Dc3MoKS5jb250cm9sXFxcIj48L3NlbGVjdD5cXG4gICAgPC9kaXY+XFxuICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5rb0lzUmVhZE9ubHkgLS0+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ0ZXh0OiBxdWVzdGlvbi5oYXNPdGhlciAmJiBxdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQgPyBxdWVzdGlvbi5vdGhlclRleHQgOiBxdWVzdGlvbi5kaXNwbGF5VmFsdWUsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5jb250cm9sXFxcIj48L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5oYXNPdGhlclxcXCI+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1jb21tZW50JywgZGF0YTogeydxdWVzdGlvbic6IHF1ZXN0aW9uLCAndmlzaWJsZSc6IHF1ZXN0aW9uLmtvT3RoZXJWaXNpYmxlIH0gfSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLm90aGVyXFxcIj48L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLWRyb3Bkb3duLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDY4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1lbXB0eVxcXCI+XFxuPGRpdj48L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZW1wdHkuaHRtbFxuLy8gbW9kdWxlIGlkID0gNjlcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWVycm9yc1xcXCI+XFxuICAgIDxkaXYgcm9sZT1cXFwiYWxlcnRcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZToga29FcnJvcnMoKS5sZW5ndGggPiAwLCBmb3JlYWNoOiB7IGRhdGE6IGtvRXJyb3JzLCBhczogJ2Vycm9yJ30sIGNzczogcXVlc3Rpb24ua29Dc3MoKS5lcnJvci5yb290XFxcIj5cXG4gICAgICAgIDxkaXY+XFxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XFxcInRydWVcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLmVycm9yLmljb25cXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcInRleHQ6ZXJyb3IuZ2V0VGV4dCgpLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuZXJyb3IuaXRlbVxcXCI+PC9zcGFuPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2Plxcbjwvc2NyaXB0PlxcblwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1lcnJvcnMuaHRtbFxuLy8gbW9kdWxlIGlkID0gNzBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLWV4cHJlc3Npb25cXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGV4dDpxdWVzdGlvbi5rb0Rpc3BsYXlWYWx1ZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPjwvZGl2Plxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1leHByZXNzaW9uLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDcxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1maWxlXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24uY3NzQ2xhc3Nlcy5yb290XFxcIj5cXG4gICAgICAgIDwhLS0ga28gaWZub3Q6IHF1ZXN0aW9uLmtvSXNSZWFkT25seSAtLT5cXG4gICAgICAgIDxpbnB1dCB0eXBlPVxcXCJmaWxlXFxcIiBkYXRhLWJpbmQ9XFxcImF0dHI6IHtpZDogcXVlc3Rpb24uaW5wdXRJZCwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsIG11bHRpcGxlOiBxdWVzdGlvbi5hbGxvd011bHRpcGxlID8gJ211bHRpcGxlJyA6IHVuZGVmaW5lZCB9LCBldmVudDoge2NoYW5nZTogcXVlc3Rpb24uZG9jaGFuZ2V9XFxcIj5cXG4gICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvSGFzVmFsdWUgLS0+XFxuICAgICAgICA8YnV0dG9uIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLnJlbW92ZUJ1dHRvbiwgY2xpY2s6IHF1ZXN0aW9uLmRvY2xlYW4sIHRleHQ6IHF1ZXN0aW9uLmNsZWFuQnV0dG9uQ2FwdGlvblxcXCI+PC9idXR0b24+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24ua29Jc1JlYWRPbmx5IC0tPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcInRleHRcXFwiIHJlYWRvbmx5IGRhdGEtYmluZD1cXFwiY3NzOiAnZm9ybS1jb250cm9sICcgKyBxdWVzdGlvbi5jc3NDbGFzc2VzLnBsYWNlaG9sZGVySW5wdXQsIGF0dHI6IHsgcGxhY2Vob2xkZXI6IHF1ZXN0aW9uLnRpdGxlIH1cXFwiXFxuICAgICAgICAvPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwiZm9yZWFjaDogcXVlc3Rpb24ua29EYXRhLCB2aXNpYmxlOiBxdWVzdGlvbi5rb0hhc1ZhbHVlXFxcIj5cXG4gICAgICAgICAgICA8aW1nIGRhdGEtYmluZD1cXFwiYXR0cjogeyBzcmM6ICRkYXRhLCBoZWlnaHQ6IHF1ZXN0aW9uLmltYWdlSGVpZ2h0LCB3aWR0aDogcXVlc3Rpb24uaW1hZ2VXaWR0aCB9LCB2aXNpYmxlOiBxdWVzdGlvbi5zaG93UHJldmlldywgY3NzOiBxdWVzdGlvbi5jc3NDbGFzc2VzLnByZXZpZXdcXFwiXFxuICAgICAgICAgICAgICAgIGFsdD1cXFwiRmlsZSBwcmV2aWV3XFxcIj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tZmlsZS5odG1sXG4vLyBtb2R1bGUgaWQgPSA3MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24taHRtbFxcXCI+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJodG1sOiBxdWVzdGlvbi5wcm9jZXNzZWRIdG1sXFxcIj48L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24taHRtbC5odG1sXG4vLyBtb2R1bGUgaWQgPSA3M1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tbWF0cml4XFxcIj5cXG4gICAgPGZpZWxkc2V0PlxcbiAgICAgICAgPHRhYmxlIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICAgICAgICAgIDx0aGVhZD5cXG4gICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24uaGFzUm93c1xcXCI+PC90ZD5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24uY29sdW1ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0aD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jVGV4dCB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPC90aD5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgIDwvdGhlYWQ+XFxuICAgICAgICAgICAgPHRib2R5PlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24udmlzaWJsZVJvd3MsIGFzOiAncm93JyB9IC0tPlxcbiAgICAgICAgICAgICAgICA8dHIgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm93XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmhhc1Jvd3NcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiByb3cubG9jVGV4dCB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24uY29sdW1ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmdldEl0ZW1Dc3Mocm93LCAkZGF0YSlcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwicmFkaW9cXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1WYWx1ZSwgYXR0cjoge25hbWU6IHJvdy5mdWxsTmFtZSwgJ2FyaWEtbGFiZWwnOiBxdWVzdGlvbi5sb2NUaXRsZS5yZW5kZXJlZEh0bWwsIHZhbHVlOiAkZGF0YS52YWx1ZSwgaWQ6ICgkaW5kZXgoKSA9PSAwKSAmJiAoJHBhcmVudENvbnRleHQuJGluZGV4KCkgPT0gMCkgPyBxdWVzdGlvbi5pbnB1dElkIDogJyd9LCBjaGVja2VkOiByb3cua29WYWx1ZSwgZW5hYmxlOiAhcXVlc3Rpb24ua29Jc1JlYWRPbmx5KClcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJjaXJjbGVcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNoZWNrXFxcIj48L3NwYW4+XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVxcXCJkaXNwbGF5OiBub25lXFxcIiBkYXRhLWJpbmQ9XFxcInRleHQ6ICRkYXRhLmxvY1RleHQudGV4dFxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XFxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICA8L3RhYmxlPlxcbiAgICAgICAgPGxlZ2VuZCBzdHlsZT1cXFwiZGlzcGxheTogbm9uZTtcXFwiIGRhdGEtYmluZD1cXFwidGV4dDogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sXFxcIj48L2xlZ2VuZD5cXG4gICAgPC9maWVsZHNldD5cXG48L3NjcmlwdD5cXG48c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS10ZXh0XFxcIj5cXG4gICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJ0ZXh0OiRkYXRhLnJlbmRlcmVkSHRtbFxcXCI+PC9zcGFuPlxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1tYXRyaXguaHRtbFxuLy8gbW9kdWxlIGlkID0gNzRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLW1hdHJpeGRyb3Bkb3duXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7b3ZlcmZsb3dYOiBxdWVzdGlvbi5ob3Jpem9udGFsU2Nyb2xsPyAnc2Nyb2xsJzogJyd9XFxcIj5cXG4gICAgICAgIDx0YWJsZSBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgICAgICA8dGhlYWQ+XFxuICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBxdWVzdGlvbi5jb2x1bW5zIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHRoIGRhdGEtYmluZD1cXFwic3R5bGU6IHsgbWluV2lkdGg6IHF1ZXN0aW9uLmdldENvbHVtbldpZHRoKCRkYXRhKSB9XFxcIj48IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jVGl0bGUgfSAtLT48IS0tIC9rbyAtLT48L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgPC90aGVhZD5cXG4gICAgICAgICAgICA8dGJvZHk+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogeyBkYXRhOiBxdWVzdGlvbi52aXNpYmxlUm93cywgYXM6ICdyb3cnIH0gLS0+XFxuICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgIDx0ZD48IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcm93LmxvY1RleHQgfSAtLT48IS0tIC9rbyAtLT48L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiByb3cuY2VsbHMtLT5cXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktbWF0cml4Y2VsbCcsIGRhdGE6ICRkYXRhLCBhczogXFxcImNlbGxcXFwiLCBhZnRlclJlbmRlcjogJGRhdGEuZGF0YS5rb0NlbGxBZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3Rib2R5PlxcbiAgICAgICAgPC90YWJsZT5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9uLW1hdHJpeGRyb3Bkb3duLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDc1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1tYXRyaXhkeW5hbWljXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7b3ZlcmZsb3dYOiBxdWVzdGlvbi5ob3Jpem9udGFsU2Nyb2xsPyAnc2Nyb2xsJzogJyd9XFxcIj5cXG4gICAgICAgIDx0YWJsZSBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgICAgICA8dGhlYWQ+XFxuICAgICAgICAgICAgICAgIDx0cj5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24uY29sdW1ucyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDx0aCBkYXRhLWJpbmQ9XFxcInN0eWxlOiB7IG1pbldpZHRoOiBxdWVzdGlvbi5nZXRDb2x1bW5XaWR0aCgkZGF0YSkgfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6IGxvY1RpdGxlIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5rb0lzUmVhZE9ubHkgLS0+XFxuICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8L3RyPlxcbiAgICAgICAgICAgIDwvdGhlYWQ+XFxuICAgICAgICAgICAgPHRib2R5PlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24ua29Sb3dzLCBhczogJ3JvdycgfSAtLT5cXG4gICAgICAgICAgICAgICAgPHRyPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiByb3cuY2VsbHMtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1tYXRyaXhjZWxsJywgZGF0YTogJGRhdGEsIGFzOiBcXFwiY2VsbFxcXCIsIGFmdGVyUmVuZGVyOiAkZGF0YS5kYXRhLmtvQ2VsbEFmdGVyUmVuZGVyIH0gLS0+XFxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24ua29Jc1JlYWRPbmx5IC0tPlxcbiAgICAgICAgICAgICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29DYW5SZW1vdmVSb3csIGNsaWNrOnF1ZXN0aW9uLmtvUmVtb3ZlUm93Q2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24sIHZhbHVlOiBxdWVzdGlvbi5yZW1vdmVSb3dUZXh0XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XFxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgICAgIDwvdHI+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvdGJvZHk+XFxuICAgICAgICA8L3RhYmxlPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5mb290ZXJcXFwiPlxcbiAgICAgICAgPCEtLSBrbyBpZm5vdDogcXVlc3Rpb24ua29Jc1JlYWRPbmx5KCkgfHwgIXF1ZXN0aW9uLmtvQ2FuQWRkUm93KCkgLS0+XFxuICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBkYXRhLWJpbmQ9XFxcImNsaWNrOnF1ZXN0aW9uLmtvQWRkUm93Q2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24sIHZhbHVlOiBxdWVzdGlvbi5hZGRSb3dUZXh0XFxcIiAvPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgIDwvZGl2Plxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1tYXRyaXhkeW5hbWljLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDc2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1tdWx0aXBsZXRleHRcXFwiPlxcbiAgICA8dGFibGUgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm9vdCwgZm9yZWFjaDogeyBkYXRhOiAgcXVlc3Rpb24ua29Sb3dzLCBhczogJ3JvdycgfVxcXCI+XFxuICAgICAgICA8dHIgZGF0YS1iaW5kPVxcXCJmb3JlYWNoOiB7IGRhdGE6IHJvdywgYXM6ICdpdGVtJyB9LCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkucm93XFxcIj5cXG4gICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuaXRlbVRpdGxlXFxcIj48IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogaXRlbS5sb2NUaXRsZSB9IC0tPjwhLS0gL2tvIC0tPjwvdGQ+XFxuICAgICAgICAgICAgPHRkPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5rb0lzUmVhZE9ubHkgLS0+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBkYXRhLWJpbmQ9XFxcImF0dHI6IHthdHRyOiB7aWQ6IGl0ZW0uaWR9LCB0eXBlOiBpdGVtLmlucHV0VHlwZSwgc2l6ZTogcXVlc3Rpb24uaXRlbVNpemUsIGlkOiAoJGluZGV4KCkgPT0gMCkgPyBxdWVzdGlvbi5pbnB1dElkIDogJycsIHBsYWNlaG9sZGVyOiBpdGVtLnBsYWNlSG9sZGVyLCAnYXJpYS1sYWJlbCc6IHF1ZXN0aW9uLmxvY1RpdGxlLnJlbmRlcmVkSHRtbH0sIHZhbHVlOiBpdGVtLmtvVmFsdWUsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtVmFsdWVcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5rb0lzUmVhZE9ubHkgLS0+XFxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJhdHRyOiB7c2l6ZTogcXVlc3Rpb24uaXRlbVNpemV9LCB0ZXh0OiBpdGVtLmtvVmFsdWUsIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtVmFsdWVcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8L3RkPlxcbiAgICAgICAgPC90cj5cXG4gICAgPC90YWJsZT5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tbXVsdGlwbGV0ZXh0Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDc3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1wYW5lbGR5bmFtaWMtbmF2aWdhdG9yXFxcIj5cXG4gICAgPGlucHV0IHR5cGU9XFxcInJhbmdlXFxcIiBtaW49XFxcIjBcXFwiIHN0eWxlPVxcXCJ3aWR0aDoyNSU7ZmxvYXQ6bGVmdDttYXJnaW46NXB4XFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IGtvSXNSYW5nZSwgdmFsdWU6IHF1ZXN0aW9uLmtvUmFuZ2VWYWx1ZSwgYXR0cjoge21heDogcXVlc3Rpb24ua29SYW5nZU1heH1cXFwiIC8+XFxuICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIHN0eWxlPVxcXCJmbG9hdDpsZWZ0O21hcmdpbjo1cHhcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29Jc1ByZXZCdXR0b24sIGNsaWNrOnF1ZXN0aW9uLmtvUHJldlBhbmVsQ2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24sIHZhbHVlOiBxdWVzdGlvbi5wYW5lbFByZXZUZXh0XFxcIiAvPlxcbiAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBzdHlsZT1cXFwiZmxvYXQ6bGVmdDttYXJnaW46NXB4XFxcIiBkYXRhLWJpbmQ9XFxcInZpc2libGU6IHF1ZXN0aW9uLmtvSXNOZXh0QnV0dG9uLCBjbGljazpxdWVzdGlvbi5rb05leHRQYW5lbENsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uLCB2YWx1ZTogcXVlc3Rpb24ucGFuZWxOZXh0VGV4dFxcXCIgLz5cXG4gICAgPGlucHV0IHR5cGU9XFxcImJ1dHRvblxcXCIgc3R5bGU9XFxcImZsb2F0OmxlZnQ7bWFyZ2luOjVweFxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOnF1ZXN0aW9uLmtvQ2FuQWRkUGFuZWwsIGNsaWNrOnF1ZXN0aW9uLmtvQWRkUGFuZWxDbGljaywgY3NzOiBxdWVzdGlvbi5rb0NzcygpLmJ1dHRvbiwgdmFsdWU6IHF1ZXN0aW9uLnBhbmVsQWRkVGV4dFxcXCIgLz5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tcGFuZWxkeW5hbWljLW5hdmlnYXRvci5odG1sXG4vLyBtb2R1bGUgaWQgPSA3OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tcGFuZWxkeW5hbWljXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvSXNMaXN0KCkgLS0+XFxuICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcXVlc3Rpb24ua29QYW5lbHMgfSAtLT5cXG4gICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1wYW5lbCcsIGRhdGE6ICRkYXRhLCBhczogJ3F1ZXN0aW9uJywgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvUGFuZWxBZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8aW5wdXQgdHlwZT1cXFwiYnV0dG9uXFxcIiBzdHlsZT1cXFwibWFyZ2luLXRvcDo1cHhcXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTogcXVlc3Rpb24ua29DYW5SZW1vdmVQYW5lbCwgY2xpY2s6cXVlc3Rpb24ua29SZW1vdmVQYW5lbENsaWNrLCBjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuYnV0dG9uLCB2YWx1ZTogcXVlc3Rpb24ucGFuZWxSZW1vdmVUZXh0XFxcIlxcbiAgICAgICAgLz5cXG4gICAgICAgIDxoci8+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIGRhdGEtYmluZD1cXFwidmlzaWJsZTpxdWVzdGlvbi5rb0NhbkFkZFBhbmVsLCBjbGljazpxdWVzdGlvbi5rb0FkZFBhbmVsQ2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24sIHZhbHVlOiBxdWVzdGlvbi5wYW5lbEFkZFRleHRcXFwiXFxuICAgICAgICAvPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5rb0lzTGlzdCgpICAtLT5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOnF1ZXN0aW9uLmtvSXNQcm9ncmVzc1RvcFxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3InLCBkYXRhOiBxdWVzdGlvbiwgYXM6ICdxdWVzdGlvbid9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcGFuZWwnLCBkYXRhOiBxdWVzdGlvbi5rb1BhbmVsKCksIGFzOiAncXVlc3Rpb24nLCBhZnRlclJlbmRlcjogcXVlc3Rpb24ua29QYW5lbEFmdGVyUmVuZGVyIH0gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDxpbnB1dCB0eXBlPVxcXCJidXR0b25cXFwiIHN0eWxlPVxcXCJtYXJnaW4tdG9wOjVweFxcXCIgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5rb0NhblJlbW92ZVBhbmVsLCBjbGljazpxdWVzdGlvbi5rb1JlbW92ZVBhbmVsQ2xpY2ssIGNzczogcXVlc3Rpb24ua29Dc3MoKS5idXR0b24sIHZhbHVlOiBxdWVzdGlvbi5wYW5lbFJlbW92ZVRleHRcXFwiXFxuICAgICAgICAvPlxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInZpc2libGU6cXVlc3Rpb24ua29Jc1Byb2dyZXNzQm90dG9tXFxcIj5cXG4gICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tcGFuZWxkeW5hbWljLW5hdmlnYXRvcicsIGRhdGE6IHF1ZXN0aW9uLCBhczogJ3F1ZXN0aW9uJ30gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tcGFuZWxkeW5hbWljLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDc5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1xdWVzdGlvbi1yYWRpb2dyb3VwXFxcIj5cXG4gICAgPGZpZWxkc2V0IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPlxcbiAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB7IGRhdGE6IHF1ZXN0aW9uLmtvVmlzaWJsZUNob2ljZXMsIGFzOiAnaXRlbScsIGFmdGVyUmVuZGVyOiBxdWVzdGlvbi5rb0FmdGVyUmVuZGVyfSAgLS0+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwic3R5bGU6e2Rpc3BsYXk6ICdpbmxpbmUtYmxvY2snLCB3aWR0aDogcXVlc3Rpb24ua29XaWR0aH0sIGNzczogcXVlc3Rpb24uZ2V0SXRlbUNsYXNzKGl0ZW0pXFxcIj5cXG4gICAgICAgICAgICA8bGFiZWwgZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubGFiZWxcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwicmFkaW9cXFwiIGRhdGEtYmluZD1cXFwiYXR0cjoge25hbWU6IHF1ZXN0aW9uLm5hbWUgKyAnXycgKyBxdWVzdGlvbi5pZCwgdmFsdWU6IGl0ZW0udmFsdWUsIGlkOiAoJGluZGV4KCkgPT0gMCkgPyBxdWVzdGlvbi5pbnB1dElkIDogJycsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfSwgY2hlY2tlZDogcXVlc3Rpb24ua29WYWx1ZSwgZW5hYmxlOiAhcXVlc3Rpb24ua29Jc1JlYWRPbmx5KCksIGNzczogcXVlc3Rpb24ua29Dc3MoKS5pdGVtQ29udHJvbFxcXCJcXG4gICAgICAgICAgICAgICAgLz5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNpcmNsZVxcXCI+PC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiY2hlY2tcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkuY29udHJvbExhYmVsXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBpdGVtLmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgPC9sYWJlbD5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5oYXNPdGhlciAmJiAoJGluZGV4KCkgPT0gcXVlc3Rpb24ua29WaXNpYmxlQ2hvaWNlcygpLmxlbmd0aC0xKSAtLT5cXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1jb21tZW50JywgZGF0YTogeydxdWVzdGlvbic6IHF1ZXN0aW9uLCAndmlzaWJsZSc6IHF1ZXN0aW9uLmtvT3RoZXJWaXNpYmxlfX0sIGNzczogcXVlc3Rpb24ua29Dc3MoKS5vdGhlclxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgPGxlZ2VuZCBzdHlsZT1cXFwiZGlzcGxheTogbm9uZTtcXFwiIGRhdGEtYmluZD1cXFwidGV4dDogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sXFxcIj48L2xlZ2VuZD5cXG4gICAgPC9maWVsZHNldD5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tcmFkaW9ncm91cC5odG1sXG4vLyBtb2R1bGUgaWQgPSA4MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb24tcmF0aW5nXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29Dc3MoKS5yb290XFxcIj5cXG4gICAgICAgIDwhLS0ga28gZm9yZWFjaDogcXVlc3Rpb24ua29WaXNpYmxlUmF0ZVZhbHVlcyAtLT5cXG4gICAgICAgIDxsYWJlbCBkYXRhLWJpbmQ9XFxcImNzczogcXVlc3Rpb24ua29HZXRDc3MoJGRhdGEpXFxcIj5cXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cXFwicmFkaW9cXFwiIHN0eWxlPVxcXCJkaXNwbGF5OiBub25lO1xcXCIgZGF0YS1iaW5kPVxcXCJhdHRyOiB7bmFtZTogcXVlc3Rpb24ubmFtZSwgaWQ6IHF1ZXN0aW9uLm5hbWUgKyAkaW5kZXgoKSwgdmFsdWU6ICRkYXRhLnZhbHVlLCAnYXJpYS1sYWJlbCc6ICRkYXRhLmxvY1RleHQudGV4dH0sIGV2ZW50OiB7IGNoYW5nZTogcXVlc3Rpb24ua29DaGFuZ2V9LCBlbmFibGU6ICFxdWVzdGlvbi5rb0lzUmVhZE9ubHkoKVxcXCJcXG4gICAgICAgICAgICAvPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRpbmRleCgpID09IDAgLS0+XFxuICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVxcXCJjc3M6IHF1ZXN0aW9uLmtvQ3NzKCkubWluVGV4dFxcXCI+XFxuICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBxdWVzdGlvbi5sb2NNaW5SYXRlRGVzY3JpcHRpb24gfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcblxcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLml0ZW1UZXh0XFxcIj5cXG4gICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXN0cmluZycsIGRhdGE6ICRkYXRhLmxvY1RleHQgfSAtLT5cXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPC9zcGFuPlxcblxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ICRpbmRleCgpID09IChxdWVzdGlvbi5rb1Zpc2libGVSYXRlVmFsdWVzKCkubGVuZ3RoLTEpIC0tPlxcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb0NzcygpLm1heFRleHRcXFwiPlxcbiAgICAgICAgICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogcXVlc3Rpb24ubG9jTWF4UmF0ZURlc2NyaXB0aW9uIH0gLS0+XFxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvbGFiZWw+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5oYXNPdGhlclxcXCI+XFxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1jb21tZW50JywgZGF0YTogeydxdWVzdGlvbic6IHF1ZXN0aW9uIH0gfVxcXCI+PC9kaXY+XFxuICAgIDwvZGl2Plxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9xdWVzdGlvbi1yYXRpbmcuaHRtbFxuLy8gbW9kdWxlIGlkID0gODFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLXRleHRcXFwiPlxcbiAgICA8IS0tIGtvIGlmbm90OiBxdWVzdGlvbi5rb0lzUmVhZE9ubHkgLS0+XFxuICAgIDxpbnB1dCBkYXRhLWJpbmQ9XFxcImF0dHI6IHt0eXBlOiBxdWVzdGlvbi5pbnB1dFR5cGUsIHNpemU6IHF1ZXN0aW9uLnNpemUsIGlkOiBxdWVzdGlvbi5pbnB1dElkLCBwbGFjZWhvbGRlcjogcXVlc3Rpb24ucGxhY2VIb2xkZXIsICdhcmlhLWxhYmVsJzogcXVlc3Rpb24ubG9jVGl0bGUucmVuZGVyZWRIdG1sfSwgdmFsdWU6cXVlc3Rpb24ua29WYWx1ZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiLz5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmtvSXNSZWFkT25seSAtLT5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6cXVlc3Rpb24ua29WYWx1ZSwgY3NzOiBxdWVzdGlvbi5rb0NzcygpLnJvb3RcXFwiPjwvZGl2PlxcbiAgICA8IS0tIC9rbyAtLT5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24tdGV4dC5odG1sXG4vLyBtb2R1bGUgaWQgPSA4MlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPHNjcmlwdCB0eXBlPVxcXCJ0ZXh0L2h0bWxcXFwiIGlkPVxcXCJzdXJ2ZXktcXVlc3Rpb25cXFwiPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBxdWVzdGlvbi5rb1Jvb3RDbGFzcywgc3R5bGU6IHsgcGFkZGluZ0xlZnQ6IHF1ZXN0aW9uLmtvUGFkZGluZ0xlZnQsIHBhZGRpbmdSaWdodDogcXVlc3Rpb24ua29QYWRkaW5nUmlnaHQsIHdpZHRoOiBxdWVzdGlvbi5rb1JlbmRlcldpZHRoIH0sIGF0dHI6IHtpZDogcXVlc3Rpb24uaWR9XFxcIj5cXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJjc3M6IHsndGl0bGUtbGVmdCc6IHF1ZXN0aW9uLmhhc1RpdGxlT25MZWZ0fVxcXCI+XFxuICAgICAgICAgICAgPCEtLSBrbyBpZjogcXVlc3Rpb24uaGFzVGl0bGVPbkxlZnRUb3AgLS0+XFxuICAgICAgICAgICAgPCEtLWtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tdGl0bGUnLCBkYXRhOiBxdWVzdGlvbiAgfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogeydjb250ZW50LWxlZnQnOiBxdWVzdGlvbi5oYXNUaXRsZU9uTGVmdH1cXFwiPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmVycm9yTG9jYXRpb24gPT0gJ3RvcCcgLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiAnc3VydmV5LXF1ZXN0aW9uLWVycm9ycycsIGRhdGE6IHF1ZXN0aW9uIH0gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogeyBuYW1lOiBxdWVzdGlvbi5rb1RlbXBsYXRlTmFtZSgpLCBkYXRhOiBxdWVzdGlvbiwgYWZ0ZXJSZW5kZXI6IHF1ZXN0aW9uLmtvUXVlc3Rpb25BZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOiBxdWVzdGlvbi5oYXNDb21tZW50XFxcIj5cXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6cXVlc3Rpb24uY29tbWVudFRleHRcXFwiPjwvZGl2PlxcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cXFwidGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1jb21tZW50JywgZGF0YTogeydxdWVzdGlvbic6IHF1ZXN0aW9uLCAndmlzaWJsZSc6IHRydWUgfSB9XFxcIj48L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5lcnJvckxvY2F0aW9uID09ICdib3R0b20nIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1xdWVzdGlvbi1lcnJvcnMnLCBkYXRhOiBxdWVzdGlvbiB9IC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IHF1ZXN0aW9uLmhhc1RpdGxlT25Cb3R0b20gLS0+XFxuICAgICAgICAgICAgPCEtLWtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktcXVlc3Rpb24tdGl0bGUnLCBkYXRhOiBxdWVzdGlvbiAgfSAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L3NjcmlwdD5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvcXVlc3Rpb24uaHRtbFxuLy8gbW9kdWxlIGlkID0gODNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXF1ZXN0aW9uLXRpdGxlXFxcIj5cXG4gICAgPGg1IGRhdGEtYmluZD1cXFwiY3NzOiBrb0NzcygpLnRpdGxlXFxcIj5cXG4gICAgICAgIDwhLS0ga28gdGVtcGxhdGU6IHsgbmFtZTogJ3N1cnZleS1zdHJpbmcnLCBkYXRhOiBsb2NUaXRsZSB9IC0tPjwhLS0gL2tvIC0tPlxcbiAgICA8L2g1PlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwidmlzaWJsZTogaGFzRGVzY3JpcHRpb24sIGNzczoga29Dc3MoKS5kZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6ICdzdXJ2ZXktc3RyaW5nJywgZGF0YTogbG9jRGVzY3JpcHRpb24gfSAtLT48IS0tIC9rbyAtLT5cXG4gICAgPC9kaXY+XFxuPC9zY3JpcHQ+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMva25vY2tvdXQvdGVtcGxhdGVzL3F1ZXN0aW9udGl0bGUuaHRtbFxuLy8gbW9kdWxlIGlkID0gODRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxzY3JpcHQgdHlwZT1cXFwidGV4dC9odG1sXFxcIiBpZD1cXFwic3VydmV5LXJvd3NcXFwiPlxcbiAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YToga29Sb3dzLCBhczogJ3Jvdyd9IC0tPlxcbiAgICA8IS0tIGtvIGlmOiByb3cua29WaXNpYmxlIC0tPlxcbiAgICA8ZGl2IGRhdGEtYmluZD1cXFwiY3NzOiBwYW5lbC5jc3NDbGFzc2VzLnJvd1xcXCI+XFxuICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHsgZGF0YTogcm93LmtvRWxlbWVudHMsIGFzOiAncXVlc3Rpb24nICwgYWZ0ZXJSZW5kZXI6IHJvdy5rb0FmdGVyUmVuZGVyIH0gLS0+XFxuICAgICAgICA8IS0tIGtvIGlmOiBxdWVzdGlvbi5rb1Zpc2libGUgLS0+XFxuICAgICAgICA8IS0tIGtvIHRlbXBsYXRlOiB7IG5hbWU6IHF1ZXN0aW9uLmtvRWxlbWVudFR5cGUsIGRhdGE6IHF1ZXN0aW9uLCBhZnRlclJlbmRlcjogJHBhcmVudC5rb0VsZW1lbnRBZnRlclJlbmRlciB9IC0tPlxcbiAgICAgICAgPCEtLSAva28gLS0+XFxuICAgICAgICA8IS0tIC9rbyAtLT5cXG4gICAgICAgIDwhLS0gL2tvIC0tPlxcbiAgICA8L2Rpdj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0gL2tvIC0tPlxcbjwvc2NyaXB0PlwiO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9yb3dzLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDg1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS1zdHJpbmdcXFwiPlxcbiAgICA8IS0tIGtvIGlmbm90OiBoYXNIdG1sIC0tPlxcbiAgICA8c3BhbiBzdHlsZT1cXFwicG9zaXRpb246IHN0YXRpYztcXFwiIGRhdGEtYmluZD1cXFwidGV4dDoga29SZW5kZXJlZEh0bWxcXFwiPjwvc3Bhbj5cXG4gICAgPCEtLSAva28gLS0+XFxuICAgIDwhLS0ga28gaWY6IGhhc0h0bWwgLS0+XFxuICAgIDxzcGFuIHN0eWxlPVxcXCJwb3NpdGlvbjogc3RhdGljO1xcXCIgZGF0YS1iaW5kPVxcXCJodG1sOiBrb1JlbmRlcmVkSHRtbFxcXCI+PC9zcGFuPlxcbiAgICA8IS0tIC9rbyAtLT5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvc3RyaW5nLmh0bWxcbi8vIG1vZHVsZSBpZCA9IDg2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gXCI8c2NyaXB0IHR5cGU9XFxcInRleHQvaHRtbFxcXCIgaWQ9XFxcInN1cnZleS10aW1lcnBhbmVsXFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcInRleHQ6a29UaW1lckluZm9UZXh0XFxcIj48L2Rpdj5cXG48L3NjcmlwdD5cXG5cIjtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9rbm9ja291dC90ZW1wbGF0ZXMvdGltZXJwYW5lbC5odG1sXG4vLyBtb2R1bGUgaWQgPSA4N1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiXCIgKyByZXF1aXJlKCcuL2luZGV4Lmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL2NvbW1lbnQuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcGFnZS5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9wYW5lbC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9wcm9ncmVzcy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9yb3dzLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3N0cmluZy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi90aW1lcnBhbmVsLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL21hdHJpeGNlbGwuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24uaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb250aXRsZS5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1jaGVja2JveC5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1jb21tZW50Lmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWRyb3Bkb3duLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWVycm9ycy5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1maWxlLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLWh0bWwuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tbWF0cml4Lmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLW1hdHJpeGRyb3Bkb3duLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLW1hdHJpeGR5bmFtaWMuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tcGFuZWxkeW5hbWljLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLXBhbmVsZHluYW1pYy1uYXZpZ2F0b3IuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tbXVsdGlwbGV0ZXh0Lmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLXJhZGlvZ3JvdXAuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tcmF0aW5nLmh0bWwnKSArIFwiXFxuXCIgKyByZXF1aXJlKCcuL3F1ZXN0aW9uLXRleHQuaHRtbCcpICsgXCJcXG5cIiArIHJlcXVpcmUoJy4vcXVlc3Rpb24tYm9vbGVhbi5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1lbXB0eS5odG1sJykgKyBcIlxcblwiICsgcmVxdWlyZSgnLi9xdWVzdGlvbi1leHByZXNzaW9uLmh0bWwnKSArIFwiXFxuXCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2h0bWwtbG9hZGVyP2ludGVycG9sYXRlIS4vfi92YWwtbG9hZGVyIS4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy9lbnRyeS5odG1sXG4vLyBtb2R1bGUgaWQgPSA4OFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBzdHlsZT1cXFwicG9zaXRpb246IGZpeGVkOyBib3R0b206IDNweDsgcmlnaHQ6IDEwcHg7XFxcIiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLndpbmRvdy5yb290XFxcIj5cXG4gICAgPGRpdiBkYXRhLWJpbmQ9XFxcImNzczogY3NzLndpbmRvdy5oZWFkZXIucm9vdFxcXCI+XFxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XFxcImNsaWNrOmRvRXhwYW5kXFxcIiBzdHlsZT1cXFwid2lkdGg6IDEwMCU7IGN1cnNvcjogcG9pbnRlcjtcXFwiPlxcbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVxcXCJwYWRkaW5nLXJpZ2h0OjEwcHhcXFwiIGRhdGEtYmluZD1cXFwiY3NzOiBjc3Mud2luZG93LmhlYWRlci50aXRsZSwgdGV4dDogbG9jVGl0bGUua29SZW5kZXJlZEh0bWxcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cXFwidHJ1ZVxcXCIgZGF0YS1iaW5kPVxcXCJjc3M6IGtvRXhwYW5kZWRDc3NcXFwiPjwvc3Bhbj5cXG4gICAgICAgIDwvc3Bhbj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgZGF0YS1iaW5kPVxcXCJ2aXNpYmxlOmtvRXhwYW5kZWQsIGNzczogY3NzLndpbmRvdy5ib2R5XFxcIj5cXG4gICAgICAgIDxkaXYgaWQ9XFxcIndpbmRvd1N1cnZleUpTXFxcIj48L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XCI7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L2h0bWwtbG9hZGVyP2ludGVycG9sYXRlIS4vfi92YWwtbG9hZGVyIS4vc3JjL2tub2Nrb3V0L3RlbXBsYXRlcy93aW5kb3cvd2luZG93Lmh0bWxcbi8vIG1vZHVsZSBpZCA9IDg5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IHN1cnZleUNzcyB9IGZyb20gXCIuL2Nzc3N0YW5kYXJkXCI7XG5cbmV4cG9ydCB2YXIgZGVmYXVsdEJvb3RzdHJhcENzcyA9IHtcbiAgcm9vdDogXCJzdl9ib290c3RyYXBfY3NzXCIsXG4gIGhlYWRlcjogXCJwYW5lbC1oZWFkaW5nIGNhcmQtaGVhZGVyXCIsXG4gIGJvZHk6IFwicGFuZWwtYm9keSBjYXJkLWJsb2NrXCIsXG4gIGZvb3RlcjogXCJwYW5lbC1mb290ZXIgY2FyZC1mb290ZXJcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJcIixcbiAgbmF2aWdhdGlvbjoge1xuICAgIGNvbXBsZXRlOiBcInN2X2NvbXBsZXRlX2J0blwiLFxuICAgIHByZXY6IFwic3ZfcHJldl9idG5cIixcbiAgICBuZXh0OiBcInN2X25leHRfYnRuXCIsXG4gICAgc3RhcnQ6IFwic3Zfc3RhcnRfYnRuXCJcbiAgfSxcbiAgcHJvZ3Jlc3M6IFwicHJvZ3Jlc3MgY2VudGVyLWJsb2NrIG14LWF1dG8gbWItNFwiLFxuICBwcm9ncmVzc0JhcjogXCJwcm9ncmVzcy1iYXJcIixcbiAgcGFnZToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgZGVzY3JpcHRpb246IFwiXCJcbiAgfSxcbiAgcGFnZVRpdGxlOiBcIlwiLFxuICBwYWdlRGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgcm93OiBcIlwiLFxuICBxdWVzdGlvbjoge1xuICAgIG1haW5Sb290OiBcInN2X3FzdG5cIixcbiAgICB0aXRsZTogXCJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJzbWFsbFwiLFxuICAgIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXG4gICAgcmVxdWlyZWQ6IFwiXCIsXG4gICAgdGl0bGVSZXF1aXJlZDogXCJcIixcbiAgICBpbmRlbnQ6IDIwXG4gIH0sXG4gIHBhbmVsOiB7XG4gICAgdGl0bGU6IFwic3ZfcF90aXRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gICAgY29udGFpbmVyOiBcInN2X3BfY29udGFpbmVyXCJcbiAgfSxcbiAgZXJyb3I6IHtcbiAgICByb290OiBcImFsZXJ0IGFsZXJ0LWRhbmdlclwiLFxuICAgIGljb246IFwiZ2x5cGhpY29uIGdseXBoaWNvbi1leGNsYW1hdGlvbi1zaWduXCIsXG4gICAgaXRlbTogXCJcIlxuICB9LFxuXG4gIGJvb2xlYW46IHsgcm9vdDogXCJzdl9xYmxuIGZvcm0taW5saW5lIGNoZWNrYm94XCIsIGl0ZW06IFwiXCIgfSxcbiAgY2hlY2tib3g6IHtcbiAgICByb290OiBcInN2X3FjYmMgc3ZfcWNieCBmb3JtLWlubGluZVwiLFxuICAgIGl0ZW06IFwiY2hlY2tib3hcIixcbiAgICBpdGVtQ29udHJvbDogXCJcIixcbiAgICBjb250cm9sTGFiZWw6IFwiXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9jaGVja2JveF9vdGhlclwiXG4gIH0sXG4gIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXG4gIGRyb3Bkb3duOiB7IHJvb3Q6IFwiXCIsIGNvbnRyb2w6IFwiZm9ybS1jb250cm9sXCIsIG90aGVyOiBcIlwiIH0sXG4gIG1hdHJpeDogeyByb290OiBcInRhYmxlXCIsIGxhYmVsOiBcInN2X3FfbV9sYWJlbFwiIH0sXG4gIG1hdHJpeGRyb3Bkb3duOiB7IHJvb3Q6IFwidGFibGVcIiB9LFxuICBtYXRyaXhkeW5hbWljOiB7IHJvb3Q6IFwidGFibGVcIiwgYnV0dG9uOiBcImJ1dHRvblwiIH0sXG4gIHBhbmVsZHluYW1pYzogeyByb290OiBcIlwiLCBidXR0b246IFwiYnV0dG9uXCIgfSxcbiAgbXVsdGlwbGV0ZXh0OiB7XG4gICAgcm9vdDogXCJ0YWJsZVwiLFxuICAgIGl0ZW1UaXRsZTogXCJcIixcbiAgICBpdGVtVmFsdWU6IFwic3ZfcV9tdF9pdGVtX3ZhbHVlIGZvcm0tY29udHJvbFwiXG4gIH0sXG4gIHJhZGlvZ3JvdXA6IHtcbiAgICByb290OiBcInN2X3FjYmMgZm9ybS1pbmxpbmVcIixcbiAgICBpdGVtOiBcInJhZGlvXCIsXG4gICAgbGFiZWw6IFwiXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwiXCIsXG4gICAgY29udHJvbExhYmVsOiBcIlwiLFxuICAgIG90aGVyOiBcInN2X3FfcmFkaW9ncm91cF9vdGhlclwiXG4gIH0sXG4gIHJhdGluZzoge1xuICAgIHJvb3Q6IFwiYnRuLWdyb3VwXCIsXG4gICAgaXRlbTogXCJidG4gYnRuLWRlZmF1bHQgYnRuLXNlY29uZGFyeVwiLFxuICAgIHNlbGVjdGVkOiBcImFjdGl2ZVwiLFxuICAgIG1pblRleHQ6IFwic3ZfcV9yYXRpbmdfbWluX3RleHRcIixcbiAgICBpdGVtVGV4dDogXCJzdl9xX3JhdGluZ19pdGVtX3RleHRcIixcbiAgICBtYXhUZXh0OiBcInN2X3FfcmF0aW5nX21heF90ZXh0XCJcbiAgfSxcbiAgdGV4dDogXCJmb3JtLWNvbnRyb2xcIixcbiAgZXhwcmVzc2lvbjogXCJmb3JtLWNvbnRyb2xcIixcbiAgZmlsZToge1xuICAgIHJvb3Q6IFwic3ZfcV9maWxlXCIsXG4gICAgcGxhY2Vob2xkZXJJbnB1dDogXCJzdl9xX2ZpbGVfcGxhY2Vob2xkZXJcIixcbiAgICBwcmV2aWV3OiBcInN2X3FfZmlsZV9wcmV2aWV3XCIsXG4gICAgcmVtb3ZlQnV0dG9uOiBcInN2X3FfZmlsZV9yZW1vdmVfYnV0dG9uXCJcbiAgfSxcbiAgc2F2ZURhdGE6IHtcbiAgICByb290OiBcIlwiLFxuICAgIHNhdmluZzogXCJhbGVydCBhbGVydC1pbmZvXCIsXG4gICAgZXJyb3I6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgc3VjY2VzczogXCJhbGVydCBhbGVydC1zdWNjZXNzXCIsXG4gICAgc2F2ZUFnYWluQnV0dG9uOiBcIlwiXG4gIH0sXG4gIHdpbmRvdzoge1xuICAgIHJvb3Q6IFwibW9kYWwtY29udGVudFwiLFxuICAgIGJvZHk6IFwibW9kYWwtYm9keVwiLFxuICAgIGhlYWRlcjoge1xuICAgICAgcm9vdDogXCJtb2RhbC1oZWFkZXIgcGFuZWwtdGl0bGVcIixcbiAgICAgIHRpdGxlOiBcInB1bGwtbGVmdFwiLFxuICAgICAgYnV0dG9uOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0XCIsXG4gICAgICBidXR0b25FeHBhbmRlZDogXCJnbHlwaGljb24gcHVsbC1yaWdodCBnbHlwaGljb24tY2hldnJvbi11cFwiLFxuICAgICAgYnV0dG9uQ29sbGFwc2VkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLWRvd25cIlxuICAgIH1cbiAgfVxufTtcbnN1cnZleUNzc1tcImJvb3RzdHJhcFwiXSA9IGRlZmF1bHRCb290c3RyYXBDc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3Nib290c3RyYXAudHMiLCJpbXBvcnQgeyBzdXJ2ZXlDc3MgfSBmcm9tIFwiLi9jc3NzdGFuZGFyZFwiO1xuXG5leHBvcnQgdmFyIGRlZmF1bHRCb290c3RyYXBNYXRlcmlhbENzcyA9IHtcbiAgcm9vdDogXCJzdl9ib290c3RyYXBtYXRlcmlhbF9jc3NcIixcbiAgaGVhZGVyOiBcInBhbmVsLWhlYWRpbmdcIixcbiAgYm9keTogXCJwYW5lbC1ib2R5XCIsXG4gIGZvb3RlcjogXCJwYW5lbC1mb290ZXJcIixcbiAgbmF2aWdhdGlvbkJ1dHRvbjogXCJcIixcbiAgY29tcGxldGVkUGFnZTogXCJcIixcbiAgbmF2aWdhdGlvbjoge1xuICAgIGNvbXBsZXRlOiBcInN2X2NvbXBsZXRlX2J0blwiLFxuICAgIHByZXY6IFwic3ZfcHJldl9idG5cIixcbiAgICBuZXh0OiBcInN2X25leHRfYnRuXCIsXG4gICAgc3RhcnQ6IFwic3Zfc3RhcnRfYnRuXCJcbiAgfSxcbiAgcHJvZ3Jlc3M6IFwicHJvZ3Jlc3MgY2VudGVyLWJsb2NrIG14LWF1dG8gbWItNFwiLFxuICBwcm9ncmVzc0JhcjogXCJwcm9ncmVzcy1iYXJcIixcbiAgcGFnZToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgdGl0bGU6IFwiXCIsXG4gICAgZGVzY3JpcHRpb246IFwiXCJcbiAgfSxcbiAgcGFnZVRpdGxlOiBcIlwiLFxuICBwYWdlRGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgcm93OiBcIlwiLFxuICBxdWVzdGlvbjoge1xuICAgIG1haW5Sb290OiBcInN2X3FzdG4gZm9ybS1ncm91cFwiLFxuICAgIHRpdGxlOiBcIlwiLFxuICAgIGRlc2NyaXB0aW9uOiBcInNtYWxsXCIsXG4gICAgY29tbWVudDogXCJmb3JtLWNvbnRyb2xcIixcbiAgICByZXF1aXJlZDogXCJcIixcbiAgICB0aXRsZVJlcXVpcmVkOiBcIlwiLFxuICAgIGluZGVudDogMjBcbiAgfSxcbiAgcGFuZWw6IHtcbiAgICB0aXRsZTogXCJzdl9wX3RpdGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwic21hbGxcIixcbiAgICBjb250YWluZXI6IFwic3ZfcF9jb250YWluZXJcIlxuICB9LFxuICBlcnJvcjoge1xuICAgIHJvb3Q6IFwiYWxlcnQgYWxlcnQtZGFuZ2VyXCIsXG4gICAgaWNvbjogXCJnbHlwaGljb24gZ2x5cGhpY29uLWV4Y2xhbWF0aW9uLXNpZ25cIixcbiAgICBpdGVtOiBcIlwiXG4gIH0sXG5cbiAgYm9vbGVhbjogeyByb290OiBcInN2X3FibG4gZm9ybS1pbmxpbmUgY2hlY2tib3hcIiwgaXRlbTogXCJcIiB9LFxuICBjaGVja2JveDoge1xuICAgIHJvb3Q6IFwic3ZfcWNieCBmb3JtLWlubGluZVwiLFxuICAgIGl0ZW06IFwiY2hlY2tib3hcIixcbiAgICBpdGVtQ29udHJvbDogXCJcIixcbiAgICBjb250cm9sTGFiZWw6IFwiXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9jaGVja2JveF9vdGhlclwiXG4gIH0sXG4gIGNvbW1lbnQ6IFwiZm9ybS1jb250cm9sXCIsXG4gIGRyb3Bkb3duOiB7IHJvb3Q6IFwiXCIsIGNvbnRyb2w6IFwiZm9ybS1jb250cm9sXCIsIG90aGVyOiBcIlwiIH0sXG4gIG1hdHJpeDoge1xuICAgIHJvb3Q6IFwidGFibGVcIixcbiAgICByb3c6IFwiZm9ybS1ncm91cFwiLFxuICAgIGxhYmVsOiBcInN2X3FfbV9sYWJlbCByYWRpby1pbmxpbmVcIixcbiAgICBpdGVtVmFsdWU6IFwiZm9ybS1jb250cm9sXCJcbiAgfSxcbiAgbWF0cml4ZHJvcGRvd246IHsgcm9vdDogXCJ0YWJsZVwiLCBpdGVtVmFsdWU6IFwiZm9ybS1ncm91cFwiIH0sXG4gIG1hdHJpeGR5bmFtaWM6IHsgcm9vdDogXCJ0YWJsZVwiLCBidXR0b246IFwiYnV0dG9uXCIsIGl0ZW1WYWx1ZTogXCJmb3JtLWdyb3VwXCIgfSxcbiAgcGFuZWxkeW5hbWljOiB7IHJvb3Q6IFwiXCIsIGJ1dHRvbjogXCJidXR0b25cIiB9LFxuICBtdWx0aXBsZXRleHQ6IHtcbiAgICByb290OiBcInRhYmxlXCIsXG4gICAgaXRlbVRpdGxlOiBcIlwiLFxuICAgIHJvdzogXCJmb3JtLWdyb3VwXCIsXG4gICAgaXRlbVZhbHVlOiBcInN2X3FfbXRfaXRlbV92YWx1ZSBmb3JtLWNvbnRyb2xcIlxuICB9LFxuICByYWRpb2dyb3VwOiB7XG4gICAgcm9vdDogXCJcIixcbiAgICBpdGVtOiBcInJhZGlvXCIsXG4gICAgbGFiZWw6IFwiXCIsXG4gICAgaXRlbUNvbnRyb2w6IFwiXCIsXG4gICAgY29udHJvbExhYmVsOiBcInN2X3FfcmFkaW9ncm91cF9jb250cm9sX2xhYmVsXCIsXG4gICAgb3RoZXI6IFwic3ZfcV9yYWRpb2dyb3VwX290aGVyXCJcbiAgfSxcbiAgcmF0aW5nOiB7XG4gICAgcm9vdDogXCJidG4tZ3JvdXBcIixcbiAgICBpdGVtOiBcImJ0biBidG4tZGVmYXVsdCBidG4tc2Vjb25kYXJ5XCIsXG4gICAgc2VsZWN0ZWQ6IFwiYWN0aXZlXCIsXG4gICAgbWluVGV4dDogXCJzdl9xX3JhdGluZ19taW5fdGV4dFwiLFxuICAgIGl0ZW1UZXh0OiBcInN2X3FfcmF0aW5nX2l0ZW1fdGV4dFwiLFxuICAgIG1heFRleHQ6IFwic3ZfcV9yYXRpbmdfbWF4X3RleHRcIlxuICB9LFxuICB0ZXh0OiBcImZvcm0tY29udHJvbFwiLFxuICBleHByZXNzaW9uOiBcImZvcm0tY29udHJvbFwiLFxuICBmaWxlOiB7XG4gICAgcm9vdDogXCJmb3JtLWdyb3VwIGlzLWZpbGVpbnB1dCBzdl9xX2ZpbGVcIixcbiAgICBwbGFjZWhvbGRlcklucHV0OiBcIlwiLFxuICAgIHByZXZpZXc6IFwic3ZfcV9maWxlX3ByZXZpZXdcIixcbiAgICByZW1vdmVCdXR0b246IFwic3ZfcV9maWxlX3JlbW92ZV9idXR0b25cIlxuICB9LFxuICBzYXZlRGF0YToge1xuICAgIHJvb3Q6IFwiXCIsXG4gICAgc2F2aW5nOiBcImFsZXJ0IGFsZXJ0LWluZm9cIixcbiAgICBlcnJvcjogXCJhbGVydCBhbGVydC1kYW5nZXJcIixcbiAgICBzdWNjZXNzOiBcImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIixcbiAgICBzYXZlQWdhaW5CdXR0b246IFwiXCJcbiAgfSxcbiAgd2luZG93OiB7XG4gICAgcm9vdDogXCJtb2RhbC1jb250ZW50XCIsXG4gICAgYm9keTogXCJtb2RhbC1ib2R5XCIsXG4gICAgaGVhZGVyOiB7XG4gICAgICByb290OiBcIm1vZGFsLWhlYWRlciBwYW5lbC10aXRsZVwiLFxuICAgICAgdGl0bGU6IFwicHVsbC1sZWZ0XCIsXG4gICAgICBidXR0b246IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHRcIixcbiAgICAgIGJ1dHRvbkV4cGFuZGVkOiBcImdseXBoaWNvbiBwdWxsLXJpZ2h0IGdseXBoaWNvbi1jaGV2cm9uLXVwXCIsXG4gICAgICBidXR0b25Db2xsYXBzZWQ6IFwiZ2x5cGhpY29uIHB1bGwtcmlnaHQgZ2x5cGhpY29uLWNoZXZyb24tZG93blwiXG4gICAgfVxuICB9XG59O1xuc3VydmV5Q3NzW1wiYm9vdHN0cmFwbWF0ZXJpYWxcIl0gPSBkZWZhdWx0Qm9vdHN0cmFwTWF0ZXJpYWxDc3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZGVmYXVsdENzcy9jc3Nib290c3RyYXBtYXRlcmlhbC50cyIsImltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9hcmFiaWNcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9jYXRhbGFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vY3plY2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9kYW5pc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9kdXRjaFwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2Zpbm5pc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9mcmVuY2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9nZW9yZ2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2dlcm1hblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2dyZWVrXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaGVicmV3XCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaHVuZ2FyaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaWNlbGFuZGljXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vaXRhbGlhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL2xhdHZpYW5cIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9wZXJzaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcG9saXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcG9ydHVndWVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3JvbWFuaWFuXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vcnVzc2lhblwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3NpbXBsaWZpZWQtY2hpbmVzZVwiO1xuaW1wb3J0IFwiLi4vLi4vbG9jYWxpemF0aW9uL3NwYW5pc2hcIjtcbmltcG9ydCBcIi4uLy4uL2xvY2FsaXphdGlvbi9zd2VkaXNoXCI7XG5pbXBvcnQgXCIuLi8uLi9sb2NhbGl6YXRpb24vdHVya2lzaFwiO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvY2h1bmtzL2xvY2FsaXphdGlvbi50cyIsIi8vIHN0eWxlc1xuaW1wb3J0IFwiLi4vLi4vbWFpbi5zY3NzXCI7XG5cbmV4cG9ydCBsZXQgVmVyc2lvbjogc3RyaW5nO1xuVmVyc2lvbiA9IGAke3Byb2Nlc3MuZW52LlZFUlNJT059YDtcblxuZXhwb3J0IHsgSGVscGVycyB9IGZyb20gXCIuLi8uLi9oZWxwZXJzXCI7XG5leHBvcnQge1xuICBBbnN3ZXJDb3VudFZhbGlkYXRvcixcbiAgRW1haWxWYWxpZGF0b3IsXG4gIE51bWVyaWNWYWxpZGF0b3IsXG4gIFJlZ2V4VmFsaWRhdG9yLFxuICBTdXJ2ZXlWYWxpZGF0b3IsXG4gIFRleHRWYWxpZGF0b3IsXG4gIFZhbGlkYXRvclJlc3VsdCxcbiAgVmFsaWRhdG9yUnVubmVyXG59IGZyb20gXCIuLi8uLi92YWxpZGF0b3JcIjtcbmV4cG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuLi8uLi9pdGVtdmFsdWVcIjtcbmV4cG9ydCB7IEJhc2UsIEV2ZW50LCBTdXJ2ZXlFcnJvciwgSVN1cnZleSwgU3VydmV5RWxlbWVudCB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5leHBvcnQgeyBJTG9jYWxpemFibGVPd25lciwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tIFwiLi4vLi4vbG9jYWxpemFibGVzdHJpbmdcIjtcbmV4cG9ydCB7IENob2ljZXNSZXN0ZnVsbCB9IGZyb20gXCIuLi8uLi9jaG9pY2VzUmVzdGZ1bGxcIjtcbmV4cG9ydCB7IEZ1bmN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi8uLi9mdW5jdGlvbnNmYWN0b3J5XCI7XG5leHBvcnQgeyBDb25kaXRpb24sIENvbmRpdGlvbk5vZGUsIENvbmRpdGlvblJ1bm5lciB9IGZyb20gXCIuLi8uLi9jb25kaXRpb25zXCI7XG5leHBvcnQgeyBDb25kaXRpb25zUGFyc2VyIH0gZnJvbSBcIi4uLy4uL2NvbmRpdGlvbnNQYXJzZXJcIjtcbmV4cG9ydCB7IFByb2Nlc3NWYWx1ZSB9IGZyb20gXCIuLi8uLi9jb25kaXRpb25Qcm9jZXNzVmFsdWVcIjtcbmV4cG9ydCB7IEN1c3RvbUVycm9yLCBFeGNlZWRTaXplRXJyb3IsIFJlcXVyZU51bWVyaWNFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvclwiO1xuZXhwb3J0IHtcbiAgSnNvbkVycm9yLFxuICBKc29uSW5jb3JyZWN0VHlwZUVycm9yLFxuICBKc29uTWV0YWRhdGEsXG4gIEpzb25NZXRhZGF0YUNsYXNzLFxuICBKc29uTWlzc2luZ1R5cGVFcnJvcixcbiAgSnNvbk1pc3NpbmdUeXBlRXJyb3JCYXNlLFxuICBKc29uT2JqZWN0LFxuICBKc29uT2JqZWN0UHJvcGVydHksXG4gIEpzb25SZXF1aXJlZFByb3BlcnR5RXJyb3IsXG4gIEpzb25Vbmtub3duUHJvcGVydHlFcnJvclxufSBmcm9tIFwiLi4vLi4vanNvbm9iamVjdFwiO1xuZXhwb3J0IHtcbiAgTWF0cml4RHJvcGRvd25DZWxsLFxuICBNYXRyaXhEcm9wZG93bkNvbHVtbixcbiAgbWF0cml4RHJvcGRvd25Db2x1bW5UeXBlcyxcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbEJhc2UsXG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2Vcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuZXhwb3J0IHtcbiAgTWF0cml4RHJvcGRvd25Sb3dNb2RlbCxcbiAgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9tYXRyaXhkcm9wZG93blwiO1xuZXhwb3J0IHtcbiAgTWF0cml4RHluYW1pY1Jvd01vZGVsLFxuICBRdWVzdGlvbk1hdHJpeER5bmFtaWNNb2RlbFxufSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbWF0cml4ZHluYW1pY1wiO1xuZXhwb3J0IHsgTWF0cml4Um93TW9kZWwsIFF1ZXN0aW9uTWF0cml4TW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fbWF0cml4XCI7XG5leHBvcnQge1xuICBNdWx0aXBsZVRleHRJdGVtTW9kZWwsXG4gIFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWxcbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xuZXhwb3J0IHsgUGFuZWxNb2RlbCwgUGFuZWxNb2RlbEJhc2UsIFF1ZXN0aW9uUm93TW9kZWwgfSBmcm9tIFwiLi4vLi4vcGFuZWxcIjtcbmV4cG9ydCB7IFBhZ2VNb2RlbCB9IGZyb20gXCIuLi8uLi9wYWdlXCI7XG5leHBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi8uLi9xdWVzdGlvblwiO1xuZXhwb3J0IHsgUXVlc3Rpb25CYXNlIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uYmFzZVwiO1xuZXhwb3J0IHsgUXVlc3Rpb25FbXB0eU1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2VtcHR5XCI7XG5leHBvcnQge1xuICBRdWVzdGlvbkNoZWNrYm94QmFzZSxcbiAgUXVlc3Rpb25TZWxlY3RCYXNlXG59IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5leHBvcnQgeyBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fY2hlY2tib3hcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uQ29tbWVudE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2NvbW1lbnRcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9kcm9wZG93blwiO1xuZXhwb3J0IHsgUXVlc3Rpb25GYWN0b3J5LCBFbGVtZW50RmFjdG9yeSB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uRmlsZU1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2ZpbGVcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uSHRtbE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX2h0bWxcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIH0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3JhZGlvZ3JvdXBcIjtcbmV4cG9ydCB7IFF1ZXN0aW9uUmF0aW5nTW9kZWwgfSBmcm9tIFwiLi4vLi4vcXVlc3Rpb25fcmF0aW5nXCI7XG5leHBvcnQgeyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9leHByZXNzaW9uXCI7XG5leHBvcnQgeyBRdWVzdGlvblRleHRNb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl90ZXh0XCI7XG5leHBvcnQgeyBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gXCIuLi8uLi9xdWVzdGlvbl9ib29sZWFuXCI7XG5leHBvcnQge1xuICBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsLFxuICBRdWVzdGlvblBhbmVsRHluYW1pY0l0ZW1cbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uX3BhbmVsZHluYW1pY1wiO1xuZXhwb3J0IHsgU3VydmV5VGltZXIgfSBmcm9tIFwiLi4vLi4vc3VydmV5dGltZXJcIjtcbmV4cG9ydCB7IFN1cnZleU1vZGVsIH0gZnJvbSBcIi4uLy4uL3N1cnZleVwiO1xuZXhwb3J0IHtcbiAgU3VydmV5VHJpZ2dlcixcbiAgU3VydmV5VHJpZ2dlckNvbXBsZXRlLFxuICBTdXJ2ZXlUcmlnZ2VyU2V0VmFsdWUsXG4gIFN1cnZleVRyaWdnZXJWaXNpYmxlLFxuICBUcmlnZ2VyXG59IGZyb20gXCIuLi8uLi90cmlnZ2VyXCI7XG5leHBvcnQgeyBTdXJ2ZXlXaW5kb3dNb2RlbCB9IGZyb20gXCIuLi8uLi9zdXJ2ZXlXaW5kb3dcIjtcbmV4cG9ydCB7IFRleHRQcmVQcm9jZXNzb3IgfSBmcm9tIFwiLi4vLi4vdGV4dFByZVByb2Nlc3NvclwiO1xuXG5leHBvcnQgeyBkeFN1cnZleVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vZHhTdXJ2ZXlTZXJ2aWNlXCI7XG5leHBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24sIHN1cnZleVN0cmluZ3MgfSBmcm9tIFwiLi4vLi4vc3VydmV5U3RyaW5nc1wiO1xuZXhwb3J0IHtcbiAgUXVlc3Rpb25DdXN0b21XaWRnZXQsXG4gIEN1c3RvbVdpZGdldENvbGxlY3Rpb25cbn0gZnJvbSBcIi4uLy4uL3F1ZXN0aW9uQ3VzdG9tV2lkZ2V0c1wiO1xuXG5leHBvcnQgeyBTdHlsZXNNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL3N0eWxlc21hbmFnZXJcIjtcblxuLy9VbmNvbW1lbnQgdG8gaW5jbHVkZSB0aGUgXCJkYXRlXCIgcXVlc3Rpb24gdHlwZS5cbi8vZXhwb3J0IHtkZWZhdWx0IGFzIFF1ZXN0aW9uRGF0ZU1vZGVsfSBmcm9tIFwiLi4vLi4vcGx1Z2lucy9xdWVzdGlvbl9kYXRlXCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9jaHVua3MvbW9kZWwudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQm9vbGVhbk1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2Jvb2xlYW5cIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkJvb2xlYW5JbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uSW1wbGVtZW50b3Ige1xuICBrb0luZGV0ZXJtaW5hdGU6IGFueTtcbiAga29DaGVja2VkVmFsdWU6IGFueTtcbiAgY29uc3RydWN0b3IocHVibGljIHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLmtvSW5kZXRlcm1pbmF0ZSA9IGtvLm9ic2VydmFibGUoXG4gICAgICAoPFF1ZXN0aW9uQm9vbGVhbj50aGlzLnF1ZXN0aW9uKS5pc0luZGV0ZXJtaW5hdGVcbiAgICApO1xuICAgIHRoaXMua29DaGVja2VkVmFsdWUgPSBrby5vYnNlcnZhYmxlKFxuICAgICAgKDxRdWVzdGlvbkJvb2xlYW4+dGhpcy5xdWVzdGlvbikuY2hlY2tlZFZhbHVlXG4gICAgKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb0NoZWNrZWRWYWx1ZS5zdWJzY3JpYmUoZnVuY3Rpb24obmV3VmFsdWUpIHtcbiAgICAgIHNlbGYudXBkYXRlQ2hlY2tlZFZhbHVlKG5ld1ZhbHVlKTtcbiAgICB9KTtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29JbmRldGVybWluYXRlXCJdID0gdGhpcy5rb0luZGV0ZXJtaW5hdGU7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvQ2hlY2tlZFZhbHVlXCJdID0gdGhpcy5rb0NoZWNrZWRWYWx1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0a29WYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgc3VwZXIuc2V0a29WYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5rb0luZGV0ZXJtaW5hdGUoKDxRdWVzdGlvbkJvb2xlYW4+dGhpcy5xdWVzdGlvbikuaXNJbmRldGVybWluYXRlKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmtvQ2hlY2tlZFZhbHVlKCkgIT0gKDxRdWVzdGlvbkJvb2xlYW4+dGhpcy5xdWVzdGlvbikuY2hlY2tlZFZhbHVlXG4gICAgKSB7XG4gICAgICB0aGlzLmtvQ2hlY2tlZFZhbHVlKCg8UXVlc3Rpb25Cb29sZWFuPnRoaXMucXVlc3Rpb24pLmNoZWNrZWRWYWx1ZSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCB1cGRhdGVDaGVja2VkVmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgICg8UXVlc3Rpb25Cb29sZWFuPnRoaXMucXVlc3Rpb24pLmNoZWNrZWRWYWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG4gIHByaXZhdGUgaXNJbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5xdWVzdGlvbi52YWx1ZSAmJiB0aGlzLnF1ZXN0aW9uLnZhbHVlICE9PSBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Cb29sZWFuIGV4dGVuZHMgUXVlc3Rpb25Cb29sZWFuTW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uQm9vbGVhbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHB1YmxpYyBnZXRJdGVtQ3NzKHJvdywgY29sdW1uKSB7XG4gICAgbGV0IGlzQ2hlY2tlZCA9IHRoaXNbXCJrb0NoZWNrZWRWYWx1ZVwiXSgpO1xuICAgIGxldCBpdGVtQ2xhc3MgPSB0aGlzW1wia29Dc3NcIl0oKS5pdGVtICsgKGlzQ2hlY2tlZCA/IFwiIGNoZWNrZWRcIiA6IFwiXCIpO1xuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJib29sZWFuXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQm9vbGVhbihcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImJvb2xlYW5cIiwgbmFtZSA9PiB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25Cb29sZWFuKG5hbWUpO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9ib29sZWFuLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9jaGVja2JveFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcblxuY2xhc3MgUXVlc3Rpb25DaGVja2JveEltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25DaGVja2JveEJhc2VJbXBsZW1lbnRvciB7XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRla29WYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uLnZhbHVlXG4gICAgICA/IGtvLm9ic2VydmFibGVBcnJheSh0aGlzLnF1ZXN0aW9uLnZhbHVlKVxuICAgICAgOiBrby5vYnNlcnZhYmxlQXJyYXkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgc2V0a29WYWx1ZShuZXdWYWx1ZTogYW55KSB7XG4gICAgaWYgKG5ld1ZhbHVlKSB7XG4gICAgICB0aGlzLmtvVmFsdWUoW10uY29uY2F0KG5ld1ZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua29WYWx1ZShbXSk7XG4gICAgfVxuICB9XG59XG5leHBvcnQgY2xhc3MgUXVlc3Rpb25DaGVja2JveCBleHRlbmRzIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25DaGVja2JveEltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIGdldEl0ZW1DbGFzcyhpdGVtKSB7XG4gICAgdmFyIGlzQ2hlY2tlZCA9IHRoaXNbXCJrb1ZhbHVlXCJdKCkgJiYgdGhpc1tcImtvVmFsdWVcIl0oKS5pbmRleE9mKGl0ZW0udmFsdWUpICE9PSAtMTtcbiAgICB2YXIgaXRlbUNsYXNzID1cbiAgICAgIHRoaXMuY3NzQ2xhc3Nlcy5pdGVtICtcbiAgICAgICh0aGlzLmNvbENvdW50ID09PSAwID8gXCIgc3ZfcV9jaGVja2JveF9pbmxpbmVcIiA6IFwiXCIpO1xuXG4gICAgaWYgKGlzQ2hlY2tlZCkgaXRlbUNsYXNzICs9IFwiIGNoZWNrZWRcIjtcblxuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJjaGVja2JveFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbkNoZWNrYm94KFwiXCIpO1xufSk7XG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcImNoZWNrYm94XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbkNoZWNrYm94KG5hbWUpO1xuICBxLmNob2ljZXMgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdENob2ljZXM7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9jaGVja2JveC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkNvbW1lbnRNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9jb21tZW50XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25Db21tZW50IGV4dGVuZHMgUXVlc3Rpb25Db21tZW50TW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJjb21tZW50XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tbWVudChcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJjb21tZW50XCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uQ29tbWVudChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fY29tbWVudC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2Ryb3Bkb3duXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uU2VsZWN0QmFzZUltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvbl9iYXNlc2VsZWN0XCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkRyb3Bkb3duIGV4dGVuZHMgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvblNlbGVjdEJhc2VJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLm92ZXJyaWRlQ2xhc3NDcmVhdG9yZShcImRyb3Bkb3duXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRHJvcGRvd24oXCJcIik7XG59KTtcblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwiZHJvcGRvd25cIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uRHJvcGRvd24obmFtZSk7XG4gIHEuY2hvaWNlcyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q2hvaWNlcztcbiAgcmV0dXJuIHE7XG59KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9rbm9ja291dC9rb3F1ZXN0aW9uX2Ryb3Bkb3duLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkVtcHR5TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fZW1wdHlcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkVtcHR5IGV4dGVuZHMgUXVlc3Rpb25FbXB0eU1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwiZW1wdHlcIiwgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgUXVlc3Rpb25FbXB0eShcIlwiKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fZW1wdHkudHMiLCJpbXBvcnQgKiBhcyBrbyBmcm9tIFwia25vY2tvdXRcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX2V4cHJlc3Npb25cIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkV4cHJlc3Npb25JbXBsZW1lbnRvciBleHRlbmRzIFF1ZXN0aW9uSW1wbGVtZW50b3Ige1xuICBrb0Rpc3BsYXlWYWx1ZTogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHRoaXMua29EaXNwbGF5VmFsdWUgPSBrby5vYnNlcnZhYmxlKHRoaXMucXVlc3Rpb24uZGlzcGxheVZhbHVlKTtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29EaXNwbGF5VmFsdWVcIl0gPSB0aGlzLmtvRGlzcGxheVZhbHVlO1xuICB9XG4gIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdlZCgpIHtcbiAgICBzdXBlci5vblZhbHVlQ2hhbmdlZCgpO1xuICAgIHRoaXMua29EaXNwbGF5VmFsdWUodGhpcy5xdWVzdGlvbi5kaXNwbGF5VmFsdWUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25FeHByZXNzaW9uSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJleHByZXNzaW9uXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRXhwcmVzc2lvbihcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJleHByZXNzaW9uXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRXhwcmVzc2lvbihuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fZXhwcmVzc2lvbi50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZpbGVNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9maWxlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yIH0gZnJvbSBcIi4va29xdWVzdGlvblwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uRmlsZUltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25JbXBsZW1lbnRvciB7XG4gIGtvRGF0YVVwZGF0ZXIgPSBrby5vYnNlcnZhYmxlKDApO1xuICBrb0RhdGE6IGFueTtcbiAga29IYXNWYWx1ZSA9IGtvLm9ic2VydmFibGUoZmFsc2UpO1xuICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29EYXRhID0ga28uY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgc2VsZi5rb0RhdGFVcGRhdGVyKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvbkZpbGVNb2RlbD5zZWxmLnF1ZXN0aW9uKS5wcmV2aWV3VmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvRGF0YVwiXSA9IHRoaXMua29EYXRhO1xuICAgIHRoaXMucXVlc3Rpb25bXCJrb0hhc1ZhbHVlXCJdID0gdGhpcy5rb0hhc1ZhbHVlO1xuICAgICg8UXVlc3Rpb25GaWxlTW9kZWw+dGhpcy5xdWVzdGlvbikucHJldmlld1ZhbHVlTG9hZGVkQ2FsbGJhY2sgPVxuICAgICAgc2VsZi5vbkxvYWRQcmV2aWV3O1xuICAgIHRoaXMucXVlc3Rpb25bXCJkb2NoYW5nZVwiXSA9IChkYXRhLCBldmVudCkgPT4ge1xuICAgICAgdmFyIHNyYyA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50O1xuICAgICAgc2VsZi5vbkNoYW5nZShzcmMpO1xuICAgIH07XG4gICAgdGhpcy5xdWVzdGlvbltcImRvY2xlYW5cIl0gPSAoZGF0YSwgZXZlbnQpID0+IHtcbiAgICAgIHZhciBzcmMgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudDtcbiAgICAgICg8UXVlc3Rpb25GaWxlTW9kZWw+dGhpcy5xdWVzdGlvbikuY2xlYXIoKTtcbiAgICAgIHNyYy5wYXJlbnRFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dFwiKVswXS52YWx1ZSA9IFwiXCI7XG4gICAgICB0aGlzLmtvSGFzVmFsdWUoZmFsc2UpO1xuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBvbkNoYW5nZShzcmM6IGFueSkge1xuICAgIGlmICghd2luZG93W1wiRmlsZVJlYWRlclwiXSkgcmV0dXJuO1xuICAgIGlmICghc3JjIHx8ICFzcmMuZmlsZXMgfHwgc3JjLmZpbGVzLmxlbmd0aCA8IDEpIHJldHVybjtcbiAgICBsZXQgZmlsZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNyYy5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgZmlsZXMucHVzaChzcmMuZmlsZXNbaV0pO1xuICAgIH1cbiAgICAoPFF1ZXN0aW9uRmlsZU1vZGVsPnRoaXMucXVlc3Rpb24pLmxvYWRGaWxlcyhmaWxlcyk7XG4gICAgdGhpcy5rb0hhc1ZhbHVlKHRydWUpO1xuICB9XG4gIG9uTG9hZFByZXZpZXcgPSAoKSA9PiB7XG4gICAgdGhpcy5rb0RhdGFVcGRhdGVyKHRoaXMua29EYXRhVXBkYXRlcigpICsgMSk7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkZpbGUgZXh0ZW5kcyBRdWVzdGlvbkZpbGVNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25GaWxlSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJmaWxlXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRmlsZShcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJmaWxlXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uRmlsZShuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fZmlsZS50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgSnNvbk9iamVjdCB9IGZyb20gXCIuLi9qc29ub2JqZWN0XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkZhY3RvcnkgfSBmcm9tIFwiLi4vcXVlc3Rpb25mYWN0b3J5XCI7XG5pbXBvcnQgeyBRdWVzdGlvbkltcGxlbWVudG9yQmFzZSB9IGZyb20gXCIuL2tvcXVlc3Rpb25iYXNlXCI7XG5pbXBvcnQgeyBRdWVzdGlvbkh0bWxNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9odG1sXCI7XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvbkh0bWwgZXh0ZW5kcyBRdWVzdGlvbkh0bWxNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25JbXBsZW1lbnRvckJhc2UodGhpcyk7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJodG1sXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uSHRtbChcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJodG1sXCIsIG5hbWUgPT4ge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uSHRtbChuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25faHRtbC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHtcbiAgUXVlc3Rpb25NYXRyaXhNb2RlbCxcbiAgTWF0cml4Um93TW9kZWwsXG4gIElNYXRyaXhEYXRhXG59IGZyb20gXCIuLi9xdWVzdGlvbl9tYXRyaXhcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IEl0ZW1WYWx1ZSB9IGZyb20gXCIuLi9pdGVtdmFsdWVcIjtcblxuZXhwb3J0IGNsYXNzIE1hdHJpeFJvdyBleHRlbmRzIE1hdHJpeFJvd01vZGVsIHtcbiAgcHJpdmF0ZSBpc1ZhbHVlVXBkYXRpbmcgPSBmYWxzZTtcbiAga29WYWx1ZTogYW55O1xuICBjb25zdHJ1Y3RvcihcbiAgICBpdGVtOiBJdGVtVmFsdWUsXG4gICAgcHVibGljIGZ1bGxOYW1lOiBzdHJpbmcsXG4gICAgZGF0YTogSU1hdHJpeERhdGEsXG4gICAgdmFsdWU6IGFueVxuICApIHtcbiAgICBzdXBlcihpdGVtLCBmdWxsTmFtZSwgZGF0YSwgdmFsdWUpO1xuICAgIHRoaXMua29WYWx1ZSA9IGtvLm9ic2VydmFibGUodGhpcy52YWx1ZSk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMua29WYWx1ZS5zdWJzY3JpYmUoZnVuY3Rpb24obmV3VmFsdWUpIHtcbiAgICAgIGlmIChzZWxmLmlzVmFsdWVVcGRhdGluZykgdHJ1ZTtcbiAgICAgIHNlbGYudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5pc1ZhbHVlVXBkYXRpbmcgPSB0cnVlO1xuICAgIHRoaXMua29WYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLmlzVmFsdWVVcGRhdGluZyA9IGZhbHNlO1xuICB9XG59XG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXggZXh0ZW5kcyBRdWVzdGlvbk1hdHJpeE1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbkltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVNYXRyaXhSb3coXG4gICAgaXRlbTogSXRlbVZhbHVlLFxuICAgIGZ1bGxOYW1lOiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueVxuICApOiBNYXRyaXhSb3dNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBNYXRyaXhSb3coaXRlbSwgZnVsbE5hbWUsIHRoaXMsIHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgZ2V0SXRlbUNzcyhyb3csIGNvbHVtbikge1xuICAgIHZhciBpc0NoZWNrZWQgPSByb3cua29WYWx1ZSgpID09IGNvbHVtbi52YWx1ZTtcbiAgICBsZXQgaXRlbUNsYXNzID0gdGhpc1tcImtvQ3NzXCJdKCkubGFiZWwgKyAoaXNDaGVja2VkID8gXCIgY2hlY2tlZFwiIDogXCJcIik7XG4gICAgcmV0dXJuIGl0ZW1DbGFzcztcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLm92ZXJyaWRlQ2xhc3NDcmVhdG9yZShcIm1hdHJpeFwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeChcIlwiKTtcbn0pO1xuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uTWF0cml4KG5hbWUpO1xuICBxLnJvd3MgPSBRdWVzdGlvbkZhY3RvcnkuRGVmYXVsdFJvd3M7XG4gIHEuY29sdW1ucyA9IFF1ZXN0aW9uRmFjdG9yeS5EZWZhdWx0Q29sdW1zO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fbWF0cml4LnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbk1hdHJpeEJhc2VJbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25fbWF0cml4ZHJvcGRvd25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uTWF0cml4RHluYW1pY01vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWNcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5pbXBvcnQgeyBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeGRyb3Bkb3duYmFzZVwiO1xuaW1wb3J0IHsgTWF0cml4RHluYW1pY1Jvd01vZGVsIH0gZnJvbSBcIi4uL3F1ZXN0aW9uX21hdHJpeGR5bmFtaWNcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTWF0cml4RHluYW1pY0ltcGxlbWVudG9yIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhCYXNlSW1wbGVtZW50b3Ige1xuICBrb1Jvd3M6IGFueTtcbiAga29SZWNhbGM6IGFueTtcbiAga29BZGRSb3dDbGljazogYW55O1xuICBrb1JlbW92ZVJvd0NsaWNrOiBhbnk7XG4gIGtvT3ZlcmZsb3dYOiBhbnk7XG4gIGtvQ2FuQWRkUm93OiBhbnk7XG4gIGtvQ2FuUmVtb3ZlUm93OiBhbnk7XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLmtvUmVjYWxjID0ga28ub2JzZXJ2YWJsZSgwKTtcbiAgICB0aGlzLmtvUm93cyA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS52aXNpYmxlUm93cztcbiAgICB9LCB0aGlzKTtcblxuICAgIHRoaXMua29PdmVyZmxvd1ggPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlPnRoaXMucXVlc3Rpb24pLmhvcml6b250YWxTY3JvbGxcbiAgICAgICAgPyBcInNjcm9sbFwiXG4gICAgICAgIDogXCJub25lXCI7XG4gICAgfSwgdGhpcyk7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvUm93c1wiXSA9IHRoaXMua29Sb3dzO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvQWRkUm93Q2xpY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuYWRkUm93KCk7XG4gICAgfTtcbiAgICB0aGlzLmtvUmVtb3ZlUm93Q2xpY2sgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICBzZWxmLnJlbW92ZVJvdyhkYXRhKTtcbiAgICB9O1xuICAgIHRoaXMua29DYW5BZGRSb3cgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvbk1hdHJpeER5bmFtaWM+c2VsZi5xdWVzdGlvbikuY2FuQWRkUm93O1xuICAgIH0pO1xuICAgIHRoaXMua29DYW5SZW1vdmVSb3cgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvbk1hdHJpeER5bmFtaWM+c2VsZi5xdWVzdGlvbikuY2FuUmVtb3ZlUm93O1xuICAgIH0pO1xuICAgIHRoaXMucXVlc3Rpb25bXCJrb0FkZFJvd0NsaWNrXCJdID0gdGhpcy5rb0FkZFJvd0NsaWNrO1xuICAgIHRoaXMucXVlc3Rpb25bXCJrb1JlbW92ZVJvd0NsaWNrXCJdID0gdGhpcy5rb1JlbW92ZVJvd0NsaWNrO1xuICAgIHRoaXMucXVlc3Rpb25bXCJrb092ZXJmbG93WFwiXSA9IHRoaXMua29PdmVyZmxvd1g7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvQ2FuQWRkUm93XCJdID0gdGhpcy5rb0NhbkFkZFJvdztcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29DYW5SZW1vdmVSb3dcIl0gPSB0aGlzLmtvQ2FuUmVtb3ZlUm93O1xuICAgICg8UXVlc3Rpb25NYXRyaXhEeW5hbWljPnRoaXNcbiAgICAgIC5xdWVzdGlvbikucm93Q291bnRDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25Sb3dDb3VudENoYW5nZWQoKTtcbiAgICB9O1xuICAgICg8UXVlc3Rpb25NYXRyaXhEeW5hbWljPnRoaXMucXVlc3Rpb24pLmNvbHVtbnNDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25Db2x1bW5DaGFuZ2VkKCk7XG4gICAgfTtcbiAgICAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS51cGRhdGVDZWxsc0NhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uVXBkYXRlQ2VsbHMoKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBvblVwZGF0ZUNlbGxzKCkge1xuICAgIC8vR2VuZXJlYXRlIHJvd3MgYWdhaW4uXG4gICAgdmFyIHJvd3MgPSAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKVtcImdlbmVyYXRlZFZpc2libGVSb3dzXCJdO1xuICAgIHZhciBjb2x1bW5zID0gKDxRdWVzdGlvbk1hdHJpeER5bmFtaWM+dGhpcy5xdWVzdGlvbikuY29sdW1ucztcbiAgICBpZiAocm93cyAmJiByb3dzLmxlbmd0aCA+IDAgJiYgY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLm9uQ29sdW1uQ2hhbmdlZCgpO1xuICB9XG4gIHByb3RlY3RlZCBvbkNvbHVtbkNoYW5nZWQoKSB7XG4gICAgdmFyIHJvd3MgPSAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS52aXNpYmxlUm93cztcbiAgICB0aGlzLm9uUm93Q291bnRDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUm93Q291bnRDaGFuZ2VkKCkge1xuICAgIHRoaXMua29SZWNhbGModGhpcy5rb1JlY2FsYygpICsgMSk7XG4gIH1cbiAgcHJvdGVjdGVkIGFkZFJvdygpIHtcbiAgICAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS5hZGRSb3coKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVtb3ZlUm93KHJvdzogTWF0cml4RHluYW1pY1Jvd01vZGVsKSB7XG4gICAgdmFyIHJvd3MgPSAoPFF1ZXN0aW9uTWF0cml4RHluYW1pYz50aGlzLnF1ZXN0aW9uKS52aXNpYmxlUm93cztcbiAgICB2YXIgaW5kZXggPSByb3dzLmluZGV4T2Yocm93KTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgKDxRdWVzdGlvbk1hdHJpeER5bmFtaWM+dGhpcy5xdWVzdGlvbikucmVtb3ZlUm93VUkoaW5kZXgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25NYXRyaXhEeW5hbWljIGV4dGVuZHMgUXVlc3Rpb25NYXRyaXhEeW5hbWljTW9kZWwge1xuICBrb0NlbGxBZnRlclJlbmRlcjogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uTWF0cml4RHluYW1pY0ltcGxlbWVudG9yKHRoaXMpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwibWF0cml4ZHluYW1pY1wiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvbk1hdHJpeER5bmFtaWMoXCJcIik7XG59KTtcblxuUXVlc3Rpb25GYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyUXVlc3Rpb24oXCJtYXRyaXhkeW5hbWljXCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk1hdHJpeER5bmFtaWMobmFtZSk7XG4gIHEuY2hvaWNlcyA9IFsxLCAyLCAzLCA0LCA1XTtcbiAgcS5yb3dDb3VudCA9IDI7XG4gIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UuYWRkRGVmYXVsdENvbHVtbnMocSk7XG4gIHJldHVybiBxO1xufSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMva25vY2tvdXQva29xdWVzdGlvbl9tYXRyaXhkeW5hbWljLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQge1xuICBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsLFxuICBNdWx0aXBsZVRleHRJdGVtTW9kZWxcbn0gZnJvbSBcIi4uL3F1ZXN0aW9uX211bHRpcGxldGV4dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uVGV4dCB9IGZyb20gXCIuL2tvcXVlc3Rpb25fdGV4dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tIFwiLi4vcXVlc3Rpb25cIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVUZXh0SXRlbSBleHRlbmRzIE11bHRpcGxlVGV4dEl0ZW1Nb2RlbCB7XG4gIHByaXZhdGUgaXNLT1ZhbHVlVXBkYXRpbmcgPSBmYWxzZTtcbiAga29WYWx1ZTogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogYW55ID0gbnVsbCwgdGl0bGU6IHN0cmluZyA9IG51bGwpIHtcbiAgICBzdXBlcihuYW1lLCB0aXRsZSk7XG4gICAgdGhpcy5rb1ZhbHVlID0ga28ub2JzZXJ2YWJsZSh0aGlzLnZhbHVlKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5rb1ZhbHVlLnN1YnNjcmliZShmdW5jdGlvbihuZXdWYWx1ZSkge1xuICAgICAgaWYgKCFzZWxmLmlzS09WYWx1ZVVwZGF0aW5nKSB7XG4gICAgICAgIHNlbGYudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlRWRpdG9yKG5hbWU6IHN0cmluZyk6IFF1ZXN0aW9uVGV4dE1vZGVsIHtcbiAgICByZXR1cm4gbmV3IFF1ZXN0aW9uVGV4dChuYW1lKTtcbiAgfVxuICBvblZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc0tPVmFsdWVVcGRhdGluZyA9IHRydWU7XG4gICAgdGhpcy5rb1ZhbHVlKG5ld1ZhbHVlKTtcbiAgICB0aGlzLmlzS09WYWx1ZVVwZGF0aW5nID0gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0SW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAga29Sb3dzOiBhbnk7XG4gIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBRdWVzdGlvbikge1xuICAgIHN1cGVyKHF1ZXN0aW9uKTtcbiAgICB0aGlzLmtvUm93cyA9IGtvLm9ic2VydmFibGVBcnJheShcbiAgICAgICg8UXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbD50aGlzLnF1ZXN0aW9uKS5nZXRSb3dzKClcbiAgICApO1xuICAgIHRoaXMucXVlc3Rpb25bXCJrb1Jvd3NcIl0gPSB0aGlzLmtvUm93cztcbiAgICB0aGlzLm9uQ29sQ291bnRDaGFuZ2VkKCk7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICg8UXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbD50aGlzXG4gICAgICAucXVlc3Rpb24pLmNvbENvdW50Q2hhbmdlZENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9uQ29sQ291bnRDaGFuZ2VkKCk7XG4gICAgfTtcbiAgfVxuICBwcm90ZWN0ZWQgb25Db2xDb3VudENoYW5nZWQoKSB7XG4gICAgdGhpcy5rb1Jvd3MoKDxRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsPnRoaXMucXVlc3Rpb24pLmdldFJvd3MoKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uTXVsdGlwbGVUZXh0IGV4dGVuZHMgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25NdWx0aXBsZVRleHRJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgY3JlYXRlVGV4dEl0ZW0obmFtZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsIHtcbiAgICByZXR1cm4gbmV3IE11bHRpcGxlVGV4dEl0ZW0obmFtZSwgdGl0bGUpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwibXVsdGlwbGV0ZXh0aXRlbVwiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBNdWx0aXBsZVRleHRJdGVtKFwiXCIpO1xufSk7XG5cbkpzb25PYmplY3QubWV0YURhdGEub3ZlcnJpZGVDbGFzc0NyZWF0b3JlKFwibXVsdGlwbGV0ZXh0XCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uTXVsdGlwbGVUZXh0KFwiXCIpO1xufSk7XG5cblF1ZXN0aW9uRmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlclF1ZXN0aW9uKFwibXVsdGlwbGV0ZXh0XCIsIG5hbWUgPT4ge1xuICB2YXIgcSA9IG5ldyBRdWVzdGlvbk11bHRpcGxlVGV4dChuYW1lKTtcbiAgcS5hZGRJdGVtKFwidGV4dDFcIik7XG4gIHEuYWRkSXRlbShcInRleHQyXCIpO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fbXVsdGlwbGV0ZXh0LnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlFbGVtZW50IH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCB7IEpzb25PYmplY3QgfSBmcm9tIFwiLi4vanNvbm9iamVjdFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25GYWN0b3J5IH0gZnJvbSBcIi4uL3F1ZXN0aW9uZmFjdG9yeVwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7XG4gIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwsXG4gIFF1ZXN0aW9uUGFuZWxEeW5hbWljSXRlbVxufSBmcm9tIFwiLi4vcXVlc3Rpb25fcGFuZWxkeW5hbWljXCI7XG5pbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gXCIuLi9xdWVzdGlvblwiO1xuaW1wb3J0IHsgUGFuZWxNb2RlbCB9IGZyb20gXCIuLi9wYW5lbFwiO1xuaW1wb3J0IHsgUGFuZWwgfSBmcm9tIFwiLi9rb3BhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUGFuZWxEeW5hbWljSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAga29QYW5lbHM6IGFueTtcbiAga29SZWNhbGM6IGFueTtcbiAga29BZGRQYW5lbENsaWNrOiBhbnk7XG4gIGtvUmVtb3ZlUGFuZWxDbGljazogYW55O1xuICBrb1ByZXZQYW5lbENsaWNrOiBhbnk7XG4gIGtvTmV4dFBhbmVsQ2xpY2s6IGFueTtcbiAga29DYW5BZGRQYW5lbDogYW55O1xuICBrb0NhblJlbW92ZVBhbmVsOiBhbnk7XG4gIGtvUGFuZWw6IGFueTtcbiAga29Jc0xpc3Q6IGFueTtcbiAga29Jc1Byb2dyZXNzVG9wOiBhbnk7XG4gIGtvSXNQcm9ncmVzc0JvdHRvbTogYW55O1xuICBrb0lzTmV4dEJ1dHRvbjogYW55O1xuICBrb0lzUHJldkJ1dHRvbjogYW55O1xuICBrb0lzUmFuZ2U6IGFueTtcbiAga29SYW5nZVZhbHVlOiBhbnk7XG4gIGtvUmFuZ2VNYXg6IGFueTtcbiAgY29uc3RydWN0b3IocXVlc3Rpb246IFF1ZXN0aW9uKSB7XG4gICAgc3VwZXIocXVlc3Rpb24pO1xuICAgIHRoaXMua29SZWNhbGMgPSBrby5vYnNlcnZhYmxlKDApO1xuICAgIHRoaXMua29QYW5lbHMgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5wYW5lbHM7XG4gICAgfSwgdGhpcyk7XG5cbiAgICB0aGlzLnF1ZXN0aW9uW1wia29QYW5lbHNcIl0gPSB0aGlzLmtvUGFuZWxzO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvQWRkUGFuZWxDbGljayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5hZGRQYW5lbCgpO1xuICAgIH07XG4gICAgdGhpcy5rb1JlbW92ZVBhbmVsQ2xpY2sgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICBzZWxmLnJlbW92ZVBhbmVsKGRhdGEpO1xuICAgIH07XG4gICAgdGhpcy5rb1ByZXZQYW5lbENsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmN1cnJlbnRJbmRleC0tO1xuICAgIH07XG4gICAgdGhpcy5rb05leHRQYW5lbENsaWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmN1cnJlbnRJbmRleCsrO1xuICAgIH07XG5cbiAgICB0aGlzLmtvQ2FuQWRkUGFuZWwgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz5zZWxmLnF1ZXN0aW9uKS5jYW5BZGRQYW5lbDtcbiAgICB9KTtcbiAgICB0aGlzLmtvQ2FuUmVtb3ZlUGFuZWwgPSBrby5wdXJlQ29tcHV0ZWQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLmtvUmVjYWxjKCk7XG4gICAgICByZXR1cm4gKDxRdWVzdGlvblBhbmVsRHluYW1pYz5zZWxmLnF1ZXN0aW9uKS5jYW5SZW1vdmVQYW5lbDtcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNQcmV2QnV0dG9uID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuaXNQcmV2QnV0dG9uU2hvd2luZztcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNOZXh0QnV0dG9uID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuaXNOZXh0QnV0dG9uU2hvd2luZztcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNSYW5nZSA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmlzUmFuZ2VTaG93aW5nO1xuICAgIH0pO1xuICAgIHRoaXMua29QYW5lbCA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmN1cnJlbnRQYW5lbDtcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNMaXN0ID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuaXNSZW5kZXJNb2RlTGlzdDtcbiAgICB9KTtcbiAgICB0aGlzLmtvSXNQcm9ncmVzc1RvcCA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmlzUHJvZ3Jlc3NUb3BTaG93aW5nO1xuICAgIH0pO1xuICAgIHRoaXMua29Jc1Byb2dyZXNzQm90dG9tID0ga28ucHVyZUNvbXB1dGVkKGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5rb1JlY2FsYygpO1xuICAgICAgcmV0dXJuICg8UXVlc3Rpb25QYW5lbER5bmFtaWM+c2VsZi5xdWVzdGlvbikuaXNQcm9ncmVzc0JvdHRvbVNob3dpbmc7XG4gICAgfSk7XG5cbiAgICB0aGlzLmtvUmFuZ2VWYWx1ZSA9IGtvLm9ic2VydmFibGUoXG4gICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmN1cnJlbnRJbmRleFxuICAgICk7XG4gICAgdGhpcy5rb1JhbmdlVmFsdWUuc3Vic2NyaWJlKGZ1bmN0aW9uKG5ld1ZhbHVlKSB7XG4gICAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLmN1cnJlbnRJbmRleCA9IG5ld1ZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMua29SYW5nZU1heCA9IGtvLnB1cmVDb21wdXRlZChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYua29SZWNhbGMoKTtcbiAgICAgIHJldHVybiAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnNlbGYucXVlc3Rpb24pLnBhbmVsQ291bnQgLSAxO1xuICAgIH0pO1xuXG4gICAgdGhpcy5xdWVzdGlvbltcImtvQWRkUGFuZWxDbGlja1wiXSA9IHRoaXMua29BZGRQYW5lbENsaWNrO1xuICAgIHRoaXMucXVlc3Rpb25bXCJrb1JlbW92ZVBhbmVsQ2xpY2tcIl0gPSB0aGlzLmtvUmVtb3ZlUGFuZWxDbGljaztcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29QcmV2UGFuZWxDbGlja1wiXSA9IHRoaXMua29QcmV2UGFuZWxDbGljaztcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29OZXh0UGFuZWxDbGlja1wiXSA9IHRoaXMua29OZXh0UGFuZWxDbGljaztcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29DYW5BZGRQYW5lbFwiXSA9IHRoaXMua29DYW5BZGRQYW5lbDtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29DYW5SZW1vdmVQYW5lbFwiXSA9IHRoaXMua29DYW5SZW1vdmVQYW5lbDtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29QYW5lbFwiXSA9IHRoaXMua29QYW5lbDtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29Jc0xpc3RcIl0gPSB0aGlzLmtvSXNMaXN0O1xuICAgIHRoaXMucXVlc3Rpb25bXCJrb0lzUHJvZ3Jlc3NUb3BcIl0gPSB0aGlzLmtvSXNQcm9ncmVzc1RvcDtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29Jc1Byb2dyZXNzQm90dG9tXCJdID0gdGhpcy5rb0lzUHJvZ3Jlc3NCb3R0b207XG4gICAgdGhpcy5xdWVzdGlvbltcImtvSXNQcmV2QnV0dG9uXCJdID0gdGhpcy5rb0lzUHJldkJ1dHRvbjtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29Jc05leHRCdXR0b25cIl0gPSB0aGlzLmtvSXNOZXh0QnV0dG9uO1xuICAgIHRoaXMucXVlc3Rpb25bXCJrb0lzUmFuZ2VcIl0gPSB0aGlzLmtvSXNSYW5nZTtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29SYW5nZVZhbHVlXCJdID0gdGhpcy5rb1JhbmdlVmFsdWU7XG4gICAgdGhpcy5xdWVzdGlvbltcImtvUmFuZ2VNYXhcIl0gPSB0aGlzLmtvUmFuZ2VNYXg7XG5cbiAgICB0aGlzLnF1ZXN0aW9uW1wia29QYW5lbEFmdGVyUmVuZGVyXCJdID0gZnVuY3Rpb24oZWwsIGNvbikge1xuICAgICAgc2VsZi5wYW5lbEFmdGVyUmVuZGVyKGVsLCBjb24pO1xuICAgIH07XG4gICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzXG4gICAgICAucXVlc3Rpb24pLnBhbmVsQ291bnRDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25QYW5lbENvdW50Q2hhbmdlZCgpO1xuICAgIH07XG4gICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzXG4gICAgICAucXVlc3Rpb24pLnJlbmRlck1vZGVDaGFuZ2VkQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYub25SZW5kZXJNb2RlQ2hhbmdlZCgpO1xuICAgIH07XG4gICAgKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzXG4gICAgICAucXVlc3Rpb24pLmN1cnJlbnRJbmRleENoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vbkN1cnJlbnRJbmRleENoYW5nZWQoKTtcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBvblBhbmVsQ291bnRDaGFuZ2VkKCkge1xuICAgIHRoaXMub25DdXJyZW50SW5kZXhDaGFuZ2VkKCk7XG4gIH1cbiAgcHJvdGVjdGVkIG9uUmVuZGVyTW9kZUNoYW5nZWQoKSB7XG4gICAgdGhpcy5vbkN1cnJlbnRJbmRleENoYW5nZWQoKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25DdXJyZW50SW5kZXhDaGFuZ2VkKCkge1xuICAgIHRoaXMua29SZWNhbGModGhpcy5rb1JlY2FsYygpICsgMSk7XG4gICAgdGhpcy5rb1JhbmdlVmFsdWUoKDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uKS5jdXJyZW50SW5kZXgpO1xuICB9XG4gIHByb3RlY3RlZCBhZGRQYW5lbCgpIHtcbiAgICAoPFF1ZXN0aW9uUGFuZWxEeW5hbWljPnRoaXMucXVlc3Rpb24pLmFkZFBhbmVsVUkoKTtcbiAgfVxuICBwcm90ZWN0ZWQgcmVtb3ZlUGFuZWwodmFsOiBhbnkpIHtcbiAgICB2YXIgcSA9IDxRdWVzdGlvblBhbmVsRHluYW1pYz50aGlzLnF1ZXN0aW9uO1xuICAgIGlmICghcS5pc1JlbmRlck1vZGVMaXN0KSB7XG4gICAgICB2YWwgPSBxLmN1cnJlbnRQYW5lbDtcbiAgICB9XG4gICAgcS5yZW1vdmVQYW5lbFVJKHZhbCk7XG4gIH1cbiAgcHJpdmF0ZSBwYW5lbEFmdGVyUmVuZGVyKGVsZW1lbnRzLCBjb24pIHtcbiAgICBpZiAoIXRoaXMucXVlc3Rpb24gfHwgIXRoaXMucXVlc3Rpb24uc3VydmV5KSByZXR1cm47XG4gICAgdmFyIGVsID0gU3VydmV5RWxlbWVudC5HZXRGaXJzdE5vblRleHRFbGVtZW50KGVsZW1lbnRzKTtcbiAgICB0aGlzLnF1ZXN0aW9uLnN1cnZleS5hZnRlclJlbmRlclBhbmVsKGNvbiwgZWwpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVzdGlvblBhbmVsRHluYW1pYyBleHRlbmRzIFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWwge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobmFtZSk7XG4gICAgbmV3IFF1ZXN0aW9uUGFuZWxEeW5hbWljSW1wbGVtZW50b3IodGhpcyk7XG4gIH1cbiAgcHJvdGVjdGVkIGNyZWF0ZU5ld1BhbmVsT2JqZWN0KCk6IFBhbmVsTW9kZWwge1xuICAgIHJldHVybiBuZXcgUGFuZWwoKTtcbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLm92ZXJyaWRlQ2xhc3NDcmVhdG9yZShcInBhbmVsZHluYW1pY1wiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pYyhcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInBhbmVsZHluYW1pY1wiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblBhbmVsRHluYW1pYyhuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCB9IGZyb20gXCIuLi9xdWVzdGlvbl9yYWRpb2dyb3VwXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uQ2hlY2tib3hCYXNlSW1wbGVtZW50b3IgfSBmcm9tIFwiLi9rb3F1ZXN0aW9uX2Jhc2VzZWxlY3RcIjtcblxuZXhwb3J0IGNsYXNzIFF1ZXN0aW9uUmFkaW9ncm91cCBleHRlbmRzIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKG5hbWUpO1xuICAgIG5ldyBRdWVzdGlvbkNoZWNrYm94QmFzZUltcGxlbWVudG9yKHRoaXMpO1xuICB9XG4gIGdldEl0ZW1DbGFzcyhpdGVtKSB7XG4gICAgdmFyIGl0ZW1DbGFzcyA9XG4gICAgICB0aGlzLmNzc0NsYXNzZXMuaXRlbSArXG4gICAgICAodGhpcy5jb2xDb3VudCA9PT0gMCA/IFwiIHN2X3FfcmFkaW9ncm91cF9pbmxpbmVcIiA6IFwiXCIpO1xuICAgIGlmIChpdGVtLnZhbHVlID09PSB0aGlzW1wia29WYWx1ZVwiXSgpKSBpdGVtQ2xhc3MgKz0gXCIgY2hlY2tlZFwiO1xuICAgIHJldHVybiBpdGVtQ2xhc3M7XG4gIH1cbn1cblxuSnNvbk9iamVjdC5tZXRhRGF0YS5vdmVycmlkZUNsYXNzQ3JlYXRvcmUoXCJyYWRpb2dyb3VwXCIsIGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFF1ZXN0aW9uUmFkaW9ncm91cChcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhZGlvZ3JvdXBcIiwgbmFtZSA9PiB7XG4gIHZhciBxID0gbmV3IFF1ZXN0aW9uUmFkaW9ncm91cChuYW1lKTtcbiAgcS5jaG9pY2VzID0gUXVlc3Rpb25GYWN0b3J5LkRlZmF1bHRDaG9pY2VzO1xuICByZXR1cm4gcTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcmFkaW9ncm91cC50cyIsImltcG9ydCAqIGFzIGtvIGZyb20gXCJrbm9ja291dFwiO1xuaW1wb3J0IHsgUXVlc3Rpb25JbXBsZW1lbnRvciB9IGZyb20gXCIuL2tvcXVlc3Rpb25cIjtcbmltcG9ydCB7IFF1ZXN0aW9uUmF0aW5nTW9kZWwgfSBmcm9tIFwiLi4vcXVlc3Rpb25fcmF0aW5nXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4uL2pzb25vYmplY3RcIjtcbmltcG9ydCB7IFF1ZXN0aW9uRmFjdG9yeSB9IGZyb20gXCIuLi9xdWVzdGlvbmZhY3RvcnlcIjtcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSBcIi4uL3F1ZXN0aW9uXCI7XG5cbmNsYXNzIFF1ZXN0aW9uUmF0aW5nSW1wbGVtZW50b3IgZXh0ZW5kcyBRdWVzdGlvbkltcGxlbWVudG9yIHtcbiAga29WaXNpYmxlUmF0ZVZhbHVlczogYW55O1xuICBrb0NoYW5nZTogYW55O1xuICBrb0NzczogYW55O1xuICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogUXVlc3Rpb24pIHtcbiAgICBzdXBlcihxdWVzdGlvbik7XG4gICAgdGhpcy5rb1Zpc2libGVSYXRlVmFsdWVzID0ga28ub2JzZXJ2YWJsZUFycmF5KHRoaXMuZ2V0VmFsdWVzKCkpO1xuICAgIHRoaXMucXVlc3Rpb25bXCJrb1Zpc2libGVSYXRlVmFsdWVzXCJdID0gdGhpcy5rb1Zpc2libGVSYXRlVmFsdWVzO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmtvQ2hhbmdlID0gZnVuY3Rpb24odmFsKSB7XG4gICAgICBzZWxmLmtvVmFsdWUodmFsLml0ZW1WYWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29DaGFuZ2VcIl0gPSB0aGlzLmtvQ2hhbmdlO1xuICAgICg8UXVlc3Rpb25SYXRpbmc+dGhpcy5xdWVzdGlvbikucmF0ZVZhbHVlc0NoYW5nZWRDYWxsYmFjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5vblJhdGVWYWx1ZXNDaGFuZ2VkKCk7XG4gICAgfTtcbiAgICB0aGlzLnF1ZXN0aW9uW1wia29HZXRDc3NcIl0gPSBmdW5jdGlvbih2YWwpIHtcbiAgICAgIHZhciBjc3MgPSAoPFF1ZXN0aW9uUmF0aW5nPnNlbGYucXVlc3Rpb24pLml0ZW1Dc3M7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSAoPFF1ZXN0aW9uUmF0aW5nPnNlbGYucXVlc3Rpb24pLnNlbGVjdGVkQ3NzO1xuICAgICAgcmV0dXJuIHNlbGYucXVlc3Rpb25bXCJrb1ZhbHVlXCJdKCkgPT0gdmFsLnZhbHVlXG4gICAgICAgID8gY3NzICsgXCIgXCIgKyBzZWxlY3RlZFxuICAgICAgICA6IGNzcztcbiAgICB9O1xuICB9XG4gIHByb3RlY3RlZCBvblJhdGVWYWx1ZXNDaGFuZ2VkKCkge1xuICAgIHRoaXMua29WaXNpYmxlUmF0ZVZhbHVlcyh0aGlzLmdldFZhbHVlcygpKTtcbiAgfVxuICBwcml2YXRlIGdldFZhbHVlcygpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gKDxRdWVzdGlvblJhdGluZz50aGlzLnF1ZXN0aW9uKS52aXNpYmxlUmF0ZVZhbHVlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlc3Rpb25SYXRpbmcgZXh0ZW5kcyBRdWVzdGlvblJhdGluZ01vZGVsIHtcbiAgcHVibGljIGl0ZW1Dc3M6IHN0cmluZztcbiAgcHVibGljIHNlbGVjdGVkQ3NzOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihuYW1lKTtcbiAgICBuZXcgUXVlc3Rpb25SYXRpbmdJbXBsZW1lbnRvcih0aGlzKTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TZXREYXRhKCkge1xuICAgIHZhciBjc3MgPSB0aGlzLnN1cnZleSA/IHRoaXMuc3VydmV5W1wiY3NzXCJdIDogbnVsbDtcbiAgICBpZiAoY3NzICYmIGNzcy5yYXRpbmcpIHtcbiAgICAgIHRoaXMuaXRlbUNzcyA9IGNzcy5yYXRpbmcuaXRlbTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDc3MgPSBjc3MucmF0aW5nLnNlbGVjdGVkO1xuICAgIH1cbiAgfVxufVxuXG5Kc29uT2JqZWN0Lm1ldGFEYXRhLm92ZXJyaWRlQ2xhc3NDcmVhdG9yZShcInJhdGluZ1wiLCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblJhdGluZyhcIlwiKTtcbn0pO1xuXG5RdWVzdGlvbkZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJRdWVzdGlvbihcInJhdGluZ1wiLCBuYW1lID0+IHtcbiAgcmV0dXJuIG5ldyBRdWVzdGlvblJhdGluZyhuYW1lKTtcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2tub2Nrb3V0L2tvcXVlc3Rpb25fcmF0aW5nLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBhcmFiaWNTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi2KfZhNiz2KfYqNmCXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLYp9mE2KrYp9mE2YpcIixcbiAgY29tcGxldGVUZXh0OiBcItin2YbZh9in2KEtINiq2YVcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcInsxfSDYtdmB2K3YqSB7MH0g2YXZhlwiLFxuICBvdGhlckl0ZW1UZXh0OiBcItmG2LUg2KLYrtixXCIsXG4gIGVtcHR5U3VydmV5OiBcItmE2Kcg2KrZiNis2K8g2LXZgdit2Kkg2YXYsdim2YrYqSDYo9mIINiz2KTYp9mEINmB2Yog2KfZhNmF2LPYrVwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIti02YPYsdinINmE2YMg2YTYp9iz2KrZg9mF2KfZhCDYp9mE2KfYs9iq2KjZitin2YYhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiLi4u2YrYqtmFINiq2K3ZhdmK2YQg2KfZhNin2LPYqtio2YrYp9mGXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIi4uLtin2K7YqtixXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiLtmK2LHYrNmJINin2YTYpdis2KfYqNipINi52YTZiSDYp9mE2LPYpNin2YRcIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLZitix2KzZiSDYp9mE2KXYrNin2KjYqSDYudmE2Ykg2KfZhNij2LPYptmE2Kkg2YHZiiDYrNmF2YrYuSDYp9mE2LXZgdmI2YFcIixcbiAgbnVtZXJpY0Vycm9yOiBcItmK2KzYqCDYo9mGINiq2YPZiNmGINin2YTZgtmK2YXYqSDYp9mE2LHZgtmF2YrYqS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLYp9mE2LHYrNin2KEg2KXYr9iu2KfZhCDZhdinINmE2Kcg2YrZgtmEINi52YYgezB9INit2LHZgVwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcItin2YTYsdis2KfYoSDYpdiv2K7Yp9mEINij2YLZhCDZhdmGIHswfSDYrdix2YFcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLZitix2KzZiSDYpdiv2K7Yp9mEINij2YPYq9ixINmF2YYgezB9INmI2KPZgtmEINmF2YYgezF9INit2LHZgVwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItmK2LHYrNmJINmF2YTYoSDZhdinINmE2Kcg2YrZgtmEINi52YYgezB9INin2YTYtdmB2YjZgVwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLZitix2KzZiSDYqtit2K/ZitivINmF2Kcg2YTYpyDZitmC2YQg2LnZhiB7MH0g2KfZhNmF2KrYutmK2LHYp9iqXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcItmK2LHYrNmJINiq2K3Yr9mK2K8g2YXYpyDZhNinINmK2LLZitivINi52YYgezB9INin2YTZhdiq2LrZitix2KfYqlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwi2YgnezB9JyDZitis2Kgg2KPZhiDYqtmD2YjZhiDZhdiz2KfZiNmK2Kkg2KPZiCDYo9mD2KvYsSDZhdmGIHsxfSDZiNmK2LPYp9mI2Yog2KPZiCDYo9mC2YQg2YXZhiB7Mn3Yp1wiLFxuICBudW1lcmljTWluOiBcItmIJ3swfScg2YrYrNioINij2YYg2KrZg9mI2YYg2YXYs9in2YjZitipINij2Ygg2KPZg9ir2LEg2YXZhiB7MX3Yp1wiLFxuICBudW1lcmljTWF4OiBcItmIJ3swfScg2YrYrNioINij2YYg2KrZg9mI2YYg2YXYs9in2YjZitipINij2Ygg2KPZgtmEINmF2YYgezF92KdcIixcbiAgaW52YWxpZEVtYWlsOiBcItix2KzYp9ihINmC2YUg2KjYpdiv2K7Yp9mEINio2LHZitivINin2YTZg9iq2LHZiNmG2Yog2LXYrdmK2K1cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIti32YTYqCDYpdix2KzYp9i5INiu2LfYoyAnezB9Jy4gezF92KdcIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIti52KfYryDYt9mE2Kgg2KjZitin2YbYp9iqINmB2KfYsdi62Kkg2KPZiCAn2KfZhNmF2LPYp9ixJyDZhdmF2KrZhNmD2KfYqiDYutmK2LEg2LXYrdmK2K3YqSBcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLZiNmK2YbYqNi62Yog2KPZhNinINmK2KrYrNin2YjYsiDYrdis2YUg2KfZhNmF2YTZgSB7MH3Yp1wiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwi2KfZhNix2KzYp9ihINil2K/Yrtin2YQg2YLZitmF2Kkg2KPYrtix2YlcIixcbiAgdXBsb2FkaW5nRmlsZTogXCLYp9mE2YXZhNmBINin2YTYrtin2LUg2KjZgyDYqtit2YXZitmELiDZitix2KzZiSDYp9mE2KfZhtiq2LjYp9ixINi52K/YqSDYq9mI2KfZhiDZiNit2KfZiNmEINmF2LHYqSDYo9iu2LHZiVwiLFxuICBhZGRSb3c6IFwi2KfYttin2YHYqSDYtdmBXCIsXG4gIHJlbW92ZVJvdzogXCLYpdiy2KfZhNipINi12YFcIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJhclwiXSA9IGFyYWJpY1N1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2FyYWJpYy50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgY2F0YWxhblN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBbnRlcmlvclwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU2Vnw7xlbnRcIixcbiAgY29tcGxldGVUZXh0OiBcIkNvbXBsZXRcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJVbiBhbHRyZSAoZGVzY3JpZ3VpKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUMOgZ2luYSB7MH0gZGUgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIk5vIGhpIGhhIGNhcCBww6BnaW5hIHZpc2libGUgbyBwcmVndW50YSBhIGwnZW5xdWVzdGEuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiR3LDoGNpZXMgcGVyIGNvbXBsZXRhciBsJ2VucXVlc3RhIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkwnZW5xdWVzdGEgcydlc3TDoCBjYXJyZWdhbnQgLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNlbGVjY2lvbmEgLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiU2kgdXMgcGxhdSBjb250ZXN0aSBsYSBwcmVndW50YS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJTaSB1cyBwbGF1IGNvbnRlc3RpIGxlcyBwcmVndW50ZXMgZGUgY2FkYSBmaWxlcmEuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJMJ2VzdGltYWNpw7MgaGEgZGUgc2VyIG51bcOocmljYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJTaSB1cyBwbGF1IGVudHJlIGFsbWVueXMgezB9IHPDrW1ib2xzLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlNpIHVzIHBsYXUgZW50cmUgbWVueXMgZGUgezB9IHPDrW1ib2xzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlNpIHVzIHBsYXUgZW50cmUgbcOpcyBkZSB7MH0gaSBtZW55cyBkZSB7MX0gc8OtbWJvbHMuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiU2kgdXMgcGxhdSBvbXBsaSBhbG1lbnlzIHswfSBmaWxlcmVzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTaSB1cyBwbGF1IHNlbGVjY2lvbmkgYWxtZW55cyB7MH0gdmFyaWFudHMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlNpIHVzIHBsYXUgc2VsZWNjaW9uaSBubyBtw6lzIGRlIHswfSB2YXJpYW50cy5cIixcbiAgbnVtZXJpY01pbk1heDogXCJFbCAnezB9JyBkZXUgc2VyIGlndWFsIG8gbcOpcyBkZSB7MX0gaSBpZ3VhbCBvIG1lbnlzIGRlIHsyfVwiLFxuICBudW1lcmljTWluOiBcIkVsICd7MH0nIGhhIGRlIHNlciBpZ3VhbCBvIG3DqXMgZGUgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiRWwgJ3swfScgaGEgZGUgc2VyIGlndWFsIG8gbWVueXMgZGUgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJTaSB1cyBwbGF1IGFmZWdpdSB1biBjb3JyZXUgZWxlY3Ryw7JuaWMgdsOgbGlkLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgc29swrdsaWNpdHVkIHZhIHRvcm5hciBlcnJvciAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIkxhIHNvbMK3bGljaXR1ZCB2YSB0b3JuYXIgYnVpZGEgZGUgZGF0ZXMgbyBsYSBwcm9waWV0YXQgJ3RyYWplY3TDsnJpYScgbm8gw6lzIGNvcnJlY3RhXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiTGEgbWlkYSBkZSBsJ2FyeGl1IG5vIHBvdCBleGNlZGlyIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlNpIHVzIHBsYXUgYWZlZ2l1IGwnYWx0cmEgZXN0aW1hY2nDsy5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkVsIHNldSBhcnhpdSBzJ2VzdMOgIHB1amFudC4gU2kgdXMgcGxhdSBlc3BlcmkgdW5zIHNlZ29ucyBpIGludGVudGV1LWhvIGRlIG5vdS5cIixcbiAgYWRkUm93OiBcIkFmZWdpdSB1bmEgZmlsZXJhXCIsXG4gIHJlbW92ZVJvdzogXCJFbGltaW5hciB1bmEgZmlsZXJhXCIsXG4gIGNob2ljZXNfZmlyc3RJdGVtOiBcInByaW1lciBhcnRpY2xlXCIsXG4gIGNob2ljZXNfc2Vjb25kSXRlbTogXCJzZWdvbiBhcnRpY2xlXCIsXG4gIGNob2ljZXNfdGhpcmRJdGVtOiBcInRlcmNlciBhcnRpY2xlXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sdW1uYVwiLFxuICBtYXRyaXhfcm93OiBcIkZpbGVyYVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImNhXCJdID0gY2F0YWxhblN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2NhdGFsYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGN6ZWNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlDFmWVkY2hvesOtXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJEYWzFocOtXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJIb3Rvdm9cIixcbiAgb3RoZXJJdGVtVGV4dDogXCJKaW7DoSBvZHBvdsSbxI8gKG5hcGnFoXRlKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU3RyYW5hIHswfSB6IHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJQcsWvemt1bXUgbmVvYnNhaHVqZSDFvsOhZG7DqSBvdMOhemt5LlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkTEm2t1amVtZSB6YSB2eXBsbsSbbsOtIHByxa96a3VtdSFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJQcm9iw61ow6EgbmHEjcOtdMOhbsOtIHByxa96a3VtdS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWeWJlci4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIk9kcG92xJt6dGUgcHJvc8OtbSBuYSBvdMOhemt1LlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIk9kcG92xJt6dGUgcHJvc8OtbSBuYSB2xaFlY2hueSBvdMOhemt5LlwiLFxuICBudW1lcmljRXJyb3I6IFwiViB0b210byBwb2xpIGx6ZSB6YWRhdCBwb3V6ZSDEjcOtc2xhLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gem5ha8WvLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSBtw6luxJsgbmXFviB7MH0gem5ha8WvLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlphZGVqdGUgcHJvc8OtbSB2w61jZSBuZcW+IHswfSBhIG3DqW7EmyBuZcW+IHsxfSB6bmFrxa8uXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVnlwbMWIdGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gxZnDoWRrxa8uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlZ5YmVydGUgcHJvc8OtbSBhbGVzcG/FiCB7MH0gdmFyaWFudHkuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk5ldnliw61yZWp0ZSBwcm9zw61tIHbDrWNlIG5lxb4gezB9IHZhcmlhbnQuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJPZHBvdsSbxI8gJ3swfScgYnkgbcSbbG8gYsO9dCB2xJt0xaHDrSBuZWJvIHJvdm5vIHsxfSBhIG1lbsWhw60gbmVibyByb3ZubyB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJPZHBvdsSbxI8gJ3swfScgYnkgbcSbbG8gYsO9dCB2xJt0xaHDrSBuZWJvIHJvdm5vIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIk9kcG92xJvEjyAnezB9JyBieSBtxJtsbyBiw710IG1lbsWhw60gbmVibyByb3ZubyB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlphZGVqdGUgcHJvc8OtbSBwbGF0bm91IGUtbWFpbG92b3UgYWRyZXN1LlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiUG/FvmFkYXZlayB2csOhdGlsIGNoeWJ1ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIlBvxb5hZGF2ZWsgbmV2csOhdGlsIGRhdGEgbmVibyBjZXN0YSBqZSBuZXBsYXRuw6FcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJWZWxpa29zdCBzb3Vib3J1IGJ5IG5lbcSbbGEgYsO9dCB2xJt0xaHDrSBuZcW+IHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlphZGVqdGUgcHJvc8OtbSBqaW5vdSBob2Rub3R1LlwiLFxuICB1cGxvYWRpbmdGaWxlOiBcIlbDocWhIHNvdWJvciBzZSBuYWhyw6F2w6EuIFprdXN0ZSB0byBwcm9zw61tIHphIG7Em2tvbGlrIHNla3VuZC5cIixcbiAgYWRkUm93OiBcIlDFmWlkYXQgxZnDoWRla1wiLFxuICByZW1vdmVSb3c6IFwiT2RzdHJhbml0XCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiY3pcIl0gPSBjemVjaFN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2N6ZWNoLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBkYW5pc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiVGlsYmFnZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVmlkZXJlXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJGw6ZyZGlnXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTaWRlIHswfSBhZiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiRGVyIGVyIGluZ2VuIHN5bmxpZ2Ugc3DDuHJnc23DpWwuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiTWFuZ2UgdGFrIGZvciBkaW4gYmVzdmFyZWxzZSFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJTcMO4cmdlc2tlbWFldCBoZW50ZXMgZnJhIHNlcnZlcmVuLi4uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiVmFsZ2ZyaXQgc3Zhci4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWw6ZsZy4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIkJlc3ZhciB2ZW5saWdzdCBzcMO4cmdzbcOlbGV0LlwiLFxuICBudW1lcmljRXJyb3I6IFwiQW5naXYgZXQgdGFsLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIkFuZ2l2IG1pbmRzdCB7MH0gdGVnbi5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiVsOmbGcgdmVubGlnc3QgbWluZHN0ICB7MH0gc3Zhcm11bGlnaGVkKGVyKS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVsOmbGcgdmVubGlnc3QgZsOmcnJlIHswfSBzdmFybXVsaWdoZWRlcihlcikuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBza2FsIHbDpnJlIGxpZyBtZWQgZWxsZXIgc3TDuHJyZSBlbmQgezF9IG9nIGxpZyBtZWQgZWxsZXIgbWluZHJlIGVuZCB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBza2FsIHbDpnJlIGxpZyBtZWQgZWxsZXIgc3TDuHJyZSBlbmQgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgc2thbCB2w6ZyZSBsaWcgbWVkIGVsbGVyIG1pbmRyZSBlbmQgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJBbmdpdiB2ZW5saWdzdCBlbiBneWxkaWcgZS1tYWlsIGFkcmVzc2UuXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRmlsc3TDuHJyZWxzZW4gbcOlIGlra2Ugb3ZlcnN0aWdlIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkFuZ2l2IGVuIHbDpnJkaSBmb3IgZGl0IHZhbGdmcmllIHN2YXIuXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiZGFcIl0gPSBkYW5pc2hTdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9kYW5pc2gudHMiLCIvL0NyZWF0ZWQgb24gYmVoYWxmIGh0dHBzOi8vZ2l0aHViLmNvbS9GcmFuazEzXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGR1dGNoU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlZvcmlnZVwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVm9sZ2VuZGVcIixcbiAgY29tcGxldGVUZXh0OiBcIkFmc2x1aXRlblwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkFuZGVyZVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSB2YW4gezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkVyIGlzIGdlZW4gemljaHRiYXJlIHBhZ2luYSBvZiB2cmFhZyBpbiBkZXplIHZyYWdlbmxpanN0XCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiQmVkYW5rdCBvbSBkZXplIHZyYWdlbmxpanN0IGluIHRlIHZ1bGxlblwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkRlIHZyYWdlbmxpanN0IGlzIGFhbiBoZXQgbGFkZW4uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiS2llcy4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIkdlbGlldmUgZWVuIGFudHdvb3JkIGluIHRlIHZ1bGxlblwiLFxuICBudW1lcmljRXJyb3I6IFwiSGV0IGFudHdvb3JkIG1vZXQgZWVuIGdldGFsIHppam5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJHZWxpZXZlIG1pbnN0ZW4gezB9IGthcmFrdGVycyBpbiB0ZSB2dWxsZW4uXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIkdlbGlldmUgbWluaW11bSB7MH0gYW50d29vcmRlbiB0ZSBzZWxlY3RlcmVuLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJHZWxpZXZlIG5pZXQgbWVlciBkYW4gezB9IGFudHdvb3JkZW4gdGUgc2VsZWN0ZXJlbi5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIlV3IGFudHdvb3JkICd7MH0nIG1vZXQgZ3JvdGVyIG9mIGdlbGlqayB6aWpuIGFhbiB7MX0gZW4ga2xlaW5lciBvZiBnZWxpamsgYWFuIHsyfVwiLFxuICBudW1lcmljTWluOiBcIlV3IGFudHdvb3JkICd7MH0nIG1vZXQgZ3JvdGVyIG9mIGdlbGlqayB6aWpuIGFhbiB7MX1cIixcbiAgbnVtZXJpY01heDogXCJVdyBhbnR3b29yZCAnezB9JyBtb2V0IGdyb3RlciBvZiBnZWxpamsgemlqbiBhYW4gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJHZWxpZXZlIGVlbiBnZWxkaWcgZS1tYWlsYWRyZXMgaW4gdGUgdnVsbGVuLlwiLFxuICBleGNlZWRNYXhTaXplOiBcIkRlIGdyb290dGUgdmFuIGhldCBiZXN0YW5kIG1hZyBuaWV0IGdyb3RlciB6aWpuIGRhbiB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJHZWxpZXZlIGhldCB2ZWxkICdBbmRlcmUnIGluIHRlIHZ1bGxlblwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcIm5sXCJdID0gZHV0Y2hTdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9kdXRjaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZmlubmlzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJFZGVsbGluZW5cIixcbiAgcGFnZU5leHRUZXh0OiBcIlNldXJhYXZhXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJWYWxtaXNcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJNdXUgKGt1dmFpbGUpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTaXZ1IHswfS97MX1cIixcbiAgZW1wdHlTdXJ2ZXk6XG4gICAgXCJUw6Rzc8OkIGt5c2VseXNzw6QgZWkgb2xlIHlodMOka8Okw6RuIG7DpGt5dmlsbMOkIG9sZXZhYSBzaXZ1YSB0YWkga3lzeW15c3TDpC5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJLaWl0b3Mga3lzZWx5eW4gdmFzdGFhbWlzZXN0YSFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJLeXNlbHnDpCBsYWRhdGFhbiBwYWx2ZWxpbWVsdGEuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiVmFsaXRzZS4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZhc3RhYSBreXN5bXlrc2Vlbiwga2lpdG9zLlwiLFxuICBudW1lcmljRXJyb3I6IFwiQXJ2b24gdHVsZWUgb2xsYSBudW1lZXJpbmVuLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIk9sZSBoeXbDpCBqYSBzecO2dMOkIHbDpGhpbnTDpMOkbiB7MH0gbWVya2tpw6QuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIk9sZSBoeXbDpCBqYSB2YWxpdHNlIHbDpGhpbnTDpMOkbiB7MH0gdmFpaHRvZWh0b2EuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIk9sZSBoeXbDpCBqYSB2YWxpdHNlIGVuaW50w6TDpG4gezB9IHZhaWh0b2VodG9hLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgdMOkeXR5eSBvbGxhIGVuZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsxfSBqYSB2w6RoZW1tw6RuIHRhaSB5aHTDpCBzdXVyaSBrdWluIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIHTDpHl0eXkgb2xsYSBlbmVtbcOkbiB0YWkgeWh0w6Qgc3V1cmkga3VpbiB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyB0w6R5dHl5IG9sbGEgdsOkaGVtbcOkbiB0YWkgeWh0w6Qgc3V1cmkga3VpbiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIlN5w7Z0w6QgdmFsaWRpIHPDpGhrw7Zwb3N0aW9zb2l0ZS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiAnT2xlIGh5dsOkIGphIHN5w7Z0w6QgXCJNdXUgKGt1dmFpbGUpXCInXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImZpXCJdID0gZmlubmlzaFN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2Zpbm5pc2gudHMiLCIvL0NyZWF0ZWQgb24gYmVoYWxmIGh0dHBzOi8vZ2l0aHViLmNvbS9GcmFuazEzXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGZyZW5jaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJQclxcdTAwZTljXFx1MDBlOWRlbnRcIixcbiAgcGFnZU5leHRUZXh0OiBcIlN1aXZhbnRcIixcbiAgY29tcGxldGVUZXh0OiBcIlRlcm1pbmVyXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQXV0cmUgKHByXFx1MDBlOWNpc2VyKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnZSB7MH0gc3VyIHsxfVwiLFxuICBlbXB0eVN1cnZleTpcbiAgICBcIklsIG4neSBhIG5pIHBhZ2UgdmlzaWJsZSBuaSBxdWVzdGlvbiB2aXNpYmxlIGRhbnMgY2UgcXVlc3Rpb25uYWlyZVwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIk1lcmNpIGQnYXZvaXIgclxcdTAwZTlwb25kdSBhdSBxdWVzdGlvbm5haXJlIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkxlIHF1ZXN0aW9ubmFpcmUgZXN0IGVuIGNvdXJzIGRlIGNoYXJnZW1lbnQuLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiQ2hvaXNpc3Nlei4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIkxhIHJcXHUwMGU5cG9uc2UgXFx1MDBlMCBjZXR0ZSBxdWVzdGlvbiBlc3Qgb2JsaWdhdG9pcmUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVG91dGVzIGxlcyBsaWduZXMgc29udCBvYmxpZ2F0b2lyZXNcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkxhIHJcXHUwMGU5cG9uc2UgZG9pdCBcXHUwMGVhdHJlIHVuIG5vbWJyZS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJNZXJjaSBkJ2VudHJlciBhdSBtb2lucyB7MH0gc3ltYm9sZXMuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIk1lcmNpIGRlIHNcXHUwMGU5bGVjdGlvbm5lciBhdSBtb2lucyB7MH1yXFx1MDBlOXBvbnNlcy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiTWVyY2kgZGUgc1xcdTAwZTlsZWN0aW9ubmVyIGF1IHBsdXMgezB9clxcdTAwZTlwb25zZXMuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCJWb3RyZSByXFx1MDBlOXBvbnNlICd7MH0nIGRvaXQgXFx1MDBlYXRyZXN1cFxcdTAwZTlyaWV1cmUgb3UgXFx1MDBlOWdhbGUgXFx1MDBlMCB7MX0gZXQgaW5mXFx1MDBlOXJpZXVyZSBvdVxcdTAwZTlnYWxlIFxcdTAwZTAgezJ9XCIsXG4gIG51bWVyaWNNaW46XG4gICAgXCJWb3RyZSByXFx1MDBlOXBvbnNlICd7MH0nIGRvaXQgXFx1MDBlYXRyZXN1cFxcdTAwZTlyaWV1cmUgb3UgXFx1MDBlOWdhbGUgXFx1MDBlMCB7MX1cIixcbiAgbnVtZXJpY01heDpcbiAgICBcIlZvdHJlIHJcXHUwMGU5cG9uc2UgJ3swfScgZG9pdCBcXHUwMGVhdHJlaW5mXFx1MDBlOXJpZXVyZSBvdSBcXHUwMGU5Z2FsZSBcXHUwMGUwIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiTWVyY2kgZCdlbnRyZXIgdW5lIGFkcmVzc2UgbWFpbCB2YWxpZGUuXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiTGEgdGFpbGxlIGR1IGZpY2hpZXIgbmUgZG9pdCBwYXMgZXhjXFx1MDBlOWRlciB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJNZXJjaSBkZSBwclxcdTAwZTljaXNlciBsZSBjaGFtcCAnQXV0cmUnLlwiXG59O1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmclwiXSA9IGZyZW5jaFN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2ZyZW5jaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgZ2VvcmdpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi4YOj4YOZ4YOQ4YOcXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLhg6jhg5Thg5vhg5Phg5Thg5JcIixcbiAgY29tcGxldGVUZXh0OiBcIuGDk+GDkOGDoeGDoOGDo+GDmuGDlOGDkeGDkFwiLFxuICBwcm9ncmVzc1RleHQ6IFwi4YOS4YOV4YOU4YOg4YOT4YOYIHswfSAvIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCLhg5Dhg6Dhg6rhg5Thg6Dhg5fhg5gg4YOZ4YOY4YOX4YOu4YOV4YOQIOGDkOGDoCDhg5Dhg6Dhg5jhg6EuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi4YOS4YOb4YOQ4YOT4YOa4YOd4YOR4YOXIOGDmeGDmOGDl+GDruGDleGDkOGDoOGDmOGDoSDhg6jhg5Thg5Xhg6Hhg5Thg5Hhg5jhg6Hhg5fhg5Xhg5jhg6EhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwi4YOp4YOQ4YOi4YOV4YOY4YOg4YOX4YOV4YOQIOGDoeGDlOGDoOGDleGDlOGDoOGDmOGDk+GDkOGDnC4uLlwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIuGDoeGDruGDleGDkCAo4YOS4YOX4YOu4YOd4YOV4YOXIOGDm+GDmOGDo+GDl+GDmOGDl+GDlOGDlylcIixcbiAgb3B0aW9uc0NhcHRpb246IFwi4YOQ4YOg4YOp4YOU4YOV4YOQLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDo+GDnuGDkOGDoeGDo+GDruGDlOGDlyDhg5nhg5jhg5fhg67hg5Xhg5Dhg6EuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLhg57hg5Dhg6Hhg6Phg67hg5gg4YOj4YOc4YOT4YOQIOGDmOGDp+GDneGDoSDhg6Dhg5jhg6rhg67hg5Xhg5guXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDqOGDlOGDmOGDp+GDleGDkOGDnOGDlOGDlyDhg5Dhg6Dhg5Dhg5zhg5Dhg5nhg5rhg5Thg5EgezB9IOGDoeGDmOGDm+GDkeGDneGDmuGDnS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDkOGDmOGDoOGDqeGDmOGDlOGDlyDhg5Dhg6Dhg5Dhg5zhg5Dhg5nhg5rhg5Thg5EgezB9IOGDleGDkOGDoOGDmOGDkOGDnOGDouGDmC5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi4YOS4YOX4YOu4YOd4YOV4YOXIOGDkOGDmOGDoOGDqeGDmOGDlOGDlyDhg5Dhg6Dhg5Dhg6Phg5vhg5Thg6Lhg5Thg6EgezB9IOGDleGDkOGDoOGDmOGDkOGDnOGDouGDmC5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIid7MH0nIOGDo+GDnOGDk+GDkCDhg5jhg6fhg53hg6Eg4YOb4YOU4YOi4YOYIOGDkOGDnCDhg6Lhg53hg5rhg5gsIOGDleGDmOGDk+GDoOGDlCB7MX0sIOGDk+GDkCDhg5zhg5Dhg5nhg5rhg5Thg5Hhg5gg4YOQ4YOcIOGDouGDneGDmuGDmCDhg5Xhg5jhg5Phg6Dhg5QgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg4YOj4YOc4YOT4YOQIOGDmOGDp+GDneGDoSDhg5vhg5Thg6Lhg5gg4YOQ4YOcIOGDouGDneGDmuGDmCDhg5Xhg5jhg5Phg6Dhg5QgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg4YOj4YOc4YOT4YOQIOGDmOGDp+GDneGDoSDhg5zhg5Dhg5nhg5rhg5Thg5Hhg5gg4YOQ4YOcIOGDouGDneGDmuGDmCDhg5Xhg5jhg5Phg6Dhg5QgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLhg5Lhg5fhg67hg53hg5Xhg5cg4YOo4YOU4YOY4YOn4YOV4YOQ4YOc4YOd4YOXIOGDlOGDmi4g4YOk4YOd4YOh4YOi4YOY4YOhIOGDoOGDlOGDkOGDmuGDo+GDoOGDmCDhg5vhg5jhg6Hhg5Dhg5vhg5Dhg6Dhg5fhg5guXCIsXG4gIG90aGVyUmVxdWlyZWRFcm9yOiBcIuGDkuGDl+GDruGDneGDleGDlyDhg6jhg5Thg5Dhg5Xhg6Hhg5Thg5cg4YOV4YOU4YOa4YOYICfhg6Hhg67hg5Xhg5AnXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wia2FcIl0gPSBnZW9yZ2lhblN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2dlb3JnaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBnZXJtYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiWnVyw7xja1wiLFxuICBwYWdlTmV4dFRleHQ6IFwiV2VpdGVyXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJBYnNlbmRlblwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2VpdGUgezB9IHZvbiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiRXMgZ2lidCBrZWluZSBzaWNodGJhcmUgRnJhZ2UuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiVmllbGVuIERhbmsgZsO8ciBkaWUgQmVhbnR3b3J0dW5nIGRlcyBGcmFnZWJvZ2VucyFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJEZXIgRnJhZ2Vib2dlbiB3aXJkIHZvbSBTZXJ2ZXIgZ2VsYWRlbi4uLlwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkJlbnV0emVyZGVmaW5pZXJ0ZSBBbnR3b3J0Li4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlfDpGhsZW4uLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJCaXR0ZSBiZWFudHdvcnRlbiBTaWUgZGllc2UgRnJhZ2UuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJEZXIgV2VydCBzb2xsdGUgZWluZSBaYWhsIHNlaW4uXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiQml0dGUgZ2ViZW4gU2llIG1pbmRlc3RlbnMgezB9IFplaWNoZW4gZWluLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJCaXR0ZSB3w6RobGVuIFNpZSBtaW5kZXN0ZW5zIHswfSBFaW50csOkZ2UuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIkJpdHRlIHfDpGhsZW4gU2llIG5pY2h0IG1laHIgYWxzIHswfSBFaW50csOkZ2UuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBzb2xsdGUgZ2xlaWNoIG9kZXIgZ3LDtsOfZXIgc2VpbiBhbHMgezF9IHVuZCBnbGVpY2ggb2RlciBrbGVpbmVyIGFscyB7Mn0uXCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgc29sbHRlIGdsZWljaCBvZGVyIGdyw7bDn2VyIHNlaW4gYWxzIHsxfS5cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBzb2xsdGUgZ2xlaWNoIG9kZXIga2xlaW5lciBhbHMgezF9IHNlaW4uXCIsXG4gIGludmFsaWRFbWFpbDogXCJCaXR0ZSBnZWJlbiBTaWUgZWluZSBnw7xsdGlnZSBFLU1haWwgQWRyZXNzZSBlaW4uXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRGllIERhdGVpZ3LDtsOfZSBkYXJmIHswfSBLQiBuaWNodCDDvGJlcnNjaHJlaXRlbi5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkJpdHRlIGdlYmVuIFNpZSBJaHJlIGJlbnV0emVyZGVmaW5pZXJ0ZSBBbnR3b3J0IGVpbi5cIlxufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJkZVwiXSA9IGdlcm1hblN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2dlcm1hbi50cyIsIi8vQ3JlYXRlZCBieSBodHRwczovL2dpdGh1Yi5jb20vYWdlbG9zcGFuYWdpb3Rha2lzXG5pbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGdyZWVrU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIs6gz4HOv863zrPOv8+NzrzOtc69zr9cIixcbiAgcGFnZU5leHRUZXh0OiBcIs6Vz4DPjM68zrXOvc6/XCIsXG4gIGNvbXBsZXRlVGV4dDogXCLOn867zr/Ous67zq7Pgc+Jz4POt1wiLFxuICBvdGhlckl0ZW1UZXh0OiBcIs6GzrvOu86/ICjPgM6xz4HOsc66zrHOu8+OIM60zrnOtc+FzrrPgc65zr3Or8+Dz4TOtSlcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIs6jzrXOu86vzrTOsSB7MH0gzrHPgM+MIHsxfVwiLFxuICBlbXB0eVN1cnZleTpcbiAgICBcIs6UzrXOvSDPhc+AzqzPgc+HzrXOuSDOus6xzrzOr86xIM6/z4HOsc+Ezq4gz4POtc67zq/OtM6xIM6uIM6/z4HOsc+Ezq4gzrXPgc+Oz4TOt8+Dzrcgz4POtSDOsc+Fz4TPjCDPhM6/IM61z4HPic+EzrfOvM6xz4TOv867z4zOs865zr8uXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6XG4gICAgXCLOlc+Fz4fOsc+BzrnPg8+Ezr/Pjc68zrUgzrPOuc6xIM+EzrfOvSDPg8+FzrzPgM67zq7Pgc+Jz4POtyDOsc+Fz4TOv8+FIM+Ezr/PhSDOtc+Bz4nPhM63zrzOsc+Ezr/Ou86/zrPOr86/z4UhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwizqTOvyDOtc+Bz4nPhM63zrzOsc+Ezr/Ou8+MzrPOuc6/IM+Gzr/Pgc+Ez47Ovc61z4TOsc65IM6xz4DOvyDPhM6/IM60zrnOsc66zr/OvM65z4PPhM6uLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIs6Vz4DOuc67zq3Ovs+EzrUuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM6xz4DOsc69z4TOrs+Dz4TOtSDPg8+EzrfOvSDOtc+Bz47PhM63z4POty5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjpcbiAgICBcIs6gzrHPgc6xzrrOsc67z44gzrHPgM6xzr3PhM6uz4PPhM61IM+Dz4TOuc+CIM61z4HPic+Ezq7Pg861zrnPgiDPg861IM+MzrvOtc+CIM+EzrnPgiDOs8+BzrHOvM68zq3Pgi5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIs6XIM+EzrnOvM6uIM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgzrHPgc65zrjOvM65z4TOuc66zq4uXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwizqDOsc+BzrHOus6xzrvPjiDPg8+FzrzPgM67zrfPgc+Oz4PPhM61IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM+Dz43OvM6yzr/Ou86xLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIs6gzrHPgc6xzrrOsc67z44gz4PPhc68z4DOu863z4HPjs+Dz4TOtSDPhM6/z4XOu86sz4fOuc+Dz4TOv869IHswfSDOs8+BzrHOvM68zq3Pgi5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwizqDOsc+BzrHOus6xzrvPjiDOtc+AzrnOu86tzr7PhM61IM+Ezr/Phc67zqzPh865z4PPhM6/zr0gezB9IM+AzrHPgc6xzrvOu86xzrPOrc+CLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM61z4DOuc67zq3Ovs+EzrUgz4zPh865IM+AzrHPgc6xz4DOrM69z4kgzrHPgM6/IHswfSDPgM6xz4HOsc67zrvOsc6zzq3Pgi5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIs6kzr8gJ3swfScgzrjOsSDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM6vz4POvyDOriDOvM61zrPOsc67z43PhM61z4HOvyDOsc+Azr8gz4TOvyB7MX0gzrrOsc65IM6vz4POvyDOriDOvM65zrrPgc+Mz4TOtc+Bzr8gzrHPgM6/IM+Ezr8gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwizqTOvyAnezB9JyDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM68zrXOs86xzrvPjc+EzrXPgc6/IM6uIM65z4POvyDOvM61IM+Ezr8gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwizqTOvyAnezB9JyDPgM+Bzq3PgM61zrkgzr3OsSDOtc6vzr3Osc65IM68zrnOus+Bz4zPhM61z4HOvyDOriDOr8+Dzr8gzrHPgM6/IM+Ezr8gezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLOoM6xz4HOsc66zrHOu8+OIM60z47Pg8+EzrUgzrzOuc6xIM6xz4DOv860zrXOus+Ezq4gzrTOuc61z43OuM+Fzr3Pg863IGUtbWFpbC5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIs6XIM6xzq/PhM63z4POtyDOtc+Azq3Pg8+Ez4HOtc+IzrUgz4PPhs6szrvOvM6xICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwizpcgzrHOr8+EzrfPg863IM61z4DOrc+Dz4TPgc61z4jOtSDOus61zr3OrCDOtM61zrTOv868zq3Ovc6xIM6uIM63IM65zrTPjM+EzrfPhM6xICfOvM6/zr3Ov8+AzqzPhM65L3BhdGgnIM61zq/Ovc6xzrkgzrXPg8+GzrHOu86tzrzOrc69zrdcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLOpM6/IM68zq3Os861zrjOv8+CIM60zrXOvSDOvM+Azr/Pgc61zq8gzr3OsSDPhc+AzrXPgc6yzq3Ovc61zrkgz4TOsSB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLOoM6xz4HOsc66zrHOu8+OIM+Dz4XOvM+AzrvOt8+Bz47Pg8+EzrUgz4TOt869IM+EzrnOvM6uIM6zzrnOsSDPhM6/IM+AzrXOtM6vzr8gJ86szrvOu86/Jy5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIs6kzr8gzrHPgc+HzrXOr86/IM+DzrHPgiDOsc69zrXOss6xzq/Ovc61zrkuIM6gzrHPgc6xzrrOsc67z44gz4DOtc+BzrnOvM6tzr3Otc+EzrUgzrrOsc+Azr/Ouc6xIM60zrXPhc+EzrXPgc+MzrvOtc+Az4TOsSDOus6xzrkgzrTOv866zrnOvM6sz4PPhM61IM6+zrHOvc6sLlwiLFxuICBhZGRSb3c6IFwizqDPgc6/z4POuM6uzrrOtyDOs8+BzrHOvM68zq7PglwiLFxuICByZW1vdmVSb3c6IFwizpHPhs6xzq/Pgc61z4POt1wiXG59O1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJnclwiXSA9IGdyZWVrU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vZ3JlZWsudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGhlYnJld1N1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLXkNeX15XXqNeUXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLXp9eT15nXnteUXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLXodeZ15XXnVwiLFxuICBwcm9ncmVzc1RleHQ6IFwi15PXoyB7MX0g157XqteV15ogezB9XCIsXG4gIGVtcHR5U3VydmV5OiBcIteQ15nXnyDXqdeQ15zXldeqXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi16rXldeT15Qg16LXnCDXnteZ15zXldeZINeU16nXkNec15XXnyFcIixcbiAgbG9hZGluZ1N1cnZleTogXCLXmNei15nXoNeUINee15TXqdeo16ouLi5cIixcbiAgb3RoZXJJdGVtVGV4dDogXCLXkNeX16ggKNeg15Ag15zXqteQ16gpXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIteR15fXqC4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIteQ16DXkCDXlNep15Eg16LXnCDXlNep15DXnNeUXCIsXG4gIG51bWVyaWNFcnJvcjogXCLXlNeq16nXldeR15Qg16bXqNeZ15vXlCDXnNeU15nXldeqINee16HXpNeoLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIteU15bXnyDXnNek15fXldeqIHswfSDXqteV15XXmdedLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCLXkdeX16gg15zXpNeX15XXqiB7MH0g15DXpNep16jXldeZ15XXqi5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi15HXl9eoINei15MgezB9INeQ16TXqdeo15XXmdeV16ouXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDXl9eZ15nXkSDXnNeU15nXldeqINep15XXldeUINeQ15Ug15LXk9eV15wg154gezF9LCDXldep15XXldeUINecLSB7Mn0g15DXlSDXpNeX15XXqiDXni0ge319XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg15fXmdeZ15Eg15zXlNeZ15XXqiDXqdeV15XXlCDXkNeVINeS15PXldecINeeIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nINeX15nXmdeRINec15TXmdeV16og16nXldeV15Qg15DXlSDXp9eY158g154gezF9XCIsXG4gIGludmFsaWRFbWFpbDogJ9eU15bXnyDXm9eq15XXkdeqINeT15XXkFwi15wg15fXlden15nXqi4nLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6ICfXoNeQINec15TXlteZ158g16DXqteV16DXmdedINeR16nXk9eUIFwi15DXl9eoXCInXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImhlXCJdID0gaGVicmV3U3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vaGVicmV3LnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBodW5nYXJpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiVmlzc3phXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJUb3bDoWJiXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJLw6lzelwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkVnecOpYiAoYWRqYSBtZWcpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJ7MH0uL3sxfSBvbGRhbFwiLFxuICBlbXB0eVN1cnZleTogXCJUaGVyZSBpcyBubyB2aXNpYmxlIHBhZ2Ugb3IgcXVlc3Rpb24gaW4gdGhlIHN1cnZleS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJLw7ZzesO2bmrDvGssIGhvZ3kga2l0w7ZsdMO2dHRlIGZlbG3DqXLDqXPDvG5rZXQhXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6IFwiTcOhciBraXTDtmx0w7Z0dGUgYSBmZWxtw6lyw6lzdC5cIixcbiAgbG9hZGluZ1N1cnZleTogXCJGZWxtw6lyw6lzIGJldMO2bHTDqXNlLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlbDoWxhc3N6b24uLi5cIixcbiAgdmFsdWU6IFwiw6lydMOpa1wiLFxuICByZXF1aXJlZEVycm9yOiBcIkvDqXJqw7xrLCB2w6FsYXN6b2xqYSBtZWcgZXp0IGEga8OpcmTDqXN0IVwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkvDqXJqw7xrIGFkam9uIHbDoWxhc3p0IG1pbmRlbiBzb3JiYW4hXCIsXG4gIG51bWVyaWNFcnJvcjogXCJBeiDDqXJ0w6lrIHN6w6FtIGtlbGwsIGhvZ3kgbGVneWVuIVwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIkFkam9uIG1lZyBsZWdhbMOhYmIgezB9IGthcmFrdGVydCFcIixcbiAgdGV4dE1heExlbmd0aDogXCJMZWdmZWxqZWJiIHswfSBrYXJha3RlcnQgYWRqb24gbWVnIVwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIkFkam9uIG1lZyBsZWdhbMOhYmIgezB9LCBkZSBsZWdmZWxqZWJiIHsxfSBrYXJha3RlcnQhXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiVMO2bHRzw7ZuIGtpIG1pbmltdW0gezB9IHNvcnQhXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIlbDoWxhc3N6b24ga2kgbGVnYWzDoWJiIHswfSBsZWhldMWRc8OpZ2V0IVwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJOZSB2w6FsYXNzem9uIHTDtmJiZXQsIG1pbnQgezB9IGxlaGV0xZFzw6lnIVwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgbGVneWVuIG5hZ3lvYmIsIHZhZ3kgZWd5ZW5sxZEsIG1pbnQgezF9IMOpcyBraXNlYmIsIHZhZ3kgZWd5ZW5sxZEsIG1pbnQgezJ9IVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGxlZ3llbiBsZWdhbMOhYmIgezF9IVwiLFxuICBudW1lcmljTWF4OiBcIlRoZSAnezB9JyBuZSBsZWd5ZW4gbmFneW9iYiwgbWludCB7MX0hXCIsXG4gIGludmFsaWRFbWFpbDogXCJBZGpvbiBtZWcgZWd5IHZhbMOzcyBlbWFpbCBjw61tZXQhXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJBIGxla8OpcmRlesOpcyBoaWLDoXZhbCB0w6lydCB2aXNzemE6ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQSBsZWvDqXJkZXrDqXMgw7xyZXMgYWRhdHRhbCB0w6lydCB2aXNzemEsIHZhZ3kgYSAncGF0aCcgcGFyYW3DqXRlciBoZWx5dGVsZW4uXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiQSBtw6lyZXQgbmVtIGxlaGV0IG5hZ3lvYmIsIG1pbnQgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiQWRqYSBtZWcgYXogZWd5w6liIMOpcnTDqWtldCFcIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkZlbHTDtmx0w6lzIGZvbHlhbWF0YmFuLiBWw6Fyam9uIHDDoXIgbcOhc29kcGVyY2V0LCBtYWpkIHByw7Niw6FsamEgw7pqcmEuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiVMO2cmxpIGV6dCBhIHJla29yZG90P1wiLFxuICBrZXlEdXBsaWNhdGlvbkVycm9yOiBcIkF6IMOpcnTDqWtuZWsgZWd5ZWRpbmVrIGtlbGwgbGVubmllLlwiLFxuICBhZGRSb3c6IFwiU29yIGhvenrDoWFkw6FzYVwiLFxuICByZW1vdmVSb3c6IFwiRWx0w6F2b2zDrXTDoXNcIixcbiAgYWRkUGFuZWw6IFwiw5pqIGhvenrDoWFkw6FzYVwiLFxuICByZW1vdmVQYW5lbDogXCJFbHTDoXZvbMOtdMOhc1wiLFxuICBjaG9pY2VzX0l0ZW06IFwiZWxlbVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIk9zemxvcFwiLFxuICBtYXRyaXhfcm93OiBcIlNvclwiLFxuICBzYXZpbmdEYXRhOiBcIkVyZWRtw6lueSBtZW50w6lzZSBhIHN6ZXJ2ZXJyZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiRWd5IGhpYmEgZm9seXTDoW4gbmVtIHR1ZHR1ayBlbG1lbnRlbmkgYXogZXJlZG3DqW55dC5cIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwiRXJlZG3DqW55IHNpa2VyZXNlbiBtZW50dmUhXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCJQcsOzYsOhbGphIMO6anJhXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiaHVcIl0gPSBodW5nYXJpYW5TdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9odW5nYXJpYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGljZWxhbmRpY1N1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJUaWxiYWthXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLDgWZyYW1cIixcbiAgY29tcGxldGVUZXh0OiBcIkxva2nDsFwiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkhpbm4gKHNrw71yaW5nKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU8Otw7BhIHswfSBvZiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiw55hw7AgZXIgZW5naW5uIHPDrcOwYSBlw7BhIHNwdXJuaW5nYXIgw60gw75lc3Nhcmkga8O2bm51bi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUYWtrIGZ5cmlyIGHDsCBmeWxsamEgw7p0IMO+ZXNzYSBrw7ZubnVuIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkvDtm5udW5pbiBlciBhw7AgaGxhw7BhLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlZlbGR1Li4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiVmluc2FtbGVnYXN0IHN2YXJpw7Agc3B1cm5pbmd1bm5pLlwiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIlZpbnNhbWxlZ2FzdCBzdmFyacOwIHNwdXJuaW5ndW0gw60gw7ZsbHVtIHLDtsOwdW0uXCIsXG4gIG51bWVyaWNFcnJvcjogXCLDnmV0dGEgZ2lsZGkgdmVyw7B1ciBhw7AgdmVyYSB0YWxhLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIsOeYcOwIMOmdHRpIGHDsCB2ZXJhIG1pbm5zdCB7MH0gdMOha24uXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiw55hw7Agw6Z0dGkgYcOwIHZlcmEgbWVzdCB7MH0gdMOha24uXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiw55hw7Agw6Z0dGkgYcOwIHZlcmEgZmxlaXJpIGVuIHswfSBvZyBmw6ZycmkgZW4gezF9IHTDoWtuLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIlZpbnNhbWxlZ2FzdCBmeWxsacOwIMO6ciBhw7AgbWlubnN0YSBrb3N0aSB7MH0gcmHDsGlyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWaW5zYW1sZWdhc3QgdmVsamnDsCBhw7AgbWlubnN0YSBrb3N0aSB7MH0gbcO2Z3VsZWlrYS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVmluc2FtbGVnYXN0IHZlbGppw7AgZWtraSBmbGVpcmkgZW4gezB9IG3Dtmd1bGVpa2EuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDDpnR0aSBhw7AgdmVyYSBtZWlyYSBlbiBlw7BhIGphZm50IG9nIHsxfSBtaW5uYSBlbiBlw7BhIGphZm50IG9nIHsyfVwiLFxuICBudW1lcmljTWluOiBcInswfScgw6Z0dGkgYcOwIHZlcmEgbWVpcmEgZW4gZcOwYSBqYWZudCBvZyB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDDpnR0aSBhw7AgdmVyYSBtaW5uYSBlbiBlw7BhIGphZm50IG9nIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVmluc2FtbGVnYXN0IHNsw6Fpw7AgaW5uIGdpbHQgbmV0ZmFuZy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkJlacOwbmlubiBza2lsYcOwaSBlZnRpcmZhcmFuYWRpIHZpbGx1ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOiBcIkJlacOwbmlubmcgc2tpbGHDsGkgZW5ndW0gZ8O2Z251bSBlw7BhIHNsw7PDsGlubiB2YXIgcsO2bmdcIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJTa3LDoWlubiBza2FsIGVra2kgdmVyYSBzdMOmcnJpIGVuIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlZpbmFtbGVnYXN0IGZ5bGxpw7Agw7p0IGhpdHQgZ2lsZGnDsC5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIlNrcsOhaW5uIMO+w61uIHZhciBzZW5kLiBWaW5zYW1sZWdhc3QgYsOtw7Bpw7Agw60gbm9ra3JhciBzZWvDum5kdXIgb2cgcmV5bmnDsCBhZnR1ci5cIixcbiAgYWRkUm93OiBcIkLDpnRhIHZpw7AgcsO2w7BcIixcbiAgcmVtb3ZlUm93OiBcIkZqYXJsw6ZnamFcIixcbiAgY2hvaWNlc19maXJzdEl0ZW06IFwiZnlyc3RpIGhsdXR1clwiLFxuICBjaG9pY2VzX3NlY29uZEl0ZW06IFwiYW5uYXIgaGx1dHVyXCIsXG4gIGNob2ljZXNfdGhpcmRJdGVtOiBcIsO+cmnDsGppIGhsdXR1clwiLFxuICBtYXRyaXhfY29sdW1uOiBcIkTDoWxrdXJcIixcbiAgbWF0cml4X3JvdzogXCJSw7bDsFwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImlzXCJdID0gaWNlbGFuZGljU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vaWNlbGFuZGljLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBpdGFsaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlByZWNlZGVudGVcIixcbiAgcGFnZU5leHRUZXh0OiBcIlN1Y2Nlc3Npdm9cIixcbiAgY29tcGxldGVUZXh0OiBcIlNhbHZhXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQWx0cm8gKGRlc2NyaXZpKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSBkaSB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTm9uIGNpIHNvbm8gcGFnaW5lIG8gZG9tYW5kZSB2aXNpYmlsaSBuZWwgcXVlc3Rpb25hcmlvLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkdyYXppZSBwZXIgYXZlciBjb21wbGV0YXRvIGlsIHF1ZXN0aW9uYXJpbyFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJDYXJpY2FtZW50byBkZWwgcXVlc3Rpb25hcmlvIGluIGNvcnNvLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIlNjZWdsaS4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIkNhbXBvIG9iYmxpZ2F0b3Jpb1wiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcIkNvbXBsZXRhcmUgdHV0dGUgbGUgcmlnaGVcIixcbiAgbnVtZXJpY0Vycm9yOiBcIklsIHZhbG9yZSBkZXZlIGVzc2VyZSBudW1lcmljb1wiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIkluc2VyaXJlIGFsbWVubyB7MH0gY2FyYXR0ZXJpXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiTHVuZ2hlenphIG1hc3NpbWEgY29uc2VudGl0YSB7MH0gY2FyYXR0ZXJpXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6XG4gICAgXCJJbnNlcmlyZSB1bmEgc3RyaW5nYSBjb24gbWluaW1vIHswfSBlIG1hc3NpbW8gezF9IGNhcmF0dGVyaVwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIkNvbXBsZXRhcmUgYWxtZW5vIHswfSByaWdoZS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiU2VsZXppb25hcmUgYWxtZW5vIHswfSB2YXJpYW50aS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiU2VsZXppb25hcmUgbWFzc2ltbyB7MH0gdmFyaWFudGkuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBkZXZlIGVzc2VyZSB1Z3VhbGUgbyBzdXBlcmlvcmUgYSB7MX0gZSB1Z3VhbGUgbyBpbmZlcmlvcmUgYSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyBkZXZlIGVzc2VyZSB1Z3VhbGUgbyBzdXBlcmlvcmUgYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBkZXZlIGVzc2VyZSB1Z3VhbGUgbyBpbmZlcmlvcmUgYSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIkluc2VyaXJlIGluZGlyaXp6byBtYWlsIHZhbGlkb1wiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiTGEgcmljaGllc3RhIGhhIHJpc3Bvc3RvIGNvbiB1biBlcnJvcmUgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJMYSByaWNoaWVzdGEgaGEgcmlzcG9zdG8gbnVsbCBvcHB1cmUgaWwgcGVyY29yc28gbm9uIMOoIGNvcnJldHRvXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiSWwgZmlsZSBub24gcHXDsiBlY2NlZGVyZSB7MH1cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkluc2VyaXJlIGlsIHZhbG9yZSAnYWx0cm8nXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwiRmlsZSBpbiBjYXJpY2FtZW50by4gQXR0ZW5kaSBhbGN1bmkgc2Vjb25kaSBlIHJpcHJvdmFcIixcbiAgYWRkUm93OiBcIkFnZ2l1bmdpIHJpZ2FcIixcbiAgcmVtb3ZlUm93OiBcIlJpbXVvdmkgcmlnYVwiLFxuICBjaG9pY2VzX0l0ZW06IFwiRWxlbWVudG9cIixcbiAgbWF0cml4X2NvbHVtbjogXCJDb2xvbm5hXCIsXG4gIG1hdHJpeF9yb3c6IFwiUmlnYVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcIml0XCJdID0gaXRhbGlhblN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2l0YWxpYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIGxhdHZpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiQXRwYWthxLxcIixcbiAgcGFnZU5leHRUZXh0OiBcIlTEgWzEgWtcIixcbiAgY29tcGxldGVUZXh0OiBcIlBhYmVpZ3RcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIkxhcHB1c2UgezB9IG5vIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJOYXYgbmV2aWVuYSBqYXV0xIFqdW1hLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIlBhdGVpY2FtaWVzIEp1bXMgcGFyIGFua2V0YXMgYWl6cGlsZMSrxaFhbnUhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiSWVsxIFkZSBubyBzZXJ2ZXJhLi4uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiQ2l0cyAobMWrZHp1LCBhcHJha3N0aWV0ISlcIixcbiAgb3B0aW9uc0NhcHRpb246IFwiSXp2xJNsxJN0aWVzLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiTMWrZHp1LCBhdGJpbGRpZXQgdXogamF1dMSBanVtdSFcIixcbiAgbnVtZXJpY0Vycm9yOiBcIkF0YmlsZGVpIGlyIGrEgWLFq3Qgc2thaXRsaW0uXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiTMWrZHp1LCBpZXZhZGlldCB2aXNtYXogezB9IHNpbWJvbHVzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJMxatkenUsIGl6dsSTbGlldGllcyB2aXNtYXogezB9IHZhcmlhbnR1LlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJMxatkenUsIGl6dsSTbGlldGllcyBuZSB2YWlyYWsgcGFyIHswfSB2YXJpYW50aWVtLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSBuZWvEgSB7MX0sIHVuIHZpZW7EgWRhbSB2YWkgbWF6xIFrYW0sIG5la8SBIHsyfVwiLFxuICBudW1lcmljTWluOiBcIid7MH0nIGrEgWLFq3QgdmllbsSBZGFtIHZhaSBsaWVsxIFrYW0gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScgasSBYsWrdCB2aWVuxIFkYW0gdmFpIGxpZWzEgWthbSB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIkzFq2R6dSwgaWV2YWRpZXQgcGF0aWVzdSBlLXBhc3RhIGFkcmVzaSFcIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiAnTMWrZHp1LCBpZXZhZGlldCBkYXR1cyBsYXVrxIEgXCJDaXRzXCInXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImx2XCJdID0gbGF0dmlhblN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL2xhdHZpYW4udHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHBlcnNpYW5TdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwi2YLYqNmE24xcIixcbiAgcGFnZU5leHRUZXh0OiBcItio2LnYr9uMXCIsXG4gIGNvbXBsZXRlVGV4dDogXCLYqtqp2YXbjNmEXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi2K/bjNqv2LEo2KrZiNi224zYrSlcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIti12YHYrdmHIHswfSDYp9iyIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCLYtdmB2K3ZhyDYp9uMINuM2Kcg2q/YstuM2YbZhyDYp9uMINio2LHYp9uMINin24zZhiDZvtix2LPYtNmG2KfZhdmHINmF2YjYrNmI2K8g2YbbjNiz2KouXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi2KfYsiDYtNmF2Kcg2KjYp9io2Kog2KraqdmF24zZhCDYp9uM2YYg2b7Ysdiz2LTZhtin2YXZhyDZhdiq2LTaqdix24zZhVwiLFxuICBjb21wbGV0aW5nU3VydmV5QmVmb3JlOlxuICAgIFwi2KjZhyDZhti42LEg2YXbjCDYsdiz2K8g2YfZhSDZh9mFINin2qnZhtmI2YYg2b7Ysdiz2LTZhtin2YXZhyDYsdinINiq2qnZhduM2YQg2qnYsdiv2Ycg2KfbjNivLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcItiv2LHYrdin2YQg2KfbjNis2KfYryDZvtix2LPYtNmG2KfZhdmHXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcItin2YbYqtiu2KfYqCDaqdmG24zYry4uLlwiLFxuICB2YWx1ZTogXCLZhdmC2K/Yp9ixXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi2YTYt9mB2Kcg2KjZhyDYs9mI2KfZhCDZvtin2LPYriDYr9mH24zYr1wiLFxuICByZXF1aXJlZEluQWxsUm93c0Vycm9yOiBcItmE2LfZgdinINio2Ycg2KrZhdin2YUg2LPYt9ixINmH2KfbjCDYs9mI2KfZhNin2Kog2b7Yp9iz2K4g2K/Zh9uM2K9cIixcbiAgbnVtZXJpY0Vycm9yOiBcItmF2YLYr9in2LEg2KjYp9uM2K8g2LnYr9iv24wg2KjYp9i02K9cIixcbiAgdGV4dE1pbkxlbmd0aDogXCLZhNi32YHYpyDYrdiv2KfZgtmEICB7MH0g2K3YsdmBINmI2KfYsdivINqp2YbbjNivXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi2YTYt9mB2Kcg2qnZhdiq2LEg2KfYsiAgezB9INit2LHZgSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLZhNi32YHYpyDYqNuM2LTYqtixINin2LIgIHswfSDYrdix2YEg2Ygg2qnZhdiq2LEg2KfYsiB7MX0g2K3YsdmBINmI2KfYsdivINqp2YbbjNivLlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcItmE2LfZgdinINit2K/Yp9mC2YQgezB9INiz2LfYsSDZiNin2LHYryDaqdmG24zYry5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwi2K3Yr9in2YLZhCB7MH0g2KfZhtiq2K7Yp9ioINqp2YbbjNivLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCLZhNi32YHYpyDYqNuM2LTYqtixINin2LIgIHswfSDYp9mG2KrYrtin2Kgg2qnZhtuM2K8uXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiJ3swfScg2KjYp9uM2K8g2KjbjNmGIHsxfSDZiCB7Mn0g2KjYp9i02K9cIixcbiAgbnVtZXJpY01pbjogXCInezB9JyDYqNiy2LHar9iq2LEg2YXYs9in2YjbjCB7MX0g2KjYp9i02K9cIixcbiAgbnVtZXJpY01heDogXCInezB9JyDYqNin24zYryDaqdmI2obaqdiq2LEg24zYpyDZhdiz2KfZiNuMIHsxfSDYqNin2LTYr1wiLFxuICBpbnZhbGlkRW1haWw6IFwi2YTYt9mB2Kcg2KfbjNmF24zZhCDYtdit24zYrSDYr9ix2Kwg2qnZhtuM2K9cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcItiv2LHYrtmI2KfYs9iqINio2Kcg2K7Yt9inINix2YjYqNix2Ygg2LTYrzogJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6IFwi2K/Ysdiu2YjYp9iz2Kog2YXYs9uM2LHbjCDYrtin2YTbjCDYqNin2LLar9i02Kog2K/Yp9iv2Ycg24zYpyDZhdiz24zYsSDYr9ix2LPYqiDYqtmG2LjbjNmFINmG2LTYr9mHXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwi2KjbjNi02KrYsduM2YYg2K3YrNmFINmF2KzYp9iyINmB2KfbjNmEOiB7MH1cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcItmF2YLYr9in2LEgJ9iv24zar9ixJyDYsdinINmI2KfYsdivINqp2YbbjNivXCIsXG4gIHVwbG9hZGluZ0ZpbGU6IFwi2YHYp9uM2YQg2K/YsSDYrdin2YQg2KLbjNmE2YjYryDZhduMINio2KfYtNivLiDZhNi32YHYpyDYtdio2LEg2qnZhtuM2K8uXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwi2KLbjNinINmF2KfbjNmEINio2Ycg2K3YsNmBINin24zZhiDYsdiv24zZgSDZh9iz2KrbjNiv2J9cIixcbiAga2V5RHVwbGljYXRpb25FcnJvcjogXCLYp9uM2YYg2YXZgtiv2KfYsSDYqNin24zYryDYutuM2LEg2Kraqdix2KfYsduMINio2KfYtNivXCIsXG4gIGFkZFJvdzogXCLYs9i32LEg2KzYr9uM2K9cIixcbiAgcmVtb3ZlUm93OiBcItit2LDZgVwiLFxuICBhZGRQYW5lbDogXCLYrNiv24zYr1wiLFxuICByZW1vdmVQYW5lbDogXCLYrdiw2YFcIixcbiAgY2hvaWNlc19JdGVtOiBcItii24zYqtmFXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi2LPYqtmI2YZcIixcbiAgbWF0cml4X3JvdzogXCLYs9i32LFcIixcbiAgc2F2aW5nRGF0YTogXCLZhtiq2KfbjNisINiv2LEg2K3Yp9mEINiw2K7bjNix2Ycg2LPYp9iy24wg2K/YsSDYs9ix2YjYsSDZhduMINio2KfYtNivXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLYrti32KfbjNuMINiv2LEg2LDYrtuM2LHZhyDYs9in2LLbjCDZhtiq2KfbjNisINix2K4g2K/Yp9iv2Ycg2KfYs9iqXCIsXG4gIHNhdmluZ0RhdGFTdWNjZXNzOiBcItmG2KrYp9uM2Kwg2KjYpyDZhdmI2YHZgtuM2Kog2LDYrtuM2LHZhyDYtNivXCIsXG4gIHNhdmVBZ2FpbkJ1dHRvbjogXCLZhdis2K/YryDYqtmE2KfYtCDaqdmG24zYr1wiXG59O1xuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJmYVwiXSA9IHBlcnNpYW5TdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9wZXJzaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBwb2xpc2hTdXJ2ZXlTdHJpbmdzID0ge1xuICBwYWdlUHJldlRleHQ6IFwiV3N0ZWN6XCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJEYWxlalwiLFxuICBjb21wbGV0ZVRleHQ6IFwiR290b3dlXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiSW5uYSBvZHBvd2llZMW6ICh3cGlzeilcIixcbiAgcHJvZ3Jlc3NUZXh0OiBcIlN0cm9uYSB7MH0geiB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiTmllIG1hIHdpZG9jem55Y2ggcHl0YcWELlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIkR6acSZa3VqZW15IHphIHd5cGXFgm5pZW5pZSBhbmtpZXR5IVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIlRyd2Egd2N6eXR5d2FuaWUgYW5raWV0eS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJXeWJpZXJ6Li4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUHJvc3rEmSBvZHBvd2llZHppZcSHIG5hIHRvIHB5dGFuaWUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiUHJvc3rEmSBvZHBvd2llZHppZcSHIG5hIHdzenlzdGtpZSBweXRhbmlhLlwiLFxuICBudW1lcmljRXJyb3I6IFwiVyB0eW0gcG9sdSBtb8W8bmEgd3Bpc2HEhyB0eWxrbyBsaWN6YnkuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiUHJvc3rEmSB3cGlzYcSHIGNvIG5ham1uaWVqIHswfSB6bmFrw7N3LlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlByb3N6xJkgd3Bpc2HEhyBtbmllaiBuacW8IHswfSB6bmFrw7N3LlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlByb3N6xJkgd3Bpc2HEhyB3acSZY2VqIG5pxbwgezB9IGkgbW5pZWogbmnFvCB7MX0gem5ha8Ozdy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQcm9zesSZIHV6dXBlxYJuacSHIHByenluYWptbmllaiB7MH0gd2llcnN6eS5cIixcbiAgbWluU2VsZWN0RXJyb3I6IFwiUHJvc3rEmSB3eWJyYcSHIGNvIG5ham1uaWVqIHswfSBwb3p5Y2ppLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJQcm9zesSZIHd5YnJhxIcgbmllIHdpxJljZWogbmnFvCB7MH0gcG96eWNqaS5cIixcbiAgbnVtZXJpY01pbk1heDpcbiAgICBcIk9kcG93aWVkxbogJ3swfScgcG93aW5uYSBiecSHIHdpxJlrc3phIGx1YiByw7N3bmEgezF9IG9yYXogbW5pZWpzemEgbHViIHLDs3duYSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJPZHBvd2llZMW6ICd7MH0nIHBvd2lubmEgYnnEhyB3acSZa3N6YSBsdWIgcsOzd25hIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIk9kcG93aWVkxbogJ3swfScgcG93aW5uYSBiecSHIG1uaWVqc3phIGx1YiByw7N3bmEgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQcm9zesSZIHBvZGHEhyBwcmF3aWTFgm93eSBhZHJlcyBlbWFpbC5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIsW7xIVkYW5pZSB6d3LDs2NpxYJvIGLFgsSFZCAnezB9Jy4gezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjpcbiAgICBcIsW7xIVkYW5pZSBuaWUgendyw7NjacWCbyBkYW55Y2ggYWxibyDFm2NpZcW8a2EgamVzdCBuaWVwcmF3aWTFgm93YVwiLFxuICBleGNlZWRNYXhTaXplOiBcIlJvem1pYXIgcHJ6ZXPFgmFuZWdvIHBsaWt1IG5pZSBtb8W8ZSBwcnpla3JhY3phxIcgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUHJvc3rEmSBwb2RhxIcgaW5uxIUgb2Rwb3dpZWTFui5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIlRyd2EgcHJ6ZW5vc3plbmllIFR3b2plZ28gcGxpa3UsIHByb3N6xJkgc3Byw7Nib3dhxIcgcG9ub3duaWUgemEga2lsa2Egc2VrdW5kLlwiLFxuICBhZGRSb3c6IFwiRG9kYWogd2llcnN6XCIsXG4gIHJlbW92ZVJvdzogXCJVc3XFhFwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInBsXCJdID0gcG9saXNoU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vcG9saXNoLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBwb3J0dWd1ZXNlU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIkFudGVyaW9yXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCJQcsOzeGltb1wiLFxuICBjb21wbGV0ZVRleHQ6IFwiRmluYWxpemFyXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiT3V0cm9zIChkZXNjcmV2ZXIpXCIsXG4gIHByb2dyZXNzVGV4dDogXCJQYWdpbmEgezB9IGRlIHsxfVwiLFxuICBlbXB0eVN1cnZleTogXCJOw6NvIGjDoSBww6FnaW5hIHZpc8OtdmVsIG91IHBlcmd1bnRhIG5hIHBlc3F1aXNhLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcIk9icmlnYWRvIHBvciBmaW5hbGl6YXIgYSBwZXNxdWlzYSFcIixcbiAgY29tcGxldGluZ1N1cnZleUJlZm9yZTpcbiAgICBcIk5vc3NvcyByZWdpc3Ryb3MgbW9zdHJhbSBxdWUgdm9jw6ogasOhIGZpbmFsaXpvdSBhIHBlc3F1aXNhLlwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkEgcGVzcXVpc2EgZXN0w6EgY2FycmVnYW5kby4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJTZWxlY2lvbmUuLi5cIixcbiAgdmFsdWU6IFwidmFsb3JcIixcbiAgcmVxdWlyZWRFcnJvcjogXCJQb3IgZmF2b3IsIHJlc3BvbmRhIGEgcGVyZ3VudGEuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6XG4gICAgXCJQb3IgZmF2b3IsIHJlc3BvbmRhIGFzIHBlcmd1bnRhcyBlbSB0b2RhcyBhcyBsaW5oYXMuXCIsXG4gIG51bWVyaWNFcnJvcjogXCJPIHZhbG9yIGRldmUgc2VyIG51bcOpcmljby5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQb3IgZmF2b3IsIGluc2lyYSBwZWxvIG1lbm9zIHswfSBjYXJhY3RlcmVzLlwiLFxuICB0ZXh0TWF4TGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIG1lbm9zIGRlIHswfSBjYXJhY3RlcmVzLlwiLFxuICB0ZXh0TWluTWF4TGVuZ3RoOiBcIlBvciBmYXZvciwgaW5zaXJhIG1haXMgZGUgezB9IGUgbWVub3MgZGUgezF9IGNhcmFjdGVyZXMuXCIsXG4gIG1pblJvd0NvdW50RXJyb3I6IFwiUHJlZW5jaGEgcGVsbyBtZW5vcyB7MH0gbGluaGFzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJTZWxlY2lvbmUgcGVsbyBtZW5vcyB7MH0gb3DDp8O1ZXMuXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIlBvciBmYXZvciwgc2VsZWNpb25lIG7Do28gbWFpcyBkbyBxdWUgezB9IG9ww6fDtWVzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiTyAnezB9JyBkZXZlIHNlciBpZ3VhbCBvdSBzdXBlcmlvciBhIHsxfSBlIGlndWFsIG91IG1lbm9yIHF1ZSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJPICd7MH0nIGRldmUgc2VyIGlndWFsIG91IHN1cGVyaW9yIGEgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiTyAnezB9JyBkZXZlIHNlciBpZ3VhbCBvdSBpbmZlcmlvciBhIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiUG9yIGZhdm9yLCBpbmZvcm1lIHVtIGUtbWFpbCB2w6FsaWRvLlwiLFxuICB1cmxSZXF1ZXN0RXJyb3I6IFwiQSByZXF1aXNpw6fDo28gcmV0b3Jub3UgbyBlcnJvICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQSByZXF1aXNpw6fDo28gbsOjbyByZXRvcm5vdSBkYWRvcyBvdSBvICdjYW1pbmhvJyBkYSByZXF1aXNpw6fDo28gbsOjbyBlc3TDoSBjb3JyZXRvXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiTyB0YW1hbmhvIGRvIGFycXVpdm8gbsOjbyBkZXZlIGV4Y2VkZXIgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiUG9yIGZhdm9yLCBpbmZvcm1lIG8gb3V0cm8gdmFsb3IuXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJTZXUgYXJxdWl2byBlc3TDoSBzZW5kbyBjYXJyZWdhZG8uIFBvciBmYXZvciwgYWd1YXJkZSBhbGd1bnMgc2VndW5kb3MgZSB0ZW50ZSBub3ZhbWVudGUuXCIsXG4gIGFkZFJvdzogXCJBZGljaW9uYXIgbGluaGFcIixcbiAgcmVtb3ZlUm93OiBcIlJlbW92ZXIgbGluaGFcIixcbiAgYWRkUGFuZWw6IFwiQWRpY2lvbmFyIG5vdm9cIixcbiAgcmVtb3ZlUGFuZWw6IFwiUmVtb3ZlclwiLFxuICBjaG9pY2VzX0l0ZW06IFwiaXRlbVwiLFxuICBtYXRyaXhfY29sdW1uOiBcIkNvbHVuYVwiLFxuICBtYXRyaXhfcm93OiBcIkxpbmhhXCIsXG4gIHNhdmluZ0RhdGE6IFwiT3MgcmVzdWx0YWRvcyBlc3RvIHNlbmRvIHNhbHZvcyBubyBzZXJ2aWRvci4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiT2NvcnJldSB1bSBlcnJvIGUgbsOjbyBmb2kgcG9zc8OtdmVsIHNhbHZhciBvcyByZXN1bHRhZG9zLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJPcyByZXN1bHRhZG9zIGZvcmFtIHNhbHZvcyBjb20gc3VjZXNzbyFcIixcbiAgc2F2ZUFnYWluQnV0dG9uOiBcIlRlbnRlIG5vdmFtZW50ZVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcInB0XCJdID0gcG9ydHVndWVzZVN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3BvcnR1Z3Vlc2UudHMiLCJpbXBvcnQgeyBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tIFwiLi4vc3VydmV5U3RyaW5nc1wiO1xuXG5leHBvcnQgdmFyIHJvbWFuaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcIlByZWNlZGVudFwiLFxuICBwYWdlTmV4dFRleHQ6IFwiVXJtxIN0b3JcIixcbiAgY29tcGxldGVUZXh0OiBcIkZpbmFsaXphcmVcIixcbiAgb3RoZXJJdGVtVGV4dDogXCJBbHR1bChwcmVjaXphxaNpKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUGFnaW5hIHswfSBkaW4gezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIk51IHN1bnQgw65udHJlYsSDcmkgcGVudHJ1IGFjZXN0IGNoZXN0aW9uYXJcIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJWxIMgbXVsxaN1bWltIHBlbnRydSB0aW1wdWwgYWNvcmRhdCFcIixcbiAgbG9hZGluZ1N1cnZleTogXCJDaGVzdGlvbmFydWwgc2Ugw65uY2FyY8SDLi4uXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcIkFsZWdlxaNpLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwiUsSDc3B1bnN1bCBsYSBhY2Vhc3TEgyDDrm50cmViYXJlIGVzdGUgb2JsaWdhdG9yaXUuXCIsXG4gIHJlcXVpcmVkSW5BbGxSb3dzRXJyb3I6IFwiVG9hdGUgcsSDc3B1bnN1cmlsZSBzdW50IG9ibGlnYXRvcmlpXCIsXG4gIG51bWVyaWNFcnJvcjogXCJSxINzcHVuc3VsIHRyZWJ1aWUgc8SDIGZpZSBudW1lcmljLlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlRyZWJ1aWUgc8SDIGludHJvZHVjZcibaSBtaW5pbSB7MH0gY2FyYWN0ZXJlLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJUcmVidWllIHPEgyBzZWxlY3RhyJtpIG1pbmltIHswfSBvcMWjaXVuaS5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiVHJlYnVpZSBzxIMgc2VsZWN0YcibaSBtYXhpbSB7MH0gb3DFo2l1bmkuXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwiUsSDc3B1bnN1bCAnezB9JyB0cmVidWllIHPEgyBmaWUgbWFpIG1hcmUgc2F1IGVnYWwgY2EgezF9IMWfw64gbWFpIG1pYyBzYXUgZWdhbCBjdSB7Mn1cIixcbiAgbnVtZXJpY01pbjogXCJSxINzcHVuc3VsICd7MH0nIHRyZWJ1aWUgc8SDIGZpZSBtYWkgbWFyZSBzYXUgZWdhbCBjYSB7MX1cIixcbiAgbnVtZXJpY01heDogXCJSxINzcHVuc3VsICd7MH0nIHRyZWJ1aWUgc8SDIGZpZSBtYWkgbWljIHNhdSBlZ2FsIGNhIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVHJlYnVpZSBzxIMgaW50cm9kdWNlxaNpIG8gYWRyZXNhIGRlIGVtYWlsIHZhbGlkxIMuXCIsXG4gIGV4Y2VlZE1heFNpemU6IFwiRGltZW5zaXVuZWEgZmnFn2llcnVsdWkgbnUgdHJlYnVpZSBzxIMgZGVwxIPFn2Vhc2PEgyB7MH0uXCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCJUcmVidWllIHPEgyBjb21wbGV0YcibaSBjw6JtcHVsICdBbHR1bCcuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXlCZWZvcmU6IFwiRGluIMOubnJlZ2lzdHLEg3JpbGUgbm9hc3RyZSByZWllc2UgY8SDIGHIm2kgY29tcGxldGF0IGRlamEgYWNlc3QgY2hlc3Rpb25hci5cIixcblx0dmFsdWU6IFwidmFsb2FyZVwiLFxuXHRyZXF1aXJlZEVycm9ySW5QYW5lbDogXCJWxIMgcnVnxINtIHPEgyByxINzcHVuZGXIm2kgbGEgY2VsIHB1yJtpbiBvIMOubnRyZWJhcmUuXCIsXG5cdHRleHRNYXhMZW5ndGg6IFwiVHJlYnVpZSBzxIMgaW50cm9kdWNlyJtpIG1heGltIHswfSBjYXJhY3RlcmUuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiVHJlYnVpZSBzxIMgaW50cm9kdWNlyJtpIG1haSBtdWx0IGRlIHswfSDImWkgbWFpIHB1yJtpbiBkZSB7MX0gY2FyYWN0ZXJlLlwiLFxuXHRtaW5Sb3dDb3VudEVycm9yOiBcIlRyZWJ1aWUgc8SDIGNvbXBsZXRhyJtpIG1pbmltIHswfSByw6JuZHVyaS5cIixcblx0dXJsUmVxdWVzdEVycm9yOiBcIlJlcXVlc3QtdWwgYSByZXR1cm5hdCBlcm9hcmVhICd7MH0nLiB7MX1cIixcblx0dXJsR2V0Q2hvaWNlc0Vycm9yOiBcIlJlcXVlc3QtdWwgbnUgYSByZXR1cm5hdCBkYXRlIHNhdSBwcm9wcmlldGF0ZWEgJ3BhdGgnIGVzdGUgaW5jb3JlY3TEg1wiLFxuXHR1cGxvYWRpbmdGaWxlOiBcIkZpyJlpZXJ1bCBkdW1uZWF2b2FzdHLEgyBlc3RlIMOubiBjdXJzIGRlIMOubmPEg3JjYXJlLiBWxIMgcnVnxINtIGHImXRlcHRhyJtpIGPDonRldmEgc2VjdW5kZSDImWkgcmV2ZW5pyJtpIGFwb2kuXCIsXG4gIGNvbmZpcm1EZWxldGU6IFwiU3VudGXIm2kgc2lndXIgY8SDIGRvcmnIm2kgc8SDIMiZdGVyZ2XIm2kgw65ucmVnaXN0cmFyZWE/XCIsXG4gIGtleUR1cGxpY2F0aW9uRXJyb3I6IFwiVmFsb2FyZWEgdHJlYnVpZSBzxIMgZmllIHVuaWPEgy5cIixcbiAgYWRkUm93OiBcIkFkxIN1Z2FyZSByw6JuZFwiLFxuICByZW1vdmVSb3c6IFwiyJh0ZXJnZXJlXCIsXG4gIGFkZFBhbmVsOiBcIkFkxIN1Z2FyZVwiLFxuICByZW1vdmVQYW5lbDogXCLImHRlcmdlcmVcIixcbiAgY2hvaWNlc19JdGVtOiBcIm9wyJtpdW5lXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sb2FuxINcIixcbiAgbWF0cml4X3JvdzogXCJSw6JuZFwiLFxuICBzYXZpbmdEYXRhOiBcIlJlenVsdGF0ZWxlIHN1bnQgw65uIGN1cnMgZGUgc2FsdmFyZS4uLlwiLFxuICBzYXZpbmdEYXRhRXJyb3I6IFwiQSBpbnRlcnZlbml0IG8gZXJvYXJlLCByZXp1bHRhdGVsZSBudSBhdSBwdXR1dCBmaSBzYWx2YXRlLlwiLFxuICBzYXZpbmdEYXRhU3VjY2VzczogXCJSZXp1bHRhdGVsZSBhdSBmb3N0IHNhbHZhdGUgY3Ugc3VjY2VzIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwiw45uY2VyY2HIm2kgZGluIG5vdVwiLFxuICB0aW1lck1pbjogXCJtaW5cIixcbiAgdGltZXJTZWM6IFwic2VjXCIsXG4gIHRpbWVyU3BlbnRBbGw6IFwiQcibaSBwZXRyZWN1dCB7MH0gcGUgYWNlYXN0xIMgcGFnaW7EgyDImWkgezF9IMOubiB0b3RhbC5cIixcbiAgdGltZXJTcGVudFBhZ2U6IFwiQcibaSBwZXRyZWN1dCB7MH0gcGUgYWNlYXN0xIMgcGFnaW7Egy5cIixcbiAgdGltZXJTcGVudFN1cnZleTogXCJByJtpIHBldHJlY3V0IHswfSDDrm4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRBbGw6IFwiQcibaSBwZXRyZWN1dCB7MH0gZGluIHsxfSBwZSBhY2Vhc3TEgyBwYWdpbsSDIMiZaSB7Mn0gZGluIHszfSDDrm4gdG90YWwuXCIsXG4gIHRpbWVyTGltaXRQYWdlOiBcIkHIm2kgcGV0cmVjdXQgezB9IGRpbiB7MX0gcGUgYWNlYXN0xIMgcGFnaW7Egy5cIixcbiAgdGltZXJMaW1pdFN1cnZleTogXCJByJtpIHBldHJlY3V0IHswfSBkaW4gezF9IMOubiB0b3RhbC5cIlxufTtcbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wicm9cIl0gPSByb21hbmlhblN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3JvbWFuaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBydXNzaWFuU3VydmV5U3RyaW5ncyA9IHtcbiAgcGFnZVByZXZUZXh0OiBcItCd0LDQt9Cw0LRcIixcbiAgcGFnZU5leHRUZXh0OiBcItCU0LDQu9C10LVcIixcbiAgY29tcGxldGVUZXh0OiBcItCT0L7RgtC+0LLQvlwiLFxuICBwcm9ncmVzc1RleHQ6IFwi0KHRgtGA0LDQvdC40YbQsCB7MH0g0LjQtyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwi0J3QtdGCINC90Lgg0L7QtNC90L7Qs9C+INCy0L7Qv9GA0L7RgdCwLlwiLFxuICBjb21wbGV0aW5nU3VydmV5OiBcItCR0LvQsNCz0L7QtNCw0YDQuNC8INCS0LDRgSDQt9CwINC30LDQv9C+0LvQvdC10L3QuNC1INCw0L3QutC10YLRiyFcIixcbiAgbG9hZGluZ1N1cnZleTogXCLQl9Cw0LPRgNGD0LfQutCwINGBINGB0LXRgNCy0LXRgNCwLi4uXCIsXG4gIG90aGVySXRlbVRleHQ6IFwi0JTRgNGD0LPQvtC1ICjQv9C+0LbQsNC70YPQudGB0YLQsCwg0L7Qv9C40YjQuNGC0LUpXCIsXG4gIG9wdGlvbnNDYXB0aW9uOiBcItCS0YvQsdGA0LDRgtGMLi4uXCIsXG4gIHJlcXVpcmVkRXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINC+0YLQstC10YLRjNGC0LUg0L3QsCDQstC+0L/RgNC+0YEuXCIsXG4gIG51bWVyaWNFcnJvcjogXCLQntGC0LLQtdGCINC00L7Qu9C20LXQvSDQsdGL0YLRjCDRh9C40YHQu9C+0LwuXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INGF0L7RgtGPINCx0YsgezB9INGB0LjQvNCy0L7Qu9C+0LIuXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcItCf0L7QttCw0LvRg9C50YHRgtCwLCDQstGL0LHQtdGA0LjRgtC1INGF0L7RgtGPINCx0YsgezB9INCy0LDRgNC40LDQvdGC0L7Qsi5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwi0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0YvQsdC10YDQuNGC0LUg0L3QtSDQsdC+0LvQtdC1IHswfSDQstCw0YDQuNCw0L3RgtC+0LIuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyDQtNC+0LvQttC90L4g0LHRi9GC0Ywg0YDQsNCy0L3Ri9C8INC40LvQuCDQsdC+0LvRjNGI0LUsINGH0LXQvCB7MX0sINC4INGA0LDQstC90YvQvCDQuNC70Lgg0LzQtdC90YzRiNC1LCDRh9C10LwgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScg0LTQvtC70LbQvdC+INCx0YvRgtGMINGA0LDQstC90YvQvCDQuNC70Lgg0LHQvtC70YzRiNC1LCDRh9C10LwgezF9XCIsXG4gIG51bWVyaWNNYXg6IFwiJ3swfScg0LTQvtC70LbQvdC+INCx0YvRgtGMINGA0LDQstC90YvQvCDQuNC70Lgg0LzQtdC90YzRiNC1LCDRh9C10LwgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCLQn9C+0LbQsNC70YPQudGB0YLQsCwg0LLQstC10LTQuNGC0LUg0LTQtdC50YHRgtCy0LjRgtC10LvRjNC90YvQuSDQsNC00YDQtdGBINGN0LvQtdC60YLRgNC+0L3QvdC+0Lkg0L/QvtGH0YLRiy5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiAn0J/QvtC20LDQu9GD0LnRgdGC0LAsINCy0LLQtdC00LjRgtC1INC00LDQvdC90YvQtSDQsiDQv9C+0LvQtSBcItCU0YDRg9Cz0L7QtVwiJ1xufTtcblxuc3VydmV5TG9jYWxpemF0aW9uLmxvY2FsZXNbXCJydVwiXSA9IHJ1c3NpYW5TdXJ2ZXlTdHJpbmdzO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2xvY2FsaXphdGlvbi9ydXNzaWFuLnRzIiwiaW1wb3J0IHsgc3VydmV5TG9jYWxpemF0aW9uIH0gZnJvbSBcIi4uL3N1cnZleVN0cmluZ3NcIjtcblxuZXhwb3J0IHZhciBzaW1wbGlmaWVkQ2hpbmVzZVN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCLkuIrkuIDpobVcIixcbiAgcGFnZU5leHRUZXh0OiBcIuS4i+S4gOmhtVwiLFxuICBjb21wbGV0ZVRleHQ6IFwi5o+Q5Lqk6Zeu5Y23XCIsXG4gIG90aGVySXRlbVRleHQ6IFwi5aGr5YaZ5YW25LuW562U5qGIXCIsXG4gIHByb2dyZXNzVGV4dDogXCLnrKwgezB9IOmhtSwg5YWxIHsxfSDpobVcIixcbiAgZW1wdHlTdXJ2ZXk6IFwi6Zeu5Y235Lit5rKh5pyJ6Zeu6aKY5oiW6aG16Z2iXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwi5oSf6LCi5oKo55qE5Y+C5LiOIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIumXruWNt+ato+WcqOWKoOi9veS4rS4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCLor7fpgInmi6kuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCLor7floavlhpnmraTpl67pophcIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCLor7floavlhpnmiYDmnInooYzkuK3pl67pophcIixcbiAgbnVtZXJpY0Vycm9yOiBcIuetlOahiOW/hemhu+aYr+S4quaVsOWtl1wiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIuetlOahiOmVv+W6puiHs+WwkSB7MH0g5Liq5a2X56ymXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwi562U5qGI6ZW/5bqm5LiN6IO96LaF6L+HIHswfSDkuKrlrZfnrKZcIixcbiAgdGV4dE1pbk1heExlbmd0aDogXCLnrZTmoYjplb/luqblv4XpobvlnKggezB9IC0gezF9IOS4quWtl+espuS5i+mXtFwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIuacgOWwkemcgOimgeWhq+WGmSB7MH0g6KGM562U5qGIXCIsXG4gIG1pblNlbGVjdEVycm9yOiBcIuacgOWwkemcgOimgemAieaLqSB7MH0g6aG5562U5qGIXCIsXG4gIG1heFNlbGVjdEVycm9yOiBcIuacgOWkmuWPquiDvemAieaLqSB7MH0g6aG5562U5qGIXCIsXG4gIG51bWVyaWNNaW5NYXg6IFwi562U5qGIICd7MH0nIOW/hemhu+Wkp+S6juetieS6jiB7MX0g5LiU5bCP5LqO562J5LqOIHsyfVwiLFxuICBudW1lcmljTWluOiBcIuetlOahiCAnezB9JyDlv4XpobvlpKfkuo7nrYnkuo4gezF9XCIsXG4gIG51bWVyaWNNYXg6IFwi562U5qGIICd7MH0nIOW/hemhu+Wwj+S6juetieS6jiB7MX1cIixcbiAgaW52YWxpZEVtYWlsOiBcIuivt+i+k+WFpeacieaViOeahCBFbWFpbCDlnLDlnYBcIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIui9veWFpemAiemhueaXtuWPkeeUn+mUmeivryAnezB9JzogezF9XCIsXG4gIHVybEdldENob2ljZXNFcnJvcjogXCLmnKrog73ovb3lhaXmnInmlYjnmoTpgInpobnmiJbor7fmsYLlj4LmlbDot6/lvoTmnInor69cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCLmlofku7blpKflsI/kuI3og73otoXov4cgezB9XCIsXG4gIG90aGVyUmVxdWlyZWRFcnJvcjogXCLor7flrozmiJDlhbbku5bpl67pophcIixcbiAgdXBsb2FkaW5nRmlsZTogXCLmlofku7bkuIrkvKDkuK0uLi4g6K+36ICQ5b+D562J5b6F5Yeg56eS5ZCO6YeN6K+VXCIsXG4gIGFkZFJvdzogXCLmt7vliqDnrZTmoYhcIixcbiAgcmVtb3ZlUm93OiBcIuWIoOmZpOetlOahiFwiLFxuICBjaG9pY2VzX0l0ZW06IFwi6YCJ6aG5XCIsXG4gIG1hdHJpeF9jb2x1bW46IFwi5YiXXCIsXG4gIG1hdHJpeF9yb3c6IFwi6KGMXCIsXG4gIHNhdmluZ0RhdGE6IFwi5q2j5Zyo5bCG57uT5p6c5L+d5a2Y5Yiw5pyN5Yqh5ZmoLi4uXCIsXG4gIHNhdmluZ0RhdGFFcnJvcjogXCLlnKjkv53lrZjnu5Pmnpzov4fnqIvkuK3lj5HnlJ/kuobplJnor6/vvIznu5PmnpzmnKrog73kv53lrZhcIixcbiAgc2F2aW5nRGF0YVN1Y2Nlc3M6IFwi57uT5p6c5L+d5a2Y5oiQ5YqfIVwiLFxuICBzYXZlQWdhaW5CdXR0b246IFwi6K+36YeN6K+VXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wiemgtY25cIl0gPSBzaW1wbGlmaWVkQ2hpbmVzZVN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3NpbXBsaWZpZWQtY2hpbmVzZS50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc3BhbmlzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJBbnRlcmlvclwiLFxuICBwYWdlTmV4dFRleHQ6IFwiU2lndWllbnRlXCIsXG4gIGNvbXBsZXRlVGV4dDogXCJDb21wbGV0b1wiLFxuICBvdGhlckl0ZW1UZXh0OiBcIk90cm8gKGRlc2NyaWJhKVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiUMOhZ2luYSB7MH0gZGUgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIk5vIGhheSBww6FnaW5hIHZpc2libGUgbyBwcmVndW50YSBlbiBsYSBlbmN1ZXN0YS5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJHcmFjaWFzIHBvciBjb21wbGV0YXIgbGEgZW5jdWVzdGEhXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiTGEgZW5jdWVzdGEgZXN0w6EgY2FyZ2FuZG8uLi5cIixcbiAgb3B0aW9uc0NhcHRpb246IFwiU2VsZWNjaW9uZS4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIlBvciBmYXZvciBjb250ZXN0ZSBsYSBwcmVndW50YS5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJQb3IgZmF2b3IgY29udGVzdGUgbGFzIHByZWd1bnRhcyBlbiBjYWRhIGhpbGVyYS5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIkxhIGVzdGltYWNpw7NuIGRlYmUgc2VyIG51bcOpcmljYS5cIixcbiAgdGV4dE1pbkxlbmd0aDogXCJQb3IgZmF2b3IgZW50cmUgcG9yIGxvIG1lbm9zIHswfSBzw61tYm9sb3MuXCIsXG4gIHRleHRNYXhMZW5ndGg6IFwiUG9yIGZhdm9yIGVudHJlIG1lbm9zIGRlIHswfSBzw61tYm9sb3MuXCIsXG4gIHRleHRNaW5NYXhMZW5ndGg6IFwiUG9yIGZhdm9yIGVudHJlIG3DoXMgZGUgezB9IHkgbWVub3MgZGUgezF9IHPDrW1ib2xvcy5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJQb3IgZmF2b3IgbGxlbmUgcG9yIGxvIG1lbm9zIHswfSBoaWxlcmFzLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJQb3IgZmF2b3Igc2VsZWNjaW9uZSBwb3IgbG8gbWVub3MgezB9IHZhcmlhbnRlcy5cIixcbiAgbWF4U2VsZWN0RXJyb3I6IFwiUG9yIGZhdm9yIHNlbGVjY2lvbmUgbm8gbcOhcyBkZSB7MH0gdmFyaWFudGVzLlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiRWwgJ3swfScgZGViZSBkZSBzZXIgaWd1YWwgbyBtw6FzIGRlIHsxfSB5IGlndWFsIG8gbWVub3MgZGUgezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiRWwgJ3swfScgZGViZSBzZXIgaWd1YWwgbyBtw6FzIGRlIHsxfVwiLFxuICBudW1lcmljTWF4OiBcIkVsICd7MH0nIGRlYmUgc2VyIGlndWFsIG8gbWVub3MgZGUgezF9XCIsXG4gIGludmFsaWRFbWFpbDogXCJQb3IgZmF2b3IgYWdyZWd1ZSB1biBjb3JyZW8gZWxlY3Ryw7NuaWNvIHbDoWxpZG8uXCIsXG4gIHVybFJlcXVlc3RFcnJvcjogXCJMYSBzb2xpY2l0dWQgcmVncmVzw7MgZXJyb3IgJ3swfScuIHsxfVwiLFxuICB1cmxHZXRDaG9pY2VzRXJyb3I6XG4gICAgXCJMYSBzb2xpY2l0dWQgcmVncmVzw7MgdmFjw61vIGRlIGRhdGEgbyBsYSBwcm9waWVkYWQgJ3RyYXllY3RvcmlhJyBubyBlcyBjb3JyZWN0YVwiLFxuICBleGNlZWRNYXhTaXplOiBcIkVsIHRhbWHDsW8gZGVsIGFyY2hpdm8gbm8gZGViZSBkZSBleGNlZGVyIHswfS5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIlBvciBmYXZvciBhZ3JlZ3VlIGxhIG90cmEgZXN0aW1hY2nDs24uXCIsXG4gIHVwbG9hZGluZ0ZpbGU6XG4gICAgXCJTdSBhcmNoaXZvIHNlIGVzdMOhIHN1YmllbmRvLiBQb3IgZmF2b3IgZXNwZXJlIHVub3Mgc2VndW5kb3MgZSBpbnRlbnRlIGRlIG51ZXZvLlwiLFxuICBhZGRSb3c6IFwiQWdyZWd1ZSB1bmEgaGlsZXJhXCIsXG4gIHJlbW92ZVJvdzogXCJFbGltaW5hciB1bmEgaGlsZXJhXCIsXG4gIGNob2ljZXNfZmlyc3RJdGVtOiBcInByaW1lciBhcnTDrWN1bG9cIixcbiAgY2hvaWNlc19zZWNvbmRJdGVtOiBcInNlZ3VuZG8gYXJ0w61jdWxvXCIsXG4gIGNob2ljZXNfdGhpcmRJdGVtOiBcInRlcmNlcmEgYXJ0w61jdWxvXCIsXG4gIG1hdHJpeF9jb2x1bW46IFwiQ29sdW1uYVwiLFxuICBtYXRyaXhfcm93OiBcIkhpbGVyYVwiXG59O1xuXG5zdXJ2ZXlMb2NhbGl6YXRpb24ubG9jYWxlc1tcImVzXCJdID0gc3BhbmlzaFN1cnZleVN0cmluZ3M7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvbG9jYWxpemF0aW9uL3NwYW5pc2gudHMiLCIvL0NyZWF0ZSBieSBNYXR0aWFzIEFzcGx1bmRcbmltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgc3dlZGlzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJGw7ZyZWfDpWVuZGVcIixcbiAgcGFnZU5leHRUZXh0OiBcIk7DpHN0YVwiLFxuICBjb21wbGV0ZVRleHQ6IFwiRsOkcmRpZ1wiLFxuICBvdGhlckl0ZW1UZXh0OiBcIkFubmF0IChiZXNrcml2KVwiLFxuICBwcm9ncmVzc1RleHQ6IFwiU2lkYSB7MH0gYXYgezF9XCIsXG4gIGVtcHR5U3VydmV5OiBcIkRldCBmaW5ucyBpbmdlbiBzeW5saWcgc2lkYSBlbGxlciBmcsOlZ2EgaSBlbmvDpHRlbi5cIixcbiAgY29tcGxldGluZ1N1cnZleTogXCJUYWNrIGbDtnIgYXR0IGR1IGdlbm9tZsO2cnQgZW5rw6R0ZW4hIVwiLFxuICBsb2FkaW5nU3VydmV5OiBcIkVua8OkdGVuIGxhZGRhcy4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJWw6Rsai4uLlwiLFxuICByZXF1aXJlZEVycm9yOiBcIlZhciB2w6RubGlnIGJlc3ZhcmEgZnLDpWdhbi5cIixcbiAgcmVxdWlyZWRJbkFsbFJvd3NFcnJvcjogXCJWYXIgdsOkbmxpZyBiZXN2YXJhIGZyw6Vnb3JuYSBww6UgYWxsYSByYWRlci5cIixcbiAgbnVtZXJpY0Vycm9yOiBcIlbDpHJkZXQgc2thIHZhcmEgbnVtZXJpc2t0LlwiLFxuICB0ZXh0TWluTGVuZ3RoOiBcIlZhciB2w6RubGlnIGFuZ2UgbWluc3QgezB9IHRlY2tlbi5cIixcbiAgbWluUm93Q291bnRFcnJvcjogXCJWYXIgdsOkbmxpZyBmeWxsIGkgbWluc3QgezB9IHJhZGVyLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJWYXIgdsOkbmxpZyB2w6RsaiDDpXRtaW5zdG9uZSB7MH0gdmFyaWFudGVyLlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJWYXIgdsOkbmxpZyB2w6RsaiBpbnRlIGZsZXIgw6RuIHswfSB2YXJpYW50ZXIuXCIsXG4gIG51bWVyaWNNaW5NYXg6XG4gICAgXCInezB9JyBza2EgdmFyYSBsaWthIG1lZCBlbGxlciBtZXIgw6RuIHsxfSBzYW10IGxpa2EgbWVkIGVsbGVyIG1pbmRyZSDDpG4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgc2thIHZhcmEgbGlrYSBtZWQgZWxsZXIgbWVyIMOkbiB7MX1cIixcbiAgbnVtZXJpY01heDogXCInezB9JyBza2EgdmFyYSBsaWthIG1lZCBlbGxlciBtaW5kcmUgw6RuIHsxfVwiLFxuICBpbnZhbGlkRW1haWw6IFwiVmFyIHbDpG5saWcgYW5nZSBlbiBrb3JyZWt0IGUtcG9zdGFkcmVzcy5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIkbDtnJmcsOlZ2FuIHJldHVybmVyYWRlIGZlbGV0ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiQW50aW5nZW4gcmV0dXJuZXJhZGUgZsO2cmZyw6VnYW4gaW5nZW4gZGF0YSBlbGxlciBzw6Ugw6RyIGVnZW5za2FwZW4gJ3BhdGgnIGludGUga29ycmVrdFwiLFxuICBleGNlZWRNYXhTaXplOiBcIkZpbHN0b3JsZWtlbiBmw6VyIGVqIMO2dmVyc3RpZ2EgezB9LlwiLFxuICBvdGhlclJlcXVpcmVkRXJyb3I6IFwiVmFyIHbDpG5saWcgYW5nZSBkZXQgYW5kcmEgdsOkcmRldC5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkRpbiBmaWwgbGFkZGFzIHVwcC4gVmFyIHbDpG5saWcgdsOkbnRhIG7DpWdyYSBzZWt1bmRlciBvY2ggZsO2cnPDtmsgc2VkYW4gaWdlbi5cIixcbiAgYWRkUm93OiBcIkzDpGdnIHRpbGwgcmFkXCIsXG4gIHJlbW92ZVJvdzogXCJUYSBib3J0XCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1wic3ZcIl0gPSBzd2VkaXNoU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vc3dlZGlzaC50cyIsImltcG9ydCB7IHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gXCIuLi9zdXJ2ZXlTdHJpbmdzXCI7XG5cbmV4cG9ydCB2YXIgdHVya2lzaFN1cnZleVN0cmluZ3MgPSB7XG4gIHBhZ2VQcmV2VGV4dDogXCJHZXJpXCIsXG4gIHBhZ2VOZXh0VGV4dDogXCLEsGxlcmlcIixcbiAgY29tcGxldGVUZXh0OiBcIkFua2V0aSBUYW1hbWxhXCIsXG4gIG90aGVySXRlbVRleHQ6IFwiRGnEn2VyIChhw6fEsWtsYXnEsW7EsXopXCIsXG4gIHByb2dyZXNzVGV4dDogXCJTYXlmYSB7MH0gLyB7MX1cIixcbiAgZW1wdHlTdXJ2ZXk6IFwiQW5rZXR0ZSBnw7Zyw7xudMO8bGVuZWNlayBzYXlmYSB5YSBkYSBzb3J1IG1ldmN1dCBkZcSfaWwuXCIsXG4gIGNvbXBsZXRpbmdTdXJ2ZXk6IFwiQW5rZXRpbWl6aSB0YW1hbWxhZMSxxJ/EsW7EsXogacOnaW4gdGXFn2Vra8O8ciBlZGVyaXouXCIsXG4gIGxvYWRpbmdTdXJ2ZXk6IFwiQW5rZXQgc3VudWN1ZGFuIHnDvGtsZW5peW9yIC4uLlwiLFxuICBvcHRpb25zQ2FwdGlvbjogXCJTZcOnaW5peiAuLi5cIixcbiAgcmVxdWlyZWRFcnJvcjogXCJMw7x0ZmVuIHNvcnV5YSBjZXZhcCB2ZXJpbml6XCIsXG4gIG51bWVyaWNFcnJvcjogXCJHaXJpbGVuIGRlxJ9lciBudW1lcmlrIG9sbWFsxLFkxLFyXCIsXG4gIHRleHRNaW5MZW5ndGg6IFwiRW4gYXogezB9IHNlbWJvbCBnaXJpbml6LlwiLFxuICBtaW5Sb3dDb3VudEVycm9yOiBcIkzDvHRmZW4gZW4gYXogezB9IHNhdMSxcsSxIGRvbGR1cnVuLlwiLFxuICBtaW5TZWxlY3RFcnJvcjogXCJMw7x0ZmVuIGVuIGF6IHswfSBzZcOnZW5lxJ9pIHNlw6dpbml6LlwiLFxuICBtYXhTZWxlY3RFcnJvcjogXCJMw7x0ZmVuIHswfSBhZGV0dGVuIGZhemxhIHNlw6dtZXlpbml6LlwiLFxuICBudW1lcmljTWluTWF4OlxuICAgIFwiVGhlICd7MH0nIHNob3VsZCBiZSBlcXVhbCBvciBtb3JlIHRoYW4gezF9IGFuZCBlcXVhbCBvciBsZXNzIHRoYW4gezJ9XCIsXG4gIG51bWVyaWNNaW46IFwiJ3swfScgZGXEn2VyaSB7MX0gZGXEn2VyaW5lIGXFn2l0IHZleWEgYsO8ecO8ayBvbG1hbMSxZMSxclwiLFxuICBudW1lcmljTWF4OiBcIid7MH0nIGRlxJ9lcmkgezF9IGRlxJ9lcmluZSBlxZ9pdCB5YSBkYSBrw7zDp8O8ayBvbG1hbMSxZMSxci5cIixcbiAgaW52YWxpZEVtYWlsOiBcIkzDvHRmZW4gZ2XDp2VybGkgYmlyIGVwb3N0YSBhZHJlc2kgZ2lyaW5pei5cIixcbiAgdXJsUmVxdWVzdEVycm9yOiBcIlRhbGViaSDFn3UgaGF0YXnEsSBkw7ZuZMO8ICd7MH0nLiB7MX1cIixcbiAgdXJsR2V0Q2hvaWNlc0Vycm9yOlxuICAgIFwiVGFsZXAgaGVyaGFuZ2kgYmlyIHZlcmkgZMO2bm1lZGkgeWEgZGEgJ3BhdGgnIMO2emVsbGnEn2kgaGF0YWzEsS5cIixcbiAgZXhjZWVkTWF4U2l6ZTogXCJEb3N5YSBib3l1dHUgezB9IGRlxJ9lcmluaSBnZcOnZW1lei5cIixcbiAgb3RoZXJSZXF1aXJlZEVycm9yOiBcIkzDvHRmZW4gZGnEn2VyIGRlxJ9lcmxlcmkgZ2lyaW5pei5cIixcbiAgdXBsb2FkaW5nRmlsZTpcbiAgICBcIkRvc3lhbsSxeiB5w7xrbGVuaXlvci4gTMOcdGZlbiBiaXJrYcOnIHNhbml5ZSBiZWtsZXlpbiB2ZSB0ZWtyYXIgZGVuZXlpbi5cIixcbiAgYWRkUm93OiBcIlNhdMSxciBFa2xlXCIsXG4gIHJlbW92ZVJvdzogXCJLYWxkxLFyXCJcbn07XG5cbnN1cnZleUxvY2FsaXphdGlvbi5sb2NhbGVzW1widHJcIl0gPSB0dXJraXNoU3VydmV5U3RyaW5ncztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9sb2NhbGl6YXRpb24vdHVya2lzaC50cyIsImltcG9ydCB7IEhhc2hUYWJsZSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB7IEJhc2UgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBKc29uT2JqZWN0IH0gZnJvbSBcIi4vanNvbm9iamVjdFwiO1xuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyBmb3IgYWxsIHRyaWdnZXJzLlxuICogQSB0cmlnZ2VyIGNhbGxzIGEgbWV0aG9kIHdoZW4gdGhlIGV4cHJlc3Npb24gY2hhbmdlIHRoZSByZXN1bHQ6IGZyb20gZmFsc2UgdG8gdHJ1ZSBvciBmcm9tIHRydWUgdG8gZmFsc2UuXG4gKiBQbGVhc2Ugbm90ZSwgaXQgcnVucyBvbmx5IG9uZSBjaGFuZ2luZyB0aGUgZXhwcmVzc2lvbiByZXN1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmlnZ2VyIGV4dGVuZHMgQmFzZSB7XG4gIHN0YXRpYyBvcGVyYXRvcnNWYWx1ZTogSGFzaFRhYmxlPEZ1bmN0aW9uPiA9IG51bGw7XG4gIHN0YXRpYyBnZXQgb3BlcmF0b3JzKCkge1xuICAgIGlmIChUcmlnZ2VyLm9wZXJhdG9yc1ZhbHVlICE9IG51bGwpIHJldHVybiBUcmlnZ2VyLm9wZXJhdG9yc1ZhbHVlO1xuICAgIFRyaWdnZXIub3BlcmF0b3JzVmFsdWUgPSB7XG4gICAgICBlbXB0eTogZnVuY3Rpb24odmFsdWUsIGV4cGVjdGVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICF2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBub3RlbXB0eTogZnVuY3Rpb24odmFsdWUsIGV4cGVjdGVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICEhdmFsdWU7XG4gICAgICB9LFxuICAgICAgZXF1YWw6IGZ1bmN0aW9uKHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PSBleHBlY3RlZFZhbHVlO1xuICAgICAgfSxcbiAgICAgIG5vdGVxdWFsOiBmdW5jdGlvbih2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT0gZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBjb250YWluczogZnVuY3Rpb24odmFsdWUsIGV4cGVjdGVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlW1wiaW5kZXhPZlwiXSAmJiB2YWx1ZS5pbmRleE9mKGV4cGVjdGVkVmFsdWUpID4gLTE7XG4gICAgICB9LFxuICAgICAgbm90Y29udGFpbnM6IGZ1bmN0aW9uKHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIXZhbHVlIHx8ICF2YWx1ZVtcImluZGV4T2ZcIl0gfHwgdmFsdWUuaW5kZXhPZihleHBlY3RlZFZhbHVlKSA9PSAtMVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGdyZWF0ZXI6IGZ1bmN0aW9uKHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA+IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgbGVzczogZnVuY3Rpb24odmFsdWUsIGV4cGVjdGVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIDwgZXhwZWN0ZWRWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBncmVhdGVyb3JlcXVhbDogZnVuY3Rpb24odmFsdWUsIGV4cGVjdGVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID49IGV4cGVjdGVkVmFsdWU7XG4gICAgICB9LFxuICAgICAgbGVzc29yZXF1YWw6IGZ1bmN0aW9uKHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA8PSBleHBlY3RlZFZhbHVlO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIFRyaWdnZXIub3BlcmF0b3JzVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSBvcFZhbHVlOiBzdHJpbmcgPSBcImVxdWFsXCI7XG4gIHB1YmxpYyB2YWx1ZTogYW55O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwidHJpZ2dlcmJhc2VcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMub3BWYWx1ZTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wZXJhdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghVHJpZ2dlci5vcGVyYXRvcnNbdmFsdWVdKSByZXR1cm47XG4gICAgdGhpcy5vcFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIGNoZWNrKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoVHJpZ2dlci5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0odmFsdWUsIHRoaXMudmFsdWUpKSB7XG4gICAgICB0aGlzLm9uU3VjY2VzcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uRmFpbHVyZSgpO1xuICAgIH1cbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKCkge31cbiAgcHJvdGVjdGVkIG9uRmFpbHVyZSgpIHt9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVN1cnZleVRyaWdnZXJPd25lciB7XG4gIGdldE9iamVjdHMocGFnZXM6IHN0cmluZ1tdLCBxdWVzdGlvbnM6IHN0cmluZ1tdKTogYW55W107XG4gIGRvQ29tcGxldGUoKTtcbiAgc2V0VHJpZ2dlclZhbHVlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgaXNWYXJpYWJsZTogYm9vbGVhbik7XG59XG5cbi8qKlxuICogSXQgZXh0ZW5kcyB0aGUgVHJpZ2dlciBiYXNlIGNsYXNzIGFuZCBhZGQgcHJvcGVydGllcyByZXF1aXJlZCBmb3IgU3VydmV5SlMgY2xhc3Nlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXIgZXh0ZW5kcyBUcmlnZ2VyIHtcbiAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIG93bmVyOiBJU3VydmV5VHJpZ2dlck93bmVyID0gbnVsbDtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgc2V0T3duZXIob3duZXI6IElTdXJ2ZXlUcmlnZ2VyT3duZXIpIHtcbiAgICB0aGlzLm93bmVyID0gb3duZXI7XG4gIH1cbiAgcHVibGljIGdldCBpc09uTmV4dFBhZ2UoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4vKipcbiAqIElmIGV4cHJlc3Npb24gcmV0dXJucyB0cnVlLCBpdCBtYWtlcyBxdWVzdGlvbnMvcGFnZXMgdmlzaWJsZS5cbiAqIE9odGVyd2lzZSBpdCBtYWtlcyB0aGVtIGludmlzaWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJWaXNpYmxlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gIHB1YmxpYyBwYWdlczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIHF1ZXN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInZpc2libGV0cmlnZ2VyXCI7XG4gIH1cbiAgcHJvdGVjdGVkIG9uU3VjY2VzcygpIHtcbiAgICB0aGlzLm9uVHJpZ2dlcih0aGlzLm9uSXRlbVN1Y2Nlc3MpO1xuICB9XG4gIHByb3RlY3RlZCBvbkZhaWx1cmUoKSB7XG4gICAgdGhpcy5vblRyaWdnZXIodGhpcy5vbkl0ZW1GYWlsdXJlKTtcbiAgfVxuICBwcml2YXRlIG9uVHJpZ2dlcihmdW5jOiBGdW5jdGlvbikge1xuICAgIGlmICghdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHZhciBvYmplY3RzID0gdGhpcy5vd25lci5nZXRPYmplY3RzKHRoaXMucGFnZXMsIHRoaXMucXVlc3Rpb25zKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZ1bmMob2JqZWN0c1tpXSk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBvbkl0ZW1TdWNjZXNzKGl0ZW06IGFueSkge1xuICAgIGl0ZW0udmlzaWJsZSA9IHRydWU7XG4gIH1cbiAgcHJvdGVjdGVkIG9uSXRlbUZhaWx1cmUoaXRlbTogYW55KSB7XG4gICAgaXRlbS52aXNpYmxlID0gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogSWYgZXhwcmVzc2lvbiByZXR1cm5zIHRydWUsIGl0IGNvbXBsZXRlcyB0aGUgc3VydmV5LlxuICovXG5leHBvcnQgY2xhc3MgU3VydmV5VHJpZ2dlckNvbXBsZXRlIGV4dGVuZHMgU3VydmV5VHJpZ2dlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgcHVibGljIGdldFR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJjb21wbGV0ZXRyaWdnZXJcIjtcbiAgfVxuICBwdWJsaWMgZ2V0IGlzT25OZXh0UGFnZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcm90ZWN0ZWQgb25TdWNjZXNzKCkge1xuICAgIGlmICh0aGlzLm93bmVyKSB0aGlzLm93bmVyLmRvQ29tcGxldGUoKTtcbiAgfVxufVxuZXhwb3J0IGNsYXNzIFN1cnZleVRyaWdnZXJTZXRWYWx1ZSBleHRlbmRzIFN1cnZleVRyaWdnZXIge1xuICBwdWJsaWMgc2V0VG9OYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBzZXRWYWx1ZTogYW55O1xuICBwdWJsaWMgaXNWYXJpYWJsZTogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcInNldHZhbHVldHJpZ2dlclwiO1xuICB9XG4gIHByb3RlY3RlZCBvblN1Y2Nlc3MoKSB7XG4gICAgaWYgKCF0aGlzLnNldFRvTmFtZSB8fCAhdGhpcy5vd25lcikgcmV0dXJuO1xuICAgIHRoaXMub3duZXIuc2V0VHJpZ2dlclZhbHVlKHRoaXMuc2V0VG9OYW1lLCB0aGlzLnNldFZhbHVlLCB0aGlzLmlzVmFyaWFibGUpO1xuICB9XG59XG5cbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJ0cmlnZ2VyXCIsIFtcIm9wZXJhdG9yXCIsIFwiIXZhbHVlXCJdKTtcbkpzb25PYmplY3QubWV0YURhdGEuYWRkQ2xhc3MoXCJzdXJ2ZXl0cmlnZ2VyXCIsIFtcIiFuYW1lXCJdLCBudWxsLCBcInRyaWdnZXJcIik7XG5Kc29uT2JqZWN0Lm1ldGFEYXRhLmFkZENsYXNzKFxuICBcInZpc2libGV0cmlnZ2VyXCIsXG4gIFtcInBhZ2VzXCIsIFwicXVlc3Rpb25zXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJWaXNpYmxlKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJjb21wbGV0ZXRyaWdnZXJcIixcbiAgW10sXG4gIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgU3VydmV5VHJpZ2dlckNvbXBsZXRlKCk7XG4gIH0sXG4gIFwic3VydmV5dHJpZ2dlclwiXG4pO1xuSnNvbk9iamVjdC5tZXRhRGF0YS5hZGRDbGFzcyhcbiAgXCJzZXR2YWx1ZXRyaWdnZXJcIixcbiAgW1wiIXNldFRvTmFtZVwiLCBcInNldFZhbHVlXCIsIFwiaXNWYXJpYWJsZTpib29sZWFuXCJdLFxuICBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFN1cnZleVRyaWdnZXJTZXRWYWx1ZSgpO1xuICB9LFxuICBcInN1cnZleXRyaWdnZXJcIlxuKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy90cmlnZ2VyLnRzIiwiaW1wb3J0ICogYXMga28gZnJvbSBcImtub2Nrb3V0XCI7XG5pbXBvcnQgeyBTdXJ2ZXlNb2RlbCB9IGZyb20gXCIuLi9zdXJ2ZXlcIjtcbmltcG9ydCB7IFN1cnZleSB9IGZyb20gXCIuLi9rbm9ja291dC9rb3N1cnZleVwiO1xuaW1wb3J0IHsgU3VydmV5V2luZG93IH0gZnJvbSBcIi4uL2tub2Nrb3V0L2tvU3VydmV5V2luZG93XCI7XG5pbXBvcnQgalF1ZXJ5IGZyb20gXCJqcXVlcnlcIjtcbmltcG9ydCB7IHVwZGF0ZVN1cnZleVByb3BzIH0gZnJvbSBcIi4uL3V0aWxzL3VwZGF0ZVN1cnZleVByb3BzXCI7XG5cbmpRdWVyeVtcImZuXCJdLmV4dGVuZCh7XG4gIFN1cnZleTogZnVuY3Rpb24ocHJvcHMpIHtcbiAgICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbW9kZWwgPSBwcm9wcy5tb2RlbDtcbiAgICAgIHVwZGF0ZVN1cnZleVByb3BzKG1vZGVsLCBwcm9wcyk7XG4gICAgICBtb2RlbC5yZW5kZXIodGhpcyk7XG4gICAgfSk7XG4gIH0sXG5cbiAgU3VydmV5V2luZG93OiBmdW5jdGlvbihwcm9wcykge1xuICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBtb2RlbCA9IHByb3BzLm1vZGVsO1xuICAgICAgdXBkYXRlU3VydmV5UHJvcHMobW9kZWwsIHByb3BzKTtcbiAgICAgIHZhciBzdXJ2ZXkgPSBuZXcgU3VydmV5V2luZG93KG51bGwsIG1vZGVsKTtcbiAgICAgIGlmKHByb3BzLmV4cGFuZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc3VydmV5LmlzRXhwYW5kZWQgPSBwcm9wcy5leHBhbmRlZDtcbiAgICAgIH1cbiAgICAgIHN1cnZleS5zaG93KCk7XG4gICAgfSk7XG4gIH1cbn0pO1xuXG5TdXJ2ZXlNb2RlbC5wbGF0Zm9ybSA9IFwianF1ZXJ5XCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2tub2Nrb3V0XCI7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9qcXVlcnkudHMiXSwic291cmNlUm9vdCI6IiJ9