adui
Version:
<div> <img src="https://wxa.wxs.qq.com/mpweb/delivery/legacy/wxadtouch/upload/t1/od834zef_52939fc6.png" style="margin:40px 0 0 -8px; background-color: #fcfcfc; box-shadow: none;" /> </div>
470 lines • 73.5 kB
JavaScript
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
var _excluded = ["allowClear", "className", "getPopupContainer", "onChange", "options", "placeholder", "placeholderColor", "placement", "rightIcon", "searchable", "size", "theme", "value"];
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
import * as React from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import RcSelect from "rc-select";
import OptGroup from "./OptGroup";
import Option from "./Option";
import omit from "../_util/omit";
import Icon from "../icon";
import { ConfigContext } from "../config-provider";
import getPlacements from "../tooltip/placements";
import "./style";
var noop = function noop() {};
var prefix = "adui-select";
var Select = function (_React$Component) {
function Select(props) {
var _this;
_classCallCheck(this, Select);
_this = _callSuper(this, Select, [props]);
_this.hash = Math.random().toString(36).slice(2);
_this.locked = false;
_this.select = void 0;
_this.search = void 0;
_this.menu = void 0;
_this.saveSelect = function (node) {
_this.select = node;
};
_this.saveSearch = function (node) {
_this.search = node;
};
_this.onDropdownVisibleChange = function (open) {
var _this$props = _this.props,
onDropdownVisibleChange = _this$props.onDropdownVisibleChange,
openProp = _this$props.open;
var _this$state = _this.state,
value = _this$state.value,
selectId = _this$state.selectId;
if (_this.locked) {
return;
}
if (openProp === null) {
_this.setState({
open: open
});
}
if (open) {
_this.preventVisibleChange();
setTimeout(function () {
if (_this.search) {
if (value) {
var id = selectId;
if (!selectId) {
var _this$search$parentNo;
id = (_this$search$parentNo = _this.search.parentNode) === null || _this$search$parentNo === void 0 || (_this$search$parentNo = _this$search$parentNo.nextSibling) === null || _this$search$parentNo === void 0 ? void 0 : _this$search$parentNo.id;
_this.setState({
selectId: id
});
}
if (id) {
var _document$getElementB, _parent$getElementsBy;
var parent = (_document$getElementB = document.getElementById(id)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.nextSibling;
var el = parent === null || parent === void 0 || (_parent$getElementsBy = parent.getElementsByClassName("adui-select-item-option-selected")[0]) === null || _parent$getElementsBy === void 0 ? void 0 : _parent$getElementsBy.children[0];
var listHolder = parent === null || parent === void 0 ? void 0 : parent.getElementsByClassName("rc-virtual-list-holder")[0];
if (listHolder) {
listHolder.dispatchEvent(new Event("scroll"));
if (listHolder.children[0]) {
listHolder.children[0].dispatchEvent(new Event("scroll"));
}
}
if (el) {
_this.setState({
placeholderText: el.dataset.html || el.innerHTML
});
}
}
} else {
_this.setState({
placeholderText: ""
});
}
_this.search.focus();
}
}, 150);
} else {
if (_this.search) {
_this.search.value = "";
}
_this.setState({
placeholderShow: false
});
}
if (onDropdownVisibleChange) {
onDropdownVisibleChange(open);
}
};
_this.onSelect = function (value, option) {
var _this$props2 = _this.props,
onSelect = _this$props2.onSelect,
valueProp = _this$props2.value;
if (valueProp === null) {
_this.setState({
value: value
});
}
if (onSelect && valueProp !== value) {
onSelect(value, option);
}
if (_this.search) {
_this.search.value = "";
}
if (_this.select && _this.select.setInputValue) {
_this.select.setInputValue("");
}
};
_this.handleDropdownRender = function (menu) {
_this.menu = menu;
var _this$props3 = _this.props,
searchable = _this$props3.searchable,
searchPlaceholder = _this$props3.searchPlaceholder,
searchInputProps = _this$props3.searchInputProps,
topContent = _this$props3.topContent,
bottomContent = _this$props3.bottomContent;
if (searchable) {
return React.createElement("div", null, topContent, React.createElement("div", {
className: "".concat(prefix, "-search")
}, React.createElement("input", _extends({
ref: _this.saveSearch,
placeholder: searchPlaceholder,
onChange: _this.handleSearch,
onCompositionStart: _this.handleSearchStart,
onCompositionUpdate: _this.handleSearchUpdate,
onCompositionEnd: _this.handleSearchEnd,
onKeyDown: _this.handleSearchKeyDown,
onMouseDown: _this.preventVisibleChange,
onMouseUp: _this.preventVisibleChange
}, searchInputProps || {})), React.createElement(Icon, {
icon: "search",
className: "".concat(prefix, "-icon")
})), menu, bottomContent);
}
return React.createElement(React.Fragment, null, topContent, menu, bottomContent);
};
_this.handleSearchStart = function (e) {
var onSearchCompositionStart = _this.props.onSearchCompositionStart;
var target;
if (e) {
target = e.target;
} else {
target = _this.search;
}
if (onSearchCompositionStart) {
onSearchCompositionStart(target.value);
}
};
_this.handleSearchUpdate = function (e) {
var onSearchCompositionUpdate = _this.props.onSearchCompositionUpdate;
var target;
if (e) {
target = e.target;
} else {
target = _this.search;
}
if (onSearchCompositionUpdate) {
onSearchCompositionUpdate(target.value);
}
};
_this.handleSearchEnd = function (e) {
var onSearchCompositionEnd = _this.props.onSearchCompositionEnd;
var target;
if (e) {
target = e.target;
} else {
target = _this.search;
}
if (onSearchCompositionEnd) {
onSearchCompositionEnd(target.value);
}
};
_this.handleSearch = function (e) {
var target;
if (e) {
target = e.target;
} else {
target = _this.search;
}
var val = target.value;
var _this$state2 = _this.state,
placeholderShow = _this$state2.placeholderShow,
selectId = _this$state2.selectId;
if (val && !placeholderShow) {
_this.setState({
placeholderShow: true
});
}
if (!val && placeholderShow) {
_this.setState({
placeholderShow: false
});
}
if (_this.select) {
var id = selectId;
if (!selectId) {
var _target$parentNode;
id = (_target$parentNode = target.parentNode) === null || _target$parentNode === void 0 || (_target$parentNode = _target$parentNode.nextSibling) === null || _target$parentNode === void 0 ? void 0 : _target$parentNode.id;
_this.setState({
selectId: id
});
}
var realInput = document.querySelector(".adui-select-selection-search [aria-owns=\"".concat(id, "\"]"));
if (realInput) {
var lastValue = realInput.value;
realInput.value = val;
var event = new Event("input", {
bubbles: true
});
var tracker = realInput._valueTracker;
if (tracker) {
tracker.setValue(lastValue);
}
realInput.dispatchEvent(event);
}
}
};
_this.handleSearchKeyDown = function (e) {
if (_this.select && _this.select.onInputKeyDown) {
_this.select.onInputKeyDown(e);
}
};
_this.preventVisibleChange = function () {
_this.locked = true;
setTimeout(function () {
_this.locked = false;
_this.setState({
open: true
});
}, 200);
};
var defaultOpen = props.defaultOpen,
defaultValue = props.defaultValue,
_open = props.open,
_value = props.value;
var valueState;
if (_value !== null) {
if (_value === "") {
valueState = undefined;
} else {
valueState = _value;
}
} else if (defaultValue !== null) {
valueState = defaultValue;
}
var openState;
if (_open !== null) {
openState = _open;
} else if (defaultOpen !== null) {
openState = defaultOpen;
}
_this.state = {
open: openState,
placeholderShow: false,
selectId: "",
placeholderText: "",
value: valueState
};
return _this;
}
_inherits(Select, _React$Component);
return _createClass(Select, [{
key: "render",
value: function render() {
var _this2 = this;
var _this$props4 = this.props,
allowClear = _this$props4.allowClear,
className = _this$props4.className,
getPopupContainer = _this$props4.getPopupContainer,
_onChange = _this$props4.onChange,
options = _this$props4.options,
placeholder = _this$props4.placeholder,
placeholderColor = _this$props4.placeholderColor,
placement = _this$props4.placement,
rightIcon = _this$props4.rightIcon,
searchable = _this$props4.searchable,
size = _this$props4.size,
theme = _this$props4.theme,
valueProp = _this$props4.value,
otherProps = _objectWithoutProperties(_this$props4, _excluded);
var restProps = omit(otherProps, ["defaultValue", "open", "onDropdownVisibleChange", "onSelect", "searchPlaceholder", "onSearchCompositionStart", "onSearchCompositionUpdate", "onSearchCompositionEnd", "searchInputProps", "topContent", "bottomContent"]);
var _this$state3 = this.state,
openState = _this$state3.open,
placeholderShow = _this$state3.placeholderShow,
placeholderText = _this$state3.placeholderText,
valueState = _this$state3.value;
var openProps = {};
if (typeof openState === "boolean") {
openProps.open = openState;
}
if (valueState !== null) {
openProps.value = valueProp === "" ? placeholderColor ? React.createElement("span", {
style: {
color: placeholderColor
}
}, placeholder) : placeholder : valueState;
}
var transitionName = "slide-up";
return React.createElement(ConfigContext.Consumer, null, function (_ref) {
var getPopupContainerContext = _ref.getPopupContainer;
return React.createElement(RcSelect, _extends({
allowClear: allowClear,
className: classNames(className, "".concat(prefix, "-select"), "".concat(prefix, "-").concat(size), _defineProperty(_defineProperty(_defineProperty({}, "".concat(prefix, "-value_is_empty_string"), valueState === "" || valueState === undefined), "".concat(prefix, "-light"), theme === "light"), "".concat(prefix, "-select_placeholderShow"), placeholderShow)),
"data-value": valueState || placeholder,
menuItemSelectedIcon: null,
dropdownAlign: getPlacements({
alignEdge: true
})[placement || "bottomLeft"],
dropdownClassName: "adui-select-dropdown-".concat(_this2.hash, " adui-select-dropdown-").concat(size, " ").concat(searchable ? "adui-select-dropdown-searchable" : ""),
dropdownRender: _this2.handleDropdownRender,
suffixIcon: React.createElement(React.Fragment, null, placeholderShow && (typeof (placeholderText || placeholder || "") === "string" ? React.createElement("div", {
className: "".concat(prefix, "-placeholder-text"),
style: {
color: !valueState ? placeholderColor || "var(--gray-700)" : "var(--gray-900)"
},
dangerouslySetInnerHTML: {
__html: "".concat(placeholderText || placeholder || "")
}
}) : React.createElement("div", {
className: "".concat(prefix, "-placeholder-text"),
style: {
color: !valueState ? placeholderColor || "var(--gray-700)" : "var(--gray-900)"
}
}, placeholderText || placeholder || "")), React.createElement(Icon, {
icon: rightIcon || "triangle-down",
color: "var(--transparent-gray-700)"
})),
clearIcon: React.createElement("div", {
style: {
background: "radial-gradient(\n circle at 50% 50%, #fff 50%, transparent 50%\n )"
}
}, React.createElement(Icon, {
icon: "cancel-circle",
color: "var(--transparent-gray-700)"
})),
listHeight: 250,
listItemHeight: size === "large" ? 40 : size === "medium" ? 36 : 32,
notFoundContent: "\u65E0\u5339\u914D\u7ED3\u679C",
onDropdownVisibleChange: _this2.onDropdownVisibleChange,
onSelect: _this2.onSelect,
onChange: function onChange(v, ops) {
if (v === undefined && ops === undefined && allowClear) {
_this2.onSelect(v, ops);
}
if (_onChange) {
_onChange(v, ops);
}
},
defaultActiveFirstOption: false,
getPopupContainer: getPopupContainer || getPopupContainerContext,
optionLabelProp: options ? "label" : "children",
optionFilterProp: options ? "label" : "children",
options: options,
placeholder: placeholderColor ? React.createElement("span", {
style: {
color: placeholderColor
}
}, placeholder) : placeholder,
prefixCls: "adui-select",
showSearch: true,
ref: _this2.saveSelect,
transitionName: transitionName
}, openProps, restProps));
});
}
}]);
}(React.Component);
Select.type = "Select";
Select.Option = Option;
Select.OptGroup = OptGroup;
Select.propTypes = {
allowClear: PropTypes.bool,
bottomContent: PropTypes.node,
children: PropTypes.node,
className: PropTypes.string,
defaultOpen: PropTypes.bool,
defaultValue: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
dropdownMatchSelectWidth: PropTypes.bool,
getPopupContainer: PropTypes.func,
onDropdownVisibleChange: PropTypes.func,
onPopupScroll: PropTypes.func,
onSearch: PropTypes.func,
onSearchCompositionStart: PropTypes.func,
onSearchCompositionUpdate: PropTypes.func,
onSearchCompositionEnd: PropTypes.func,
searchInputProps: PropTypes.any,
onSelect: PropTypes.func,
open: PropTypes.bool,
options: PropTypes.array,
placeholder: PropTypes.any,
placeholderColor: PropTypes.string,
placement: PropTypes.oneOf(["top", "left", "right", "bottom", "topLeft", "topRight", "bottomLeft", "bottomRight", "leftTop", "leftBottom", "rightTop", "rightBottom"]),
rightIcon: PropTypes.any,
searchPlaceholder: PropTypes.string,
searchable: PropTypes.bool,
size: PropTypes.oneOf(["mini", "small", "medium", "large"]),
theme: PropTypes.oneOf([null, "light"]),
topContent: PropTypes.node,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number])
};
Select.defaultProps = {
allowClear: false,
bottomContent: null,
children: null,
className: undefined,
defaultOpen: null,
defaultValue: null,
dropdownMatchSelectWidth: true,
getPopupContainer: null,
onDropdownVisibleChange: noop,
onPopupScroll: noop,
onSearch: noop,
onSearchCompositionStart: noop,
onSearchCompositionUpdate: noop,
onSearchCompositionEnd: noop,
searchInputProps: {},
onSelect: noop,
open: null,
options: undefined,
placeholder: "请选择",
placeholderColor: undefined,
placement: "bottomLeft",
rightIcon: "triangle-down",
searchPlaceholder: "搜索",
searchable: false,
size: "small",
theme: null,
topContent: null
};
Select.getDerivedStateFromProps = function (_ref2) {
var open = _ref2.open,
value = _ref2.value;
var newState = {};
if (open !== null) {
newState.open = open;
}
if (value !== null) {
if (value === "") {
newState.value = undefined;
} else {
newState.value = value;
}
}
return Object.keys(newState).length > 0 ? newState : null;
};
export default Select;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlByb3BUeXBlcyIsImNsYXNzTmFtZXMiLCJSY1NlbGVjdCIsIk9wdEdyb3VwIiwiT3B0aW9uIiwib21pdCIsIkljb24iLCJDb25maWdDb250ZXh0IiwiZ2V0UGxhY2VtZW50cyIsIm5vb3AiLCJwcmVmaXgiLCJTZWxlY3QiLCJfUmVhY3QkQ29tcG9uZW50IiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9jYWxsU3VwZXIiLCJoYXNoIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic2xpY2UiLCJsb2NrZWQiLCJzZWxlY3QiLCJzZWFyY2giLCJtZW51Iiwic2F2ZVNlbGVjdCIsIm5vZGUiLCJzYXZlU2VhcmNoIiwib25Ecm9wZG93blZpc2libGVDaGFuZ2UiLCJvcGVuIiwiX3RoaXMkcHJvcHMiLCJvcGVuUHJvcCIsIl90aGlzJHN0YXRlIiwic3RhdGUiLCJ2YWx1ZSIsInNlbGVjdElkIiwic2V0U3RhdGUiLCJwcmV2ZW50VmlzaWJsZUNoYW5nZSIsInNldFRpbWVvdXQiLCJpZCIsIl90aGlzJHNlYXJjaCRwYXJlbnRObyIsInBhcmVudE5vZGUiLCJuZXh0U2libGluZyIsIl9kb2N1bWVudCRnZXRFbGVtZW50QiIsIl9wYXJlbnQkZ2V0RWxlbWVudHNCeSIsInBhcmVudCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJlbCIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJjaGlsZHJlbiIsImxpc3RIb2xkZXIiLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnQiLCJwbGFjZWhvbGRlclRleHQiLCJkYXRhc2V0IiwiaHRtbCIsImlubmVySFRNTCIsImZvY3VzIiwicGxhY2Vob2xkZXJTaG93Iiwib25TZWxlY3QiLCJvcHRpb24iLCJfdGhpcyRwcm9wczIiLCJ2YWx1ZVByb3AiLCJzZXRJbnB1dFZhbHVlIiwiaGFuZGxlRHJvcGRvd25SZW5kZXIiLCJfdGhpcyRwcm9wczMiLCJzZWFyY2hhYmxlIiwic2VhcmNoUGxhY2Vob2xkZXIiLCJzZWFyY2hJbnB1dFByb3BzIiwidG9wQ29udGVudCIsImJvdHRvbUNvbnRlbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiY29uY2F0IiwiX2V4dGVuZHMiLCJyZWYiLCJwbGFjZWhvbGRlciIsIm9uQ2hhbmdlIiwiaGFuZGxlU2VhcmNoIiwib25Db21wb3NpdGlvblN0YXJ0IiwiaGFuZGxlU2VhcmNoU3RhcnQiLCJvbkNvbXBvc2l0aW9uVXBkYXRlIiwiaGFuZGxlU2VhcmNoVXBkYXRlIiwib25Db21wb3NpdGlvbkVuZCIsImhhbmRsZVNlYXJjaEVuZCIsIm9uS2V5RG93biIsImhhbmRsZVNlYXJjaEtleURvd24iLCJvbk1vdXNlRG93biIsIm9uTW91c2VVcCIsImljb24iLCJGcmFnbWVudCIsImUiLCJvblNlYXJjaENvbXBvc2l0aW9uU3RhcnQiLCJ0YXJnZXQiLCJvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlIiwib25TZWFyY2hDb21wb3NpdGlvbkVuZCIsInZhbCIsIl90aGlzJHN0YXRlMiIsIl90YXJnZXQkcGFyZW50Tm9kZSIsInJlYWxJbnB1dCIsInF1ZXJ5U2VsZWN0b3IiLCJsYXN0VmFsdWUiLCJldmVudCIsImJ1YmJsZXMiLCJ0cmFja2VyIiwiX3ZhbHVlVHJhY2tlciIsInNldFZhbHVlIiwib25JbnB1dEtleURvd24iLCJkZWZhdWx0T3BlbiIsImRlZmF1bHRWYWx1ZSIsInZhbHVlU3RhdGUiLCJ1bmRlZmluZWQiLCJvcGVuU3RhdGUiLCJfaW5oZXJpdHMiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJyZW5kZXIiLCJfdGhpczIiLCJfdGhpcyRwcm9wczQiLCJhbGxvd0NsZWFyIiwiZ2V0UG9wdXBDb250YWluZXIiLCJvcHRpb25zIiwicGxhY2Vob2xkZXJDb2xvciIsInBsYWNlbWVudCIsInJpZ2h0SWNvbiIsInNpemUiLCJ0aGVtZSIsIm90aGVyUHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJyZXN0UHJvcHMiLCJfdGhpcyRzdGF0ZTMiLCJvcGVuUHJvcHMiLCJzdHlsZSIsImNvbG9yIiwidHJhbnNpdGlvbk5hbWUiLCJDb25zdW1lciIsIl9yZWYiLCJnZXRQb3B1cENvbnRhaW5lckNvbnRleHQiLCJfZGVmaW5lUHJvcGVydHkiLCJtZW51SXRlbVNlbGVjdGVkSWNvbiIsImRyb3Bkb3duQWxpZ24iLCJhbGlnbkVkZ2UiLCJkcm9wZG93bkNsYXNzTmFtZSIsImRyb3Bkb3duUmVuZGVyIiwic3VmZml4SWNvbiIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiX19odG1sIiwiY2xlYXJJY29uIiwiYmFja2dyb3VuZCIsImxpc3RIZWlnaHQiLCJsaXN0SXRlbUhlaWdodCIsIm5vdEZvdW5kQ29udGVudCIsInYiLCJvcHMiLCJkZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24iLCJvcHRpb25MYWJlbFByb3AiLCJvcHRpb25GaWx0ZXJQcm9wIiwicHJlZml4Q2xzIiwic2hvd1NlYXJjaCIsIkNvbXBvbmVudCIsInR5cGUiLCJwcm9wVHlwZXMiLCJib29sIiwic3RyaW5nIiwib25lT2ZUeXBlIiwibnVtYmVyIiwiZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoIiwiZnVuYyIsIm9uUG9wdXBTY3JvbGwiLCJvblNlYXJjaCIsImFueSIsImFycmF5Iiwib25lT2YiLCJkZWZhdWx0UHJvcHMiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJfcmVmMiIsIm5ld1N0YXRlIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCJdLCJzb3VyY2VzIjpbIi4uLy4uL2NvbXBvbmVudHMvc2VsZWN0L1NlbGVjdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLWRhbmdlciAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCJcbmltcG9ydCBSY1NlbGVjdCBmcm9tIFwicmMtc2VsZWN0XCJcbmltcG9ydCBPcHRHcm91cCBmcm9tIFwiLi9PcHRHcm91cFwiXG5pbXBvcnQgT3B0aW9uIGZyb20gXCIuL09wdGlvblwiXG5pbXBvcnQgb21pdCBmcm9tIFwiLi4vX3V0aWwvb21pdFwiXG5pbXBvcnQgSWNvbiwgeyBJY29uTmFtZXMgfSBmcm9tIFwiLi4vaWNvblwiXG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSBcIi4uL2NvbmZpZy1wcm92aWRlclwiXG5pbXBvcnQgeyBQbGFjZW1lbnQgfSBmcm9tIFwiLi4vcG9wLXRyaWdnZXJcIlxuaW1wb3J0IGdldFBsYWNlbWVudHMgZnJvbSBcIi4uL3Rvb2x0aXAvcGxhY2VtZW50c1wiXG5pbXBvcnQgXCIuL3N0eWxlXCJcblxuLyoqXG4gKiBTZWxlY3Qg5bCB6KOF5LqOIHJjLXNlbGVjdDogaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0LWNvbXBvbmVudC9zZWxlY3RcbiAqIHJjLXNlbGVjdCDmnKzouqsgcHJvcHMg6Z2e5bi46Z2e5bi45aSa44CC6ICM5aaCIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlIOi/meagt+eahCBwcm9wIOeUmuiHs+S4jeWcqOaWh+aho+S4re+8m1xuICog6LCD55SoIHJjLXNlbGVjdCDnmoTlhoXnva7mlrnms5XvvIxTZWxlY3Qg5a6e546w5LqG5Yqf6IO955qE5YaN5bCB6KOF77yM5aaC5YaF5bWM5pCc57Si5L6d6Z2g55qE5pivIHRoaXMuc2VsZWN0Lm9uSW5wdXRDaGFuZ2XvvJtcbiAqIHJjLXNlbGVjdCDku43nhLbmnInorrjlpJrlgLzlvpflho3lsIHoo4Xlkoznu6fnu63lrabkuaDnmoTkvZnlnLDvvIwqKuacquadpeeahOWPr+e7tOaKpOepuumXtOaYr+mdnuW4uOWkp+eahCoq44CCXG4gKi9cblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5jb25zdCBwcmVmaXggPSBcImFkdWktc2VsZWN0XCJcblxuZXhwb3J0IGludGVyZmFjZSBJU2VsZWN0IHtcbiAgZm9yY2VQb3B1cEFsaWduPzogKCkgPT4gdm9pZFxuICBnZXRSb290RG9tTm9kZT86ICgpID0+IEhUTUxFbGVtZW50XG4gIG9uSW5wdXRDaGFuZ2U/OiAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHZvaWRcbiAgb25JbnB1dEtleURvd24/OiAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4gdm9pZFxuICBzZXRJbnB1dFZhbHVlPzogKHZhbHVlPzogc3RyaW5nKSA9PiB2b2lkXG4gIGdldFBvcHVwRE9NTm9kZTogKCkgPT4gSFRNTEVsZW1lbnRcbn1cblxudHlwZSBWYWx1ZVR5cGUgPSBSZWFjdC5SZWFjdFRleHRcblxuZXhwb3J0IGludGVyZmFjZSBJU2VsZWN0UHJvcHM8VCBleHRlbmRzIFZhbHVlVHlwZSA9IFZhbHVlVHlwZT4ge1xuICBba2V5OiBzdHJpbmddOiBhbnlcbiAgLyoqXG4gICAqIOaYr+WQpuaPkOS+m+a4hemZpOWKn+iDvVxuICAgKi9cbiAgYWxsb3dDbGVhcj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOS4i+aLieahhuW6lemDqOaYvuekuueahOiHquWumuS5ieWFg+e0oFxuICAgKi9cbiAgYm90dG9tQ29udGVudD86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog5a2Q6IqC54K5XG4gICAqL1xuICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog6ZmE5Yqg57G75ZCNXG4gICAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOWGhemDqOmpseWKqO+8muaYr+WQpuWxleW8gFxuICAgKi9cbiAgZGVmYXVsdE9wZW4/OiBib29sZWFuIHwgbnVsbFxuICAvKipcbiAgICog5YaF6YOo6amx5Yqo77ya5b2T5YmN6YCJ5Lit6aG555qE5YC8XG4gICAqL1xuICBkZWZhdWx0VmFsdWU/OiBUIHwgbnVsbFxuICAvKipcbiAgICog5LiL5ouJ5YiX6KGo5piv5ZCm5ZKM6YCJ5oup5Zmo5ZCM5a69XG4gICAqL1xuICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGg/OiBib29sZWFuXG4gIC8qKlxuICAgKiDmjIflrprlvLnlh7rlsYLnmoTniLbnuqfvvIzpu5jorqTkuLogZG9jdW1lbnQuYm9keVxuICAgKi9cbiAgZ2V0UG9wdXBDb250YWluZXI/OiBudWxsIHwgKChub2RlOiBIVE1MRWxlbWVudCkgPT4gSFRNTEVsZW1lbnQpXG4gIC8qKlxuICAgKiDkuIvmi4nliJfooajmmL7npLrlj5jljJbml7bnmoQgaGFuZGxlcu+8jOWPguaVsO+8mmJvb2xcbiAgICovXG4gIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlPzogKG9wZW46IGJvb2xlYW4pID0+IHZvaWRcbiAgLyoqXG4gICAqIOS4i+aLieWIl+ihqOa7muWKqOaXtueahCBoYW5kbGVyLCDlj4LmlbDvvJplXG4gICAqL1xuICBvblBvcHVwU2Nyb2xsPzogKGU6IFJlYWN0Lk1vdXNlRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB2b2lkXG4gIC8qKlxuICAgKiDmkJzntKLml7bnmoQgaGFuZGxlciwg5Y+C5pWw77yac3RyaW5nXG4gICAqL1xuICBvblNlYXJjaD86ICh2YWw6IHN0cmluZykgPT4gdm9pZFxuICAvKipcbiAgICog5pCc57SiIENvbXBvc2l0aW9uU3RhcnQg55qEIGhhbmRsZXIsIOWPguaVsO+8mnN0cmluZ1xuICAgKi9cbiAgb25TZWFyY2hDb21wb3NpdGlvblN0YXJ0PzogKHZhbDogc3RyaW5nKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDmkJzntKIgQ29tcG9zaXRpb25VcGRhdGUg55qEIGhhbmRsZXIsIOWPguaVsO+8mnN0cmluZ1xuICAgKi9cbiAgb25TZWFyY2hDb21wb3NpdGlvblVwZGF0ZT86ICh2YWw6IHN0cmluZykgPT4gdm9pZFxuICAvKipcbiAgICog5pCc57SiIENvbXBvc2l0aW9uRW5kIOeahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICovXG4gIG9uU2VhcmNoQ29tcG9zaXRpb25FbmQ/OiAodmFsOiBzdHJpbmcpID0+IHZvaWRcbiAgLyoqXG4gICAqIOabtOWkmuiHquWumuS5iSBzZWFyY2ggaW5wdXQg55qEIFByb3BcbiAgICovXG4gIHNlYXJjaElucHV0UHJvcHM/OiB7XG4gICAgW2tleTogc3RyaW5nXTogYW55XG4gIH1cbiAgLyoqXG4gICAqIOmAieaLqeaXtueahCBoYW5kbGVy77yM5Y+C5pWw77yaKHZhbHVlLCBvcHRpb24pXG4gICAqL1xuICBvblNlbGVjdD86ICh2YWx1ZTogVCwgb3B0aW9uOiBSZWFjdC5SZWFjdEVsZW1lbnQ8YW55PikgPT4gdm9pZFxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5bGV5byAXG4gICAqL1xuICBvcGVuPzogbnVsbCB8IGJvb2xlYW5cbiAgLyoqXG4gICAqIOWPr+ebtOaOpeS8oOWFpSBvcHRpb25z77yM5pu/5Luj5omL5Yqo5p6E6YCgIGNoaWxkcmVuIGpzeCDnmoTmlrnlvI/vvIzpnIDkvKDlhaXmr4/pobnnmoQgbGFiZWwg5ZKMIHZhbHVlXG4gICAqL1xuICBvcHRpb25zPzoge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxuICAgIGNsYXNzTmFtZT86IHN0cmluZ1xuICAgIGRpc2FibGVkPzogYm9vbGVhblxuICAgIGxhYmVsOiBSZWFjdC5SZWFjdE5vZGVcbiAgICB2YWx1ZTogVFxuICB9W11cbiAgLyoqXG4gICAqIOmAieaLqeahhum7mOiupOaWh+Wtl1xuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOmAieaLqeahhum7mOiupOaWh+Wtl+eahOminOiJslxuICAgKi9cbiAgcGxhY2Vob2xkZXJDb2xvcj86IHN0cmluZ1xuICAvKipcbiAgICog6K6+572uIHBsYWNlbWVudFxuICAgKi9cbiAgcGxhY2VtZW50PzogUGxhY2VtZW50XG4gIC8qKlxuICAgKiDorr7nva7lj7Plm77moIdcbiAgICovXG4gIHJpZ2h0SWNvbj86IEljb25OYW1lc1xuICAvKipcbiAgICog5pCc57Si5qGG6buY6K6k5paH5a2XXG4gICAqL1xuICBzZWFyY2hhYmxlPzogYm9vbGVhblxuICAvKipcbiAgICog5piv5ZCm6ZyA6KaB5YaF5bWM5pCc57SiXG4gICAqL1xuICBzZWFyY2hQbGFjZWhvbGRlcj86IHN0cmluZ1xuICAvKipcbiAgICog6K6+572u5bC65a+477yM6Lef552AIGJ1dHRvbiDotbBcbiAgICovXG4gIHNpemU/OiBcIm1pbmlcIiB8IFwic21hbGxcIiB8IFwibWVkaXVtXCIgfCBcImxhcmdlXCJcbiAgLyoqXG4gICAqIOiuvue9ruS4u+mimFxuICAgKi9cbiAgdGhlbWU/OiBudWxsIHwgXCJsaWdodFwiXG4gIC8qKlxuICAgKiDkuIvmi4nmoYbpobbpg6jmmL7npLrnmoToh6rlrprkuYnlhYPntKBcbiAgICovXG4gIHRvcENvbnRlbnQ/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItu+8muW9k+WJjemAieS4remhueeahOWAvFxuICAgKi9cbiAgdmFsdWU/OiBUIHwgbnVsbFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZWxlY3RTdGF0ZTxUIGV4dGVuZHMgVmFsdWVUeXBlID0gVmFsdWVUeXBlPiB7XG4gIG9wZW4/OiBib29sZWFuXG4gIHBsYWNlaG9sZGVyU2hvdz86IGJvb2xlYW5cbiAgcGxhY2Vob2xkZXJUZXh0Pzogc3RyaW5nXG4gIHZhbHVlPzogVCB8IG51bGxcbiAgc2VsZWN0SWQ/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiDpgInmi6nlmajnlKjkuo7pgInmi6nmn5DpobnlhoXlrrnjgIJcbiAqIOmAieaLqeWZqOWvueavlOWNlemAiSBSYWRpbyDnmoTkvJjlir/mmK/vvIzlvZPpgInpobnov4flpJrml7bvvIzpgInmi6nlmajlj6/lr7nlhoXlrrnmlLbotbfvvIzlubbmm7TlhbPms6jkuo7lt7LpgInpobnjgIJcbiAqIOmAmuW4uO+8jOW9k+eUqOaIt+iDveWkn+mAmui/h+W3sumAiemhue+8jOi9u+aYk+W+l+efpeWFtuS9memAiemhueeahOinhOW+i+aXtu+8iOWmguW5tOS7veOAgeWfjuW4guetie+8ie+8jOmAieaLqeWZqCBTZWxlY3Qg5piv5q+U6L6D5aW955qE6YCJ5oup44CCXG4gKi9cbmNsYXNzIFNlbGVjdDxUIGV4dGVuZHMgVmFsdWVUeXBlID0gVmFsdWVUeXBlPiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxcbiAgSVNlbGVjdFByb3BzPFQ+LFxuICBJU2VsZWN0U3RhdGU8VD5cbj4ge1xuICBwdWJsaWMgc3RhdGljIHR5cGUgPSBcIlNlbGVjdFwiXG5cbiAgcHVibGljIHN0YXRpYyBPcHRpb246IHR5cGVvZiBPcHRpb24gPSBPcHRpb25cblxuICBwdWJsaWMgc3RhdGljIE9wdEdyb3VwOiB0eXBlb2YgT3B0R3JvdXAgPSBPcHRHcm91cFxuXG4gIHB1YmxpYyBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIC8qKlxuICAgICAqIOaYr+WQpuaPkOS+m+a4hemZpOWKn+iDvVxuICAgICAqL1xuICAgIGFsbG93Q2xlYXI6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOS4i+aLieahhuW6lemDqOaYvuekuueahOiHquWumuS5ieWFg+e0oFxuICAgICAqL1xuICAgIGJvdHRvbUNvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIOWtkOiKgueCuVxuICAgICAqL1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiDpmYTliqDnsbvlkI1cbiAgICAgKi9cbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog5YaF6YOo6amx5Yqo77ya5piv5ZCm5bGV5byAXG4gICAgICovXG4gICAgZGVmYXVsdE9wZW46IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOWGhemDqOmpseWKqO+8muW9k+WJjemAieS4remhueeahOWAvFxuICAgICAqL1xuICAgIGRlZmF1bHRWYWx1ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICAgIC8qKlxuICAgICAqIOS4i+aLieWIl+ihqOaYr+WQpuWSjOmAieaLqeWZqOWQjOWuvVxuICAgICAqL1xuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog5oyH5a6a5by55Ye65bGC55qE54i257qn77yM6buY6K6k5Li6IGRvY3VtZW50LmJvZHlcbiAgICAgKi9cbiAgICBnZXRQb3B1cENvbnRhaW5lcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog5LiL5ouJ5YiX6KGo5pi+56S65Y+Y5YyW5pe255qEIGhhbmRsZXLvvIzlj4LmlbDvvJpib29sXG4gICAgICovXG4gICAgb25Ecm9wZG93blZpc2libGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOS4i+aLieWIl+ihqOa7muWKqOaXtueahCBoYW5kbGVyLCDlj4LmlbDvvJplXG4gICAgICovXG4gICAgb25Qb3B1cFNjcm9sbDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog5pCc57Si5pe255qEIGhhbmRsZXIsIOWPguaVsO+8mnN0cmluZ1xuICAgICAqL1xuICAgIG9uU2VhcmNoOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDmkJzntKIgQ29tcG9zaXRpb25TdGFydCDnmoQgaGFuZGxlciwg5Y+C5pWw77yac3RyaW5nXG4gICAgICovXG4gICAgb25TZWFyY2hDb21wb3NpdGlvblN0YXJ0OiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDmkJzntKIgQ29tcG9zaXRpb25VcGRhdGUg55qEIGhhbmRsZXIsIOWPguaVsO+8mnN0cmluZ1xuICAgICAqL1xuICAgIG9uU2VhcmNoQ29tcG9zaXRpb25VcGRhdGU6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOaQnOe0oiBDb21wb3NpdGlvbkVuZCDnmoQgaGFuZGxlciwg5Y+C5pWw77yac3RyaW5nXG4gICAgICovXG4gICAgb25TZWFyY2hDb21wb3NpdGlvbkVuZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog5pu05aSa6Ieq5a6a5LmJIHNlYXJjaCBpbnB1dCDnmoQgUHJvcFxuICAgICAqL1xuICAgIHNlYXJjaElucHV0UHJvcHM6IFByb3BUeXBlcy5hbnksXG4gICAgLyoqXG4gICAgICog6YCJ5oup5pe255qEIGhhbmRsZXLvvIzlj4LmlbDvvJoodmFsdWUsIG9wdGlvbilcbiAgICAgKi9cbiAgICBvblNlbGVjdDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5bGV5byAXG4gICAgICovXG4gICAgb3BlbjogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog5Y+v55u05o6l5Lyg5YWlIG9wdGlvbnPvvIzmm7/ku6PmiYvliqjmnoTpgKAgY2hpbGRyZW4ganN4IOeahOaWueW8j++8jOmcgOS8oOWFpeavj+mhueeahCBsYWJlbCDlkowgdmFsdWVcbiAgICAgKi9cbiAgICBvcHRpb25zOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgLyoqXG4gICAgICog6YCJ5oup5qGG6buY6K6k5paH5a2XXG4gICAgICovXG4gICAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5hbnksXG4gICAgLyoqXG4gICAgICog6YCJ5oup5qGG6buY6K6k5paH5a2X55qE6aKc6ImyXG4gICAgICovXG4gICAgcGxhY2Vob2xkZXJDb2xvcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDorr7nva4gcGxhY2VtZW50XG4gICAgICovXG4gICAgcGxhY2VtZW50OiBQcm9wVHlwZXMub25lT2YoW1xuICAgICAgXCJ0b3BcIixcbiAgICAgIFwibGVmdFwiLFxuICAgICAgXCJyaWdodFwiLFxuICAgICAgXCJib3R0b21cIixcbiAgICAgIFwidG9wTGVmdFwiLFxuICAgICAgXCJ0b3BSaWdodFwiLFxuICAgICAgXCJib3R0b21MZWZ0XCIsXG4gICAgICBcImJvdHRvbVJpZ2h0XCIsXG4gICAgICBcImxlZnRUb3BcIixcbiAgICAgIFwibGVmdEJvdHRvbVwiLFxuICAgICAgXCJyaWdodFRvcFwiLFxuICAgICAgXCJyaWdodEJvdHRvbVwiLFxuICAgIF0pLFxuICAgIC8qKlxuICAgICAqIOiuvue9ruWPs+Wbvuagh1xuICAgICAqL1xuICAgIHJpZ2h0SWNvbjogUHJvcFR5cGVzLmFueSxcbiAgICAvKipcbiAgICAgKiDmkJzntKLmoYbpu5jorqTmloflrZdcbiAgICAgKi9cbiAgICBzZWFyY2hQbGFjZWhvbGRlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDmmK/lkKbpnIDopoHlhoXltYzmkJzntKJcbiAgICAgKi9cbiAgICBzZWFyY2hhYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcbiAgICAgKiDorr7nva7lsLrlr7jvvIzot5/nnYAgYnV0dG9uIOi1sFxuICAgICAqL1xuICAgIHNpemU6IFByb3BUeXBlcy5vbmVPZihbXCJtaW5pXCIsIFwic21hbGxcIiwgXCJtZWRpdW1cIiwgXCJsYXJnZVwiXSksXG4gICAgLyoqXG4gICAgICog6K6+572u5Li76aKYXG4gICAgICovXG4gICAgdGhlbWU6IFByb3BUeXBlcy5vbmVPZihbbnVsbCwgXCJsaWdodFwiXSksXG4gICAgLyoqXG4gICAgICog5LiL5ouJ5qGG6aG26YOo5pi+56S655qE6Ieq5a6a5LmJ5YWD57SgXG4gICAgICovXG4gICAgdG9wQ29udGVudDogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog5aSW6YOo5o6n5Yi277ya5b2T5YmN6YCJ5Lit6aG555qE5YC8XG4gICAgICovXG4gICAgdmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzOiBJU2VsZWN0UHJvcHMgPSB7XG4gICAgYWxsb3dDbGVhcjogZmFsc2UsXG4gICAgYm90dG9tQ29udGVudDogbnVsbCxcbiAgICBjaGlsZHJlbjogbnVsbCxcbiAgICBjbGFzc05hbWU6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0T3BlbjogbnVsbCxcbiAgICBkZWZhdWx0VmFsdWU6IG51bGwsXG4gICAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoOiB0cnVlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBudWxsLFxuICAgIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlOiBub29wLFxuICAgIG9uUG9wdXBTY3JvbGw6IG5vb3AsXG4gICAgb25TZWFyY2g6IG5vb3AsXG4gICAgb25TZWFyY2hDb21wb3NpdGlvblN0YXJ0OiBub29wLFxuICAgIG9uU2VhcmNoQ29tcG9zaXRpb25VcGRhdGU6IG5vb3AsXG4gICAgb25TZWFyY2hDb21wb3NpdGlvbkVuZDogbm9vcCxcbiAgICBzZWFyY2hJbnB1dFByb3BzOiB7fSxcbiAgICBvblNlbGVjdDogbm9vcCxcbiAgICBvcGVuOiBudWxsLFxuICAgIG9wdGlvbnM6IHVuZGVmaW5lZCxcbiAgICBwbGFjZWhvbGRlcjogXCLor7fpgInmi6lcIixcbiAgICBwbGFjZWhvbGRlckNvbG9yOiB1bmRlZmluZWQsXG4gICAgcGxhY2VtZW50OiBcImJvdHRvbUxlZnRcIixcbiAgICByaWdodEljb246IFwidHJpYW5nbGUtZG93blwiLFxuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiBcIuaQnOe0olwiLFxuICAgIHNlYXJjaGFibGU6IGZhbHNlLFxuICAgIHNpemU6IFwic21hbGxcIixcbiAgICB0aGVtZTogbnVsbCxcbiAgICB0b3BDb250ZW50OiBudWxsLFxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSAoeyBvcGVuLCB2YWx1ZSB9OiBJU2VsZWN0UHJvcHMpID0+IHtcbiAgICBjb25zdCBuZXdTdGF0ZTogSVNlbGVjdFN0YXRlID0ge31cbiAgICBpZiAob3BlbiAhPT0gbnVsbCkge1xuICAgICAgbmV3U3RhdGUub3BlbiA9IG9wZW5cbiAgICB9XG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgbmV3U3RhdGUudmFsdWUgPSB1bmRlZmluZWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1N0YXRlLnZhbHVlID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG5ld1N0YXRlKS5sZW5ndGggPiAwID8gbmV3U3RhdGUgOiBudWxsXG4gIH1cblxuICBwdWJsaWMgaGFzaCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpXG5cbiAgcHVibGljIGxvY2tlZCA9IGZhbHNlXG5cbiAgcHVibGljIHNlbGVjdDogSVNlbGVjdFxuXG4gIHB1YmxpYyBzZWFyY2g6IEhUTUxJbnB1dEVsZW1lbnRcblxuICBwdWJsaWMgbWVudTogSlNYLkVsZW1lbnRcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSVNlbGVjdFByb3BzPFQ+KSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgY29uc3QgeyBkZWZhdWx0T3BlbiwgZGVmYXVsdFZhbHVlLCBvcGVuLCB2YWx1ZSB9ID0gcHJvcHNcblxuICAgIGxldCB2YWx1ZVN0YXRlOiBUIHwgdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBpZiAodmFsdWUgPT09IFwiXCIpIHtcbiAgICAgICAgdmFsdWVTdGF0ZSA9IHVuZGVmaW5lZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTdGF0ZSA9IHZhbHVlXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkZWZhdWx0VmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHZhbHVlU3RhdGUgPSBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBsZXQgb3BlblN0YXRlXG4gICAgaWYgKG9wZW4gIT09IG51bGwpIHtcbiAgICAgIG9wZW5TdGF0ZSA9IG9wZW5cbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRPcGVuICE9PSBudWxsKSB7XG4gICAgICBvcGVuU3RhdGUgPSBkZWZhdWx0T3BlblxuICAgIH1cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgb3Blbjogb3BlblN0YXRlLFxuICAgICAgcGxhY2Vob2xkZXJTaG93OiBmYWxzZSxcbiAgICAgIHNlbGVjdElkOiBcIlwiLFxuICAgICAgcGxhY2Vob2xkZXJUZXh0OiBcIlwiLFxuICAgICAgdmFsdWU6IHZhbHVlU3RhdGUsXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNhdmVTZWxlY3QgPSAobm9kZTogSVNlbGVjdCkgPT4ge1xuICAgIHRoaXMuc2VsZWN0ID0gbm9kZVxuICB9XG5cbiAgcHVibGljIHNhdmVTZWFyY2ggPSAobm9kZTogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICAgIHRoaXMuc2VhcmNoID0gbm9kZVxuICB9XG5cbiAgcHVibGljIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlID0gKG9wZW46IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCB7IG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlLCBvcGVuOiBvcGVuUHJvcCB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgdmFsdWUsIHNlbGVjdElkIH0gPSB0aGlzLnN0YXRlXG5cbiAgICBpZiAodGhpcy5sb2NrZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAob3BlblByb3AgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuIH0pXG4gICAgfVxuICAgIGlmIChvcGVuKSB7XG4gICAgICB0aGlzLnByZXZlbnRWaXNpYmxlQ2hhbmdlKClcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNlYXJjaCkge1xuICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgbGV0IGlkID0gc2VsZWN0SWRcbiAgICAgICAgICAgIGlmICghc2VsZWN0SWQpIHtcbiAgICAgICAgICAgICAgaWQgPSAodGhpcy5zZWFyY2gucGFyZW50Tm9kZT8ubmV4dFNpYmxpbmcgYXMgRWxlbWVudCk/LmlkXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzZWxlY3RJZDogaWQgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk/Lm5leHRTaWJsaW5nIGFzIEVsZW1lbnRcblxuICAgICAgICAgICAgICBjb25zdCBlbCA9IHBhcmVudD8uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgICAgICAgICAgICBcImFkdWktc2VsZWN0LWl0ZW0tb3B0aW9uLXNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgKVswXT8uY2hpbGRyZW5bMF0gYXMgSFRNTEVsZW1lbnRcblxuICAgICAgICAgICAgICBjb25zdCBsaXN0SG9sZGVyID0gcGFyZW50Py5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgICAgICAgICAgIFwicmMtdmlydHVhbC1saXN0LWhvbGRlclwiXG4gICAgICAgICAgICAgIClbMF0gYXMgSFRNTEVsZW1lbnRcblxuICAgICAgICAgICAgICBpZiAobGlzdEhvbGRlcikge1xuICAgICAgICAgICAgICAgIGxpc3RIb2xkZXIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJzY3JvbGxcIikpXG5cbiAgICAgICAgICAgICAgICBpZiAobGlzdEhvbGRlci5jaGlsZHJlblswXSkge1xuICAgICAgICAgICAgICAgICAgbGlzdEhvbGRlci5jaGlsZHJlblswXS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInNjcm9sbFwiKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyVGV4dDogZWwuZGF0YXNldC5odG1sIHx8IGVsLmlubmVySFRNTCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBwbGFjZWhvbGRlclRleHQ6IFwiXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNlYXJjaC5mb2N1cygpXG4gICAgICAgIH1cbiAgICAgIH0sIDE1MClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc2VhcmNoKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoLnZhbHVlID0gXCJcIlxuICAgICAgfVxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHBsYWNlaG9sZGVyU2hvdzogZmFsc2UsXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAob25Ecm9wZG93blZpc2libGVDaGFuZ2UpIHtcbiAgICAgIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlKG9wZW4pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU2VsZWN0ID0gKHZhbHVlOiBULCBvcHRpb246IGFueSkgPT4ge1xuICAgIGNvbnN0IHsgb25TZWxlY3QsIHZhbHVlOiB2YWx1ZVByb3AgfSA9IHRoaXMucHJvcHNcblxuICAgIGlmICh2YWx1ZVByb3AgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChvblNlbGVjdCAmJiB2YWx1ZVByb3AgIT09IHZhbHVlKSB7XG4gICAgICBvblNlbGVjdCh2YWx1ZSwgb3B0aW9uKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNlYXJjaCkge1xuICAgICAgdGhpcy5zZWFyY2gudmFsdWUgPSBcIlwiXG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdCAmJiB0aGlzLnNlbGVjdC5zZXRJbnB1dFZhbHVlKSB7XG4gICAgICB0aGlzLnNlbGVjdC5zZXRJbnB1dFZhbHVlKFwiXCIpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZURyb3Bkb3duUmVuZGVyID0gKG1lbnU6IEpTWC5FbGVtZW50KSA9PiB7XG4gICAgdGhpcy5tZW51ID0gbWVudVxuICAgIGNvbnN0IHtcbiAgICAgIHNlYXJjaGFibGUsXG4gICAgICBzZWFyY2hQbGFjZWhvbGRlcixcbiAgICAgIHNlYXJjaElucHV0UHJvcHMsXG4gICAgICB0b3BDb250ZW50LFxuICAgICAgYm90dG9tQ29udGVudCxcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChzZWFyY2hhYmxlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIHt0b3BDb250ZW50fVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LXNlYXJjaGB9PlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHJlZj17dGhpcy5zYXZlU2VhcmNofVxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17c2VhcmNoUGxhY2Vob2xkZXJ9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZVNlYXJjaH1cbiAgICAgICAgICAgICAgb25Db21wb3NpdGlvblN0YXJ0PXt0aGlzLmhhbmRsZVNlYXJjaFN0YXJ0fVxuICAgICAgICAgICAgICBvbkNvbXBvc2l0aW9uVXBkYXRlPXt0aGlzLmhhbmRsZVNlYXJjaFVwZGF0ZX1cbiAgICAgICAgICAgICAgb25Db21wb3NpdGlvbkVuZD17dGhpcy5oYW5kbGVTZWFyY2hFbmR9XG4gICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5oYW5kbGVTZWFyY2hLZXlEb3dufVxuICAgICAgICAgICAgICBvbk1vdXNlRG93bj17dGhpcy5wcmV2ZW50VmlzaWJsZUNoYW5nZX1cbiAgICAgICAgICAgICAgb25Nb3VzZVVwPXt0aGlzLnByZXZlbnRWaXNpYmxlQ2hhbmdlfVxuICAgICAgICAgICAgICB7Li4uKHNlYXJjaElucHV0UHJvcHMgfHwge30pfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxJY29uIGljb249XCJzZWFyY2hcIiBjbGFzc05hbWU9e2Ake3ByZWZpeH0taWNvbmB9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge21lbnV9XG4gICAgICAgICAge2JvdHRvbUNvbnRlbnR9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAge3RvcENvbnRlbnR9XG4gICAgICAgIHttZW51fVxuICAgICAgICB7Ym90dG9tQ29udGVudH1cbiAgICAgIDwvPlxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVTZWFyY2hTdGFydDogUmVhY3QuQ29tcG9zaXRpb25FdmVudEhhbmRsZXI8SFRNTElucHV0RWxlbWVudD4gPSAoXG4gICAgZVxuICApID0+IHtcbiAgICBjb25zdCB7IG9uU2VhcmNoQ29tcG9zaXRpb25TdGFydCB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnRcbiAgICBpZiAoZSkge1xuICAgICAgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudFxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQgPSB0aGlzLnNlYXJjaFxuICAgIH1cbiAgICBpZiAob25TZWFyY2hDb21wb3NpdGlvblN0YXJ0KSB7XG4gICAgICBvblNlYXJjaENvbXBvc2l0aW9uU3RhcnQodGFyZ2V0LnZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVTZWFyY2hVcGRhdGU6IFJlYWN0LkNvbXBvc2l0aW9uRXZlbnRIYW5kbGVyPEhUTUxJbnB1dEVsZW1lbnQ+ID0gKFxuICAgIGVcbiAgKSA9PiB7XG4gICAgY29uc3QgeyBvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlIH0gPSB0aGlzLnByb3BzXG4gICAgbGV0IHRhcmdldDogSFRNTElucHV0RWxlbWVudFxuICAgIGlmIChlKSB7XG4gICAgICB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldCA9IHRoaXMuc2VhcmNoXG4gICAgfVxuICAgIGlmIChvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlKSB7XG4gICAgICBvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlKHRhcmdldC52YWx1ZSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VhcmNoRW5kOiBSZWFjdC5Db21wb3NpdGlvbkV2ZW50SGFuZGxlcjxIVE1MSW5wdXRFbGVtZW50PiA9IChcbiAgICBlXG4gICkgPT4ge1xuICAgIGNvbnN0IHsgb25TZWFyY2hDb21wb3NpdGlvbkVuZCB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnRcbiAgICBpZiAoZSkge1xuICAgICAgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudFxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQgPSB0aGlzLnNlYXJjaFxuICAgIH1cbiAgICBpZiAob25TZWFyY2hDb21wb3NpdGlvbkVuZCkge1xuICAgICAgb25TZWFyY2hDb21wb3NpdGlvbkVuZCh0YXJnZXQudmFsdWUpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZVNlYXJjaCA9IChlPzogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICBsZXQgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50XG4gICAgaWYgKGUpIHtcbiAgICAgIHRhcmdldCA9IGUudGFyZ2V0XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldCA9IHRoaXMuc2VhcmNoXG4gICAgfVxuICAgIGNvbnN0IHZhbCA9IHRhcmdldC52YWx1ZVxuICAgIGNvbnN0IHsgcGxhY2Vob2xkZXJTaG93LCBzZWxlY3RJZCB9ID0gdGhpcy5zdGF0ZVxuICAgIGlmICh2YWwgJiYgIXBsYWNlaG9sZGVyU2hvdykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHBsYWNlaG9sZGVyU2hvdzogdHJ1ZSB9KVxuICAgIH1cbiAgICBpZiAoIXZhbCAmJiBwbGFjZWhvbGRlclNob3cpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBwbGFjZWhvbGRlclNob3c6IGZhbHNlIH0pXG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdCkge1xuICAgICAgbGV0IGlkID0gc2VsZWN0SWRcbiAgICAgIGlmICghc2VsZWN0SWQpIHtcbiAgICAgICAgaWQgPSAodGFyZ2V0LnBhcmVudE5vZGU/Lm5leHRTaWJsaW5nIGFzIEVsZW1lbnQpPy5pZFxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0SWQ6IGlkIH0pXG4gICAgICB9XG4gICAgICBjb25zdCByZWFsSW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLmFkdWktc2VsZWN0LXNlbGVjdGlvbi1zZWFyY2ggW2FyaWEtb3ducz1cIiR7aWR9XCJdYFxuICAgICAgKSBhcyBhbnlcbiAgICAgIGlmIChyZWFsSW5wdXQpIHtcbiAgICAgICAgY29uc3QgbGFzdFZhbHVlID0gcmVhbElucHV0LnZhbHVlXG4gICAgICAgIHJlYWxJbnB1dC52YWx1ZSA9IHZhbFxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudChcImlucHV0XCIsIHsgYnViYmxlczogdHJ1ZSB9KVxuICAgICAgICAvLyBoYWNrIFJlYWN0MTYg5YaF6YOo5a6a5LmJ5LqGZGVzY3JpcHRvcuaLpuaIqnZhbHVl77yM5q2k5aSE6YeN572u54q25oCBXG4gICAgICAgIGNvbnN0IHRyYWNrZXIgPSByZWFsSW5wdXQuX3ZhbHVlVHJhY2tlclxuICAgICAgICBpZiAodHJhY2tlcikge1xuICAgICAgICAgIHRyYWNrZXIuc2V0VmFsdWUobGFzdFZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJlYWxJbnB1dC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVTZWFyY2hLZXlEb3duID0gKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICBpZiAodGhpcy5zZWxlY3QgJiYgdGhpcy5zZWxlY3Qub25JbnB1dEtleURvd24pIHtcbiAgICAgIHRoaXMuc2VsZWN0Lm9uSW5wdXRLZXlEb3duKGUpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByZXZlbnRWaXNpYmxlQ2hhbmdlID0gKCkgPT4ge1xuICAgIHRoaXMubG9ja2VkID0gdHJ1ZVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2NrZWQgPSBmYWxzZVxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IG9wZW46IHRydWUgfSlcbiAgICB9LCAyMDApXG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFsbG93Q2xlYXIsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgcGxhY2Vob2xkZXJDb2xvcixcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIHJpZ2h0SWNvbixcbiAgICAgIHNlYXJjaGFibGUsXG4gICAgICBzaXplLFxuICAgICAgdGhlbWUsXG4gICAgICB2YWx1ZTogdmFsdWVQcm9wLFxuICAgICAgLi4ub3RoZXJQcm9wc1xuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICBjb25zdCByZXN0UHJvcHMgPSBvbWl0KG90aGVyUHJvcHMsIFtcbiAgICAgIFwiZGVmYXVsdFZhbHVlXCIsXG4gICAgICBcIm9wZW5cIixcbiAgICAgIFwib25Ecm9wZG93blZpc2libGVDaGFuZ2VcIixcbiAgICAgIFwib25TZWxlY3RcIixcbiAgICAgIFwic2VhcmNoUGxhY2Vob2xkZXJcIixcbiAgICAgIFwib25TZWFyY2hDb21wb3NpdGlvblN0YXJ0XCIsXG4gICAgICBcIm9uU2VhcmNoQ29tcG9zaXRpb25VcGRhdGVcIixcbiAgICAgIFwib25TZWFyY2hDb21wb3NpdGlvbkVuZFwiLFxuICAgICAgXCJzZWFyY2hJbnB1dFByb3BzXCIsXG4gICAgICBcInRvcENvbnRlbnRcIixcbiAgICAgIFwiYm90dG9tQ29udGVudFwiLFxuICAgIF0pXG5cbiAgICBjb25zdCB7XG4gICAgICBvcGVuOiBvcGVuU3RhdGUsXG4gICAgICBwbGFjZWhvbGRlclNob3csXG4gICAgICBwbGFjZWhvbGRlclRleHQsXG4gICAgICB2YWx1ZTogdmFsdWVTdGF0ZSxcbiAgICB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgLy8gb3BlblN0YXRlIOWPr+iDveaYryB1bmRlZmluZWQgb3IgbnVsbFxuICAgIGNvbnN0IG9wZW5Qcm9wczogeyBvcGVuPzogYm9vbGVhbjsgdmFsdWU/OiBSZWFjdC5SZWFjdE5vZGUgfCBudWxsIH0gPSB7fVxuICAgIGlmICh0eXBlb2Ygb3BlblN0YXRlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgb3BlblByb3BzLm9wZW4gPSBvcGVuU3RhdGVcbiAgICB9XG4gICAgaWYgKHZhbHVlU3RhdGUgIT09IG51bGwpIHtcbiAgICAgIG9wZW5Qcm9wcy52YWx1ZSA9XG4gICAgICAgIHZhbHVlUHJvcCA9PT0gXCJcIiA/IChcbiAgICAgICAgICBwbGFjZWhvbGRlckNvbG9yID8gKFxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6IHBsYWNlaG9sZGVyQ29sb3IgfX0+e3BsYWNlaG9sZGVyfTwvc3Bhbj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgcGxhY2Vob2xkZXJcbiAgICAgICAgICApXG4gICAgICAgICkgOiAoXG4gICAgICAgICAgdmFsdWVTdGF0ZVxuICAgICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNpdGlvbk5hbWUgPSBcInNsaWRlLXVwXCJcblxuICAgIHJldHVybiAoXG4gICAgICA8Q29uZmlnQ29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgeyh7IGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lckNvbnRleHQgfSkgPT4gKFxuICAgICAgICAgIDxSY1NlbGVjdFxuICAgICAgICAgICAgYWxsb3dDbGVhcj17YWxsb3dDbGVhcn1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICBgJHtwcmVmaXh9LXNlbGVjdGAsXG4gICAgICAgICAgICAgIGAke3ByZWZpeH0tJHtzaXplfWAsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBbYCR7cHJlZml4fS12YWx1ZV9pc19lbXB0eV9zdHJpbmdgXTpcbiAgICAgICAgICAgICAgICAgIHZhbHVlU3RhdGUgPT09IFwiXCIgfHwgdmFsdWVTdGF0ZSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIFtgJHtwcmVmaXh9LWxpZ2h0YF06IHRoZW1lID09PSBcImxpZ2h0XCIsXG4gICAgICAgICAgICAgICAgW2Ake3ByZWZpeH0tc2VsZWN0X3BsYWNlaG9sZGVyU2hvd2BdOiBwbGFjZWhvbGRlclNob3csXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICBkYXRhLXZhbHVlPXt2YWx1ZVN0YXRlIHx8IHBsYWNlaG9sZGVyfVxuICAgICAgICAgICAgbWVudUl0ZW1TZWxlY3RlZEljb249e251bGx9XG4gICAgICAgICAgICBkcm9wZG93bkFsaWduPXtcbiAgICAgICAgICAgICAgZ2V0UGxhY2VtZW50cyh7IGFsaWduRWRnZTogdHJ1ZSB9KVtwbGFjZW1lbnQgfHwgXCJib3R0b21MZWZ0XCJdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkcm9wZG93bkNsYXNzTmFtZT17YGFkdWktc2VsZWN0LWRyb3Bkb3duLSR7XG4gICAgICAgICAgICAgIHRoaXMuaGFzaFxuICAgICAgICAgICAgfSBhZHVpLXNlbGVjdC1kcm9wZG93bi0ke3NpemV9ICR7XG4gICAgICAgICAgICAgIHNlYXJjaGFibGUgPyBcImFkdWktc2VsZWN0LWRyb3Bkb3duLXNlYXJjaGFibGVcIiA6IFwiXCJcbiAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgZHJvcGRvd25SZW5kZXI9e3RoaXMuaGFuZGxlRHJvcGRvd25SZW5kZXJ9XG4gICAgICAgICAgICBzdWZmaXhJY29uPXtcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICB7cGxhY2Vob2xkZXJTaG93ICYmXG4gICAgICAgICAgICAgICAgICAodHlwZW9mIChwbGFjZWhvbGRlclRleHQgfHwgcGxhY2Vob2xkZXIgfHwgXCJcIikgPT09XG4gICAgICAgICAgICAgICAgICBcInN0cmluZ1wiID8gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LXBsYWNlaG9sZGVyLXRleHRgfVxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAg