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>
454 lines • 68.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 = ["bodyClassName", "bodyStyle", "children", "className", "destroyAfterClose", "footerClassName", "footerElement", "footerStyle", "headerClassName", "headerContent", "headerElement", "headerStyle", "maskClosable", "steps", "style", "title", "zIndex"];
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
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 getScrollBarSize from "rc-util/lib/getScrollBarSize";
import classNames from "classnames";
import CSSMotion from "rc-motion";
import omit from "../_util/omit";
import Portal from "../portal";
import Button from "../channels-button";
import Icon from "../icon";
import "./style";
var prefix = "adui-channels-dialog";
var Dialog = function (_React$Component) {
function Dialog(_props) {
var _this;
_classCallCheck(this, Dialog);
_this = _callSuper(this, Dialog, [_props]);
_this.container = void 0;
_this.bodyIsOverflowing = void 0;
_this.scrollbarWidth = void 0;
_this.dialog = void 0;
_this.wrapper = void 0;
_this.isUnmounted = false;
_this.saveDialog = function (node) {
_this.dialog = node;
};
_this.resetScrollbarPadding = function () {
var changeBodyStyle = _this.props.changeBodyStyle;
if (changeBodyStyle) {
document.body.style.overflow = "";
document.body.style.paddingRight = "";
}
};
_this.setScrollbarPadding = function () {
var changeBodyStyle = _this.props.changeBodyStyle;
if (changeBodyStyle) {
var _window = window,
innerWidth = _window.innerWidth;
_this.bodyIsOverflowing = document.body.clientWidth < innerWidth;
if (_this.bodyIsOverflowing && !document.body.style.paddingRight) {
_this.scrollbarWidth = getScrollBarSize();
if (_this.scrollbarWidth !== undefined) {
document.body.style.paddingRight = "".concat(_this.scrollbarWidth, "px");
}
}
document.body.style.overflow = "hidden";
}
};
_this.getCancelButton = function () {
var _this$props = _this.props,
cancelProps = _this$props.cancelProps,
cancelText = _this$props.cancelText,
steps = _this$props.steps,
type = _this$props.type;
var currentStep = _this.state.currentStep;
var defaultText = currentStep === 0 ? "取消" : "上一步";
var generateButton = function generateButton(props) {
var text = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultText;
return React.createElement(Button, _extends({
key: "cancel",
theme: "light",
onClick: _this.handleCancel
}, props), text);
};
if (steps && steps.length) {
var props = steps[currentStep].cancelProps;
var text = steps[currentStep].cancelText;
return generateButton(props, text);
}
if (type === "inform") {
return null;
}
return generateButton(cancelProps, cancelText);
};
_this.getConfirmButton = function () {
var _this$props2 = _this.props,
confirmProps = _this$props2.confirmProps,
confirmText = _this$props2.confirmText,
steps = _this$props2.steps;
var currentStep = _this.state.currentStep;
var generateButton = function generateButton(props, text) {
return React.createElement(Button, _extends({
key: "primary",
intent: "primary",
onClick: _this.handleConfirm
}, props), text);
};
if (steps && steps.length) {
var props = steps[currentStep].confirmProps;
var text = steps[currentStep].confirmText || (currentStep === steps.length - 1 ? "完成" : "下一步");
return generateButton(props, text);
}
return generateButton(confirmProps, confirmText || "确认");
};
_this.handleKeyDown = function (e) {
var escapeKeyClosable = _this.props.escapeKeyClosable;
if (escapeKeyClosable && e.key === "Escape") {
e.stopPropagation();
_this.handleCancel();
}
};
_this.handleCancel = function (type) {
var _this$props3 = _this.props,
onCancel = _this$props3.onCancel,
steps = _this$props3.steps,
visible = _this$props3.visible;
var currentStep = _this.state.currentStep;
if (type === "close" || !steps || !steps.length) {
if (visible === null) {
_this.setState({
visible: false
});
}
if (onCancel) {
onCancel();
}
} else {
var onStepCancel = steps[currentStep].onCancel;
if (onStepCancel) {
onStepCancel();
}
if (currentStep === 0) {
if (visible === null) {
_this.setState({
visible: false
});
}
} else {
_this.setState({
currentStep: currentStep - 1
});
}
}
};
_this.handleConfirm = function () {
var _this$props4 = _this.props,
onConfirm = _this$props4.onConfirm,
steps = _this$props4.steps,
visible = _this$props4.visible;
var currentStep = _this.state.currentStep;
if (steps && steps.length) {
var onStepConfirm = steps[currentStep].onConfirm;
if (onStepConfirm) {
onStepConfirm();
}
if (currentStep === steps.length - 1) {
if (visible === null) {
_this.setState({
visible: false
});
}
} else {
_this.setState({
currentStep: currentStep + 1
});
}
} else {
if (visible === null) {
_this.setState({
visible: false
});
}
if (onConfirm) {
onConfirm();
}
}
};
_this.onLeave = function () {
var _this$props5 = _this.props,
afterClose = _this$props5.afterClose,
destroyAfterClose = _this$props5.destroyAfterClose;
if (_this.wrapper) {
_this.wrapper.style.display = "none";
}
_this.resetScrollbarPadding();
if (afterClose) {
afterClose();
}
if (destroyAfterClose && !_this.isUnmounted) {
_this.setState({
hasEverOpened: false
});
}
};
_this.handleEnter = function () {
var escapeKeyClosable = _this.props.escapeKeyClosable;
if (_this.wrapper) {
if (escapeKeyClosable) {
_this.wrapper.focus();
}
}
};
_this.getComponent = function (options) {
var _this$props6 = _this.props,
bodyClassName = _this$props6.bodyClassName,
bodyStyle = _this$props6.bodyStyle,
children = _this$props6.children,
className = _this$props6.className,
destroyAfterClose = _this$props6.destroyAfterClose,
footerClassName = _this$props6.footerClassName,
footerElement = _this$props6.footerElement,
footerStyle = _this$props6.footerStyle,
headerClassName = _this$props6.headerClassName,
headerContent = _this$props6.headerContent,
headerElement = _this$props6.headerElement,
headerStyle = _this$props6.headerStyle,
maskClosable = _this$props6.maskClosable,
steps = _this$props6.steps,
style = _this$props6.style,
title = _this$props6.title,
zIndexProp = _this$props6.zIndex,
otherProps = _objectWithoutProperties(_this$props6, _excluded);
var zIndex = zIndexProp;
var restProps = omit(otherProps, ["afterClose", "cancelProps", "cancelText", "changeBodyStyle", "confirmProps", "confirmText", "currentStep", "defaultCurrentStep", "defaultVisible", "escapeKeyClosable", "getContainer", "onCancel", "onConfirm", "type", "visible"]);
var classSet = classNames(className, "".concat(prefix, "-inner"));
var currentStep = _this.state.currentStep;
var visible = _this.state.visible;
if (options && Object.keys(options).includes("visible")) {
;
visible = options.visible;
}
return React.createElement("div", {
ref: _this.saveDialog
}, React.createElement("div", {
className: "".concat(prefix, "-wrapper"),
ref: function ref(wrapper) {
if (wrapper) {
_this.wrapper = wrapper;
}
},
style: {
display: visible ? "flex" : "",
zIndex: zIndex
},
tabIndex: 0,
role: "none",
onKeyDown: _this.handleKeyDown
}, React.createElement(CSSMotion, {
motionName: "".concat(prefix, "-mask"),
visible: visible,
removeOnLeave: destroyAfterClose
}, function (_ref, ref) {
var cls = _ref.className;
return React.createElement("div", {
ref: ref,
className: classNames("".concat(prefix, "-mask"), cls),
role: "none",
onClick: function onClick() {
if (maskClosable) {
_this.handleCancel("close");
}
}
});
}), React.createElement(CSSMotion, {
onAppearStart: _this.handleEnter,
onEnterStart: _this.handleEnter,
onLeaveEnd: _this.onLeave,
motionName: prefix,
visible: visible,
removeOnLeave: destroyAfterClose
}, function (_ref2, ref) {
var cls = _ref2.className;
return React.createElement("div", _extends({
ref: ref,
className: classNames(classSet, cls),
style: _objectSpread({
margin: "auto",
zIndex: 1
}, style)
}, restProps), headerElement === null ? null : headerElement || React.createElement("div", {
className: "".concat(prefix, "-header ").concat(headerClassName),
style: headerStyle
}, [React.createElement("div", {
key: 0,
className: "".concat(prefix, "-title")
}, title), React.createElement("div", {
key: 1
}, headerContent && React.createElement("div", {
className: "".concat(prefix, "-headerContent")
}, headerContent)), React.createElement(Icon, {
key: 2,
className: "".concat(prefix, "-close"),
size: 24,
icon: "cancel",
onClick: function onClick() {
return _this.handleCancel("close");
}
})]), React.createElement("div", {
className: "".concat(prefix, "-body ").concat(bodyClassName),
style: bodyStyle
}, steps && steps.length ? steps[currentStep].children : children), footerElement === null ? null : React.createElement("div", {
className: "".concat(prefix, "-footer ").concat(footerClassName),
style: footerStyle
}, footerElement || [_this.getCancelButton(), _this.getConfirmButton()]));
})));
};
_this.handleChildrenMount = function () {
var visible = _this.state.visible;
if (visible && _this.wrapper) {
_this.setScrollbarPadding();
}
};
_this.componentDidUpdate = function (_, _ref3) {
var visiblePrev = _ref3.visible;
var visible = _this.state.visible;
if (visible !== visiblePrev && visible && _this.wrapper) {
_this.setScrollbarPadding();
}
};
_this.componentWillUnmount = function () {
var visible = _this.state.visible;
_this.isUnmounted = true;
if (visible) {
_this.resetScrollbarPadding();
}
};
var _currentStep = _props.currentStep,
defaultCurrentStep = _props.defaultCurrentStep,
_visible = _props.visible,
defaultVisible = _props.defaultVisible;
var visibleState = _visible !== null ? !!_visible : !!defaultVisible;
var currentStepState = _currentStep !== null ? _currentStep : defaultCurrentStep;
_this.state = {
visible: visibleState,
currentStep: currentStepState || 0,
hasEverOpened: visibleState
};
return _this;
}
_inherits(Dialog, _React$Component);
return _createClass(Dialog, [{
key: "render",
value: function render() {
var getContainer = this.props.getContainer;
var hasEverOpened = this.state.hasEverOpened;
if (!hasEverOpened) {
return null;
}
return React.createElement(Portal, {
onChildrenMount: this.handleChildrenMount,
getContainer: getContainer
}, this.getComponent());
}
}]);
}(React.Component);
Dialog.propTypes = {
afterClose: PropTypes.func,
bodyClassName: PropTypes.string,
bodyStyle: PropTypes.object,
cancelProps: PropTypes.object,
cancelText: PropTypes.node,
changeBodyStyle: PropTypes.bool,
children: PropTypes.node,
className: PropTypes.string,
confirmProps: PropTypes.object,
confirmText: PropTypes.node,
currentStep: PropTypes.number,
defaultCurrentStep: PropTypes.number,
defaultVisible: PropTypes.bool,
destroyAfterClose: PropTypes.bool,
escapeKeyClosable: PropTypes.bool,
footerElement: PropTypes.node,
footerClassName: PropTypes.string,
footerStyle: PropTypes.object,
getContainer: PropTypes.func,
headerContent: PropTypes.node,
headerElement: PropTypes.node,
headerClassName: PropTypes.string,
headerStyle: PropTypes.object,
maskClosable: PropTypes.bool,
onCancel: PropTypes.func,
onConfirm: PropTypes.func,
style: PropTypes.object,
title: PropTypes.node,
type: PropTypes.oneOf(["confirm", "inform"]),
visible: PropTypes.bool,
zIndex: PropTypes.any
};
Dialog.defaultProps = {
afterClose: null,
bodyClassName: "",
bodyStyle: {},
cancelProps: {},
cancelText: "取消",
changeBodyStyle: true,
children: null,
className: undefined,
confirmProps: {},
confirmText: "确认",
currentStep: null,
defaultCurrentStep: null,
defaultVisible: null,
destroyAfterClose: false,
escapeKeyClosable: true,
footerElement: undefined,
footerClassName: "",
footerStyle: {},
getContainer: undefined,
headerContent: null,
headerClassName: "",
headerElement: undefined,
headerStyle: {},
maskClosable: false,
onCancel: null,
onConfirm: null,
style: {},
title: null,
type: "confirm",
visible: null,
zIndex: "var(--z-index-dialog)"
};
Dialog.info = void 0;
Dialog.success = void 0;
Dialog.warning = void 0;
Dialog.danger = void 0;
Dialog.confirm = void 0;
Dialog.inform = void 0;
Dialog.getDerivedStateFromProps = function (_ref4, _ref5) {
var currentStep = _ref4.currentStep,
visible = _ref4.visible;
var hasEverOpened = _ref5.hasEverOpened;
var newState = {};
if (currentStep !== null) {
newState.currentStep = currentStep;
}
if (visible !== null) {
newState.visible = visible;
if (!hasEverOpened && visible) {
newState.hasEverOpened = true;
}
}
return Object.keys(newState).length > 0 ? newState : null;
};
export default Dialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlByb3BUeXBlcyIsImdldFNjcm9sbEJhclNpemUiLCJjbGFzc05hbWVzIiwiQ1NTTW90aW9uIiwib21pdCIsIlBvcnRhbCIsIkJ1dHRvbiIsIkljb24iLCJwcmVmaXgiLCJEaWFsb2ciLCJfUmVhY3QkQ29tcG9uZW50IiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9jYWxsU3VwZXIiLCJjb250YWluZXIiLCJib2R5SXNPdmVyZmxvd2luZyIsInNjcm9sbGJhcldpZHRoIiwiZGlhbG9nIiwid3JhcHBlciIsImlzVW5tb3VudGVkIiwic2F2ZURpYWxvZyIsIm5vZGUiLCJyZXNldFNjcm9sbGJhclBhZGRpbmciLCJjaGFuZ2VCb2R5U3R5bGUiLCJkb2N1bWVudCIsImJvZHkiLCJzdHlsZSIsIm92ZXJmbG93IiwicGFkZGluZ1JpZ2h0Iiwic2V0U2Nyb2xsYmFyUGFkZGluZyIsIl93aW5kb3ciLCJ3aW5kb3ciLCJpbm5lcldpZHRoIiwiY2xpZW50V2lkdGgiLCJ1bmRlZmluZWQiLCJjb25jYXQiLCJnZXRDYW5jZWxCdXR0b24iLCJfdGhpcyRwcm9wcyIsImNhbmNlbFByb3BzIiwiY2FuY2VsVGV4dCIsInN0ZXBzIiwidHlwZSIsImN1cnJlbnRTdGVwIiwic3RhdGUiLCJkZWZhdWx0VGV4dCIsImdlbmVyYXRlQnV0dG9uIiwidGV4dCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kcyIsImtleSIsInRoZW1lIiwib25DbGljayIsImhhbmRsZUNhbmNlbCIsImdldENvbmZpcm1CdXR0b24iLCJfdGhpcyRwcm9wczIiLCJjb25maXJtUHJvcHMiLCJjb25maXJtVGV4dCIsImludGVudCIsImhhbmRsZUNvbmZpcm0iLCJoYW5kbGVLZXlEb3duIiwiZSIsImVzY2FwZUtleUNsb3NhYmxlIiwic3RvcFByb3BhZ2F0aW9uIiwiX3RoaXMkcHJvcHMzIiwib25DYW5jZWwiLCJ2aXNpYmxlIiwic2V0U3RhdGUiLCJvblN0ZXBDYW5jZWwiLCJfdGhpcyRwcm9wczQiLCJvbkNvbmZpcm0iLCJvblN0ZXBDb25maXJtIiwib25MZWF2ZSIsIl90aGlzJHByb3BzNSIsImFmdGVyQ2xvc2UiLCJkZXN0cm95QWZ0ZXJDbG9zZSIsImRpc3BsYXkiLCJoYXNFdmVyT3BlbmVkIiwiaGFuZGxlRW50ZXIiLCJmb2N1cyIsImdldENvbXBvbmVudCIsIm9wdGlvbnMiLCJfdGhpcyRwcm9wczYiLCJib2R5Q2xhc3NOYW1lIiwiYm9keVN0eWxlIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJmb290ZXJDbGFzc05hbWUiLCJmb290ZXJFbGVtZW50IiwiZm9vdGVyU3R5bGUiLCJoZWFkZXJDbGFzc05hbWUiLCJoZWFkZXJDb250ZW50IiwiaGVhZGVyRWxlbWVudCIsImhlYWRlclN0eWxlIiwibWFza0Nsb3NhYmxlIiwidGl0bGUiLCJ6SW5kZXhQcm9wIiwiekluZGV4Iiwib3RoZXJQcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsInJlc3RQcm9wcyIsImNsYXNzU2V0IiwiT2JqZWN0Iiwia2V5cyIsImluY2x1ZGVzIiwicmVmIiwidGFiSW5kZXgiLCJyb2xlIiwib25LZXlEb3duIiwibW90aW9uTmFtZSIsInJlbW92ZU9uTGVhdmUiLCJfcmVmIiwiY2xzIiwib25BcHBlYXJTdGFydCIsIm9uRW50ZXJTdGFydCIsIm9uTGVhdmVFbmQiLCJfcmVmMiIsIl9vYmplY3RTcHJlYWQiLCJtYXJnaW4iLCJzaXplIiwiaWNvbiIsImhhbmRsZUNoaWxkcmVuTW91bnQiLCJjb21wb25lbnREaWRVcGRhdGUiLCJfIiwiX3JlZjMiLCJ2aXNpYmxlUHJldiIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwiZGVmYXVsdEN1cnJlbnRTdGVwIiwiZGVmYXVsdFZpc2libGUiLCJ2aXNpYmxlU3RhdGUiLCJjdXJyZW50U3RlcFN0YXRlIiwiX2luaGVyaXRzIiwiX2NyZWF0ZUNsYXNzIiwidmFsdWUiLCJyZW5kZXIiLCJnZXRDb250YWluZXIiLCJvbkNoaWxkcmVuTW91bnQiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJmdW5jIiwic3RyaW5nIiwib2JqZWN0IiwiYm9vbCIsIm51bWJlciIsIm9uZU9mIiwiYW55IiwiZGVmYXVsdFByb3BzIiwiaW5mbyIsInN1Y2Nlc3MiLCJ3YXJuaW5nIiwiZGFuZ2VyIiwiY29uZmlybSIsImluZm9ybSIsImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsIl9yZWY0IiwiX3JlZjUiLCJuZXdTdGF0ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL2NvbXBvbmVudHMvY2hhbm5lbHMtZGlhbG9nL0RpYWxvZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IGdldFNjcm9sbEJhclNpemUgZnJvbSBcInJjLXV0aWwvbGliL2dldFNjcm9sbEJhclNpemVcIlxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIlxuaW1wb3J0IENTU01vdGlvbiBmcm9tIFwicmMtbW90aW9uXCJcbmltcG9ydCBvbWl0IGZyb20gXCIuLi9fdXRpbC9vbWl0XCJcbmltcG9ydCBQb3J0YWwgZnJvbSBcIi4uL3BvcnRhbFwiXG5pbXBvcnQgQnV0dG9uLCB7IElCdXR0b25Qcm9wcyB9IGZyb20gXCIuLi9jaGFubmVscy1idXR0b25cIlxuaW1wb3J0IEljb24gZnJvbSBcIi4uL2ljb25cIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5cbmNvbnN0IHByZWZpeCA9IFwiYWR1aS1jaGFubmVscy1kaWFsb2dcIlxuXG5pbnRlcmZhY2UgSVN0ZXBQcm9wcyB7XG4gIC8qKlxuICAgKiDlj5bmtojmjInpkq7nmoQgcHJvcHPvvIzlj4LogIMgQnV0dG9uIFByb3BzXG4gICAqL1xuICBjYW5jZWxQcm9wcz86IFBhcnRpYWw8SUJ1dHRvblByb3BzPlxuICAvKipcbiAgICog5Y+W5raI5oyJ6ZKu55qEIOaWh+Wtl1xuICAgKi9cbiAgY2FuY2VsVGV4dD86IHN0cmluZ1xuICAvKipcbiAgICog5a2Q6IqC54K5XG4gICAqL1xuICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog56Gu6K6k5oyJ6ZKu55qEIHByb3Bz77yM5Y+C6ICDIEJ1dHRvbiBQcm9wc1xuICAgKi9cbiAgY29uZmlybVByb3BzPzogUGFydGlhbDxJQnV0dG9uUHJvcHM+XG4gIC8qKlxuICAgKiDnoa7orqTmjInpkq7nmoQg5paH5a2XXG4gICAqL1xuICBjb25maXJtVGV4dD86IHN0cmluZ1xuICAvKipcbiAgICog54K55Ye75Y+W5raI5oyJ6ZKu44CB5Y+z5LiK6KeS5YWz6Zet5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2FuY2VsPzogKCgpID0+IHZvaWQpIHwgbnVsbFxuICAvKipcbiAgICog54K55Ye756Gu6K6k5oyJ6ZKu5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ29uZmlybT86ICgoKSA9PiB2b2lkKSB8IG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGlhbG9nUHJvcHMgZXh0ZW5kcyBJU3RlcFByb3BzIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIC8qKlxuICAgKiDlhbPpl63lkI7vvIh0cmFuc2l0aW9uIOe7k+adn+WQju+8ieeahCBoYW5kbGVyXG4gICAqL1xuICBhZnRlckNsb3NlPzogKCgpID0+IHZvaWQpIHwgbnVsbFxuICAvKipcbiAgICog6K6+572uIGJvZHkgY2xhc3NOYW1lXG4gICAqL1xuICBib2R5Q2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDorr7nva4gYm9keSBzdHlsZVxuICAgKi9cbiAgYm9keVN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAvKipcbiAgICogZGlhbG9nIOaJk+W8gOWSjOWFs+mXreaXtumDveS8muabtOaUuSBkb2N1bWVudC5ib2R5LnN0eWxl44CC5Y+v5Lul5Lul5q2kIHByb3Ag5o6n5Yi25piv5ZCm5L+u5pS544CC5L2/55So5Zy65pmv5aaC77ya5rWu5bGC5YaF5by55Ye6IGRpYWxvZ1xuICAgKi9cbiAgY2hhbmdlQm9keVN0eWxlPzogYm9vbGVhblxuICAvKipcbiAgICog6ZmE5Yqg57G75ZCN77yM5rOo5oSPIERpYWxvZyDmiYDmnInnmoTlsZ7mgKfkvJrpmYTliqDliLDlhoXpg6jnmoTlhoXlrrnlhYPntKDkuIrvvIzogIzkuI3mmK/ljIXlkKsgbWFzayDnmoTmnIDlpJblsYLlhYPntKBcbiAgICovXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICog5oyH5a6a5b2T5YmN55qEIHN0ZXDvvIzku4XlnKjkvb/nlKggc3RlcHMgcHJvcCDml7bmnInkvZznlKhcbiAgICovXG4gIGN1cnJlbnRTdGVwPzogbnVsbCB8IG51bWJlclxuICAvKipcbiAgICog5oyH5a6a6buY6K6k55qE6LW35aeLIHN0ZXDvvIzku4XlnKjkvb/nlKggc3RlcHMgcHJvcCDml7bmnInkvZznlKhcbiAgICovXG4gIGRlZmF1bHRDdXJyZW50U3RlcD86IG51bGwgfCBudW1iZXJcbiAgLyoqXG4gICAqIOWGhemDqOmpseWKqO+8muaYr+WQpum7mOiupOaYvuekulxuICAgKi9cbiAgZGVmYXVsdFZpc2libGU/OiBudWxsIHwgYm9vbGVhblxuICAvKipcbiAgICog5piv5ZCm5q+P5qyhIHZpc2libGU6IGZhbHNlIOmDvemUgOavgSBkb21cbiAgICovXG4gIGRlc3Ryb3lBZnRlckNsb3NlPzogYm9vbGVhblxuICAvKipcbiAgICog5piv5ZCm5pSv5oyBIEVTQyDlhbPpl61cbiAgICovXG4gIGVzY2FwZUtleUNsb3NhYmxlPzogYm9vbGVhblxuICAvKipcbiAgICog5a6M5YWo6Ieq5a6a5LmJIGZvb3RlciDnmoTlhoXlrrnvvIzlpoLmnpzmg7PopoHmlLnlj5ggZm9vdGVyIOeItue6p+eahOagt+W8j++8jOS9v+eUqCBmb290ZXJTdHlsZSBQcm9wXG4gICAqL1xuICBmb290ZXJFbGVtZW50PzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDorr7nva4gZm9vdGVyIGNsYXNzTmFtZVxuICAgKi9cbiAgZm9vdGVyQ2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDorr7nva4gZm9vdGVyIHN0eWxlXG4gICAqL1xuICBmb290ZXJTdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgLyoqXG4gICAqIOaMh+WumuW8ueWHuuWxgueahOeItue6p++8jOm7mOiupOS4uiBkb2N1bWVudC5ib2R577yM57G75Ly85LqOIFRvb2x0aXAg55qEIGdldFBvcHVwQ29udGFpbmVyXG4gICAqL1xuICBnZXRDb250YWluZXI/OiAoKSA9PiBIVE1MRWxlbWVudFxuICAvKipcbiAgICogaGVhZGVyIOagh+mimOS4i+eahOWGheWuuVxuICAgKi9cbiAgaGVhZGVyQ29udGVudD86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog5a6M5YWo6Ieq5a6a5LmJIGhlYWRlciDnmoTlhoXlrrlcbiAgICovXG4gIGhlYWRlckVsZW1lbnQ/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOiuvue9riBoZWFkZXIgY2xhc3NOYW1lXG4gICAqL1xuICBoZWFkZXJDbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOiuvue9riBoZWFkZXIgc3R5bGVcbiAgICovXG4gIGhlYWRlclN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAvKipcbiAgICog54K55Ye7IG1hc2sg5piv5ZCm6Kem5Y+RIGNhbmNlbCDkuovku7ZcbiAgICovXG4gIG1hc2tDbG9zYWJsZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOaMh+WumuatpemqpO+8jOeUqOS7peW/q+aNt+S4iuS4gOatpeOAgeS4i+S4gOatpeeahOmcgOaxguOAglxuICAgKi9cbiAgc3RlcHM/OiBBcnJheTxJU3RlcFByb3BzPlxuICAvKipcbiAgICog6ZmE5Yqg5qC35byP77yM5rOo5oSPIERpYWxvZyDmiYDmnInnmoTlsZ7mgKfkvJrpmYTliqDliLDlhoXpg6jnmoTlhoXlrrnlhYPntKDkuIrvvIzogIzkuI3mmK/ljIXlkKsgbWFzayDnmoTmnIDlpJblsYLlhYPntKBcbiAgICovXG4gIHN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAvKipcbiAgICog5a+56K+d5qGG5qCH6aKYXG4gICAqL1xuICB0aXRsZT86IG51bGwgfCBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIGNvbmZpcm0g5Li65Y+W5raI44CB56Gu6K6k5oyJ6ZKu77ybaW5mb3JtIOS4uuWPquacieehruiupOaMiemSrlxuICAgKi9cbiAgdHlwZT86IFwiY29uZmlybVwiIHwgXCJpbmZvcm1cIlxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5pi+56S6XG4gICAqL1xuICB2aXNpYmxlPzogbnVsbCB8IGJvb2xlYW5cbiAgLyoqXG4gICAqIOiuvue9riB6LWluZGV4IOWxgue6p++8jOm7mOiupOS4uiB2YXIoLS16LWluZGV4LWRpYWxvZylcbiAgICovXG4gIHpJbmRleD86IFJlYWN0LlJlYWN0Tm9kZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEaWFsb2dTdGF0ZSB7XG4gIHZpc2libGU/OiBib29sZWFuXG4gIGN1cnJlbnRTdGVwOiBudW1iZXJcbiAgaGFzRXZlck9wZW5lZD86IGJvb2xlYW5cbn1cblxuLyoqXG4gKiDlr7nor53moYbnlKjkuo7lhajlsYDmgKfnmoTlj43ppojvvIzpgJrluLjliIbkuLrigJznoa7orqTmk43kvZzigJ3kuI7igJzlkYrnn6Xkv6Hmga/igJ3jgIJcbiAqIOehruiupOaTjeS9nOeUqOS6juivoumXrueUqOaIt+KAnOaTjeS9nOaYr+WQpue7p+e7rei/m+ihjO+8n+KAne+8jOWmguWkp+mDqOWIhueahOS6jOasoeehruiupOWPjemmiOOAguWRiuefpeS/oeaBr+WImeeUqOS6juefpeS8mueUqOaIt+afkOS4quWPiuaXtuWPjemmiO+8jOWmguS/oeaBr+aPkOS6pOaIkOWKn+OAgeWksei0peetieOAglxuICovXG5jbGFzcyBEaWFsb2cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SURpYWxvZ1Byb3BzLCBJRGlhbG9nU3RhdGU+IHtcbiAgcHVibGljIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgLyoqXG4gICAgICog5YWz6Zet5ZCO77yIdHJhbnNpdGlvbiDnu5PmnZ/lkI7vvInnmoQgaGFuZGxlclxuICAgICAqL1xuICAgIGFmdGVyQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOiuvue9riBib2R5IGNsYXNzTmFtZVxuICAgICAqL1xuICAgIGJvZHlDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog6K6+572uIGJvZHkgc3R5bGVcbiAgICAgKi9cbiAgICBib2R5U3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgLyoqXG4gICAgICog5Y+W5raI5oyJ6ZKu55qEIHByb3Bz77yM5Y+C6ICDIEJ1dHRvbiBQcm9wc1xuICAgICAqL1xuICAgIGNhbmNlbFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxuICAgICAqIOWPlua2iOaMiemSrueahCDmloflrZdcbiAgICAgKi9cbiAgICBjYW5jZWxUZXh0OiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiBkaWFsb2cg5omT5byA5ZKM5YWz6Zet5pe26YO95Lya5pu05pS5IGRvY3VtZW50LmJvZHkuc3R5bGXjgILlj6/ku6Xku6XmraQgcHJvcCDmjqfliLbmmK/lkKbkv67mlLnjgILkvb/nlKjlnLrmma/lpoLvvJrmta7lsYLlhoXlvLnlh7ogZGlhbG9nXG4gICAgICovXG4gICAgY2hhbmdlQm9keVN0eWxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcbiAgICAgKiDlrZDoioLngrlcbiAgICAgKi9cbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog6ZmE5Yqg57G75ZCN77yM5rOo5oSPIERpYWxvZyDmiYDmnInnmoTlsZ7mgKfkvJrpmYTliqDliLDlhoXpg6jnmoTlhoXlrrnlhYPntKDkuIrvvIzogIzkuI3mmK/ljIXlkKsgbWFzayDnmoTmnIDlpJblsYLlhYPntKBcbiAgICAgKi9cbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog56Gu6K6k5oyJ6ZKu55qEIHByb3Bz77yM5Y+C6ICDIEJ1dHRvbiBQcm9wc1xuICAgICAqL1xuICAgIGNvbmZpcm1Qcm9wczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAvKipcbiAgICAgKiDnoa7orqTmjInpkq7nmoQg5paH5a2XXG4gICAgICovXG4gICAgY29uZmlybVRleHQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIOaMh+WumuW9k+WJjeeahCBzdGVw77yM5LuF5Zyo5L2/55SoIHN0ZXBzIHByb3Ag5pe25pyJ5L2c55SoXG4gICAgICovXG4gICAgY3VycmVudFN0ZXA6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgLyoqXG4gICAgICog5oyH5a6a6buY6K6k55qE6LW35aeLIHN0ZXDvvIzku4XlnKjkvb/nlKggc3RlcHMgcHJvcCDml7bmnInkvZznlKhcbiAgICAgKi9cbiAgICBkZWZhdWx0Q3VycmVudFN0ZXA6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgLyoqXG4gICAgICog5YaF6YOo6amx5Yqo77ya5piv5ZCm6buY6K6k5pi+56S6XG4gICAgICovXG4gICAgZGVmYXVsdFZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuavj+asoSB2aXNpYmxlOiBmYWxzZSDpg73plIDmr4EgZG9tXG4gICAgICovXG4gICAgZGVzdHJveUFmdGVyQ2xvc2U6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuaUr+aMgSBFU0Mg5YWz6ZetXG4gICAgICovXG4gICAgZXNjYXBlS2V5Q2xvc2FibGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOWujOWFqOiHquWumuS5iSBmb290ZXIg55qE5YaF5a6577yM5aaC5p6c5oOz6KaB5pS55Y+YIGZvb3RlciDniLbnuqfnmoTmoLflvI/vvIzkvb/nlKggZm9vdGVyU3R5bGUgUHJvcFxuICAgICAqL1xuICAgIGZvb3RlckVsZW1lbnQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIOiuvue9riBmb290ZXIgY2xhc3NOYW1lXG4gICAgICovXG4gICAgZm9vdGVyQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOiuvue9riBmb290ZXIgc3R5bGVcbiAgICAgKi9cbiAgICBmb290ZXJTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAvKipcbiAgICAgKiDmjIflrprlvLnlh7rlsYLnmoTniLbnuqfvvIzpu5jorqTkuLogZG9jdW1lbnQuYm9kee+8jOexu+S8vOS6jiBUb29sdGlwIOeahCBnZXRQb3B1cENvbnRhaW5lclxuICAgICAqL1xuICAgIGdldENvbnRhaW5lcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICogaGVhZGVyIOagh+mimOS4i+eahOWGheWuuVxuICAgICAqL1xuICAgIGhlYWRlckNvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIOWujOWFqOiHquWumuS5iSBoZWFkZXIg55qE5YaF5a65XG4gICAgICovXG4gICAgaGVhZGVyRWxlbWVudDogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog6K6+572uIGhlYWRlciBjbGFzc05hbWVcbiAgICAgKi9cbiAgICBoZWFkZXJDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog6K6+572uIGhlYWRlciBzdHlsZVxuICAgICAqL1xuICAgIGhlYWRlclN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxuICAgICAqIOeCueWHuyBtYXNrIOaYr+WQpuinpuWPkSBjYW5jZWwg5LqL5Lu2XG4gICAgICovXG4gICAgbWFza0Nsb3NhYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcbiAgICAgKiDngrnlh7vlj5bmtojmjInpkq7jgIHlj7PkuIrop5LlhbPpl63ml7bnmoQgaGFuZGxlclxuICAgICAqL1xuICAgIG9uQ2FuY2VsOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDngrnlh7vnoa7orqTmjInpkq7ml7bnmoQgaGFuZGxlclxuICAgICAqL1xuICAgIG9uQ29uZmlybTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog6ZmE5Yqg5qC35byP77yM5rOo5oSPIERpYWxvZyDmiYDmnInnmoTlsZ7mgKfkvJrpmYTliqDliLDlhoXpg6jnmoTlhoXlrrnlhYPntKDkuIrvvIzogIzkuI3mmK/ljIXlkKsgbWFzayDnmoTmnIDlpJblsYLlhYPntKBcbiAgICAgKi9cbiAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAvKipcbiAgICAgKiDlr7nor53moYbmoIfpophcbiAgICAgKi9cbiAgICB0aXRsZTogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICogY29uZmlybSDkuLrlj5bmtojjgIHnoa7orqTmjInpkq7vvJtpbmZvcm0g5Li65Y+q5pyJ56Gu6K6k5oyJ6ZKuXG4gICAgICovXG4gICAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKFtcImNvbmZpcm1cIiwgXCJpbmZvcm1cIl0pLFxuICAgIC8qKlxuICAgICAqIOWklumDqOaOp+WItu+8muaYr+WQpuaYvuekulxuICAgICAqL1xuICAgIHZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOiuvue9riB6LWluZGV4IOWxgue6p++8jOm7mOiupOS4uiB2YXIoLS16LWluZGV4LWRpYWxvZylcbiAgICAgKi9cbiAgICB6SW5kZXg6IFByb3BUeXBlcy5hbnksXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGRlZmF1bHRQcm9wczogSURpYWxvZ1Byb3BzID0ge1xuICAgIGFmdGVyQ2xvc2U6IG51bGwsXG4gICAgYm9keUNsYXNzTmFtZTogXCJcIixcbiAgICBib2R5U3R5bGU6IHt9LFxuICAgIGNhbmNlbFByb3BzOiB7fSxcbiAgICBjYW5jZWxUZXh0OiBcIuWPlua2iFwiLFxuICAgIGNoYW5nZUJvZHlTdHlsZTogdHJ1ZSxcbiAgICBjaGlsZHJlbjogbnVsbCxcbiAgICBjbGFzc05hbWU6IHVuZGVmaW5lZCxcbiAgICBjb25maXJtUHJvcHM6IHt9LFxuICAgIGNvbmZpcm1UZXh0OiBcIuehruiupFwiLFxuICAgIGN1cnJlbnRTdGVwOiBudWxsLFxuICAgIGRlZmF1bHRDdXJyZW50U3RlcDogbnVsbCxcbiAgICBkZWZhdWx0VmlzaWJsZTogbnVsbCxcbiAgICBkZXN0cm95QWZ0ZXJDbG9zZTogZmFsc2UsXG4gICAgZXNjYXBlS2V5Q2xvc2FibGU6IHRydWUsXG4gICAgZm9vdGVyRWxlbWVudDogdW5kZWZpbmVkLFxuICAgIGZvb3RlckNsYXNzTmFtZTogXCJcIixcbiAgICBmb290ZXJTdHlsZToge30sXG4gICAgZ2V0Q29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgaGVhZGVyQ29udGVudDogbnVsbCxcbiAgICBoZWFkZXJDbGFzc05hbWU6IFwiXCIsXG4gICAgaGVhZGVyRWxlbWVudDogdW5kZWZpbmVkLFxuICAgIGhlYWRlclN0eWxlOiB7fSxcbiAgICBtYXNrQ2xvc2FibGU6IGZhbHNlLFxuICAgIG9uQ2FuY2VsOiBudWxsLFxuICAgIG9uQ29uZmlybTogbnVsbCxcbiAgICBzdHlsZToge30sXG4gICAgdGl0bGU6IG51bGwsXG4gICAgdHlwZTogXCJjb25maXJtXCIsXG4gICAgdmlzaWJsZTogbnVsbCxcbiAgICB6SW5kZXg6IFwidmFyKC0tei1pbmRleC1kaWFsb2cpXCIsXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGluZm86IGFueVxuXG4gIHB1YmxpYyBzdGF0aWMgc3VjY2VzczogYW55XG5cbiAgcHVibGljIHN0YXRpYyB3YXJuaW5nOiBhbnlcblxuICBwdWJsaWMgc3RhdGljIGRhbmdlcjogYW55XG5cbiAgcHVibGljIHN0YXRpYyBjb25maXJtOiBhbnlcblxuICBwdWJsaWMgc3RhdGljIGluZm9ybTogYW55XG5cbiAgcHVibGljIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSAoXG4gICAgeyBjdXJyZW50U3RlcCwgdmlzaWJsZSB9OiBJRGlhbG9nUHJvcHMsXG4gICAgeyBoYXNFdmVyT3BlbmVkIH06IElEaWFsb2dTdGF0ZVxuICApID0+IHtcbiAgICBjb25zdCBuZXdTdGF0ZTogUGFydGlhbDxJRGlhbG9nU3RhdGU+ID0ge31cbiAgICBpZiAoY3VycmVudFN0ZXAgIT09IG51bGwpIHtcbiAgICAgIG5ld1N0YXRlLmN1cnJlbnRTdGVwID0gY3VycmVudFN0ZXBcbiAgICB9XG4gICAgaWYgKHZpc2libGUgIT09IG51bGwpIHtcbiAgICAgIG5ld1N0YXRlLnZpc2libGUgPSB2aXNpYmxlXG4gICAgICBpZiAoIWhhc0V2ZXJPcGVuZWQgJiYgdmlzaWJsZSkge1xuICAgICAgICBuZXdTdGF0ZS5oYXNFdmVyT3BlbmVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMobmV3U3RhdGUpLmxlbmd0aCA+IDAgPyBuZXdTdGF0ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiDkv53lrZjoioLngrnmjILovb3nmoTlr7nosaFcbiAgICovXG4gIHB1YmxpYyBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbFxuXG4gIC8qKlxuICAgKiDkv53lrZjpobXpnaLmmK/lkKYgb3ZlcmZsb3dcbiAgICovXG4gIHB1YmxpYyBib2R5SXNPdmVyZmxvd2luZzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiDkv53lrZjlvZPliY3mtY/op4jlmajnmoTmu5rliqjmnaHlrr3luqZcbiAgICovXG4gIHB1YmxpYyBzY3JvbGxiYXJXaWR0aDogbnVtYmVyXG5cbiAgcHVibGljIGRpYWxvZzogSFRNTERpdkVsZW1lbnRcblxuICBwdWJsaWMgd3JhcHBlcjogSFRNTERpdkVsZW1lbnRcblxuICBwdWJsaWMgaXNVbm1vdW50ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJRGlhbG9nUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICBjb25zdCB7IGN1cnJlbnRTdGVwLCBkZWZhdWx0Q3VycmVudFN0ZXAsIHZpc2libGUsIGRlZmF1bHRWaXNpYmxlIH0gPSBwcm9wc1xuICAgIGNvbnN0IHZpc2libGVTdGF0ZSA9IHZpc2libGUgIT09IG51bGwgPyAhIXZpc2libGUgOiAhIWRlZmF1bHRWaXNpYmxlXG4gICAgY29uc3QgY3VycmVudFN0ZXBTdGF0ZSA9XG4gICAgICBjdXJyZW50U3RlcCAhPT0gbnVsbCA/IGN1cnJlbnRTdGVwIDogZGVmYXVsdEN1cnJlbnRTdGVwXG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgdmlzaWJsZTogdmlzaWJsZVN0YXRlLFxuICAgICAgY3VycmVudFN0ZXA6IGN1cnJlbnRTdGVwU3RhdGUgfHwgMCxcbiAgICAgIGhhc0V2ZXJPcGVuZWQ6IHZpc2libGVTdGF0ZSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2F2ZURpYWxvZyA9IChub2RlOiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgIHRoaXMuZGlhbG9nID0gbm9kZVxuICB9XG5cbiAgcHVibGljIHJlc2V0U2Nyb2xsYmFyUGFkZGluZyA9ICgpID0+IHtcbiAgICBjb25zdCB7IGNoYW5nZUJvZHlTdHlsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChjaGFuZ2VCb2R5U3R5bGUpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBcIlwiXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCJcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2Nyb2xsYmFyUGFkZGluZyA9ICgpID0+IHtcbiAgICBjb25zdCB7IGNoYW5nZUJvZHlTdHlsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChjaGFuZ2VCb2R5U3R5bGUpIHtcbiAgICAgIGNvbnN0IHsgaW5uZXJXaWR0aCB9ID0gd2luZG93XG4gICAgICB0aGlzLmJvZHlJc092ZXJmbG93aW5nID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IGlubmVyV2lkdGhcbiAgICAgIGlmICh0aGlzLmJvZHlJc092ZXJmbG93aW5nICYmICFkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCkge1xuICAgICAgICB0aGlzLnNjcm9sbGJhcldpZHRoID0gZ2V0U2Nyb2xsQmFyU2l6ZSgpXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbGJhcldpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IGAke3RoaXMuc2Nyb2xsYmFyV2lkdGh9cHhgXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENhbmNlbEJ1dHRvbiA9ICgpID0+IHtcbiAgICBjb25zdCB7IGNhbmNlbFByb3BzLCBjYW5jZWxUZXh0LCBzdGVwcywgdHlwZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgY3VycmVudFN0ZXAgfSA9IHRoaXMuc3RhdGVcbiAgICBjb25zdCBkZWZhdWx0VGV4dCA9IGN1cnJlbnRTdGVwID09PSAwID8gXCLlj5bmtohcIiA6IFwi5LiK5LiA5q2lXCJcbiAgICBjb25zdCBnZW5lcmF0ZUJ1dHRvbiA9IChwcm9wcz86IElCdXR0b25Qcm9wcywgdGV4dCA9IGRlZmF1bHRUZXh0KSA9PiAoXG4gICAgICA8QnV0dG9uIGtleT1cImNhbmNlbFwiIHRoZW1lPVwibGlnaHRcIiBvbkNsaWNrPXt0aGlzLmhhbmRsZUNhbmNlbH0gey4uLnByb3BzfT5cbiAgICAgICAge3RleHR9XG4gICAgICA8L0J1dHRvbj5cbiAgICApXG5cbiAgICBpZiAoc3RlcHMgJiYgc3RlcHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBwcm9wcyA9IHN0ZXBzW2N1cnJlbnRTdGVwXS5jYW5jZWxQcm9wc1xuICAgICAgY29uc3QgdGV4dCA9IHN0ZXBzW2N1cnJlbnRTdGVwXS5jYW5jZWxUZXh0XG4gICAgICByZXR1cm4gZ2VuZXJhdGVCdXR0b24ocHJvcHMsIHRleHQpXG4gICAgfVxuICAgIGlmICh0eXBlID09PSBcImluZm9ybVwiKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gZ2VuZXJhdGVCdXR0b24oY2FuY2VsUHJvcHMsIGNhbmNlbFRleHQpXG4gIH1cblxuICBwdWJsaWMgZ2V0Q29uZmlybUJ1dHRvbiA9ICgpID0+IHtcbiAgICBjb25zdCB7IGNvbmZpcm1Qcm9wcywgY29uZmlybVRleHQsIHN0ZXBzIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBjdXJyZW50U3RlcCB9ID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IGdlbmVyYXRlQnV0dG9uID0gKHByb3BzPzogSUJ1dHRvblByb3BzLCB0ZXh0Pzogc3RyaW5nKSA9PiAoXG4gICAgICA8QnV0dG9uXG4gICAgICAgIGtleT1cInByaW1hcnlcIlxuICAgICAgICBpbnRlbnQ9XCJwcmltYXJ5XCJcbiAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVDb25maXJtfVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICA+XG4gICAgICAgIHt0ZXh0fVxuICAgICAgPC9CdXR0b24+XG4gICAgKVxuXG4gICAgaWYgKHN0ZXBzICYmIHN0ZXBzLmxlbmd0aCkge1xuICAgICAgY29uc3QgcHJvcHMgPSBzdGVwc1tjdXJyZW50U3RlcF0uY29uZmlybVByb3BzXG4gICAgICBjb25zdCB0ZXh0ID1cbiAgICAgICAgc3RlcHNbY3VycmVudFN0ZXBdLmNvbmZpcm1UZXh0IHx8XG4gICAgICAgIChjdXJyZW50U3RlcCA9PT0gc3RlcHMubGVuZ3RoIC0gMSA/IFwi5a6M5oiQXCIgOiBcIuS4i+S4gOatpVwiKVxuICAgICAgcmV0dXJuIGdlbmVyYXRlQnV0dG9uKHByb3BzLCB0ZXh0KVxuICAgIH1cbiAgICByZXR1cm4gZ2VuZXJhdGVCdXR0b24oY29uZmlybVByb3BzLCBjb25maXJtVGV4dCB8fCBcIuehruiupFwiKVxuICB9XG5cbiAgcHVibGljIGhhbmRsZUtleURvd24gPSAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IHsgZXNjYXBlS2V5Q2xvc2FibGUgfSA9IHRoaXMucHJvcHNcbiAgICBpZiAoZXNjYXBlS2V5Q2xvc2FibGUgJiYgZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIHRoaXMuaGFuZGxlQ2FuY2VsKClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ2FuY2VsID0gKHR5cGU/OiBhbnkpID0+IHtcbiAgICBjb25zdCB7IG9uQ2FuY2VsLCBzdGVwcywgdmlzaWJsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgY3VycmVudFN0ZXAgfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAodHlwZSA9PT0gXCJjbG9zZVwiIHx8ICFzdGVwcyB8fCAhc3RlcHMubGVuZ3RoKSB7XG4gICAgICBpZiAodmlzaWJsZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogZmFsc2UgfSlcbiAgICAgIH1cbiAgICAgIGlmIChvbkNhbmNlbCkge1xuICAgICAgICBvbkNhbmNlbCgpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgb25DYW5jZWw6IG9uU3RlcENhbmNlbCB9ID0gc3RlcHNbY3VycmVudFN0ZXBdXG4gICAgICBpZiAob25TdGVwQ2FuY2VsKSB7XG4gICAgICAgIG9uU3RlcENhbmNlbCgpXG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFN0ZXAgPT09IDApIHtcbiAgICAgICAgaWYgKHZpc2libGUgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogZmFsc2UgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGN1cnJlbnRTdGVwOiBjdXJyZW50U3RlcCAtIDEgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ29uZmlybSA9ICgpID0+IHtcbiAgICBjb25zdCB7IG9uQ29uZmlybSwgc3RlcHMsIHZpc2libGUgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IGN1cnJlbnRTdGVwIH0gPSB0aGlzLnN0YXRlXG4gICAgaWYgKHN0ZXBzICYmIHN0ZXBzLmxlbmd0aCkge1xuICAgICAgY29uc3QgeyBvbkNvbmZpcm06IG9uU3RlcENvbmZpcm0gfSA9IHN0ZXBzW2N1cnJlbnRTdGVwXVxuICAgICAgaWYgKG9uU3RlcENvbmZpcm0pIHtcbiAgICAgICAgb25TdGVwQ29uZmlybSgpXG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFN0ZXAgPT09IHN0ZXBzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgaWYgKHZpc2libGUgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogZmFsc2UgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGN1cnJlbnRTdGVwOiBjdXJyZW50U3RlcCArIDEgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZpc2libGUgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZpc2libGU6IGZhbHNlIH0pXG4gICAgICB9XG4gICAgICBpZiAob25Db25maXJtKSB7XG4gICAgICAgIG9uQ29uZmlybSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uTGVhdmUgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBhZnRlckNsb3NlLCBkZXN0cm95QWZ0ZXJDbG9zZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmICh0aGlzLndyYXBwZXIpIHtcbiAgICAgIHRoaXMud3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbiAgICB9XG4gICAgdGhpcy5yZXNldFNjcm9sbGJhclBhZGRpbmcoKVxuXG4gICAgaWYgKGFmdGVyQ2xvc2UpIHtcbiAgICAgIGFmdGVyQ2xvc2UoKVxuICAgIH1cblxuICAgIGlmIChkZXN0cm95QWZ0ZXJDbG9zZSAmJiAhdGhpcy5pc1VubW91bnRlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGhhc0V2ZXJPcGVuZWQ6IGZhbHNlIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZUVudGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgZXNjYXBlS2V5Q2xvc2FibGUgfSA9IHRoaXMucHJvcHNcbiAgICBpZiAodGhpcy53cmFwcGVyKSB7XG4gICAgICBpZiAoZXNjYXBlS2V5Q2xvc2FibGUpIHtcbiAgICAgICAgdGhpcy53cmFwcGVyLmZvY3VzKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29tcG9uZW50ID0gKG9wdGlvbnM/OiB7IHZpc2libGU6IGJvb2xlYW4gfSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGJvZHlDbGFzc05hbWUsXG4gICAgICBib2R5U3R5bGUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGRlc3Ryb3lBZnRlckNsb3NlLFxuICAgICAgZm9vdGVyQ2xhc3NOYW1lLFxuICAgICAgZm9vdGVyRWxlbWVudCxcbiAgICAgIGZvb3RlclN0eWxlLFxuICAgICAgaGVhZGVyQ2xhc3NOYW1lLFxuICAgICAgaGVhZGVyQ29udGVudCxcbiAgICAgIGhlYWRlckVsZW1lbnQsXG4gICAgICBoZWFkZXJTdHlsZSxcbiAgICAgIG1hc2tDbG9zYWJsZSxcbiAgICAgIHN0ZXBzLFxuICAgICAgc3R5bGUsXG4gICAgICB0aXRsZSxcbiAgICAgIHpJbmRleDogekluZGV4UHJvcCxcbiAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3QgekluZGV4ID0gekluZGV4UHJvcCBhcyBSZWFjdC5DU1NQcm9wZXJ0aWVzW1wiekluZGV4XCJdXG5cbiAgICBjb25zdCByZXN0UHJvcHMgPSBvbWl0KG90aGVyUHJvcHMsIFtcbiAgICAgIFwiYWZ0ZXJDbG9zZVwiLFxuICAgICAgXCJjYW5jZWxQcm9wc1wiLFxuICAgICAgXCJjYW5jZWxUZXh0XCIsXG4gICAgICBcImNoYW5nZUJvZHlTdHlsZVwiLFxuICAgICAgXCJjb25maXJtUHJvcHNcIixcbiAgICAgIFwiY29uZmlybVRleHRcIixcbiAgICAgIFwiY3VycmVudFN0ZXBcIixcbiAgICAgIFwiZGVmYXVsdEN1cnJlbnRTdGVwXCIsXG4gICAgICBcImRlZmF1bHRWaXNpYmxlXCIsXG4gICAgICBcImVzY2FwZUtleUNsb3NhYmxlXCIsXG4gICAgICBcImdldENvbnRhaW5lclwiLFxuICAgICAgXCJvbkNhbmNlbFwiLFxuICAgICAgXCJvbkNvbmZpcm1cIixcbiAgICAgIFwidHlwZVwiLFxuICAgICAgXCJ2aXNpYmxlXCIsXG4gICAgXSlcblxuICAgIGNvbnN0IGNsYXNzU2V0ID0gY2xhc3NOYW1lcyhjbGFzc05hbWUsIGAke3ByZWZpeH0taW5uZXJgKVxuICAgIGNvbnN0IHsgY3VycmVudFN0ZXAgfSA9IHRoaXMuc3RhdGVcbiAgICBsZXQgeyB2aXNpYmxlIH0gPSB0aGlzLnN0YXRlXG4gICAgaWYgKG9wdGlvbnMgJiYgT2JqZWN0LmtleXMob3B0aW9ucykuaW5jbHVkZXMoXCJ2aXNpYmxlXCIpKSB7XG4gICAgICA7KHsgdmlzaWJsZSB9ID0gb3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiByZWY9e3RoaXMuc2F2ZURpYWxvZ30+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9e2Ake3ByZWZpeH0td3JhcHBlcmB9XG4gICAgICAgICAgcmVmPXsod3JhcHBlcikgPT4ge1xuICAgICAgICAgICAgaWYgKHdyYXBwZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGRpc3BsYXk6IHZpc2libGUgPyBcImZsZXhcIiA6IFwiXCIsXG4gICAgICAgICAgICB6SW5kZXgsXG4gICAgICAgICAgfX1cbiAgICAgICAgICB0YWJJbmRleD17MH1cbiAgICAgICAgICByb2xlPVwibm9uZVwiXG4gICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZUtleURvd259XG4gICAgICAgID5cbiAgICAgICAgICA8Q1NTTW90aW9uXG4gICAgICAgICAgICBtb3Rpb25OYW1lPXtgJHtwcmVmaXh9LW1hc2tgfVxuICAgICAgICAgICAgdmlzaWJsZT17dmlzaWJsZX1cbiAgICAgICAgICAgIHJlbW92ZU9uTGVhdmU9e2Rlc3Ryb3lBZnRlckNsb3NlfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsoeyBjbGFzc05hbWU6IGNscyB9LCByZWYpID0+IChcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIHJlZj17cmVmfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhgJHtwcmVmaXh9LW1hc2tgLCBjbHMpfVxuICAgICAgICAgICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAobWFza0Nsb3NhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2FuY2VsKFwiY2xvc2VcIilcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0NTU01vdGlvbj5cbiAgICAgICAgICB7LyoqXG4gICAgICAgICAgICogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMzNDU1MzQyXG4gICAgICAgICAgICogMS4g5pyA5aSW5bGCIG1hcmdpbjogYXV0byDpnZ7luLjph43opoHjgIJcbiAgICAgICAgICAgKiBEaWFsb2cg55qE5a695bqm5piv6Ieq6YCC5bqU55qE77yM5Zug5q2k5L2/55So5LqGIGRpc3BsYXk6IGZsZXgg5aSE55CG5bGF5Lit77yM6L+Z5L2/5b6X5a2Q5YWD57Sg5YW35pyJ5YyF6KO55oCn77yM5Zug5q2k5a695bqm5omN6IO955Sx5YaF5a655omA5Yaz5a6a77ybXG4gICAgICAgICAgICogbWFyZ2luOiBhdXRvOyDmmK/kuLrkuoblrozlloQgZmxleGJveCBvdmVyZmxvdyDnmoTmoLflvI/jgIJcbiAgICAgICAgICAgKiAyLiB6SW5kZXg6IDEg5piv5Li65LqG6KaG55uW5ZyoIG1hc2sg5LiK44CCXG4gICAgICAgICAgICovfVxuICAgICAgICAgIDxDU1NNb3Rpb25cbiAgICAgICAgICAgIG9uQXBwZWFyU3RhcnQ9e3RoaXMuaGFuZGxlRW50ZXJ9XG4gICAgICAgICAgICBvbkVudGVyU3RhcnQ9e3RoaXMuaGFuZGxlRW50ZXJ9XG4gICAgICAgICAgICBvbkxlYXZlRW5kPXt0aGlzLm9uTGVhdmV9XG4gICAgICAgICAgICBtb3Rpb25OYW1lPXtwcmVmaXh9XG4gICAgICAgICAgICB2aXNpYmxlPXt2aXNpYmxlfVxuICAgICAgICAgICAgcmVtb3ZlT25MZWF2ZT17ZGVzdHJveUFmdGVyQ2xvc2V9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgeyh7IGNsYXNzTmFtZTogY2xzIH0sIHJlZikgPT4gKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGNsYXNzU2V0LCBjbHMpfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICBtYXJnaW46IFwiYXV0b1wiLFxuICAgICAgICAgICAgICAgICAgekluZGV4OiAxLFxuICAgICAgICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICB7Li4ucmVzdFByb3BzfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2hlYWRlckVsZW1lbnQgPT09IG51bGxcbiAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgOiBoZWFkZXJFbGVtZW50IHx8IChcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake3ByZWZpeH0taGVhZGVyICR7aGVhZGVyQ2xhc3NOYW1lfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17aGVhZGVyU3R5bGV9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9ezB9IGNsYXNzTmFtZT17YCR7cHJlZml4fS10aXRsZWB9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17MX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2hlYWRlckNvbnRlbnQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0taGVhZGVyQ29udGVudGB9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aGVhZGVyQ29udGVudH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9ezJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWNsb3NlYH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPXsyNH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiY2FuY2VsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB0aGlzLmhhbmRsZUNhbmNlbChcImNsb3NlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAvPixcbiAgICAgICAgICAgICAgICAgICAgICAgIF19XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWJvZHkgJHtib2R5Q2xhc3NOYW1lfWB9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17Ym9keVN0eWxlfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtzdGVwcyAmJiBzdGVwcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBzdGVwc1tjdXJyZW50U3RlcF0uY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgOiBjaGlsZHJlbn1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB7Zm9vdGVyRWxlbWVudCA9PT0gbnVsbCA/IG51bGwgOiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS1mb290ZXIgJHtmb290ZXJDbGFzc05hbWV9YH1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e2Zvb3RlclN0eWxlfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7Zm9vdGVyRWxlbWVudCB8fCBbXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDYW5jZWxCdXR0b24oKSxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENvbmZpcm1CdXR0b24oKSxcbiAgICAgICAgICAgICAgICAgICAgXX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L0NTU01vdGlvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICAvKipcbiAgICogZGlkbW91bnQg55SxIHBvcnRhbCDnmoQgb25DaGlsZHJlbk1vdW5077yM5Zug5Li6IGRpZG1vdW50IOaXtiB3cmFwcGVyIOWPr+iDveW5tuS4jeWcqCBkb21cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVDaGlsZHJlbk1vdW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgdmlzaWJsZSB9ID0gdGhpcy5zdGF0ZVxuICAgIGlmICh2aXNpYmxlICYmIHRoaXMud3JhcHBlcikge1xuICAgICAgdGhpcy5zZXRTY3JvbGxiYXJQYWRkaW5nKClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY29tcG9uZW50RGlkVXBkYXRlID0gKFxuICAgIF86IElEaWFsb2dQcm9wcyxcbiAgICB7IHZpc2libGU6IHZpc2libGVQcmV2IH06IElEaWFsb2dTdGF0ZVxuICApID0+IHtcbiAgICBjb25zdCB7IHZpc2libGUgfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAodmlzaWJsZSAhPT0gdmlzaWJsZVByZXYgJiYgdmlzaWJsZSAmJiB0aGlzLndyYXBwZXIpIHtcbiAgICAgIHRoaXMuc2V0U2Nyb2xsYmFyUGFkZGluZygpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgdmlzaWJsZSB9ID0gdGhpcy5zdGF0ZVxuICAgIHRoaXMuaXNVbm1vdW50ZWQgPSB0cnVlXG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIHRoaXMucmVzZXRTY3JvbGxiYXJQYWRkaW5nKClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgZ2V0Q29udGFpbmVyIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBoYXNFdmVyT3BlbmVkIH0gPSB0aGlzLnN0YXRlXG4gICAgaWYgKCFoYXNFdmVyT3BlbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPFBvcnRhbFxuICAgICAgICBvbkNoaWxkcmVuTW91bnQ9e3RoaXMuaGFuZGxlQ2hpbGRyZW5Nb3VudH1cbiAgICAgICAgZ2V0Q29udGFpbmVyPXtnZXRDb250YWluZXJ9XG4gICAgICA+XG4gICAgICAgIHt0aGlzLmdldENvbXBvbmVudCgpfVxuICAgICAgPC9Qb3J0YWw+XG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpYWxvZ1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsT0FBT0MsU0FBUyxNQUFNLFlBQVk7QUFDbEMsT0FBT0MsZ0JBQWdCLE1BQU0sOEJBQThCO0FBQzNEL