UNPKG

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>

283 lines (215 loc) 35 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var React = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _classnames = _interopRequireDefault(require("classnames")); var _shallowequal = _interopRequireDefault(require("shallowequal")); var _addEventListener = _interopRequireDefault(require("rc-util/lib/Dom/addEventListener")); var _omit = _interopRequireDefault(require("../_util/omit")); var _resizeObserver = _interopRequireDefault(require("../resize-observer")); require("./style"); var _excluded = ["children", "className", "style"]; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } 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 _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; } 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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var prefix = "adui-affix"; var Affix = function (_React$Component) { _inherits(Affix, _React$Component); var _super = _createSuper(Affix); function Affix(_props) { var _this; _classCallCheck(this, Affix); _this = _super.call(this, _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 = (0, _addEventListener["default"])(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 (!(0, _shallowequal["default"])(affixStyle, newAffixStyle)) { _this.setState({ affixStyle: newAffixStyle }); } if (!!affixStyle !== !!newAffixStyle && onChange) { onChange(!!newAffixStyle); } }; _this.updatePosition = function () { var _assertThisInitialize = _assertThisInitialized(_this), fixedNode = _assertThisInitialize.fixedNode, placeholderNode = _assertThisInitialize.placeholderNode, props = _assertThisInitialize.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; } _createClass(Affix, [{ key: "render", value: function render() { var _this2 = this; var _this$props = this.props, children = _this$props.children, className = _this$props.className, style = _this$props.style, otherProps = _objectWithoutProperties(_this$props, _excluded); var restProps = (0, _omit["default"])(otherProps, ["getContainer", "getTarget", "offsetBottom", "offsetTop", "onChange"]); var affixStyle = this.state.affixStyle; var classSet = (0, _classnames["default"])(className, "".concat(prefix, "-base")); return React.createElement("div", { ref: this.savePlaceholderNode }, React.createElement(_resizeObserver["default"], { onResize: function onResize(_ref) { var width = _ref.width, height = _ref.height; _this2.updatePosition(); _this2.syncPlaceholderStyle(); if (_this2.placeholderNode && width && height) { _this2.placeholderNode.style.width = "".concat(width, "px"); _this2.placeholderNode.style.height = "".concat(height, "px"); } } }, React.createElement("div", _extends({ className: classSet, ref: this.saveFixedNode, style: _objectSpread(_objectSpread({}, affixStyle), style) }, restProps), children))); } }]); return Affix; }(React.Component); exports["default"] = Affix; Affix.propTypes = { children: _propTypes["default"].node, className: _propTypes["default"].string, getContainer: _propTypes["default"].func, getTarget: _propTypes["default"].func, offsetBottom: _propTypes["default"].number, offsetTop: _propTypes["default"].number, onChange: _propTypes["default"].func, style: _propTypes["default"].object }; Affix.defaultProps = { children: "", className: undefined, getContainer: null, getTarget: null, offsetBottom: null, offsetTop: 0, onChange: null, style: {} }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwcmVmaXgiLCJBZmZpeCIsInByb3BzIiwiZml4ZWROb2RlIiwicGxhY2Vob2xkZXJOb2RlIiwic2Nyb2xsRXZlbnRIYW5kbGVyIiwiY29tcG9uZW50RGlkTW91bnQiLCJnZXRUYXJnZXQiLCJ0YXJnZXQiLCJ3aW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwidXBkYXRlUG9zaXRpb24iLCJzeW5jUGxhY2Vob2xkZXJTdHlsZSIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlIiwic2V0QWZmaXhTdHlsZSIsIm5ld0FmZml4U3R5bGUiLCJvbkNoYW5nZSIsImFmZml4U3R5bGUiLCJzdGF0ZSIsInNoYWxsb3dlcXVhbCIsInNldFN0YXRlIiwiZ2V0Q29udGFpbmVyIiwib2Zmc2V0Qm90dG9tIiwib2Zmc2V0VG9wIiwiZG9jdW1lbnRSZWN0IiwiZG9jdW1lbnQiLCJib2R5IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicGxhY2Vob2xkZXJSZWN0IiwiZml4ZWRSZWN0IiwidGFyZ2V0UmVjdCIsImRvY3VtZW50UmVjdExlZnQiLCJsZWZ0IiwicGxhY2Vob2xkZXJSZWN0TGVmdCIsInRhcmdldFRvcCIsInRvcCIsInRhcmdldEhlaWdodCIsImhlaWdodCIsImlubmVySGVpZ2h0IiwicG9zaXRpb24iLCJ3aWR0aCIsInVuZGVmaW5lZCIsImlzTmFOIiwic2V0VGltZW91dCIsImJvdHRvbSIsImNvbnRhaW5lclJlY3QiLCJ3aWR0aFByZXYiLCJzdHlsZSIsIm9mZnNldFdpZHRoIiwic2F2ZVBsYWNlaG9sZGVyTm9kZSIsIm5vZGUiLCJzYXZlRml4ZWROb2RlIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJvdGhlclByb3BzIiwicmVzdFByb3BzIiwib21pdCIsImNsYXNzU2V0IiwiY2xhc3NOYW1lcyIsIlJlYWN0IiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic3RyaW5nIiwiZnVuYyIsIm51bWJlciIsIm9iamVjdCIsImRlZmF1bHRQcm9wcyJdLCJzb3VyY2VzIjpbIi4uLy4uL2NvbXBvbmVudHMvYWZmaXgvQWZmaXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWZmaXgg57uE5Lu25bCG5LiN5Lya5L+u5pS55oiQIEZ1bmN0aW9uQ29tcG9uZW5077yMXG4gKiDlm6DkuLrmiJHvvIhZaWppZe+8ieWwneivlei/h+WPkeeOsOS8muS4gOebtOinpuWPkSBvbkNoYW5nZSwgYWZmaXhTdHlsZSDmmI7mmI7mnInvvIzkvYbmmK/lnKggb25DaGFuZ2Ug5pe25LiA55u05pivIHVuZGVmaW5lZFxuICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgc2hhbGxvd2VxdWFsIGZyb20gXCJzaGFsbG93ZXF1YWxcIlxuaW1wb3J0IGFkZEV2ZW50TGlzdGVuZXIgZnJvbSBcInJjLXV0aWwvbGliL0RvbS9hZGRFdmVudExpc3RlbmVyXCJcbmltcG9ydCBvbWl0IGZyb20gXCIuLi9fdXRpbC9vbWl0XCJcbmltcG9ydCBSZXNpemVPYnNlcnZlciBmcm9tIFwiLi4vcmVzaXplLW9ic2VydmVyXCJcbmltcG9ydCBcIi4vc3R5bGVcIlxuXG5jb25zdCBwcmVmaXggPSBcImFkdWktYWZmaXhcIlxuXG5leHBvcnQgaW50ZXJmYWNlIElBZmZpeFByb3BzIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBnZXRDb250YWluZXI/OiAoKCkgPT4gSFRNTEVsZW1lbnQpIHwgbnVsbFxuICBnZXRUYXJnZXQ/OiAoKCkgPT4gSFRNTEVsZW1lbnQpIHwgbnVsbFxuICBvZmZzZXRCb3R0b20/OiBudW1iZXIgfCBudWxsXG4gIG9mZnNldFRvcD86IG51bWJlclxuICBvbkNoYW5nZT86ICgoYWZmaXhlZDogYm9vbGVhbikgPT4gdm9pZCkgfCBudWxsXG4gIHN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBZmZpeFN0YXRlIHtcbiAgYWZmaXhTdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXMgfCBudWxsXG59XG5cbi8qKlxuICog5Zu66ZKJXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFmZml4IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElBZmZpeFByb3BzLCBJQWZmaXhTdGF0ZT4ge1xuICBwdWJsaWMgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAvKipcbiAgICAgKiDlrZDoioLngrlcbiAgICAgKi9cbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog6ZmE5Yqg57G75ZCNXG4gICAgICovXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8qKlxuICAgICAqICgpID0+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+IHtcbiAgICB0aGlzLmZpeGVkTm9kZSA9IG5vZGVcbiAgfVxuXG4gIHB1YmxpYyByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBjaGlsZHJlbiwgY2xhc3NOYW1lLCBzdHlsZSwgLi4ub3RoZXJQcm9wcyB9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3QgcmVzdFByb3BzID0gb21pdChvdGhlclByb3BzLCBbXG4gICAgICBcImdldENvbnRhaW5lclwiLFxuICAgICAgXCJnZXRUYXJnZXRcIixcbiAgICAgIFwib2Zmc2V0Qm90dG9tXCIsXG4gICAgICBcIm9mZnNldFRvcFwiLFxuICAgICAgXCJvbkNoYW5nZVwiLFxuICAgIF0pXG5cbiAgICBjb25zdCB7IGFmZml4U3R5bGUgfSA9IHRoaXMuc3RhdGVcblxuICAgIGNvbnN0IGNsYXNzU2V0ID0gY2xhc3NOYW1lcyhjbGFzc05hbWUsIGAke3ByZWZpeH0tYmFzZWApXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiByZWY9e3RoaXMuc2F2ZVBsYWNlaG9sZGVyTm9kZX0+XG4gICAgICAgIDxSZXNpemVPYnNlcnZlclxuICAgICAgICAgIG9uUmVzaXplPXsoeyB3aWR0aCwgaGVpZ2h0IH0pID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb24oKVxuICAgICAgICAgICAgdGhpcy5zeW5jUGxhY2Vob2xkZXJTdHlsZSgpXG4gICAgICAgICAgICBpZiAodGhpcy5wbGFjZWhvbGRlck5vZGUgJiYgd2lkdGggJiYgaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXJOb2RlLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgXG4gICAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXJOb2RlLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc1NldH1cbiAgICAgICAgICAgIHJlZj17dGhpcy5zYXZlRml4ZWROb2RlfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgLi4uYWZmaXhTdHlsZSxcbiAgICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgey4uLnJlc3RQcm9wc31cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvUmVzaXplT2JzZXJ2ZXI+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLE1BQU0sR0FBRyxZQUFmOztJQXFCcUJDLEs7Ozs7O0VBcURuQixlQUFZQyxNQUFaLEVBQWdDO0lBQUE7O0lBQUE7O0lBQzlCLDBCQUFNQSxNQUFOO0lBRDhCLE1BTnpCQyxTQU15QjtJQUFBLE1BSnpCQyxlQUl5QjtJQUFBLE1BRnhCQyxrQkFFd0I7O0lBQUEsTUFPekJDLGlCQVB5QixHQU9MLFlBQU07TUFDL0IsSUFBUUMsU0FBUixHQUFzQixNQUFLTCxLQUEzQixDQUFRSyxTQUFSO01BQ0EsSUFBTUMsTUFBTSxHQUFHRCxTQUFTLEdBQUdBLFNBQVMsRUFBWixHQUFp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