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>
262 lines (207 loc) • 33.5 kB
JavaScript
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); }
var _excluded = ["children", "className", "style"];
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); }
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) {
_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 = 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 _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 = 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
}, React.createElement(ResizeObserver, {
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);
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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlByb3BUeXBlcyIsImNsYXNzTmFtZXMiLCJzaGFsbG93ZXF1YWwiLCJhZGRFdmVudExpc3RlbmVyIiwib21pdCIsIlJlc2l6ZU9ic2VydmVyIiwicHJlZml4IiwiQWZmaXgiLCJwcm9wcyIsImZpeGVkTm9kZSIsInBsYWNlaG9sZGVyTm9kZSIsInNjcm9sbEV2ZW50SGFuZGxlciIsImNvbXBvbmVudERpZE1vdW50IiwiZ2V0VGFyZ2V0IiwidGFyZ2V0Iiwid2luZG93IiwidXBkYXRlUG9zaXRpb24iLCJzeW5jUGxhY2Vob2xkZXJTdHlsZSIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlIiwic2V0QWZmaXhTdHlsZSIsIm5ld0FmZml4U3R5bGUiLCJvbkNoYW5nZSIsImFmZml4U3R5bGUiLCJzdGF0ZSIsInNldFN0YXRlIiwiZ2V0Q29udGFpbmVyIiwib2Zmc2V0Qm90dG9tIiwib2Zmc2V0VG9wIiwiZG9jdW1lbnRSZWN0IiwiZG9jdW1lbnQiLCJib2R5IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicGxhY2Vob2xkZXJSZWN0IiwiZml4ZWRSZWN0IiwidGFyZ2V0UmVjdCIsImRvY3VtZW50UmVjdExlZnQiLCJsZWZ0IiwicGxhY2Vob2xkZXJSZWN0TGVmdCIsInRhcmdldFRvcCIsInRvcCIsInRhcmdldEhlaWdodCIsImhlaWdodCIsImlubmVySGVpZ2h0IiwicG9zaXRpb24iLCJ3aWR0aCIsInVuZGVmaW5lZCIsImlzTmFOIiwic2V0VGltZW91dCIsImJvdHRvbSIsImNvbnRhaW5lclJlY3QiLCJ3aWR0aFByZXYiLCJzdHlsZSIsIm9mZnNldFdpZHRoIiwic2F2ZVBsYWNlaG9sZGVyTm9kZSIsIm5vZGUiLCJzYXZlRml4ZWROb2RlIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJvdGhlclByb3BzIiwicmVzdFByb3BzIiwiY2xhc3NTZXQiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJzdHJpbmciLCJmdW5jIiwibnVtYmVyIiwib2JqZWN0IiwiZGVmYXVsdFByb3BzIl0sInNvdXJjZXMiOlsiLi4vLi4vY29tcG9uZW50cy9hZmZpeC9BZmZpeC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZmZpeCDnu4Tku7blsIbkuI3kvJrkv67mlLnmiJAgRnVuY3Rpb25Db21wb25lbnTvvIxcbiAqIOWboOS4uuaIke+8iFlpamll77yJ5bCd6K+V6L+H5Y+R546w5Lya5LiA55u06Kem5Y+RIG9uQ2hhbmdlLCBhZmZpeFN0eWxlIOaYjuaYjuacie+8jOS9huaYr+WcqCBvbkNoYW5nZSDml7bkuIDnm7TmmK8gdW5kZWZpbmVkXG4gKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCJcbmltcG9ydCBzaGFsbG93ZXF1YWwgZnJvbSBcInNoYWxsb3dlcXVhbFwiXG5pbXBvcnQgYWRkRXZlbnRMaXN0ZW5lciBmcm9tIFwicmMtdXRpbC9saWIvRG9tL2FkZEV2ZW50TGlzdGVuZXJcIlxuaW1wb3J0IG9taXQgZnJvbSBcIi4uL191dGlsL29taXRcIlxuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gXCIuLi9yZXNpemUtb2JzZXJ2ZXJcIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5cbmNvbnN0IHByZWZpeCA9IFwiYWR1aS1hZmZpeFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFmZml4UHJvcHMge1xuICBba2V5OiBzdHJpbmddOiBhbnlcbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIGdldENvbnRhaW5lcj86ICgoKSA9PiBIVE1MRWxlbWVudCkgfCBudWxsXG4gIGdldFRhcmdldD86ICgoKSA9PiBIVE1MRWxlbWVudCkgfCBudWxsXG4gIG9mZnNldEJvdHRvbT86IG51bWJlciB8IG51bGxcbiAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gIG9uQ2hhbmdlPzogKChhZmZpeGVkOiBib29sZWFuKSA9PiB2b2lkKSB8IG51bGxcbiAgc3R5bGU/OiBSZWFjdC5DU1NQcm9wZXJ0aWVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFmZml4U3RhdGUge1xuICBhZmZpeFN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllcyB8IG51bGxcbn1cblxuLyoqXG4gKiDlm7rpkolcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWZmaXggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SUFmZml4UHJvcHMsIElBZmZpeFN0YXRlPiB7XG4gIHB1YmxpYyBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIC8qKlxuICAgICAqIOWtkOiKgueCuVxuICAgICAqL1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiDpmYTliqDnsbvlkI1cbiAgICAgKi9cbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICogKCkgPT4gSFRNTEVsZW1lbnQg5Zu66ZKJ55qE5pi+56S65Yy65Z+f77yM5rC46L+c5Lya5Zyo5q2k5pa55rOV5Lyg5Zue55qE5YWD57Sg5YaFXG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiAoKSA9PiBIVE1MRWxlbWVudCDnm5HlkKzmu5rliqjnmoTlhYPntKDvvIzpu5jorqTlnKggd2luZG93IOS4ilxuICAgICAqL1xuICAgIGdldFRhcmdldDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog6Led56a756qX5Y+j6aG26YOo6L6+5Yiw5oyH5a6a5YGP56e76YeP5ZCO6Kem5Y+R77yM5aaC5p6c5Lyg5YWl5LqGIG9mZnNldEJvdHRvbe+8jEFmZml4IOS8muW/veeVpSBvZmZzZXRUb3BcbiAgICAgKi9cbiAgICBvZmZzZXRCb3R0b206IFByb3BUeXBlcy5udW1iZXIsXG4gICAgLyoqXG4gICAgICog6Led56a756qX5Y+j6aG26YOo6L6+5Yiw5oyH5a6a5YGP56e76YeP5ZCO6Kem5Y+RXG4gICAgICovXG4gICAgb2Zmc2V0VG9wOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIC8qKlxuICAgICAqIOWbuuWumueKtuaAgeaUueWPmOaXtueahCBoYW5kbGVyXG4gICAgICovXG4gICAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOmZhOWKoOagt+W8j1xuICAgICAqL1xuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBkZWZhdWx0UHJvcHM6IElBZmZpeFByb3BzID0ge1xuICAgIGNoaWxkcmVuOiBcIlwiLFxuICAgIGNsYXNzTmFtZTogdW5kZWZpbmVkLFxuICAgIGdldENvbnRhaW5lcjogbnVsbCxcbiAgICBnZXRUYXJnZXQ6IG51bGwsXG4gICAgb2Zmc2V0Qm90dG9tOiBudWxsLFxuICAgIG9mZnNldFRvcDogMCxcbiAgICBvbkNoYW5nZTogbnVsbCxcbiAgICBzdHlsZToge30sXG4gIH1cblxuICBwdWJsaWMgZml4ZWROb2RlOiBIVE1MRGl2RWxlbWVudFxuXG4gIHB1YmxpYyBwbGFjZWhvbGRlck5vZGU6IEhUTUxEaXZFbGVtZW50XG5cbiAgcHJpdmF0ZSBzY3JvbGxFdmVudEhhbmRsZXI6IGFueVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJQWZmaXhQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBhZmZpeFN0eWxlOiB1bmRlZmluZWQsXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNvbXBvbmVudERpZE1vdW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0VGFyZ2V0IH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0ID8gZ2V0VGFyZ2V0KCkgOiB3aW5kb3dcbiAgICB0aGlzLnNjcm9sbEV2ZW50SGFuZGxlciA9IGFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICB0YXJnZXQsXG4gICAgICBcInNjcm9sbFwiLFxuICAgICAgdGhpcy51cGRhdGVQb3NpdGlvblxuICAgIClcbiAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKClcbiAgICB0aGlzLnN5bmNQbGFjZWhvbGRlclN0eWxlKClcbiAgfVxuXG4gIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5zY3JvbGxFdmVudEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuc2Nyb2xsRXZlbnRIYW5kbGVyLnJlbW92ZSgpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldEFmZml4U3R5bGUgPSAobmV3QWZmaXhTdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyB8IG51bGwpID0+IHtcbiAgICBjb25zdCB7IG9uQ2hhbmdlIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBhZmZpeFN0eWxlIH0gPSB0aGlzLnN0YXRlXG4gICAgaWYgKCFzaGFsbG93ZXF1YWwoYWZmaXhTdHlsZSwgbmV3QWZmaXhTdHlsZSkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBhZmZpeFN0eWxlOiBuZXdBZmZpeFN0eWxlIH0pXG4gICAgfVxuICAgIGlmICghIWFmZml4U3R5bGUgIT09ICEhbmV3QWZmaXhTdHlsZSAmJiBvbkNoYW5nZSkge1xuICAgICAgb25DaGFuZ2UoISFuZXdBZmZpeFN0eWxlKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQb3NpdGlvbiA9ICgpID0+IHtcbiAgICBjb25zdCB7IGZpeGVkTm9kZSwgcGxhY2Vob2xkZXJOb2RlLCBwcm9wcyB9ID0gdGhpc1xuICAgIGNvbnN0IHsgZ2V0Q29udGFpbmVyLCBnZXRUYXJnZXQsIG9mZnNldEJvdHRvbSwgb2Zmc2V0VG9wIH0gPSBwcm9wc1xuICAgIGNvbnN0IHRhcmdldCA9IGdldFRhcmdldCA/IGdldFRhcmdldCgpIDogd2luZG93XG5cbiAgICAvLyDmr4/mrKHkvb/nlKggcmVmIOmDveimgei/m+ihjOWIpOaWrVxuICAgIGlmICh0YXJnZXQgJiYgcGxhY2Vob2xkZXJOb2RlICYmIGZpeGVkTm9kZSkge1xuICAgICAgLy8gZG9jdW1lbnRSZWN0IOaYr+S4gOWumumcgOimgeeahO+8jOS4uuS6huiuvue9ruato+ehrueahCBsZWZ0IOWAvFxuICAgICAgY29uc3QgZG9jdW1lbnRSZWN0ID0gZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgbGV0IHBsYWNlaG9sZGVyUmVjdCA9IHBsYWNlaG9sZGVyTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgY29uc3QgZml4ZWRSZWN0ID0gZml4ZWROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG5cbiAgICAgIC8vIOWIpOaWreaYr+WQpuaYryB3aW5kb3dcbiAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSBnZXRUYXJnZXRcbiAgICAgICAgPyBnZXRUYXJnZXQoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICA6IGRvY3VtZW50UmVjdFxuICAgICAgY29uc3QgZG9jdW1lbnRSZWN0TGVmdCA9IGRvY3VtZW50UmVjdC5sZWZ0XG4gICAgICBjb25zdCBwbGFjZWhvbGRlclJlY3RMZWZ0ID0gcGxhY2Vob2xkZXJSZWN0LmxlZnRcblxuICAgICAgY29uc3QgdGFyZ2V0VG9wID0gZ2V0VGFyZ2V0ID8gdGFyZ2V0UmVjdC50b3AgOiAwXG4gICAgICBjb25zdCB0YXJnZXRIZWlnaHQgPSBnZXRUYXJnZXQgPyB0YXJnZXRSZWN0LmhlaWdodCA6IHdpbmRvdy5pbm5lckhlaWdodFxuXG4gICAgICBjb25zdCBhZmZpeFN0eWxlOiBSZWFjdC5DU1NQcm9wZXJ0aWVzID0ge1xuICAgICAgICBsZWZ0OiBkb2N1bWVudFJlY3RMZWZ0ICsgcGxhY2Vob2xkZXJSZWN0TGVmdCxcbiAgICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgICAgd2lkdGg6IGZpeGVkUmVjdC53aWR0aCxcbiAgICAgIH1cblxuICAgICAgLy8g5aaC5p6c5Lyg5YWl5LqGIG9mZnNldEJvdHRvbe+8jOWImeS8muW/veeVpSBvZmZzZXRUb3BcbiAgICAgIGlmIChcbiAgICAgICAgb2Zmc2V0Qm90dG9tICE9PSBudWxsICYmXG4gICAgICAgIG9mZnNldEJvdHRvbSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICFpc05hTihvZmZzZXRCb3R0b20pXG4gICAgICApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcGxhY2Vob2xkZXJSZWN0ID0gcGxhY2Vob2xkZXJOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGxhY2Vob2xkZXJSZWN0LmJvdHRvbSA+XG4gICAgICAgICAgICB0YXJnZXRIZWlnaHQgLSBvZmZzZXRCb3R0b20gKyB0YXJnZXRUb3BcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChnZXRDb250YWluZXIgJiYgZ2V0Q29udGFpbmVyKCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGdldENvbnRhaW5lcigpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9XG4gICAgICAgICAgICAgICAgdGFyZ2V0SGVpZ2h0IC1cbiAgICAgICAgICAgICAgICBjb250YWluZXJSZWN0LnRvcCAtXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJSZWN0LmhlaWdodCArXG4gICAgICAgICAgICAgICAgdGFyZ2V0VG9wXG4gICAgICAgICAgICAgIGlmIChib3R0b20gPD0gb2Zmc2V0Qm90dG9tKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyUmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgIGFmZml4U3R5bGUuYm90dG9tID1cbiAgICAgICAgICAgICAgICAgICAgYm90dG9tICsgcGxhY2Vob2xkZXJSZWN0LmhlaWdodCA8IDBcbiAgICAgICAgICAgICAgICAgICAgICA/IC1wbGFjZWhvbGRlclJlY3QuaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgOiBib3R0b21cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYWZmaXhTdHlsZS5ib3R0b20gPVxuICAgICAgICAgICAgICAgICAgb2Zmc2V0Qm90dG9tICsgd2luZG93LmlubmVySGVpZ2h0IC0gdGFyZ2V0VG9wIC0gdGFyZ2V0SGVpZ2h0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFmZml4U3R5bGUuYm90dG9tID1cbiAgICAgICAgICAgICAgICBvZmZzZXRCb3R0b20gKyB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0YXJnZXRUb3AgLSB0YXJnZXRIZWlnaHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0QWZmaXhTdHlsZShhZmZpeFN0eWxlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldEFmZml4U3R5bGUobnVsbClcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDApXG4gICAgICB9IGVsc2UgaWYgKHBsYWNlaG9sZGVyUmVjdC50b3AgPCAob2Zmc2V0VG9wIHx8IDApICsgdGFyZ2V0VG9wKSB7XG4gICAgICAgIGlmIChnZXRDb250YWluZXIgJiYgZ2V0Q29udGFpbmVyKCkpIHtcbiAgICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gZ2V0Q29udGFpbmVyKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgICBjb25zdCB0b3AgPVxuICAgICAgICAgICAgY29udGFpbmVyUmVjdC5oZWlnaHQgK1xuICAgICAgICAgICAgY29udGFpbmVyUmVjdC50b3AgLVxuICAgICAgICAgICAgcGxhY2Vob2xkZXJSZWN0LmhlaWdodCAtXG4gICAgICAgICAgICB0YXJnZXRUb3BcbiAgICAgICAgICBpZiAob2Zmc2V0VG9wICE9PSB1bmRlZmluZWQgJiYgdG9wIDw9IG9mZnNldFRvcCkge1xuICAgICAgICAgICAgYWZmaXhTdHlsZS50b3AgPVxuICAgICAgICAgICAgICB0b3AgKyBwbGFjZWhvbGRlclJlY3QuaGVpZ2h0IDwgMCA/IC1wbGFjZWhvbGRlclJlY3QuaGVpZ2h0IDogdG9wXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFmZml4U3R5bGUudG9wID0gdGFyZ2V0VG9wICsgKG9mZnNldFRvcCB8fCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZmZpeFN0eWxlLnRvcCA9IHRhcmdldFRvcCArIChvZmZzZXRUb3AgfHwgMClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEFmZml4U3R5bGUoYWZmaXhTdHlsZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0QWZmaXhTdHlsZShudWxsKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzeW5jUGxhY2Vob2xkZXJTdHlsZSA9ICgpID0+IHtcbiAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKClcbiAgICBjb25zdCB7IGFmZml4U3R5bGUgfSA9IHRoaXMuc3RhdGVcbiAgICAvLyDmnaHku7bliKTmlq3vvJpcbiAgICAvLyAxLiDmr4/mrKHkvb/nlKggcmVmIOmDveimgei/m+ihjOWIpOaWrSAyLiDliKTmlq3mnIkgYWZmaXhTdHlsZSDor7TmmI7njrDlnKjmraPlpITkuo7lm7rlrprnirbmgIHkuK1cbiAgICBpZiAodGhpcy5wbGFjZWhvbGRlck5vZGUgJiYgYWZmaXhTdHlsZSkge1xuICAgICAgY29uc3Qgd2lkdGhQcmV2ID0gdGhpcy5wbGFjZWhvbGRlck5vZGUuc3R5bGUud2lkdGhcbiAgICAgIHRoaXMucGxhY2Vob2xkZXJOb2RlLnN0eWxlLndpZHRoID0gXCJcIlxuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnBsYWNlaG9sZGVyTm9kZS5vZmZzZXRXaWR0aFxuICAgICAgdGhpcy5zZXRBZmZpeFN0eWxlKHtcbiAgICAgICAgLi4uYWZmaXhTdHlsZSxcbiAgICAgICAgd2lkdGgsXG4gICAgICB9KVxuICAgICAgaWYgKCF3aWR0aCkge1xuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyTm9kZS5zdHlsZS53aWR0aCA9IHdpZHRoUHJldlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzYXZlUGxhY2Vob2xkZXJOb2RlID0gKG5vZGU6IEhUTUxEaXZFbGVtZW50KSA9PiB7XG4gICAgdGhpcy5wbGFjZWhvbGRlck5vZGUgPSBub2RlXG4gIH1cblxuICBwdWJsaWMgc2F2ZUZpeGVkTm9kZSA9IChub2RlOiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgIHRoaXMuZml4ZWROb2RlID0gbm9kZVxuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IGNoaWxkcmVuLCBjbGFzc05hbWUsIHN0eWxlLCAuLi5vdGhlclByb3BzIH0gPSB0aGlzLnByb3BzXG5cbiAgICBjb25zdCByZXN0UHJvcHMgPSBvbWl0KG90aGVyUHJvcHMsIFtcbiAgICAgIFwiZ2V0Q29udGFpbmVyXCIsXG4gICAgICBcImdldFRhcmdldFwiLFxuICAgICAgXCJvZmZzZXRCb3R0b21cIixcbiAgICAgIFwib2Zmc2V0VG9wXCIsXG4gICAgICBcIm9uQ2hhbmdlXCIsXG4gICAgXSlcblxuICAgIGNvbnN0IHsgYWZmaXhTdHlsZSB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgY29uc3QgY2xhc3NTZXQgPSBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYCR7cHJlZml4fS1iYXNlYClcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJlZj17dGhpcy5zYXZlUGxhY2Vob2xkZXJOb2RlfT5cbiAgICAgICAgPFJlc2l6ZU9ic2VydmVyXG4gICAgICAgICAgb25SZXNpemU9eyh7IHdpZHRoLCBoZWlnaHQgfSkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpXG4gICAgICAgICAgICB0aGlzLnN5bmNQbGFjZWhvbGRlclN0eWxlKClcbiAgICAgICAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyTm9kZSAmJiB3aWR0aCAmJiBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlck5vZGUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGBcbiAgICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlck5vZGUuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzU2V0fVxuICAgICAgICAgICAgcmVmPXt0aGlzLnNhdmVGaXhlZE5vZGV9XG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAuLi5hZmZpeFN0eWxlLFxuICAgICAgICAgICAgICAuLi5zdHlsZSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB7Li4ucmVzdFByb3BzfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9SZXNpemVPYnNlcnZlcj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJQSxPQUFPLEtBQUtBLEtBQVosTUFBdUIsT0FBdkI7QUFDQSxPQUFPQyxTQUFQLE1BQXNCLFlBQXRCO0FBQ0EsT0FBT0MsVUFBUCxNQUF1QixZQUF2QjtBQUNBLE9BQU9DLFlBQVAsTUFBeUIsY0FBekI7QUFDQSxPQUFPQyxnQkFBUCxNQUE2QixrQ0FBN0I7QUFDQSxPQUFPQyxJQUFQLE1BQWlCLGVBQWpCO0FBQ0EsT0FBT0MsY0FBUCxNQUEyQixvQkFBM0I7QUFDQSxPQUFPLFNBQVA7QUFFQSxJQUFNQyxNQUFNLEdBQUcsWUFBZjs7SUFxQnFCQyxLOzs7OztFQXFEbkIsZUFBWUMsTUFBWixFQUFnQztJQUFBOztJQUFBOztJQUM5QiwwQkFBTUEsTUFBTjtJQUQ4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