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>
377 lines (325 loc) • 55.7 kB
JavaScript
var _excluded = ["autoComplete", "autoFocus", "className", "cleaveOptions", "contentJustify", "countHanzi", "defaultValue", "disabled", "id", "intent", "leftElement", "limit", "name", "onBlur", "onChange", "onFocus", "onKeyDown", "onPressEnter", "placeholder", "required", "rightElement", "size", "style", "theme", "type", "value"];
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
import React, { forwardRef, useContext, useImperativeHandle, useEffect, useRef, useState } from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import Cleave from "cleave.js/react";
import warning from "../_util/warning";
import { ConfigContext, getComputedSize } from "../config-provider";
import Textarea from "./Textarea";
import "./style";
var prefix = "adui-channels-input";
var Input = forwardRef(function (_ref, ref) {
var _cleaveRef$current, _classNames, _classNames2, _classNames3;
var autoComplete = _ref.autoComplete,
autoFocus = _ref.autoFocus,
className = _ref.className,
cleaveOptions = _ref.cleaveOptions,
contentJustify = _ref.contentJustify,
countHanzi = _ref.countHanzi,
defaultValue = _ref.defaultValue,
disabled = _ref.disabled,
id = _ref.id,
intent = _ref.intent,
leftElement = _ref.leftElement,
limit = _ref.limit,
name = _ref.name,
onBlur = _ref.onBlur,
onChange = _ref.onChange,
onFocus = _ref.onFocus,
onKeyDown = _ref.onKeyDown,
onPressEnter = _ref.onPressEnter,
placeholder = _ref.placeholder,
required = _ref.required,
rightElement = _ref.rightElement,
sizeProp = _ref.size,
style = _ref.style,
theme = _ref.theme,
type = _ref.type,
value = _ref.value,
otherProps = _objectWithoutProperties(_ref, _excluded);
var _useState = useState(null),
_useState2 = _slicedToArray(_useState, 2),
leftElementWidth = _useState2[0],
setLeftElementWidth = _useState2[1];
var _useState3 = useState(null),
_useState4 = _slicedToArray(_useState3, 2),
rightElementWidth = _useState4[0],
setRightElementWidth = _useState4[1];
var inputRef = useRef(null);
var wrapperElementRef = useRef(null);
var leftElementRef = useRef(null);
var rightElementRef = useRef(null);
var justifyElementRef = useRef(null);
var cleaveRef = useRef(null);
var inputElement = (inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) || (cleaveRef === null || cleaveRef === void 0 ? void 0 : (_cleaveRef$current = cleaveRef.current) === null || _cleaveRef$current === void 0 ? void 0 : _cleaveRef$current.element);
var _useContext = useContext(ConfigContext),
sizeContext = _useContext.size;
var size = getComputedSize(sizeProp, sizeContext);
var handleChange = function handleChange(e) {
if (!disabled && onChange) {
var val = e.target.value.replace(/\u0008|\u0009|\u000A|\u000B|\u000C|\u000D|\u00A0|\u2028|\u2029|\uFEFF/g, "");
onChange(e, val);
}
};
var handleKeyDown = function handleKeyDown(e) {
if (e.key === "Enter" && onPressEnter) {
onPressEnter(e);
}
if (onKeyDown) {
onKeyDown(e);
}
};
var handleBlur = function handleBlur(e) {
if (onBlur) {
onBlur(e);
}
};
var handleFocus = function handleFocus(e) {
if (onFocus) {
onFocus(e);
}
};
var handleAttachedElementClick = function handleAttachedElementClick(position) {
if (position === "left" && leftElement && leftElement.type && leftElement.type.name === "Icon") {
inputElement.focus();
inputElement.select();
}
if (position === "right" && rightElement && rightElement.type && rightElement.type.name === "Icon") {
inputElement.focus();
inputElement.select();
}
};
var fixControlledValue = function fixControlledValue(val) {
if (typeof val === "undefined" || val === null) {
return "";
}
return val;
};
var updateElementsWidth = function updateElementsWidth() {
if (leftElementRef !== null && leftElementRef !== void 0 && leftElementRef.current) {
var clientWidth = leftElementRef.current.clientWidth;
if (Math.abs(clientWidth - (leftElementWidth || 0)) > 2) {
setLeftElementWidth(clientWidth);
}
} else if (leftElementWidth) {
setLeftElementWidth(null);
}
if (rightElementRef !== null && rightElementRef !== void 0 && rightElementRef.current) {
var _clientWidth = rightElementRef.current.clientWidth;
if (Math.abs(_clientWidth - (rightElementWidth || 0)) > 2) {
setRightElementWidth(_clientWidth);
}
} else if (rightElementWidth) {
setRightElementWidth(null);
}
if (justifyElementRef !== null && justifyElementRef !== void 0 && justifyElementRef.current) {
var scrollWidth = justifyElementRef.current.scrollWidth;
if (wrapperElementRef.current && Math.ceil(scrollWidth) !== wrapperElementRef.current.clientWidth) {
wrapperElementRef.current.style.width = "".concat(Math.ceil(scrollWidth), "px");
}
}
};
var getFormatStrLeng = function getFormatStrLeng(str) {
var len = str.length;
var realLength = 0;
var charCode = -1;
for (var i = 0; i < len; i += 1) {
charCode = str.charCodeAt(i);
if (charCode >= 0 && charCode <= 128) {
realLength += 0.5;
} else {
realLength += 1;
}
}
return Math.ceil(realLength);
};
useEffect(function () {
updateElementsWidth();
if (cleaveRef !== null && cleaveRef !== void 0 && cleaveRef.current) {
var el = cleaveRef.current.element;
if (cleaveRef.current.lastInputValue !== value) {
cleaveRef.current.lastInputValue = value;
}
if (cleaveRef.current.state.value !== value) {
cleaveRef.current.state.value = value;
}
if (cleaveRef.current.properties.result !== value) {
cleaveRef.current.properties.result = value;
}
if (el && el.value !== value && value) {
el.value = value;
}
}
});
useImperativeHandle(ref, function () {
var _cleaveRef$current2;
var realRef = (inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) || (cleaveRef === null || cleaveRef === void 0 ? void 0 : (_cleaveRef$current2 = cleaveRef.current) === null || _cleaveRef$current2 === void 0 ? void 0 : _cleaveRef$current2.element);
return {
cleave: cleaveRef === null || cleaveRef === void 0 ? void 0 : cleaveRef.current,
input: realRef,
leftElement: leftElementRef === null || leftElementRef === void 0 ? void 0 : leftElementRef.current,
rightElement: rightElementRef === null || rightElementRef === void 0 ? void 0 : rightElementRef.current,
updateElementsWidth: updateElementsWidth,
handleChange: handleChange,
handleKeyDown: handleKeyDown,
handleBlur: handleBlur,
handleFocus: handleFocus,
handleAttachedElementClick: handleAttachedElementClick,
focus: function focus() {
return realRef.focus();
},
blur: function blur() {
return realRef.blur();
}
};
});
var inputProps = {
autoComplete: autoComplete,
autoFocus: autoFocus,
className: "".concat(prefix, "-base"),
disabled: disabled,
id: id,
name: name,
onBlur: handleBlur,
onChange: handleChange,
onFocus: handleFocus,
onKeyDown: handleKeyDown,
placeholder: placeholder,
ref: inputRef,
required: required,
style: {
paddingLeft: leftElementWidth ? "".concat(leftElementWidth, "px") : undefined,
paddingRight: rightElementWidth ? "".concat(rightElementWidth, "px") : undefined
},
type: type
};
var cleaveInputProps = _objectSpread({}, inputProps);
if (value !== null) {
inputProps.value = fixControlledValue(value);
} else {
inputProps.defaultValue = fixControlledValue(defaultValue);
}
cleaveInputProps.value = value || defaultValue || "";
var input = !cleaveOptions || Object.keys(cleaveOptions).length === 0 ? React.createElement("input", inputProps) : React.createElement(Cleave, _extends({
options: cleaveOptions
}, cleaveInputProps, {
ref: cleaveRef
}));
var length;
if (limit) {
warning(!rightElement, "Input", "不允许同时使用 prop `limit` 与 prop `rightElement`");
if (value) {
length = countHanzi ? getFormatStrLeng(value) : value.length;
} else {
warning(value !== null, "Input", "如果要使用 limit Prop,必须从外部控制 value。");
length = 0;
}
}
if (contentJustify) {
warning(value !== null, "Input", "如果使用 contentJusfity Prop,必须从外部控制 value。");
}
var classSet = classNames(className, "".concat(prefix, "-wrapper"), "".concat(prefix, "-").concat(size), (_classNames = {}, _defineProperty(_classNames, "".concat(prefix, "-").concat(theme), theme), _defineProperty(_classNames, "".concat(prefix, "-disabled"), disabled), _defineProperty(_classNames, "".concat(prefix, "-limited"), limit), _defineProperty(_classNames, "".concat(prefix, "-limited_digit-over-2"), limit && limit.toString().length > 2), _defineProperty(_classNames, "".concat(prefix, "-normal"), intent === "normal"), _defineProperty(_classNames, "".concat(prefix, "-primary"), intent === "primary"), _defineProperty(_classNames, "".concat(prefix, "-success"), intent === "success"), _defineProperty(_classNames, "".concat(prefix, "-warning"), intent === "warning"), _defineProperty(_classNames, "".concat(prefix, "-danger"), intent === "danger" || length && limit && length > limit), _classNames));
var leftType = leftElement && leftElement.type ? leftElement.type.type : "";
var rightType = rightElement && rightElement.type ? rightElement.type.type : "";
return React.createElement("div", _extends({
ref: wrapperElementRef,
className: classSet,
style: style
}, otherProps), !!leftElement && React.createElement("div", {
ref: leftElementRef,
onClick: function onClick() {
return handleAttachedElementClick("left");
},
role: "none",
className: classNames("".concat(prefix, "-left"), (_classNames2 = {}, _defineProperty(_classNames2, "".concat(prefix, "-left_button"), leftType === "Button"), _defineProperty(_classNames2, "".concat(prefix, "-left_icon"), leftType === "Icon"), _defineProperty(_classNames2, "".concat(prefix, "-left_select"), leftType === "Select"), _classNames2))
}, leftElement), input, !!rightElement && React.createElement("div", {
ref: rightElementRef,
onClick: function onClick() {
return handleAttachedElementClick("right");
},
role: "none",
className: classNames("".concat(prefix, "-right"), (_classNames3 = {}, _defineProperty(_classNames3, "".concat(prefix, "-right_button"), rightType === "Button"), _defineProperty(_classNames3, "".concat(prefix, "-right_icon"), rightType === "Icon"), _defineProperty(_classNames3, "".concat(prefix, "-right_select"), rightType === "Select"), _classNames3))
}, rightElement), limit && React.createElement("div", {
className: "".concat(prefix, "-limit")
}, React.createElement("span", null, "".concat(length, "/").concat(limit))), contentJustify && React.createElement("div", {
className: "".concat(prefix, "-justify"),
ref: justifyElementRef,
style: {
paddingLeft: leftElementWidth ? "".concat(leftElementWidth, "px") : undefined,
paddingRight: rightElementWidth ? "".concat(rightElementWidth, "px") : undefined,
minWidth: style === null || style === void 0 ? void 0 : style.minWidth
}
}, fixControlledValue(value)));
});
Input.Textarea = Textarea;
Input.displayName = "Input";
Input.propTypes = {
autoComplete: PropTypes.oneOf(["on", "off"]),
autoFocus: PropTypes.bool,
className: PropTypes.string,
cleaveOptions: PropTypes.object,
contentJustify: PropTypes.bool,
countHanzi: PropTypes.bool,
defaultValue: PropTypes.string,
disabled: PropTypes.bool,
id: PropTypes.string,
intent: PropTypes.oneOf(["normal", "primary", "success", "warning", "danger"]),
leftElement: PropTypes.any,
limit: PropTypes.number,
name: PropTypes.string,
onBlur: PropTypes.func,
onChange: PropTypes.func,
onFocus: PropTypes.func,
onKeyDown: PropTypes.func,
onPressEnter: PropTypes.func,
placeholder: PropTypes.string,
required: PropTypes.bool,
rightElement: PropTypes.any,
size: PropTypes.oneOf(["mini", "small", "medium", "large"]),
style: PropTypes.object,
theme: PropTypes.oneOf([null, "light"]),
type: PropTypes.string,
value: PropTypes.string
};
Input.defaultProps = {
autoComplete: "off",
autoFocus: false,
className: undefined,
cleaveOptions: {},
contentJustify: false,
countHanzi: true,
defaultValue: null,
disabled: false,
id: null,
intent: "normal",
leftElement: undefined,
limit: null,
name: null,
onBlur: function onBlur() {},
onChange: function onChange() {},
onFocus: function onFocus() {},
onKeyDown: function onKeyDown() {},
onPressEnter: function onPressEnter() {},
placeholder: "请输入",
required: false,
rightElement: undefined,
size: "small",
style: {},
theme: null,
type: null,
value: null
};
export default Input;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImZvcndhcmRSZWYiLCJ1c2VDb250ZXh0IiwidXNlSW1wZXJhdGl2ZUhhbmRsZSIsInVzZUVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiUHJvcFR5cGVzIiwiY2xhc3NOYW1lcyIsIkNsZWF2ZSIsIndhcm5pbmciLCJDb25maWdDb250ZXh0IiwiZ2V0Q29tcHV0ZWRTaXplIiwiVGV4dGFyZWEiLCJwcmVmaXgiLCJJbnB1dCIsInJlZiIsImF1dG9Db21wbGV0ZSIsImF1dG9Gb2N1cyIsImNsYXNzTmFtZSIsImNsZWF2ZU9wdGlvbnMiLCJjb250ZW50SnVzdGlmeSIsImNvdW50SGFuemkiLCJkZWZhdWx0VmFsdWUiLCJkaXNhYmxlZCIsImlkIiwiaW50ZW50IiwibGVmdEVsZW1lbnQiLCJsaW1pdCIsIm5hbWUiLCJvbkJsdXIiLCJvbkNoYW5nZSIsIm9uRm9jdXMiLCJvbktleURvd24iLCJvblByZXNzRW50ZXIiLCJwbGFjZWhvbGRlciIsInJlcXVpcmVkIiwicmlnaHRFbGVtZW50Iiwic2l6ZVByb3AiLCJzaXplIiwic3R5bGUiLCJ0aGVtZSIsInR5cGUiLCJ2YWx1ZSIsIm90aGVyUHJvcHMiLCJsZWZ0RWxlbWVudFdpZHRoIiwic2V0TGVmdEVsZW1lbnRXaWR0aCIsInJpZ2h0RWxlbWVudFdpZHRoIiwic2V0UmlnaHRFbGVtZW50V2lkdGgiLCJpbnB1dFJlZiIsIndyYXBwZXJFbGVtZW50UmVmIiwibGVmdEVsZW1lbnRSZWYiLCJyaWdodEVsZW1lbnRSZWYiLCJqdXN0aWZ5RWxlbWVudFJlZiIsImNsZWF2ZVJlZiIsImlucHV0RWxlbWVudCIsImN1cnJlbnQiLCJlbGVtZW50Iiwic2l6ZUNvbnRleHQiLCJoYW5kbGVDaGFuZ2UiLCJlIiwidmFsIiwidGFyZ2V0IiwicmVwbGFjZSIsImhhbmRsZUtleURvd24iLCJrZXkiLCJoYW5kbGVCbHVyIiwiaGFuZGxlRm9jdXMiLCJoYW5kbGVBdHRhY2hlZEVsZW1lbnRDbGljayIsInBvc2l0aW9uIiwiZm9jdXMiLCJzZWxlY3QiLCJmaXhDb250cm9sbGVkVmFsdWUiLCJ1cGRhdGVFbGVtZW50c1dpZHRoIiwiY2xpZW50V2lkdGgiLCJNYXRoIiwiYWJzIiwic2Nyb2xsV2lkdGgiLCJjZWlsIiwid2lkdGgiLCJnZXRGb3JtYXRTdHJMZW5nIiwic3RyIiwibGVuIiwibGVuZ3RoIiwicmVhbExlbmd0aCIsImNoYXJDb2RlIiwiaSIsImNoYXJDb2RlQXQiLCJlbCIsImxhc3RJbnB1dFZhbHVlIiwic3RhdGUiLCJwcm9wZXJ0aWVzIiwicmVzdWx0IiwicmVhbFJlZiIsImNsZWF2ZSIsImlucHV0IiwiYmx1ciIsImlucHV0UHJvcHMiLCJwYWRkaW5nTGVmdCIsInVuZGVmaW5lZCIsInBhZGRpbmdSaWdodCIsImNsZWF2ZUlucHV0UHJvcHMiLCJPYmplY3QiLCJrZXlzIiwiY2xhc3NTZXQiLCJ0b1N0cmluZyIsImxlZnRUeXBlIiwicmlnaHRUeXBlIiwibWluV2lkdGgiLCJkaXNwbGF5TmFtZSIsInByb3BUeXBlcyIsIm9uZU9mIiwiYm9vbCIsInN0cmluZyIsIm9iamVjdCIsImFueSIsIm51bWJlciIsImZ1bmMiLCJkZWZhdWx0UHJvcHMiXSwic291cmNlcyI6WyIuLi8uLi9jb21wb25lbnRzL2NoYW5uZWxzLWlucHV0L0lucHV0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtcbiAgZm9yd2FyZFJlZixcbiAgdXNlQ29udGV4dCxcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZSxcbiAgdXNlRWZmZWN0LFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgQ2xlYXZlIGZyb20gXCJjbGVhdmUuanMvcmVhY3RcIlxuaW1wb3J0IHdhcm5pbmcgZnJvbSBcIi4uL191dGlsL3dhcm5pbmdcIlxuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCwgZ2V0Q29tcHV0ZWRTaXplIH0gZnJvbSBcIi4uL2NvbmZpZy1wcm92aWRlclwiXG5pbXBvcnQgVGV4dGFyZWEgZnJvbSBcIi4vVGV4dGFyZWFcIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5cbmNvbnN0IHByZWZpeCA9IFwiYWR1aS1jaGFubmVscy1pbnB1dFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlucHV0UHJvcHMge1xuICBba2V5OiBzdHJpbmddOiBhbnlcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIGF1dG9Db21wbGV0ZVxuICAgKi9cbiAgYXV0b0NvbXBsZXRlPzogXCJvblwiIHwgXCJvZmZcIlxuICAvKipcbiAgICogaW5wdXQg5qCH562+5Y6f55Sf5bGe5oCnIC0gYXV0b0ZvY3VzXG4gICAqL1xuICBhdXRvRm9jdXM/OiBib29sZWFuXG4gIC8qKlxuICAgKiDpmYTliqDnsbvlkI1cbiAgICovXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICog5a6e546w5omL5py65Y+344CB5pel5pyf44CB5pWw5a2X5Y+K6Ieq5a6a5LmJ5qC85byP77yM5Y+v5p+l55yLW+ekuuS+i10oaHR0cDovL3d4YWQuZGVzaWduL2FkdWkvY29tcG9uZW50cy9pbnB1dCnjgIJcbiAgICovXG4gIGNsZWF2ZU9wdGlvbnM/OiBvYmplY3RcbiAgLyoqXG4gICAqIOWuveW6puaYr+WQpuS4juWGheWuueWuveW6puWvuem9kFxuICAgKi9cbiAgY29udGVudEp1c3RpZnk/OiBib29sZWFuXG4gIC8qKlxuICAgKiDmmK/lkKbmjInnhafkuIDkuKrmsYnlrZfnrpcgMiDlrZfmlbDnmoTmlrnlvI/pmZDliLbplb/luqZcbiAgICovXG4gIGNvdW50SGFuemk/OiBib29sZWFuXG4gIC8qKlxuICAgKiDpu5jorqTlgLwgLSDlhoXpg6jpqbHliqhcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bGxcbiAgLyoqXG4gICAqIOaYr+WQpuemgeeUqFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiDovpPlhaXmoYbnmoQgaWRcbiAgICovXG4gIGlkPzogc3RyaW5nIHwgbnVsbFxuICAvKipcbiAgICog57G75Z6LXG4gICAqL1xuICBpbnRlbnQ/OiBcIm5vcm1hbFwiIHwgXCJwcmltYXJ5XCIgfCBcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiIHwgXCJkYW5nZXJcIlxuICAvKipcbiAgICog5YmN572u5YWD57SgXG4gICAqL1xuICBsZWZ0RWxlbWVudD86IEpTWC5FbGVtZW50XG4gIC8qKlxuICAgKiDpmZDliLbplb/luqZcbiAgICovXG4gIGxpbWl0PzogbnVtYmVyIHwgbnVsbFxuICAvKipcbiAgICogaW5wdXQg5qCH562+5Y6f55Sf5bGe5oCnIC0gbmFtZVxuICAgKi9cbiAgbmFtZT86IHN0cmluZyB8IG51bGxcbiAgLyoqXG4gICAqIGJsdXIg5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQmx1cj86IChlOiBSZWFjdC5Gb2N1c0V2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB2b2lkXG4gIC8qKlxuICAgKiDlgLzmlLnlj5jml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25DaGFuZ2U/OiAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4sIHZhbHVlPzogc3RyaW5nKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBmb2N1cyDml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25Gb2N1cz86IChlOiBSZWFjdC5Gb2N1c0V2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB2b2lkXG4gIC8qKlxuICAgKiBrZXlkb3duIOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbktleURvd24/OiAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4gdm9pZFxuICAvKipcbiAgICogZW50ZXIg5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uUHJlc3NFbnRlcj86IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB2b2lkXG4gIC8qKlxuICAgKiBwbGFjZWhvbGRlclxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIHJlcXVpcmVkXG4gICAqL1xuICByZXF1aXJlZD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOWQjue9ruWFg+e0oFxuICAgKi9cbiAgcmlnaHRFbGVtZW50PzogSlNYLkVsZW1lbnRcbiAgLyoqXG4gICAqIOiuvue9ruWwuuWvuFxuICAgKi9cbiAgc2l6ZT86IFwibWluaVwiIHwgXCJzbWFsbFwiIHwgXCJtZWRpdW1cIiB8IFwibGFyZ2VcIlxuICAvKipcbiAgICog6ZmE5Yqg5qC35byPXG4gICAqL1xuICBzdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgLyoqXG4gICAqIOiuvue9ruS4u+mimFxuICAgKi9cbiAgdGhlbWU/OiBudWxsIHwgXCJsaWdodFwiXG4gIC8qKlxuICAgKiBpbnB1dCDmoIfnrb7ljp/nlJ/lsZ7mgKcgLSB0eXBlXG4gICAqL1xuICB0eXBlPzogc3RyaW5nIHwgbnVsbFxuICAvKipcbiAgICog5YC8IC0g5aSW6YOo5o6n5Yi2XG4gICAqL1xuICB2YWx1ZT86IHN0cmluZyB8IG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSW5wdXRcbiAgZXh0ZW5kcyBSZWFjdC5Gb3J3YXJkUmVmRXhvdGljQ29tcG9uZW50PFxuICAgIElJbnB1dFByb3BzICYgUmVhY3QuUmVmQXR0cmlidXRlczxhbnk+XG4gID4ge1xuICBUZXh0YXJlYTogdHlwZW9mIFRleHRhcmVhXG59XG5cbi8qKlxuICog6L6T5YWl5qGG55So5LqO5paH5pys6L6T5YWl55qE5Yy65Z+f77yM5Y+v57uT5ZCI5Zu+5qCH44CB5oyJ6ZKu44CB6YCJ5oup5Zmo562J57uE5Lu25L2/55So44CCXG4gKi9cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IElucHV0OiBJSW5wdXQgPSBmb3J3YXJkUmVmKFxuICAoXG4gICAge1xuICAgICAgYXV0b0NvbXBsZXRlLFxuICAgICAgYXV0b0ZvY3VzLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgY2xlYXZlT3B0aW9ucyxcbiAgICAgIGNvbnRlbnRKdXN0aWZ5LFxuICAgICAgY291bnRIYW56aSxcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIGRpc2FibGVkLFxuICAgICAgaWQsXG4gICAgICBpbnRlbnQsXG4gICAgICBsZWZ0RWxlbWVudCxcbiAgICAgIGxpbWl0LFxuICAgICAgbmFtZSxcbiAgICAgIG9uQmx1cixcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgb25Gb2N1cyxcbiAgICAgIG9uS2V5RG93bixcbiAgICAgIG9uUHJlc3NFbnRlcixcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgcmVxdWlyZWQsXG4gICAgICByaWdodEVsZW1lbnQsXG4gICAgICBzaXplOiBzaXplUHJvcCxcbiAgICAgIHN0eWxlLFxuICAgICAgdGhlbWUsXG4gICAgICB0eXBlLFxuICAgICAgdmFsdWUsXG4gICAgICAuLi5vdGhlclByb3BzXG4gICAgfTogSUlucHV0UHJvcHMsXG4gICAgcmVmXG4gICkgPT4ge1xuICAgIGNvbnN0IFtsZWZ0RWxlbWVudFdpZHRoLCBzZXRMZWZ0RWxlbWVudFdpZHRoXSA9IHVzZVN0YXRlPG51bGwgfCBudW1iZXI+KFxuICAgICAgbnVsbFxuICAgIClcbiAgICBjb25zdCBbcmlnaHRFbGVtZW50V2lkdGgsIHNldFJpZ2h0RWxlbWVudFdpZHRoXSA9IHVzZVN0YXRlPG51bGwgfCBudW1iZXI+KFxuICAgICAgbnVsbFxuICAgIClcbiAgICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZjxhbnk+KG51bGwpXG4gICAgY29uc3Qgd3JhcHBlckVsZW1lbnRSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gICAgY29uc3QgbGVmdEVsZW1lbnRSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gICAgY29uc3QgcmlnaHRFbGVtZW50UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICAgIGNvbnN0IGp1c3RpZnlFbGVtZW50UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICAgIGNvbnN0IGNsZWF2ZVJlZiA9IHVzZVJlZjxhbnk+KG51bGwpXG5cbiAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSBpbnB1dFJlZj8uY3VycmVudCB8fCBjbGVhdmVSZWY/LmN1cnJlbnQ/LmVsZW1lbnRcblxuICAgIGNvbnN0IHsgc2l6ZTogc2l6ZUNvbnRleHQgfSA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dClcblxuICAgIGNvbnN0IHNpemUgPSBnZXRDb21wdXRlZFNpemUoc2l6ZVByb3AsIHNpemVDb250ZXh0KVxuXG4gICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoIWRpc2FibGVkICYmIG9uQ2hhbmdlKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnRyb2wtcmVnZXgsIG1heC1sZW4gKi9cbiAgICAgICAgLy8gMDggQmFja3NwYWNlLCAwOSBUYWIsIDBBIOaNouihjOespiwgMEIg5Z6C55u05Yi26KGo56ymLCAwQyDmjaLpobUsIDBEIOWbnui9piwgQTAg5LiN6Ze05pat56m65qC8LFxuICAgICAgICAvLyAyMDI4LzIwMjkg5YiG6ZqU56ymLCBGRWZmIOWtl+iKgumhuuW6j+agh+iusOOAglxuICAgICAgICBjb25zdCB2YWwgPSBlLnRhcmdldC52YWx1ZS5yZXBsYWNlKFxuICAgICAgICAgIC9cXHUwMDA4fFxcdTAwMDl8XFx1MDAwQXxcXHUwMDBCfFxcdTAwMEN8XFx1MDAwRHxcXHUwMEEwfFxcdTIwMjh8XFx1MjAyOXxcXHVGRUZGL2csXG4gICAgICAgICAgXCJcIlxuICAgICAgICApXG4gICAgICAgIG9uQ2hhbmdlKGUsIHZhbClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiICYmIG9uUHJlc3NFbnRlcikge1xuICAgICAgICBvblByZXNzRW50ZXIoZSlcbiAgICAgIH1cbiAgICAgIGlmIChvbktleURvd24pIHtcbiAgICAgICAgb25LZXlEb3duKGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlQmx1ciA9IChlOiBSZWFjdC5Gb2N1c0V2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAob25CbHVyKSB7XG4gICAgICAgIG9uQmx1cihlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUZvY3VzID0gKGU6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICAgIG9uRm9jdXMoZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVBdHRhY2hlZEVsZW1lbnRDbGljayA9IChwb3NpdGlvbjogXCJsZWZ0XCIgfCBcInJpZ2h0XCIpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcG9zaXRpb24gPT09IFwibGVmdFwiICYmXG4gICAgICAgIGxlZnRFbGVtZW50ICYmXG4gICAgICAgIGxlZnRFbGVtZW50LnR5cGUgJiZcbiAgICAgICAgbGVmdEVsZW1lbnQudHlwZS5uYW1lID09PSBcIkljb25cIlxuICAgICAgKSB7XG4gICAgICAgIGlucHV0RWxlbWVudC5mb2N1cygpXG4gICAgICAgIGlucHV0RWxlbWVudC5zZWxlY3QoKVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBwb3NpdGlvbiA9PT0gXCJyaWdodFwiICYmXG4gICAgICAgIHJpZ2h0RWxlbWVudCAmJlxuICAgICAgICByaWdodEVsZW1lbnQudHlwZSAmJlxuICAgICAgICByaWdodEVsZW1lbnQudHlwZS5uYW1lID09PSBcIkljb25cIlxuICAgICAgKSB7XG4gICAgICAgIGlucHV0RWxlbWVudC5mb2N1cygpXG4gICAgICAgIGlucHV0RWxlbWVudC5zZWxlY3QoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZpeENvbnRyb2xsZWRWYWx1ZSA9ICh2YWw/OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCB2YWwgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVFbGVtZW50c1dpZHRoID0gKCkgPT4ge1xuICAgICAgLyoqXG4gICAgICAgKiDov5nkuKrmlrnms5XkvJrlnKggZGlkVXBkYXRlIOWSjCBkaWRNb3VudCDml7bljrsgc2V0U3RhdGVcbiAgICAgICAqIOS4gOWumuimgemBv+WFjemAoOaIkOW+queOr+OAglxuICAgICAgICovXG4gICAgICBpZiAobGVmdEVsZW1lbnRSZWY/LmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgeyBjbGllbnRXaWR0aCB9ID0gbGVmdEVsZW1lbnRSZWYuY3VycmVudFxuXG4gICAgICAgIC8vIOmYsuatouW+queOr1xuICAgICAgICBpZiAoTWF0aC5hYnMoY2xpZW50V2lkdGggLSAobGVmdEVsZW1lbnRXaWR0aCB8fCAwKSkgPiAyKSB7XG4gICAgICAgICAgc2V0TGVmdEVsZW1lbnRXaWR0aChjbGllbnRXaWR0aClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChsZWZ0RWxlbWVudFdpZHRoKSB7XG4gICAgICAgIHNldExlZnRFbGVtZW50V2lkdGgobnVsbClcbiAgICAgIH1cblxuICAgICAgaWYgKHJpZ2h0RWxlbWVudFJlZj8uY3VycmVudCkge1xuICAgICAgICBjb25zdCB7IGNsaWVudFdpZHRoIH0gPSByaWdodEVsZW1lbnRSZWYuY3VycmVudFxuXG4gICAgICAgIC8vIOmYsuatouW+queOr1xuICAgICAgICBpZiAoTWF0aC5hYnMoY2xpZW50V2lkdGggLSAocmlnaHRFbGVtZW50V2lkdGggfHwgMCkpID4gMikge1xuICAgICAgICAgIHNldFJpZ2h0RWxlbWVudFdpZHRoKGNsaWVudFdpZHRoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJpZ2h0RWxlbWVudFdpZHRoKSB7XG4gICAgICAgIHNldFJpZ2h0RWxlbWVudFdpZHRoKG51bGwpXG4gICAgICB9XG5cbiAgICAgIGlmIChqdXN0aWZ5RWxlbWVudFJlZj8uY3VycmVudCkge1xuICAgICAgICBjb25zdCB7IHNjcm9sbFdpZHRoIH0gPSBqdXN0aWZ5RWxlbWVudFJlZi5jdXJyZW50XG4gICAgICAgIGlmIChcbiAgICAgICAgICB3cmFwcGVyRWxlbWVudFJlZi5jdXJyZW50ICYmXG4gICAgICAgICAgTWF0aC5jZWlsKHNjcm9sbFdpZHRoKSAhPT0gd3JhcHBlckVsZW1lbnRSZWYuY3VycmVudC5jbGllbnRXaWR0aFxuICAgICAgICApIHtcbiAgICAgICAgICB3cmFwcGVyRWxlbWVudFJlZi5jdXJyZW50LnN0eWxlLndpZHRoID0gYCR7TWF0aC5jZWlsKHNjcm9sbFdpZHRoKX1weGBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGdldEZvcm1hdFN0ckxlbmcgPSAoc3RyOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGhcbiAgICAgIGxldCByZWFsTGVuZ3RoID0gMFxuICAgICAgbGV0IGNoYXJDb2RlID0gLTFcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgICAgICBpZiAoY2hhckNvZGUgPj0gMCAmJiBjaGFyQ29kZSA8PSAxMjgpIHtcbiAgICAgICAgICByZWFsTGVuZ3RoICs9IDAuNVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlYWxMZW5ndGggKz0gMVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gTWF0aC5jZWlsKHJlYWxMZW5ndGgpXG4gICAgfVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIHVwZGF0ZUVsZW1lbnRzV2lkdGgoKVxuICAgICAgaWYgKGNsZWF2ZVJlZj8uY3VycmVudCkge1xuICAgICAgICBjb25zdCBlbCA9IGNsZWF2ZVJlZi5jdXJyZW50LmVsZW1lbnRcbiAgICAgICAgLyoqXG4gICAgICAgICAqIOS/ruWkjSBjbGVhdmUuMS40LjcgYnVnOlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGNsZWF2ZVJlZi5jdXJyZW50Lmxhc3RJbnB1dFZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgIGNsZWF2ZVJlZi5jdXJyZW50Lmxhc3RJbnB1dFZhbHVlID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xlYXZlUmVmLmN1cnJlbnQuc3RhdGUudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgY2xlYXZlUmVmLmN1cnJlbnQuc3RhdGUudmFsdWUgPSB2YWx1ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChjbGVhdmVSZWYuY3VycmVudC5wcm9wZXJ0aWVzLnJlc3VsdCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICBjbGVhdmVSZWYuY3VycmVudC5wcm9wZXJ0aWVzLnJlc3VsdCA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsICYmIGVsLnZhbHVlICE9PSB2YWx1ZSAmJiB2YWx1ZSkge1xuICAgICAgICAgIGVsLnZhbHVlID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4ge1xuICAgICAgY29uc3QgcmVhbFJlZiA9IGlucHV0UmVmPy5jdXJyZW50IHx8IGNsZWF2ZVJlZj8uY3VycmVudD8uZWxlbWVudFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2xlYXZlOiBjbGVhdmVSZWY/LmN1cnJlbnQsXG4gICAgICAgIGlucHV0OiByZWFsUmVmLFxuICAgICAgICBsZWZ0RWxlbWVudDogbGVmdEVsZW1lbnRSZWY/LmN1cnJlbnQsXG4gICAgICAgIHJpZ2h0RWxlbWVudDogcmlnaHRFbGVtZW50UmVmPy5jdXJyZW50LFxuICAgICAgICB1cGRhdGVFbGVtZW50c1dpZHRoLFxuICAgICAgICBoYW5kbGVDaGFuZ2UsXG4gICAgICAgIGhhbmRsZUtleURvd24sXG4gICAgICAgIGhhbmRsZUJsdXIsXG4gICAgICAgIGhhbmRsZUZvY3VzLFxuICAgICAgICBoYW5kbGVBdHRhY2hlZEVsZW1lbnRDbGljayxcbiAgICAgICAgZm9jdXM6ICgpID0+IHJlYWxSZWYuZm9jdXMoKSxcbiAgICAgICAgYmx1cjogKCkgPT4gcmVhbFJlZi5ibHVyKCksXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGlucHV0UHJvcHM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7XG4gICAgICBhdXRvQ29tcGxldGUsXG4gICAgICBhdXRvRm9jdXMsXG4gICAgICBjbGFzc05hbWU6IGAke3ByZWZpeH0tYmFzZWAsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGlkLFxuICAgICAgbmFtZSxcbiAgICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICAgIG9uQ2hhbmdlOiBoYW5kbGVDaGFuZ2UsXG4gICAgICBvbkZvY3VzOiBoYW5kbGVGb2N1cyxcbiAgICAgIG9uS2V5RG93bjogaGFuZGxlS2V5RG93bixcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgcmVmOiBpbnB1dFJlZixcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgcGFkZGluZ0xlZnQ6IGxlZnRFbGVtZW50V2lkdGggPyBgJHtsZWZ0RWxlbWVudFdpZHRofXB4YCA6IHVuZGVmaW5lZCxcbiAgICAgICAgcGFkZGluZ1JpZ2h0OiByaWdodEVsZW1lbnRXaWR0aCA/IGAke3JpZ2h0RWxlbWVudFdpZHRofXB4YCA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICB0eXBlLFxuICAgIH1cblxuICAgIGNvbnN0IGNsZWF2ZUlucHV0UHJvcHMgPSB7IC4uLmlucHV0UHJvcHMgfVxuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICBpbnB1dFByb3BzLnZhbHVlID0gZml4Q29udHJvbGxlZFZhbHVlKHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dFByb3BzLmRlZmF1bHRWYWx1ZSA9IGZpeENvbnRyb2xsZWRWYWx1ZShkZWZhdWx0VmFsdWUpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY2xlYXZlIOS4jeaOpeaUtuWOn+eUn+eahCBkZWZhdWx0VmFsdWXvvIzlv4XpobvkvKDlhaUgdmFsdWUgcHJvcCDmnaXlrp7njrAgZGVmYXVsdFZhbHVlIOeahOS9nOeUqFxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub3Npci9jbGVhdmUuanMvYmxvYi9tYXN0ZXIvZG9jL3JlYWN0anMtY29tcG9uZW50LXVzYWdlLm1kI2hvdy10by1wYXNzLWRlZmF1bHQtdmFsdWVcbiAgICAgKi9cbiAgICBjbGVhdmVJbnB1dFByb3BzLnZhbHVlID0gdmFsdWUgfHwgZGVmYXVsdFZhbHVlIHx8IFwiXCJcblxuICAgIGNvbnN0IGlucHV0ID1cbiAgICAgICFjbGVhdmVPcHRpb25zIHx8IE9iamVjdC5rZXlzKGNsZWF2ZU9wdGlvbnMpLmxlbmd0aCA9PT0gMCA/IChcbiAgICAgICAgPGlucHV0IHsuLi5pbnB1dFByb3BzfSAvPlxuICAgICAgKSA6IChcbiAgICAgICAgPENsZWF2ZSBvcHRpb25zPXtjbGVhdmVPcHRpb25zfSB7Li4uY2xlYXZlSW5wdXRQcm9wc30gcmVmPXtjbGVhdmVSZWZ9IC8+XG4gICAgICApXG5cbiAgICBsZXQgbGVuZ3RoXG4gICAgaWYgKGxpbWl0KSB7XG4gICAgICB3YXJuaW5nKFxuICAgICAgICAhcmlnaHRFbGVtZW50LFxuICAgICAgICBcIklucHV0XCIsXG4gICAgICAgIFwi5LiN5YWB6K645ZCM5pe25L2/55SoIHByb3AgYGxpbWl0YCDkuI4gcHJvcCBgcmlnaHRFbGVtZW50YFwiXG4gICAgICApXG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgbGVuZ3RoID0gY291bnRIYW56aSA/IGdldEZvcm1hdFN0ckxlbmcodmFsdWUpIDogdmFsdWUubGVuZ3RoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgIHZhbHVlICE9PSBudWxsLFxuICAgICAgICAgIFwiSW5wdXRcIixcbiAgICAgICAgICBcIuWmguaenOimgeS9v+eUqCBsaW1pdCBQcm9w77yM5b+F6aG75LuO5aSW6YOo5o6n5Yi2IHZhbHVl44CCXCJcbiAgICAgICAgKVxuICAgICAgICBsZW5ndGggPSAwXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb250ZW50SnVzdGlmeSkge1xuICAgICAgd2FybmluZyhcbiAgICAgICAgdmFsdWUgIT09IG51bGwsXG4gICAgICAgIFwiSW5wdXRcIixcbiAgICAgICAgXCLlpoLmnpzkvb/nlKggY29udGVudEp1c2ZpdHkgUHJvcO+8jOW/hemhu+S7juWklumDqOaOp+WItiB2YWx1ZeOAglwiXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgY2xhc3NTZXQgPSBjbGFzc05hbWVzKFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgYCR7cHJlZml4fS13cmFwcGVyYCxcbiAgICAgIGAke3ByZWZpeH0tJHtzaXplfWAsXG4gICAgICB7XG4gICAgICAgIFtgJHtwcmVmaXh9LSR7dGhlbWV9YF06IHRoZW1lLFxuICAgICAgICBbYCR7cHJlZml4fS1kaXNhYmxlZGBdOiBkaXNhYmxlZCxcbiAgICAgICAgW2Ake3ByZWZpeH0tbGltaXRlZGBdOiBsaW1pdCxcbiAgICAgICAgW2Ake3ByZWZpeH0tbGltaXRlZF9kaWdpdC1vdmVyLTJgXTpcbiAgICAgICAgICBsaW1pdCAmJiBsaW1pdC50b1N0cmluZygpLmxlbmd0aCA+IDIsXG4gICAgICAgIFtgJHtwcmVmaXh9LW5vcm1hbGBdOiBpbnRlbnQgPT09IFwibm9ybWFsXCIsXG4gICAgICAgIFtgJHtwcmVmaXh9LXByaW1hcnlgXTogaW50ZW50ID09PSBcInByaW1hcnlcIixcbiAgICAgICAgW2Ake3ByZWZpeH0tc3VjY2Vzc2BdOiBpbnRlbnQgPT09IFwic3VjY2Vzc1wiLFxuICAgICAgICBbYCR7cHJlZml4fS13YXJuaW5nYF06IGludGVudCA9PT0gXCJ3YXJuaW5nXCIsXG4gICAgICAgIFtgJHtwcmVmaXh9LWRhbmdlcmBdOlxuICAgICAgICAgIGludGVudCA9PT0gXCJkYW5nZXJcIiB8fCAobGVuZ3RoICYmIGxpbWl0ICYmIGxlbmd0aCA+IGxpbWl0KSxcbiAgICAgIH1cbiAgICApXG5cbiAgICBjb25zdCBsZWZ0VHlwZSA9XG4gICAgICBsZWZ0RWxlbWVudCAmJiBsZWZ0RWxlbWVudC50eXBlID8gbGVmdEVsZW1lbnQudHlwZS50eXBlIDogXCJcIlxuICAgIGNvbnN0IHJpZ2h0VHlwZSA9XG4gICAgICByaWdodEVsZW1lbnQgJiYgcmlnaHRFbGVtZW50LnR5cGUgPyByaWdodEVsZW1lbnQudHlwZS50eXBlIDogXCJcIlxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgcmVmPXt3cmFwcGVyRWxlbWVudFJlZn1cbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc1NldH1cbiAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICB7Li4ub3RoZXJQcm9wc31cbiAgICAgID5cbiAgICAgICAgeyEhbGVmdEVsZW1lbnQgJiYgKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHJlZj17bGVmdEVsZW1lbnRSZWZ9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVBdHRhY2hlZEVsZW1lbnRDbGljayhcImxlZnRcIil9XG4gICAgICAgICAgICByb2xlPVwibm9uZVwiXG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYCR7cHJlZml4fS1sZWZ0YCwge1xuICAgICAgICAgICAgICBbYCR7cHJlZml4fS1sZWZ0X2J1dHRvbmBdOiBsZWZ0VHlwZSA9PT0gXCJCdXR0b25cIixcbiAgICAgICAgICAgICAgW2Ake3ByZWZpeH0tbGVmdF9pY29uYF06IGxlZnRUeXBlID09PSBcIkljb25cIixcbiAgICAgICAgICAgICAgW2Ake3ByZWZpeH0tbGVmdF9zZWxlY3RgXTogbGVmdFR5cGUgPT09IFwiU2VsZWN0XCIsXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7bGVmdEVsZW1lbnR9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICAgIHtpbnB1dH1cbiAgICAgICAgeyEhcmlnaHRFbGVtZW50ICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICByZWY9e3JpZ2h0RWxlbWVudFJlZn1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUF0dGFjaGVkRWxlbWVudENsaWNrKFwicmlnaHRcIil9XG4gICAgICAgICAgICByb2xlPVwibm9uZVwiXG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYCR7cHJlZml4fS1yaWdodGAsIHtcbiAgICAgICAgICAgICAgW2Ake3ByZWZpeH0tcmlnaHRfYnV0dG9uYF06IHJpZ2h0VHlwZSA9PT0gXCJCdXR0b25cIixcbiAgICAgICAgICAgICAgW2Ake3ByZWZpeH0tcmlnaHRfaWNvbmBdOiByaWdodFR5cGUgPT09IFwiSWNvblwiLFxuICAgICAgICAgICAgICBbYCR7cHJlZml4fS1yaWdodF9zZWxlY3RgXTogcmlnaHRUeXBlID09PSBcIlNlbGVjdFwiLFxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3JpZ2h0RWxlbWVudH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2xpbWl0ICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cHJlZml4fS1saW1pdGB9PlxuICAgICAgICAgICAgPHNwYW4+e2Ake2xlbmd0aH0vJHtsaW1pdH1gfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2NvbnRlbnRKdXN0aWZ5ICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9e2Ake3ByZWZpeH0tanVzdGlmeWB9XG4gICAgICAgICAgICByZWY9e2p1c3RpZnlFbGVtZW50UmVmfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6IGxlZnRFbGVtZW50V2lkdGhcbiAgICAgICAgICAgICAgICA/IGAke2xlZnRFbGVtZW50V2lkdGh9cHhgXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogcmlnaHRFbGVtZW50V2lkdGhcbiAgICAgICAgICAgICAgICA/IGAke3JpZ2h0RWxlbWVudFdpZHRofXB4YFxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBtaW5XaWR0aDogc3R5bGU/Lm1pbldpZHRoLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7Zml4Q29udHJvbGxlZFZhbHVlKHZhbHVlKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuKVxuXG5JbnB1dC5UZXh0YXJlYSA9IFRleHRhcmVhXG5cbklucHV0LmRpc3BsYXlOYW1lID0gXCJJbnB1dFwiXG5cbklucHV0LnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIGF1dG9Db21wbGV0ZVxuICAgKi9cbiAgYXV0b0NvbXBsZXRlOiBQcm9wVHlwZXMub25lT2YoW1wib25cIiwgXCJvZmZcIl0pLFxuICAvKipcbiAgICogaW5wdXQg5qCH562+5Y6f55Sf5bGe5oCnIC0gYXV0b0ZvY3VzXG4gICAqL1xuICBhdXRvRm9jdXM6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog6ZmE5Yqg57G75ZCNXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiDlrp7njrDmiYvmnLrlj7fjgIHml6XmnJ/jgIHmlbDlrZflj4roh6rlrprkuYnmoLzlvI/vvIzlj6/mn6XnnItb56S65L6LXShodHRwOi8vd3hhZC5kZXNpZ24vYWR1aS9jb21wb25lbnRzL2lucHV0KeOAglxuICAgKi9cbiAgY2xlYXZlT3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqXG4gICAqIOWuveW6puaYr+WQpuS4juWGheWuueWuveW6puWvuem9kFxuICAgKi9cbiAgY29udGVudEp1c3RpZnk6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog5piv5ZCm5oyJ54Wn5LiA5Liq5rGJ5a2X566XIDIg5a2X5pWw55qE5pa55byP6ZmQ5Yi26ZW/5bqmXG4gICAqL1xuICBjb3VudEhhbnppOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOm7mOiupOWAvCAtIOWGhemDqOmpseWKqFxuICAgKi9cbiAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5piv5ZCm56aB55SoXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiDovpPlhaXmoYbnmoQgaWRcbiAgICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog57G75Z6LXG4gICAqL1xuICBpbnRlbnQ6IFByb3BUeXBlcy5vbmVPZihbXG4gICAgXCJub3JtYWxcIixcbiAgICBcInByaW1hcnlcIixcbiAgICBcInN1Y2Nlc3NcIixcbiAgICBcIndhcm5pbmdcIixcbiAgICBcImRhbmdlclwiLFxuICBdKSxcbiAgLyoqXG4gICAqIOWJjee9ruWFg+e0oFxuICAgKi9cbiAgbGVmdEVsZW1lbnQ6IFByb3BUeXBlcy5hbnksXG4gIC8qKlxuICAgKiDpmZDliLbplb/luqZcbiAgICovXG4gIGxpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICogaW5wdXQg5qCH562+5Y6f55Sf5bGe5oCnIC0gbmFtZVxuICAgKi9cbiAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIGJsdXIg5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiDlgLzmlLnlj5jml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICogZm9jdXMg5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uRm9jdXM6IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICoga2V5ZG93biDml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25LZXlEb3duOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIGVudGVyIOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvblByZXNzRW50ZXI6IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICogcGxhY2Vob2xkZXJcbiAgICovXG4gIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICogaW5wdXQg5qCH562+5Y6f55Sf5bGe5oCnIC0gcmVxdWlyZWRcbiAgICovXG4gIHJlcXVpcmVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOWQjue9ruWFg+e0oFxuICAgKi9cbiAgcmlnaHRFbGVtZW50OiBQcm9wVHlwZXMuYW55LFxuICAvKipcbiAgICog6K6+572u5bC65a+4XG4gICAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoW1wibWluaVwiLCBcInNtYWxsXCIsIFwibWVkaXVtXCIsIFwibGFyZ2VcIl0pLFxuICAvKipcbiAgICog6ZmE5Yqg5qC35byPXG4gICAqL1xuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgLyoqXG4gICAqIOiuvue9ruS4u+mimFxuICAgKi9cbiAgdGhlbWU6IFByb3BUeXBlcy5vbmVPZihbbnVsbCwgXCJsaWdodFwiXSksXG4gIC8qKlxuICAgKiBpbnB1dCDmoIfnrb7ljp/nlJ/lsZ7mgKcgLSB0eXBlXG4gICAqL1xuICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5YC8IC0g5aSW6YOo5o6n5Yi2XG4gICAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbn1cblxuSW5wdXQuZGVmYXVsdFByb3BzID0ge1xuICBhdXRvQ29tcGxldGU6IFwib2ZmXCIsXG4gIGF1dG9Gb2N1czogZmFsc2UsXG4gIGNsYXNzTmFtZTogdW5kZWZpbmVkLFxuICBjbGVhdmVPcHRpb25zOiB7fSxcbiAgY29udGVudEp1c3RpZnk6IGZhbHNlLFxuICBjb3VudEhhbnppOiB0cnVlLFxuICBkZWZhdWx0VmFsdWU6IG51bGwsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgaWQ6IG51bGwsXG4gIGludGVudDogXCJub3JtYWxcIixcbiAgbGVmdEVsZW1lbnQ6IHVuZGVmaW5lZCxcbiAgbGltaXQ6IG51bGwsXG4gIG5hbWU6IG51bGwsXG4gIG9uQmx1cjogKCkgPT4ge30sXG4gIG9uQ2hhbmdlOiAoKSA9PiB7fSxcbiAgb25Gb2N1czogKCkgPT4ge30sXG4gIG9uS2V5RG93bjogKCkgPT4ge30sXG4gIG9uUHJlc3NFbnRlcjogKCkgPT4ge30sXG4gIHBsYWNlaG9sZGVyOiBcIuivt+i+k+WFpVwiLFxuICByZXF1aXJlZDogZmFsc2UsXG4gIHJpZ2h0RWxlbWVudDogdW5kZWZpbmVkLFxuICBzaXplOiBcInNtYWxsXCIsXG4gIHN0eWxlOiB7fSxcbiAgdGhlbWU6IG51bGwsXG4gIHR5cGU6IG51bGwsXG4gIHZhbHVlOiBudWxsLFxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnB1dFxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU9BLEtBQVAsSUFDRUMsVUFERixFQUVFQyxVQUZGLEVBR0VDLG1CQUhGLEVBSUVDLFNBSkYsRUFLRUMsTUFMRixFQU1FQyxRQU5GLFFBT08sT0FQUDtBQVFBLE9BQU9DLFNBQVAsTUFBc0IsWUFBdEI7QUFD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