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>
213 lines • 34.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 = ["children", "className", "style", "width"];
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 _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 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 _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 shallowequal from "shallowequal";
import addEventListener from "rc-util/lib/Dom/addEventListener";
import omit from "../_util/omit";
import ResizeObserver from "../resize-observer";
import "./style";
var prefix = "adui-affix";
var Affix = function (_React$Component) {
function Affix(_props) {
var _this;
_classCallCheck(this, Affix);
_this = _callSuper(this, Affix, [_props]);
_this.fixedNode = void 0;
_this.placeholderNode = void 0;
_this.scrollEventHandler = void 0;
_this.componentDidMount = function () {
var getTarget = _this.props.getTarget;
var target = getTarget ? getTarget() : window;
_this.scrollEventHandler = addEventListener(target, "scroll", _this.updatePosition);
_this.updatePosition();
_this.syncPlaceholderStyle();
};
_this.componentWillUnmount = function () {
if (_this.scrollEventHandler) {
_this.scrollEventHandler.remove();
}
};
_this.setAffixStyle = function (newAffixStyle) {
var onChange = _this.props.onChange;
var affixStyle = _this.state.affixStyle;
if (!shallowequal(affixStyle, newAffixStyle)) {
_this.setState({
affixStyle: newAffixStyle
});
}
if (!!affixStyle !== !!newAffixStyle && onChange) {
onChange(!!newAffixStyle);
}
};
_this.updatePosition = function () {
var _this2 = _this,
fixedNode = _this2.fixedNode,
placeholderNode = _this2.placeholderNode,
props = _this2.props;
var getContainer = props.getContainer,
getTarget = props.getTarget,
offsetBottom = props.offsetBottom,
offsetTop = props.offsetTop;
var target = getTarget ? getTarget() : window;
if (target && placeholderNode && fixedNode) {
var documentRect = document.body.getBoundingClientRect();
var placeholderRect = placeholderNode.getBoundingClientRect();
var fixedRect = fixedNode.getBoundingClientRect();
var targetRect = getTarget ? getTarget().getBoundingClientRect() : documentRect;
var documentRectLeft = documentRect.left;
var placeholderRectLeft = placeholderRect.left;
var targetTop = getTarget ? targetRect.top : 0;
var targetHeight = getTarget ? targetRect.height : window.innerHeight;
var affixStyle = {
left: documentRectLeft + placeholderRectLeft,
position: "fixed",
width: fixedRect.width
};
if (offsetBottom !== null && offsetBottom !== undefined && !isNaN(offsetBottom)) {
setTimeout(function () {
placeholderRect = placeholderNode.getBoundingClientRect();
if (placeholderRect.bottom > targetHeight - offsetBottom + targetTop) {
if (getContainer && getContainer()) {
var containerRect = getContainer().getBoundingClientRect();
var bottom = targetHeight - containerRect.top - placeholderRect.height + targetTop;
if (bottom <= offsetBottom) {
if (placeholderRect.height) {
affixStyle.bottom = bottom + placeholderRect.height < 0 ? -placeholderRect.height : bottom;
}
} else {
affixStyle.bottom = offsetBottom + window.innerHeight - targetTop - targetHeight;
}
} else {
affixStyle.bottom = offsetBottom + window.innerHeight - targetTop - targetHeight;
}
_this.setAffixStyle(affixStyle);
} else {
_this.setAffixStyle(null);
}
}, 0);
} else if (placeholderRect.top < (offsetTop || 0) + targetTop) {
if (getContainer && getContainer()) {
var containerRect = getContainer().getBoundingClientRect();
var top = containerRect.height + containerRect.top - placeholderRect.height - targetTop;
if (offsetTop !== undefined && top <= offsetTop) {
affixStyle.top = top + placeholderRect.height < 0 ? -placeholderRect.height : top;
} else {
affixStyle.top = targetTop + (offsetTop || 0);
}
} else {
affixStyle.top = targetTop + (offsetTop || 0);
}
_this.setAffixStyle(affixStyle);
} else {
_this.setAffixStyle(null);
}
}
};
_this.syncPlaceholderStyle = function () {
_this.updatePosition();
var affixStyle = _this.state.affixStyle;
if (_this.placeholderNode && affixStyle) {
var widthPrev = _this.placeholderNode.style.width;
_this.placeholderNode.style.width = "";
var width = _this.placeholderNode.offsetWidth;
_this.setAffixStyle(_objectSpread(_objectSpread({}, affixStyle), {}, {
width: width
}));
if (!width) {
_this.placeholderNode.style.width = widthPrev;
}
}
};
_this.savePlaceholderNode = function (node) {
_this.placeholderNode = node;
};
_this.saveFixedNode = function (node) {
_this.fixedNode = node;
};
_this.state = {
affixStyle: undefined
};
return _this;
}
_inherits(Affix, _React$Component);
return _createClass(Affix, [{
key: "render",
value: function render() {
var _this3 = this;
var _this$props = this.props,
children = _this$props.children,
className = _this$props.className,
style = _this$props.style,
widthProp = _this$props.width,
otherProps = _objectWithoutProperties(_this$props, _excluded);
var restProps = omit(otherProps, ["getContainer", "getTarget", "offsetBottom", "offsetTop", "onChange"]);
var affixStyle = this.state.affixStyle;
var classSet = classNames(className, "".concat(prefix, "-base"));
return React.createElement("div", {
ref: this.savePlaceholderNode,
style: {
width: widthProp
}
}, React.createElement(ResizeObserver, {
onResize: function onResize(_ref) {
var width = _ref.width,
height = _ref.height;
_this3.updatePosition();
_this3.syncPlaceholderStyle();
if (_this3.placeholderNode && width && height) {
if (!widthProp) {
_this3.placeholderNode.style.width = "".concat(width, "px");
}
_this3.placeholderNode.style.height = "".concat(height, "px");
}
}
}, React.createElement("div", _extends({
className: classSet,
ref: this.saveFixedNode,
style: _objectSpread(_objectSpread({}, affixStyle), style)
}, restProps), children)));
}
}]);
}(React.Component);
Affix.propTypes = {
children: PropTypes.node,
className: PropTypes.string,
getContainer: PropTypes.func,
getTarget: PropTypes.func,
offsetBottom: PropTypes.number,
offsetTop: PropTypes.number,
onChange: PropTypes.func,
style: PropTypes.object
};
Affix.defaultProps = {
children: "",
className: undefined,
getContainer: null,
getTarget: null,
offsetBottom: null,
offsetTop: 0,
onChange: null,
style: {}
};
export { Affix as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlByb3BUeXBlcyIsImNsYXNzTmFtZXMiLCJzaGFsbG93ZXF1YWwiLCJhZGRFdmVudExpc3RlbmVyIiwib21pdCIsIlJlc2l6ZU9ic2VydmVyIiwicHJlZml4IiwiQWZmaXgiLCJfUmVhY3QkQ29tcG9uZW50IiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9jYWxsU3VwZXIiLCJmaXhlZE5vZGUiLCJwbGFjZWhvbGRlck5vZGUiLCJzY3JvbGxFdmVudEhhbmRsZXIiLCJjb21wb25lbnREaWRNb3VudCIsImdldFRhcmdldCIsInRhcmdldCIsIndpbmRvdyIsInVwZGF0ZVBvc2l0aW9uIiwic3luY1BsYWNlaG9sZGVyU3R5bGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZSIsInNldEFmZml4U3R5bGUiLCJuZXdBZmZpeFN0eWxlIiwib25DaGFuZ2UiLCJhZmZpeFN0eWxlIiwic3RhdGUiLCJzZXRTdGF0ZSIsIl90aGlzMiIsImdldENvbnRhaW5lciIsIm9mZnNldEJvdHRvbSIsIm9mZnNldFRvcCIsImRvY3VtZW50UmVjdCIsImRvY3VtZW50IiwiYm9keSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInBsYWNlaG9sZGVyUmVjdCIsImZpeGVkUmVjdCIsInRhcmdldFJlY3QiLCJkb2N1bWVudFJlY3RMZWZ0IiwibGVmdCIsInBsYWNlaG9sZGVyUmVjdExlZnQiLCJ0YXJnZXRUb3AiLCJ0b3AiLCJ0YXJnZXRIZWlnaHQiLCJoZWlnaHQiLCJpbm5lckhlaWdodCIsInBvc2l0aW9uIiwid2lkdGgiLCJ1bmRlZmluZWQiLCJpc05hTiIsInNldFRpbWVvdXQiLCJib3R0b20iLCJjb250YWluZXJSZWN0Iiwid2lkdGhQcmV2Iiwic3R5bGUiLCJvZmZzZXRXaWR0aCIsIl9vYmplY3RTcHJlYWQiLCJzYXZlUGxhY2Vob2xkZXJOb2RlIiwibm9kZSIsInNhdmVGaXhlZE5vZGUiLCJfaW5oZXJpdHMiLCJfY3JlYXRlQ2xhc3MiLCJrZXkiLCJ2YWx1ZSIsInJlbmRlciIsIl90aGlzMyIsIl90aGlzJHByb3BzIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJ3aWR0aFByb3AiLCJvdGhlclByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwicmVzdFByb3BzIiwiY2xhc3NTZXQiLCJjb25jYXQiLCJjcmVhdGVFbGVtZW50IiwicmVmIiwib25SZXNpemUiLCJfcmVmIiwiX2V4dGVuZHMiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJzdHJpbmciLCJmdW5jIiwibnVtYmVyIiwib2JqZWN0IiwiZGVmYXVsdFByb3BzIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL2NvbXBvbmVudHMvYWZmaXgvQWZmaXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWZmaXgg57uE5Lu25bCG5LiN5Lya5L+u5pS55oiQIEZ1bmN0aW9uQ29tcG9uZW5077yMXG4gKiDlm6DkuLrmiJHvvIhZaWppZe+8ieWwneivlei/h+WPkeeOsOS8muS4gOebtOinpuWPkSBvbkNoYW5nZSwgYWZmaXhTdHlsZSDmmI7mmI7mnInvvIzkvYbmmK/lnKggb25DaGFuZ2Ug5pe25LiA55u05pivIHVuZGVmaW5lZFxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgc2hhbGxvd2VxdWFsIGZyb20gXCJzaGFsbG93ZXF1YWxcIlxuaW1wb3J0IGFkZEV2ZW50TGlzdGVuZXIgZnJvbSBcInJjLXV0aWwvbGliL0RvbS9hZGRFdmVudExpc3RlbmVyXCJcbmltcG9ydCBvbWl0IGZyb20gXCIuLi9fdXRpbC9vbWl0XCJcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tIFwiLi4vcmVzaXplLW9ic2VydmVyXCJcbmltcG9ydCBcIi4vc3R5bGVcIlxuXG5jb25zdCBwcmVmaXggPSBcImFkdWktYWZmaXhcIlxuXG5leHBvcnQgaW50ZXJmYWNlIElBZmZpeFByb3BzIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBnZXRDb250YWluZXI/OiAoKCkgPT4gSFRNTEVsZW1lbnQpIHwgbnVsbFxuICBnZXRUYXJnZXQ/OiAoKCkgPT4gSFRNTEVsZW1lbnQpIHwgbnVsbFxuICBvZmZzZXRCb3R0b20/OiBudW1iZXIgfCBudWxsXG4gIG9mZnNldFRvcD86IG51bWJlclxuICBvbkNoYW5nZT86ICgoYWZmaXhlZDogYm9vbGVhbikgPT4gdm9pZCkgfCBudWxsXG4gIHN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAvLyAyMDI0MDcwMSDlop7liqAgd2lkdGggcHJvcO+8jOWmguaenOWklumDqOaMh+WumuS6hiB3aWR0aO+8jOWImeS4jeWGjeWcqOWGhemDqOWKqOaAgeiuoeeul+WuveW6plxuICB3aWR0aD86IFJlYWN0LkNTU1Byb3BlcnRpZXNbXCJ3aWR0aFwiXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBZmZpeFN0YXRlIHtcbiAgYWZmaXhTdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXMgfCBudWxsXG59XG5cbi8qKlxuICog5Zu66ZKJXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFmZml4IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElBZmZpeFByb3BzLCBJQWZmaXhTdGF0ZT4ge1xuICBwdWJsaWMgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAvKipcbiAgICAgKiDlrZDoioLngrlcbiAgICAgKi9cbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog6ZmE5Yqg57G75ZCNXG4gICAgICovXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8qKlxuICAgICAqICgpID0+IEhUTUxFbGVtZW50IOWbuumSieeahOaYvuekuuWMuuWfn++8jOawuOi/nOS8muWcqOatpOaWueazleS8oOWbnueahOWFg+e0oOWGhVxuICAgICAqL1xuICAgIGdldENvbnRhaW5lcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICogKCkgPT4gSFRNTEVsZW1lbnQg55uR5ZCs5rua5Yqo55qE5YWD57Sg77yM6buY6K6k5ZyoIHdpbmRvdyDkuIpcbiAgICAgKi9cbiAgICBnZXRUYXJnZXQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOi3neemu+eql+WPo+mhtumDqOi+vuWIsOaMh+WumuWBj+enu+mHj+WQjuinpuWPke+8jOWmguaenOS8oOWFpeS6hiBvZmZzZXRCb3R0b23vvIxBZmZpeCDkvJrlv73nlaUgb2Zmc2V0VG9wXG4gICAgICovXG4gICAgb2Zmc2V0Qm90dG9tOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIC8qKlxuICAgICAqIOi3neemu+eql+WPo+mhtumDqOi+vuWIsOaMh+WumuWBj+enu+mHj+WQjuinpuWPkVxuICAgICAqL1xuICAgIG9mZnNldFRvcDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAvKipcbiAgICAgKiDlm7rlrprnirbmgIHmlLnlj5jml7bnmoQgaGFuZGxlclxuICAgICAqL1xuICAgIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDpmYTliqDmoLflvI9cbiAgICAgKi9cbiAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzOiBJQWZmaXhQcm9wcyA9IHtcbiAgICBjaGlsZHJlbjogXCJcIixcbiAgICBjbGFzc05hbWU6IHVuZGVmaW5lZCxcbiAgICBnZXRDb250YWluZXI6IG51bGwsXG4gICAgZ2V0VGFyZ2V0OiBudWxsLFxuICAgIG9mZnNldEJvdHRvbTogbnVsbCxcbiAgICBvZmZzZXRUb3A6IDAsXG4gICAgb25DaGFuZ2U6IG51bGwsXG4gICAgc3R5bGU6IHt9LFxuICB9XG5cbiAgcHVibGljIGZpeGVkTm9kZTogSFRNTERpdkVsZW1lbnRcblxuICBwdWJsaWMgcGxhY2Vob2xkZXJOb2RlOiBIVE1MRGl2RWxlbWVudFxuXG4gIHByaXZhdGUgc2Nyb2xsRXZlbnRIYW5kbGVyOiBhbnlcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSUFmZml4UHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgYWZmaXhTdHlsZTogdW5kZWZpbmVkLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjb21wb25lbnREaWRNb3VudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IGdldFRhcmdldCB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldCA/IGdldFRhcmdldCgpIDogd2luZG93XG4gICAgdGhpcy5zY3JvbGxFdmVudEhhbmRsZXIgPSBhZGRFdmVudExpc3RlbmVyKFxuICAgICAgdGFyZ2V0LFxuICAgICAgXCJzY3JvbGxcIixcbiAgICAgIHRoaXMudXBkYXRlUG9zaXRpb25cbiAgICApXG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbigpXG4gICAgdGhpcy5zeW5jUGxhY2Vob2xkZXJTdHlsZSgpXG4gIH1cblxuICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsRXZlbnRIYW5kbGVyKSB7XG4gICAgICB0aGlzLnNjcm9sbEV2ZW50SGFuZGxlci5yZW1vdmUoKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRBZmZpeFN0eWxlID0gKG5ld0FmZml4U3R5bGU6IFJlYWN0LkNTU1Byb3BlcnRpZXMgfCBudWxsKSA9PiB7XG4gICAgY29uc3QgeyBvbkNoYW5nZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgYWZmaXhTdHlsZSB9ID0gdGhpcy5zdGF0ZVxuICAgIGlmICghc2hhbGxvd2VxdWFsKGFmZml4U3R5bGUsIG5ld0FmZml4U3R5bGUpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgYWZmaXhTdHlsZTogbmV3QWZmaXhTdHlsZSB9KVxuICAgIH1cbiAgICBpZiAoISFhZmZpeFN0eWxlICE9PSAhIW5ld0FmZml4U3R5bGUgJiYgb25DaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlKCEhbmV3QWZmaXhTdHlsZSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgY29uc3QgeyBmaXhlZE5vZGUsIHBsYWNlaG9sZGVyTm9kZSwgcHJvcHMgfSA9IHRoaXNcbiAgICBjb25zdCB7IGdldENvbnRhaW5lciwgZ2V0VGFyZ2V0LCBvZmZzZXRCb3R0b20sIG9mZnNldFRvcCB9ID0gcHJvcHNcbiAgICBjb25zdCB0YXJnZXQgPSBnZXRUYXJnZXQgPyBnZXRUYXJnZXQoKSA6IHdpbmRvd1xuXG4gICAgLy8g5q+P5qyh5L2/55SoIHJlZiDpg73opoHov5vooYzliKTmlq1cbiAgICBpZiAodGFyZ2V0ICYmIHBsYWNlaG9sZGVyTm9kZSAmJiBmaXhlZE5vZGUpIHtcbiAgICAgIC8vIGRvY3VtZW50UmVjdCDmmK/kuIDlrprpnIDopoHnmoTvvIzkuLrkuoborr7nva7mraPnoa7nmoQgbGVmdCDlgLxcbiAgICAgIGNvbnN0IGRvY3VtZW50UmVjdCA9IGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIGxldCBwbGFjZWhvbGRlclJlY3QgPSBwbGFjZWhvbGRlck5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIGNvbnN0IGZpeGVkUmVjdCA9IGZpeGVkTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuXG4gICAgICAvLyDliKTmlq3mmK/lkKbmmK8gd2luZG93XG4gICAgICBjb25zdCB0YXJnZXRSZWN0ID0gZ2V0VGFyZ2V0XG4gICAgICAgID8gZ2V0VGFyZ2V0KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgOiBkb2N1bWVudFJlY3RcbiAgICAgIGNvbnN0IGRvY3VtZW50UmVjdExlZnQgPSBkb2N1bWVudFJlY3QubGVmdFxuICAgICAgY29uc3QgcGxhY2Vob2xkZXJSZWN0TGVmdCA9IHBsYWNlaG9sZGVyUmVjdC5sZWZ0XG5cbiAgICAgIGNvbnN0IHRhcmdldFRvcCA9IGdldFRhcmdldCA/IHRhcmdldFJlY3QudG9wIDogMFxuICAgICAgY29uc3QgdGFyZ2V0SGVpZ2h0ID0gZ2V0VGFyZ2V0ID8gdGFyZ2V0UmVjdC5oZWlnaHQgOiB3aW5kb3cuaW5uZXJIZWlnaHRcblxuICAgICAgY29uc3QgYWZmaXhTdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyA9IHtcbiAgICAgICAgbGVmdDogZG9jdW1lbnRSZWN0TGVmdCArIHBsYWNlaG9sZGVyUmVjdExlZnQsXG4gICAgICAgIHBvc2l0aW9uOiBcImZpeGVkXCIsXG4gICAgICAgIHdpZHRoOiBmaXhlZFJlY3Qud2lkdGgsXG4gICAgICB9XG5cbiAgICAgIC8vIOWmguaenOS8oOWFpeS6hiBvZmZzZXRCb3R0b23vvIzliJnkvJrlv73nlaUgb2Zmc2V0VG9wXG4gICAgICBpZiAoXG4gICAgICAgIG9mZnNldEJvdHRvbSAhPT0gbnVsbCAmJlxuICAgICAgICBvZmZzZXRCb3R0b20gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhaXNOYU4ob2Zmc2V0Qm90dG9tKVxuICAgICAgKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHBsYWNlaG9sZGVyUmVjdCA9IHBsYWNlaG9sZGVyTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyUmVjdC5ib3R0b20gPlxuICAgICAgICAgICAgdGFyZ2V0SGVpZ2h0IC0gb2Zmc2V0Qm90dG9tICsgdGFyZ2V0VG9wXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoZ2V0Q29udGFpbmVyICYmIGdldENvbnRhaW5lcigpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBnZXRDb250YWluZXIoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICAgICAgICBjb25zdCBib3R0b20gPVxuICAgICAgICAgICAgICAgIHRhcmdldEhlaWdodCAtXG4gICAgICAgICAgICAgICAgY29udGFpbmVyUmVjdC50b3AgLVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyUmVjdC5oZWlnaHQgK1xuICAgICAgICAgICAgICAgIHRhcmdldFRvcFxuICAgICAgICAgICAgICBpZiAoYm90dG9tIDw9IG9mZnNldEJvdHRvbSkge1xuICAgICAgICAgICAgICAgIGlmIChwbGFjZWhvbGRlclJlY3QuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICBhZmZpeFN0eWxlLmJvdHRvbSA9XG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbSArIHBsYWNlaG9sZGVyUmVjdC5oZWlnaHQgPCAwXG4gICAgICAgICAgICAgICAgICAgICAgPyAtcGxhY2Vob2xkZXJSZWN0LmhlaWdodFxuICAgICAgICAgICAgICAgICAgICAgIDogYm90dG9tXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFmZml4U3R5bGUuYm90dG9tID1cbiAgICAgICAgICAgICAgICAgIG9mZnNldEJvdHRvbSArIHdpbmRvdy5pbm5lckhlaWdodCAtIHRhcmdldFRvcCAtIHRhcmdldEhlaWdodFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhZmZpeFN0eWxlLmJvdHRvbSA9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Qm90dG9tICsgd2luZG93LmlubmVySGVpZ2h0IC0gdGFyZ2V0VG9wIC0gdGFyZ2V0SGVpZ2h0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldEFmZml4U3R5bGUoYWZmaXhTdHlsZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRBZmZpeFN0eWxlKG51bGwpXG4gICAgICAgICAgfVxuICAgICAgICB9LCAwKVxuICAgICAgfSBlbHNlIGlmIChwbGFjZWhvbGRlclJlY3QudG9wIDwgKG9mZnNldFRvcCB8fCAwKSArIHRhcmdldFRvcCkge1xuICAgICAgICBpZiAoZ2V0Q29udGFpbmVyICYmIGdldENvbnRhaW5lcigpKSB7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGdldENvbnRhaW5lcigpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgY29uc3QgdG9wID1cbiAgICAgICAgICAgIGNvbnRhaW5lclJlY3QuaGVpZ2h0ICtcbiAgICAgICAgICAgIGNvbnRhaW5lclJlY3QudG9wIC1cbiAgICAgICAgICAgIHBsYWNlaG9sZGVyUmVjdC5oZWlnaHQgLVxuICAgICAgICAgICAgdGFyZ2V0VG9wXG4gICAgICAgICAgaWYgKG9mZnNldFRvcCAhPT0gdW5kZWZpbmVkICYmIHRvcCA8PSBvZmZzZXRUb3ApIHtcbiAgICAgICAgICAgIGFmZml4U3R5bGUudG9wID1cbiAgICAgICAgICAgICAgdG9wICsgcGxhY2Vob2xkZXJSZWN0LmhlaWdodCA8IDAgPyAtcGxhY2Vob2xkZXJSZWN0LmhlaWdodCA6IHRvcFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhZmZpeFN0eWxlLnRvcCA9IHRhcmdldFRvcCArIChvZmZzZXRUb3AgfHwgMClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWZmaXhTdHlsZS50b3AgPSB0YXJnZXRUb3AgKyAob2Zmc2V0VG9wIHx8IDApXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRBZmZpeFN0eWxlKGFmZml4U3R5bGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldEFmZml4U3R5bGUobnVsbClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3luY1BsYWNlaG9sZGVyU3R5bGUgPSAoKSA9PiB7XG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbigpXG4gICAgY29uc3QgeyBhZmZpeFN0eWxlIH0gPSB0aGlzLnN0YXRlXG4gICAgLy8g5p2h5Lu25Yik5pat77yaXG4gICAgLy8gMS4g5q+P5qyh5L2/55SoIHJlZiDpg73opoHov5vooYzliKTmlq0gMi4g5Yik5pat5pyJIGFmZml4U3R5bGUg6K+05piO546w5Zyo5q2j5aSE5LqO5Zu65a6a54q25oCB5LitXG4gICAgaWYgKHRoaXMucGxhY2Vob2xkZXJOb2RlICYmIGFmZml4U3R5bGUpIHtcbiAgICAgIGNvbnN0IHdpZHRoUHJldiA9IHRoaXMucGxhY2Vob2xkZXJOb2RlLnN0eWxlLndpZHRoXG4gICAgICB0aGlzLnBsYWNlaG9sZGVyTm9kZS5zdHlsZS53aWR0aCA9IFwiXCJcbiAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5wbGFjZWhvbGRlck5vZGUub2Zmc2V0V2lkdGhcbiAgICAgIHRoaXMuc2V0QWZmaXhTdHlsZSh7XG4gICAgICAgIC4uLmFmZml4U3R5bGUsXG4gICAgICAgIHdpZHRoLFxuICAgICAgfSlcbiAgICAgIGlmICghd2lkdGgpIHtcbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlck5vZGUuc3R5bGUud2lkdGggPSB3aWR0aFByZXZcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2F2ZVBsYWNlaG9sZGVyTm9kZSA9IChub2RlOiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgIHRoaXMucGxhY2Vob2xkZXJOb2RlID0gbm9kZVxuICB9XG5cbiAgcHVibGljIHNhdmVGaXhlZE5vZGUgPSAobm9kZTogSFRNTERpdkVsZW1lbnQpID0+IHtcbiAgICB0aGlzLmZpeGVkTm9kZSA9IG5vZGVcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZSxcbiAgICAgIHdpZHRoOiB3aWR0aFByb3AsXG4gICAgICAuLi5vdGhlclByb3BzXG4gICAgfSA9IHRoaXMucHJvcHNcblxuICAgIGNvbnN0IHJlc3RQcm9wcyA9IG9taXQob3RoZXJQcm9wcywgW1xuICAgICAgXCJnZXRDb250YWluZXJcIixcbiAgICAgIFwiZ2V0VGFyZ2V0XCIsXG4gICAgICBcIm9mZnNldEJvdHRvbVwiLFxuICAgICAgXCJvZmZzZXRUb3BcIixcbiAgICAgIFwib25DaGFuZ2VcIixcbiAgICBdKVxuXG4gICAgY29uc3QgeyBhZmZpeFN0eWxlIH0gPSB0aGlzLnN0YXRlXG5cbiAgICBjb25zdCBjbGFzc1NldCA9IGNsYXNzTmFtZXMoY2xhc3NOYW1lLCBgJHtwcmVmaXh9LWJhc2VgKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgcmVmPXt0aGlzLnNhdmVQbGFjZWhvbGRlck5vZGV9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgd2lkdGg6IHdpZHRoUHJvcCxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPFJlc2l6ZU9ic2VydmVyXG4gICAgICAgICAgb25SZXNpemU9eyh7IHdpZHRoLCBoZWlnaHQgfSkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpXG4gICAgICAgICAgICB0aGlzLnN5bmNQbGFjZWhvbGRlclN0eWxlKClcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyTm9kZSAmJiB3aWR0aCAmJiBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgaWYgKCF3aWR0aFByb3ApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyTm9kZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXJOb2RlLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc1NldH1cbiAgICAgICAgICAgIHJlZj17dGhpcy5zYXZlRml4ZWROb2RlfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgLi4uYWZmaXhTdHlsZSxcbiAgICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgey4uLnJlc3RQcm9wc31cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvUmVzaXplT2JzZXJ2ZXI+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJQSxPQUFPLEtBQUtBLEtBQUssTUFBTSxPQUFPO0FBQzlCLE9BQU9DLFNBQVMsTUFBTSxZQUFZO0FBQ2xDLE9BQU9DLFVBQVUsTUFBTSxZQUFZO0FBQ25DLE9BQU9DLFlBQVksTUFBTSxjQUFjO0FBQ3ZDLE9BQU9DLGdCQUFnQixNQUFNLGtDQUFrQztBQUMvRCxPQUFPQyxJQUFJLE1BQU0sZUFBZTtBQUNoQyxPQUFPQyxjQUFjLE1BQU0sb0JBQW9CO0FBQy9DLE9BQU8sU0FBUztBQUVoQixJQUFNQyxNQUFNLEdBQUcsWUFBWTtBQUFBLElBdUJOQyxLQUFLLGFBQUFDLGdCQUFBO0VBcUR4QixTQUFBRCxNQUFZRSxNQUFrQixFQUFFO0lBQUEsSUFBQUMsS0FBQTtJQUFBQyxlQUFBLE9BQUFKLEtBQUE7SUFDOUJHLEtBQUEsR0FBQUUsVUFBQSxPQUFBTCxLQUFBLEdBQU1FLE1BQUs7SUFBQ0MsS0FBQSxDQVBQRyxTQUFTO0lBQUFILEtBQUEsQ0FFVEksZUFBZTtJQUFBSixLQUFBLENBRWRLLGtCQUFrQjtJQUFBTCxLQUFBLENBU25CTSxpQkFBaUIsR0FBRyxZQUFNO01BQy9CLElBQVFDLFNBQVMsR0FBS1AsS0FBQSxDQUFLRCxLQUFLLENBQXhCUSxTQUFTO01BQ2pCLElBQU1DLE1BQU0sR0FBR0QsU0FBUyxHQUFHQSxTQUFTLENBQUMsQ0FBQyxHQUFHRSxNQUFNO01BQy9DVCxLQUFBLENBQUtLLGtCQUFrQixHQUFH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