kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
288 lines (286 loc) • 41.5 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getChildPos = exports["default"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _lodash = _interopRequireDefault(require("lodash.debounce"));
var _lodash2 = _interopRequireDefault(require("lodash.isequal"));
var _exenv = require("exenv");
var _styledComponents = require("styled-components");
var _context = require("../context");
var _reactModal = _interopRequireDefault(require("react-modal"));
var _window = _interopRequireDefault(require("global/window"));
var _styles = require("@kepler.gl/styles");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { 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) { (0, _defineProperty2["default"])(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; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
var listeners = {};
var startListening = function startListening() {
return Object.keys(listeners).forEach(function (key) {
return listeners[key]();
});
};
var getPageOffset = function getPageOffset() {
return {
x: _window["default"].pageXOffset !== undefined ? _window["default"].pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft,
y: _window["default"].pageYOffset !== undefined ? _window["default"].pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop
};
};
var addEventListeners = function addEventListeners() {
if (document && document.body) document.body.addEventListener('mousewheel', (0, _lodash["default"])(startListening, 100, {
leading: true
}));
_window["default"].addEventListener('resize', (0, _lodash["default"])(startListening, 50, {
leading: true
}));
};
var getChildPos = exports.getChildPos = function getChildPos(_ref) {
var offsets = _ref.offsets,
rect = _ref.rect,
childRect = _ref.childRect,
pageOffset = _ref.pageOffset,
padding = _ref.padding;
var topOffset = offsets.topOffset,
leftOffset = offsets.leftOffset,
rightOffset = offsets.rightOffset;
var anchorLeft = leftOffset !== undefined;
var pos = _objectSpread({
top: pageOffset.y + rect.top + (topOffset || 0)
}, anchorLeft ? {
left: pageOffset.x + rect.left + (leftOffset || 0)
} : {
right: _window["default"].innerWidth - rect.right - pageOffset.x + (rightOffset || 0)
});
var leftOrRight = anchorLeft ? 'left' : 'right';
if (pos[leftOrRight] && pos[leftOrRight] < 0) {
pos[leftOrRight] = padding;
} else if (pos[leftOrRight] && pos[leftOrRight] + childRect.width > _window["default"].innerWidth) {
pos[leftOrRight] = _window["default"].innerWidth - childRect.width - padding;
}
if (pos.top < 0) {
pos.top = padding;
} else if (pos.top + childRect.height > _window["default"].innerHeight) {
pos.top = _window["default"].innerHeight - childRect.height - padding;
}
return pos;
};
if (_exenv.canUseDOM) {
if (document.body) {
addEventListeners();
} else {
document.addEventListener('DOMContentLoaded', addEventListeners);
}
}
var listenerIdCounter = 0;
function subscribe(fn) {
listenerIdCounter += 1;
var id = listenerIdCounter;
listeners[id] = fn;
return function () {
return delete listeners[id];
};
}
var defaultModalStyle = {
content: {
top: 0,
left: 0,
border: 0,
right: 'auto',
bottom: 'auto',
padding: '0px 0px 0px 0px'
},
overlay: {
right: 'auto',
bottom: 'auto',
width: '100vw',
height: '100vh',
backgroundColor: 'rgba(0, 0, 0, 0)'
}
};
var WINDOW_PAD = 40;
var noop = function noop() {
return;
};
var DefaultComponent = 'div';
var Portaled = /*#__PURE__*/function (_Component) {
function Portaled() {
var _this;
(0, _classCallCheck2["default"])(this, Portaled);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _callSuper(this, Portaled, [].concat(args));
(0, _defineProperty2["default"])(_this, "state", {
pos: null,
isVisible: false
});
(0, _defineProperty2["default"])(_this, "unsubscribe", undefined);
(0, _defineProperty2["default"])(_this, "_unmounted", false);
(0, _defineProperty2["default"])(_this, "element", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2["default"])(_this, "child", /*#__PURE__*/(0, _react.createRef)());
// eslint-disable-next-line complexity
(0, _defineProperty2["default"])(_this, "handleScroll", function () {
if (_this.child.current && _this.element.current) {
var rect = _this.element.current.getBoundingClientRect();
var childRect = _this.child.current.getBoundingClientRect();
var pageOffset = getPageOffset();
var _this$props = _this.props,
topOffset = _this$props.top,
_this$props$left = _this$props.left,
leftOffset = _this$props$left === void 0 ? 0 : _this$props$left,
rightOffset = _this$props.right;
var pos = getChildPos({
offsets: {
topOffset: topOffset,
leftOffset: leftOffset,
rightOffset: rightOffset
},
rect: rect,
childRect: childRect,
pageOffset: pageOffset,
padding: WINDOW_PAD
});
if (!(0, _lodash2["default"])(pos, _this.state.pos)) {
_this.setState({
pos: pos
});
}
}
});
return _this;
}
(0, _inherits2["default"])(Portaled, _Component);
return (0, _createClass2["default"])(Portaled, [{
key: "componentDidMount",
value: function componentDidMount() {
this._unmounted = false;
// relative
this.unsubscribe = subscribe(this.handleScroll);
this.handleScroll();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
var _this2 = this;
var didOpen = this.props.isOpened && !prevProps.isOpened;
var didClose = !this.props.isOpened && prevProps.isOpened;
if (didOpen || didClose) {
_window["default"].requestAnimationFrame(function () {
if (_this2._unmounted) return;
_this2.setState({
isVisible: Boolean(didOpen)
});
});
}
this.handleScroll();
}
// ColorPicker will throw a cross-origin error when it is closed
// when the app is within an iframe.
// This is a known issue of react-color component:
// see: https://github.com/casesandberg/react-color/issues/806
}, {
key: "componentDidCatch",
value: function componentDidCatch() {
// Do nothing here, since React will try to recreate this component
// tree from scratch using the error boundary, which is this component
// itself. This is a temporal fix for a crash.
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this._unmounted = true;
// @ts-ignore
this.unsubscribe();
}
}, {
key: "render",
value: function render() {
var _this3 = this;
var _this$props2 = this.props,
_this$props2$componen = _this$props2.component,
component = _this$props2$componen === void 0 ? DefaultComponent : _this$props2$componen,
overlayZIndex = _this$props2.overlayZIndex,
isOpened = _this$props2.isOpened,
onClose = _this$props2.onClose,
children = _this$props2.children,
modalProps = _this$props2.modalProps,
_this$props2$modalSty = _this$props2.modalStyle,
modalStyle = _this$props2$modalSty === void 0 ? {} : _this$props2$modalSty;
var _this$state = this.state,
isVisible = _this$state.isVisible,
pos = _this$state.pos;
var newModalStyle = _objectSpread(_objectSpread({}, defaultModalStyle), {}, {
content: _objectSpread({}, modalStyle.content || {}),
overlay: _objectSpread(_objectSpread(_objectSpread({}, defaultModalStyle.overlay), modalStyle.overlay || {}), {}, {
// needs to be on top of existing modal
zIndex: overlayZIndex || 9999
})
});
var Comp = component;
return /*#__PURE__*/_react["default"].createElement(_context.RootContext.Consumer, null, function (context) {
return /*#__PURE__*/_react["default"].createElement(Comp, {
ref: _this3.element
}, isOpened ? /*#__PURE__*/_react["default"].createElement(_reactModal["default"], (0, _extends2["default"])({
className: "modal-portal"
}, modalProps, {
ariaHideApp: false,
isOpen: true,
style: newModalStyle,
parentSelector: function parentSelector() {
// React modal issue: https://github.com/reactjs/react-modal/issues/769
// failed to execute removeChild on parent node when it is already unmounted
return context && context.current || document.body;
},
onRequestClose: onClose
}), /*#__PURE__*/_react["default"].createElement("div", {
className: "portaled-content",
key: "item",
style: _objectSpread({
position: 'fixed',
opacity: isVisible ? 1 : 0,
transition: _this3.props.theme.transitionFast,
marginTop: isVisible ? '0px' : '14px'
}, pos)
}, /*#__PURE__*/_react["default"].createElement("div", {
ref: _this3.child,
style: {
position: 'absolute',
zIndex: overlayZIndex ? overlayZIndex + 1 : 10000
}
}, children))) : null);
});
}
}], [{
key: "getDerivedStateFromError",
value:
// Make Portaled a component with Error Boundary, so React can recreate
// this component if the child 'ColorPicker' throws cross-origin error.
// see function componentDidCatch()
function getDerivedStateFromError() {
return {
hasError: true
};
}
}]);
}(_react.Component);
(0, _defineProperty2["default"])(Portaled, "defaultProps", {
component: DefaultComponent,
onClose: noop,
theme: _styles.theme
});
var _default = exports["default"] = (0, _styledComponents.withTheme)(Portaled);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9sb2Rhc2gyIiwiX2V4ZW52IiwiX3N0eWxlZENvbXBvbmVudHMiLCJfY29udGV4dCIsIl9yZWFjdE1vZGFsIiwiX3dpbmRvdyIsIl9zdHlsZXMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJfY2FsbFN1cGVyIiwibyIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImxpc3RlbmVycyIsInN0YXJ0TGlzdGVuaW5nIiwia2V5IiwiZ2V0UGFnZU9mZnNldCIsIngiLCJXaW5kb3ciLCJwYWdlWE9mZnNldCIsInVuZGVmaW5lZCIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiYm9keSIsInBhcmVudE5vZGUiLCJzY3JvbGxMZWZ0IiwieSIsInBhZ2VZT2Zmc2V0Iiwic2Nyb2xsVG9wIiwiYWRkRXZlbnRMaXN0ZW5lcnMiLCJhZGRFdmVudExpc3RlbmVyIiwiZGVib3VuY2UiLCJsZWFkaW5nIiwiZ2V0Q2hpbGRQb3MiLCJleHBvcnRzIiwiX3JlZiIsIm9mZnNldHMiLCJyZWN0IiwiY2hpbGRSZWN0IiwicGFnZU9mZnNldCIsInBhZGRpbmciLCJ0b3BPZmZzZXQiLCJsZWZ0T2Zmc2V0IiwicmlnaHRPZmZzZXQiLCJhbmNob3JMZWZ0IiwicG9zIiwidG9wIiwibGVmdCIsInJpZ2h0IiwiaW5uZXJXaWR0aCIsImxlZnRPclJpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJpbm5lckhlaWdodCIsImNhblVzZURPTSIsImxpc3RlbmVySWRDb3VudGVyIiwic3Vic2NyaWJlIiwiZm4iLCJpZCIsImRlZmF1bHRNb2RhbFN0eWxlIiwiY29udGVudCIsImJvcmRlciIsImJvdHRvbSIsIm92ZXJsYXkiLCJiYWNrZ3JvdW5kQ29sb3IiLCJXSU5ET1dfUEFEIiwibm9vcCIsIkRlZmF1bHRDb21wb25lbnQiLCJQb3J0YWxlZCIsIl9Db21wb25lbnQiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImNvbmNhdCIsImlzVmlzaWJsZSIsImNyZWF0ZVJlZiIsImNoaWxkIiwiY3VycmVudCIsImVsZW1lbnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJfdGhpcyRwcm9wcyIsInByb3BzIiwiX3RoaXMkcHJvcHMkbGVmdCIsImlzRXF1YWwiLCJzdGF0ZSIsInNldFN0YXRlIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJ2YWx1ZSIsImNvbXBvbmVudERpZE1vdW50IiwiX3VubW91bnRlZCIsInVuc3Vic2NyaWJlIiwiaGFuZGxlU2Nyb2xsIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwiX3RoaXMyIiwiZGlkT3BlbiIsImlzT3BlbmVkIiwiZGlkQ2xvc2UiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjb21wb25lbnREaWRDYXRjaCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVuZGVyIiwiX3RoaXMzIiwiX3RoaXMkcHJvcHMyIiwiX3RoaXMkcHJvcHMyJGNvbXBvbmVuIiwiY29tcG9uZW50Iiwib3ZlcmxheVpJbmRleCIsIm9uQ2xvc2UiLCJjaGlsZHJlbiIsIm1vZGFsUHJvcHMiLCJfdGhpcyRwcm9wczIkbW9kYWxTdHkiLCJtb2RhbFN0eWxlIiwiX3RoaXMkc3RhdGUiLCJuZXdNb2RhbFN0eWxlIiwiekluZGV4IiwiQ29tcCIsImNyZWF0ZUVsZW1lbnQiLCJSb290Q29udGV4dCIsIkNvbnN1bWVyIiwiY29udGV4dCIsInJlZiIsIl9leHRlbmRzMiIsImNsYXNzTmFtZSIsImFyaWFIaWRlQXBwIiwiaXNPcGVuIiwic3R5bGUiLCJwYXJlbnRTZWxlY3RvciIsIm9uUmVxdWVzdENsb3NlIiwicG9zaXRpb24iLCJvcGFjaXR5IiwidHJhbnNpdGlvbiIsInRoZW1lIiwidHJhbnNpdGlvbkZhc3QiLCJtYXJnaW5Ub3AiLCJnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IiLCJoYXNFcnJvciIsIkNvbXBvbmVudCIsIl9kZWZhdWx0Iiwid2l0aFRoZW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1vbi9wb3J0YWxlZC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWYsIFByb3BzV2l0aENoaWxkcmVufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoLmRlYm91bmNlJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC5pc2VxdWFsJztcblxuaW1wb3J0IHtjYW5Vc2VET019IGZyb20gJ2V4ZW52JztcbmltcG9ydCB7d2l0aFRoZW1lfSBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQge1Jvb3RDb250ZXh0fSBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCBNb2RhbCBmcm9tICdyZWFjdC1tb2RhbCc7XG5pbXBvcnQgV2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IHt0aGVtZX0gZnJvbSAnQGtlcGxlci5nbC9zdHlsZXMnO1xuXG5jb25zdCBsaXN0ZW5lcnMgPSB7fTtcblxuY29uc3Qgc3RhcnRMaXN0ZW5pbmcgPSAoKSA9PiBPYmplY3Qua2V5cyhsaXN0ZW5lcnMpLmZvckVhY2goa2V5ID0+IGxpc3RlbmVyc1trZXldKCkpO1xuXG5jb25zdCBnZXRQYWdlT2Zmc2V0ID0gKCkgPT4gKHtcbiAgeDpcbiAgICBXaW5kb3cucGFnZVhPZmZzZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBXaW5kb3cucGFnZVhPZmZzZXRcbiAgICAgIDogKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxcbiAgeTpcbiAgICBXaW5kb3cucGFnZVlPZmZzZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBXaW5kb3cucGFnZVlPZmZzZXRcbiAgICAgIDogKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wXG59KTtcblxuY29uc3QgYWRkRXZlbnRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gIGlmIChkb2N1bWVudCAmJiBkb2N1bWVudC5ib2R5KVxuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V3aGVlbCcsIGRlYm91bmNlKHN0YXJ0TGlzdGVuaW5nLCAxMDAsIHtsZWFkaW5nOiB0cnVlfSkpO1xuICBXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZGVib3VuY2Uoc3RhcnRMaXN0ZW5pbmcsIDUwLCB7bGVhZGluZzogdHJ1ZX0pKTtcbn07XG5cbmludGVyZmFjZSBHZXRDaGlsZFBvc1Byb3BzIHtcbiAgb2Zmc2V0czogUGFydGlhbDx7XG4gICAgdG9wT2Zmc2V0OiBudW1iZXI7XG4gICAgbGVmdE9mZnNldDogbnVtYmVyO1xuICAgIHJpZ2h0T2Zmc2V0OiBudW1iZXI7XG4gIH0+O1xuICByZWN0OiBET01SZWN0O1xuICBjaGlsZFJlY3Q6IERPTVJlY3Q7XG4gIHBhZ2VPZmZzZXQ6IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9O1xuICBwYWRkaW5nOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRDaGlsZFBvcyA9ICh7b2Zmc2V0cywgcmVjdCwgY2hpbGRSZWN0LCBwYWdlT2Zmc2V0LCBwYWRkaW5nfTogR2V0Q2hpbGRQb3NQcm9wcykgPT4ge1xuICBjb25zdCB7dG9wT2Zmc2V0LCBsZWZ0T2Zmc2V0LCByaWdodE9mZnNldH0gPSBvZmZzZXRzO1xuXG4gIGNvbnN0IGFuY2hvckxlZnQgPSBsZWZ0T2Zmc2V0ICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IHBvcyA9IHtcbiAgICB0b3A6IHBhZ2VPZmZzZXQueSArIHJlY3QudG9wICsgKHRvcE9mZnNldCB8fCAwKSxcbiAgICAuLi4oYW5jaG9yTGVmdFxuICAgICAgPyB7bGVmdDogcGFnZU9mZnNldC54ICsgcmVjdC5sZWZ0ICsgKGxlZnRPZmZzZXQgfHwgMCl9XG4gICAgICA6IHtyaWdodDogV2luZG93LmlubmVyV2lkdGggLSByZWN0LnJpZ2h0IC0gcGFnZU9mZnNldC54ICsgKHJpZ2h0T2Zmc2V0IHx8IDApfSlcbiAgfTtcblxuICBjb25zdCBsZWZ0T3JSaWdodCA9IGFuY2hvckxlZnQgPyAnbGVmdCcgOiAncmlnaHQnO1xuXG4gIGlmIChwb3NbbGVmdE9yUmlnaHRdICYmIHBvc1tsZWZ0T3JSaWdodF0gPCAwKSB7XG4gICAgcG9zW2xlZnRPclJpZ2h0XSA9IHBhZGRpbmc7XG4gIH0gZWxzZSBpZiAocG9zW2xlZnRPclJpZ2h0XSAmJiBwb3NbbGVmdE9yUmlnaHRdICsgY2hpbGRSZWN0LndpZHRoID4gV2luZG93LmlubmVyV2lkdGgpIHtcbiAgICBwb3NbbGVmdE9yUmlnaHRdID0gV2luZG93LmlubmVyV2lkdGggLSBjaGlsZFJlY3Qud2lkdGggLSBwYWRkaW5nO1xuICB9XG5cbiAgaWYgKHBvcy50b3AgPCAwKSB7XG4gICAgcG9zLnRvcCA9IHBhZGRpbmc7XG4gIH0gZWxzZSBpZiAocG9zLnRvcCArIGNoaWxkUmVjdC5oZWlnaHQgPiBXaW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICBwb3MudG9wID0gV2luZG93LmlubmVySGVpZ2h0IC0gY2hpbGRSZWN0LmhlaWdodCAtIHBhZGRpbmc7XG4gIH1cblxuICByZXR1cm4gcG9zO1xufTtcblxuaWYgKGNhblVzZURPTSkge1xuICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgIGFkZEV2ZW50TGlzdGVuZXJzKCk7XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGFkZEV2ZW50TGlzdGVuZXJzKTtcbiAgfVxufVxuXG5sZXQgbGlzdGVuZXJJZENvdW50ZXIgPSAwO1xuZnVuY3Rpb24gc3Vic2NyaWJlKGZuKSB7XG4gIGxpc3RlbmVySWRDb3VudGVyICs9IDE7XG4gIGNvbnN0IGlkID0gbGlzdGVuZXJJZENvdW50ZXI7XG4gIGxpc3RlbmVyc1tpZF0gPSBmbjtcbiAgcmV0dXJuICgpID0+IGRlbGV0ZSBsaXN0ZW5lcnNbaWRdO1xufVxuXG5jb25zdCBkZWZhdWx0TW9kYWxTdHlsZSA9IHtcbiAgY29udGVudDoge1xuICAgIHRvcDogMCxcbiAgICBsZWZ0OiAwLFxuICAgIGJvcmRlcjogMCxcbiAgICByaWdodDogJ2F1dG8nLFxuICAgIGJvdHRvbTogJ2F1dG8nLFxuICAgIHBhZGRpbmc6ICcwcHggMHB4IDBweCAwcHgnXG4gIH0sXG4gIG92ZXJsYXk6IHtcbiAgICByaWdodDogJ2F1dG8nLFxuICAgIGJvdHRvbTogJ2F1dG8nLFxuICAgIHdpZHRoOiAnMTAwdncnLFxuICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDApJ1xuICB9XG59O1xuXG5jb25zdCBXSU5ET1dfUEFEID0gNDA7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7XG4gIHJldHVybjtcbn07XG5cbnR5cGUgUG9ydGFsZWRQcm9wcyA9IFByb3BzV2l0aENoaWxkcmVuPHtcbiAgcmlnaHQ/OiBudW1iZXI7XG4gIGxlZnQ/OiBudW1iZXI7XG4gIHRvcD86IG51bWJlcjtcbiAgY29tcG9uZW50PzogUmVhY3QuRWxlbWVudFR5cGU8YW55PjtcbiAgb25DbG9zZT86IChcbiAgICBldmVudDogUmVhY3QuTW91c2VFdmVudDxFbGVtZW50LCBnbG9iYWxUaGlzLk1vdXNlRXZlbnQ+IHwgUmVhY3QuS2V5Ym9hcmRFdmVudDxFbGVtZW50PlxuICApID0+IHZvaWQ7XG4gIHRvcE9mZnNldD86IG51bWJlcjtcbiAgbGVmdE9mZnNldD86IG51bWJlcjtcbiAgcmlnaHRPZmZzZXQ/OiBudW1iZXI7XG4gIG92ZXJsYXlaSW5kZXg/OiBudW1iZXI7XG4gIGlzT3BlbmVkPzogYm9vbGVhbjtcbiAgbW9kYWxQcm9wcz86IFBhcnRpYWw8UmVhY3RNb2RhbC5Qcm9wcz47XG4gIG1vZGFsU3R5bGU/OiBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0TW9kYWxTdHlsZT47XG4gIHRoZW1lPzogYW55O1xufT47XG5cbmludGVyZmFjZSBQb3J0YWxlZFN0YXRlIHtcbiAgcG9zOlxuICAgIHwge1xuICAgICAgICBsZWZ0OiBudW1iZXI7XG4gICAgICAgIHRvcDogbnVtYmVyO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICByaWdodDogbnVtYmVyO1xuICAgICAgICB0b3A6IG51bWJlcjtcbiAgICAgIH1cbiAgICB8IG51bGw7XG4gIGlzVmlzaWJsZTogYm9vbGVhbjtcbn1cblxuY29uc3QgRGVmYXVsdENvbXBvbmVudCA9ICdkaXYnO1xuXG5jbGFzcyBQb3J0YWxlZCBleHRlbmRzIENvbXBvbmVudDxQb3J0YWxlZFByb3BzLCBQb3J0YWxlZFN0YXRlPiB7XG4gIC8vIE1ha2UgUG9ydGFsZWQgYSBjb21wb25lbnQgd2l0aCBFcnJvciBCb3VuZGFyeSwgc28gUmVhY3QgY2FuIHJlY3JlYXRlXG4gIC8vIHRoaXMgY29tcG9uZW50IGlmIHRoZSBjaGlsZCAnQ29sb3JQaWNrZXInIHRocm93cyBjcm9zcy1vcmlnaW4gZXJyb3IuXG4gIC8vIHNlZSBmdW5jdGlvbiBjb21wb25lbnREaWRDYXRjaCgpXG4gIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKToge2hhc0Vycm9yOiBib29sZWFufSB7XG4gICAgcmV0dXJuIHtoYXNFcnJvcjogdHJ1ZX07XG4gIH1cblxuICBzdGF0aWMgZGVmYXVsdFByb3BzOiBQb3J0YWxlZFByb3BzID0ge1xuICAgIGNvbXBvbmVudDogRGVmYXVsdENvbXBvbmVudCxcbiAgICBvbkNsb3NlOiBub29wLFxuICAgIHRoZW1lXG4gIH07XG5cbiAgc3RhdGUgPSB7XG4gICAgcG9zOiBudWxsLFxuICAgIGlzVmlzaWJsZTogZmFsc2VcbiAgfTtcblxuICB1bnN1YnNjcmliZTogKCgpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBfdW5tb3VudGVkID0gZmFsc2U7XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5fdW5tb3VudGVkID0gZmFsc2U7XG4gICAgLy8gcmVsYXRpdmVcbiAgICB0aGlzLnVuc3Vic2NyaWJlID0gc3Vic2NyaWJlKHRoaXMuaGFuZGxlU2Nyb2xsKTtcbiAgICB0aGlzLmhhbmRsZVNjcm9sbCgpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wczogUG9ydGFsZWRQcm9wcykge1xuICAgIGNvbnN0IGRpZE9wZW4gPSB0aGlzLnByb3BzLmlzT3BlbmVkICYmICFwcmV2UHJvcHMuaXNPcGVuZWQ7XG4gICAgY29uc3QgZGlkQ2xvc2UgPSAhdGhpcy5wcm9wcy5pc09wZW5lZCAmJiBwcmV2UHJvcHMuaXNPcGVuZWQ7XG4gICAgaWYgKGRpZE9wZW4gfHwgZGlkQ2xvc2UpIHtcbiAgICAgIFdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fdW5tb3VudGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2lzVmlzaWJsZTogQm9vbGVhbihkaWRPcGVuKX0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVTY3JvbGwoKTtcbiAgfVxuXG4gIC8vIENvbG9yUGlja2VyIHdpbGwgdGhyb3cgYSBjcm9zcy1vcmlnaW4gZXJyb3Igd2hlbiBpdCBpcyBjbG9zZWRcbiAgLy8gd2hlbiB0aGUgYXBwIGlzIHdpdGhpbiBhbiBpZnJhbWUuXG4gIC8vIFRoaXMgaXMgYSBrbm93biBpc3N1ZSBvZiByZWFjdC1jb2xvciBjb21wb25lbnQ6XG4gIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Nhc2VzYW5kYmVyZy9yZWFjdC1jb2xvci9pc3N1ZXMvODA2XG4gIGNvbXBvbmVudERpZENhdGNoKCkge1xuICAgIC8vIERvIG5vdGhpbmcgaGVyZSwgc2luY2UgUmVhY3Qgd2lsbCB0cnkgdG8gcmVjcmVhdGUgdGhpcyBjb21wb25lbnRcbiAgICAvLyB0cmVlIGZyb20gc2NyYXRjaCB1c2luZyB0aGUgZXJyb3IgYm91bmRhcnksIHdoaWNoIGlzIHRoaXMgY29tcG9uZW50XG4gICAgLy8gaXRzZWxmLiBUaGlzIGlzIGEgdGVtcG9yYWwgZml4IGZvciBhIGNyYXNoLlxuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5fdW5tb3VudGVkID0gdHJ1ZTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZWxlbWVudCA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcbiAgY2hpbGQgPSBjcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgaGFuZGxlU2Nyb2xsID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLmNoaWxkLmN1cnJlbnQgJiYgdGhpcy5lbGVtZW50LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsZW1lbnQuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNoaWxkUmVjdCA9IHRoaXMuY2hpbGQuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHBhZ2VPZmZzZXQgPSBnZXRQYWdlT2Zmc2V0KCk7XG4gICAgICBjb25zdCB7dG9wOiB0b3BPZmZzZXQsIGxlZnQ6IGxlZnRPZmZzZXQgPSAwLCByaWdodDogcmlnaHRPZmZzZXR9ID0gdGhpcy5wcm9wcztcblxuICAgICAgY29uc3QgcG9zID0gZ2V0Q2hpbGRQb3Moe1xuICAgICAgICBvZmZzZXRzOiB7dG9wT2Zmc2V0LCBsZWZ0T2Zmc2V0LCByaWdodE9mZnNldH0sXG4gICAgICAgIHJlY3QsXG4gICAgICAgIGNoaWxkUmVjdCxcbiAgICAgICAgcGFnZU9mZnNldCxcbiAgICAgICAgcGFkZGluZzogV0lORE9XX1BBRFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghaXNFcXVhbChwb3MsIHRoaXMuc3RhdGUucG9zKSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtwb3N9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmVuZGVyKCk6IEpTWC5FbGVtZW50IHtcbiAgICBjb25zdCB7XG4gICAgICAvLyByZWxhdGl2ZVxuICAgICAgY29tcG9uZW50ID0gRGVmYXVsdENvbXBvbmVudCxcbiAgICAgIG92ZXJsYXlaSW5kZXgsXG4gICAgICBpc09wZW5lZCxcbiAgICAgIG9uQ2xvc2UsXG5cbiAgICAgIC8vIE1vZGFsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIG1vZGFsUHJvcHMsXG4gICAgICBtb2RhbFN0eWxlID0ge31cbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIGNvbnN0IHtpc1Zpc2libGUsIHBvc30gPSB0aGlzLnN0YXRlO1xuXG4gICAgY29uc3QgbmV3TW9kYWxTdHlsZSA9IHtcbiAgICAgIC4uLmRlZmF1bHRNb2RhbFN0eWxlLFxuICAgICAgY29udGVudDoge1xuICAgICAgICAuLi4obW9kYWxTdHlsZS5jb250ZW50IHx8IHt9KVxuICAgICAgfSxcbiAgICAgIG92ZXJsYXk6IHtcbiAgICAgICAgLi4uZGVmYXVsdE1vZGFsU3R5bGUub3ZlcmxheSxcbiAgICAgICAgLi4uKG1vZGFsU3R5bGUub3ZlcmxheSB8fCB7fSksXG4gICAgICAgIC8vIG5lZWRzIHRvIGJlIG9uIHRvcCBvZiBleGlzdGluZyBtb2RhbFxuICAgICAgICB6SW5kZXg6IG92ZXJsYXlaSW5kZXggfHwgOTk5OVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBDb21wID0gY29tcG9uZW50O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxSb290Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAge2NvbnRleHQgPT4gKFxuICAgICAgICAgIDxDb21wIHJlZj17dGhpcy5lbGVtZW50fT5cbiAgICAgICAgICAgIHtpc09wZW5lZCA/IChcbiAgICAgICAgICAgICAgPE1vZGFsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibW9kYWwtcG9ydGFsXCJcbiAgICAgICAgICAgICAgICB7Li4ubW9kYWxQcm9wc31cbiAgICAgICAgICAgICAgICBhcmlhSGlkZUFwcD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgaXNPcGVuXG4gICAgICAgICAgICAgICAgc3R5bGU9e25ld01vZGFsU3R5bGV9XG4gICAgICAgICAgICAgICAgcGFyZW50U2VsZWN0b3I9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIFJlYWN0IG1vZGFsIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWFjdC1tb2RhbC9pc3N1ZXMvNzY5XG4gICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgdG8gZXhlY3V0ZSByZW1vdmVDaGlsZCBvbiBwYXJlbnQgbm9kZSB3aGVuIGl0IGlzIGFscmVhZHkgdW5tb3VudGVkXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKGNvbnRleHQgJiYgY29udGV4dC5jdXJyZW50KSB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgb25SZXF1ZXN0Q2xvc2U9e29uQ2xvc2V9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJwb3J0YWxlZC1jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgIGtleT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IGlzVmlzaWJsZSA/IDEgOiAwLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnByb3BzLnRoZW1lLnRyYW5zaXRpb25GYXN0LFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IGlzVmlzaWJsZSA/ICcwcHgnIDogJzE0cHgnLFxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIC4uLnBvc1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIHJlZj17dGhpcy5jaGlsZH1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IG92ZXJsYXlaSW5kZXggPyBvdmVybGF5WkluZGV4ICsgMSA6IDEwMDAwXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L01vZGFsPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgPC9Db21wPlxuICAgICAgICApfVxuICAgICAgPC9Sb290Q29udGV4dC5Db25zdW1lcj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhUaGVtZShQb3J0YWxlZCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLFFBQUEsR0FBQUQsc0JBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGlCQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxRQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxXQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUSxPQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxPQUFBLEdBQUFULE9BQUE7QUFBd0MsU0FBQVUseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEseUJBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFaLHdCQUFBWSxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsZ0JBQUFLLE9BQUEsQ0FBQUwsQ0FBQSwwQkFBQUEsQ0FBQSxzQkFBQUEsQ0FBQSxRQUFBRyxDQUFBLEdBQUFKLHdCQUFBLENBQUFHLENBQUEsT0FBQUMsQ0FBQSxJQUFBQSxDQUFBLENBQUFHLEdBQUEsQ0FBQU4sQ0FBQSxVQUFBRyxDQUFBLENBQUFJLEdBQUEsQ0FBQVAsQ0FBQSxPQUFBUSxDQUFBLEtBQUFDLFNBQUEsVUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLGNBQUEsSUFBQUQsTUFBQSxDQUFBRSx3QkFBQSxXQUFBQyxDQUFBLElBQUFkLENBQUEsb0JBQUFjLENBQUEsT0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFoQixDQUFBLEVBQUFjLENBQUEsU0FBQUcsQ0FBQSxHQUFBUCxDQUFBLEdBQUFDLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQWIsQ0FBQSxFQUFBYyxDQUFBLFVBQUFHLENBQUEsS0FBQUEsQ0FBQSxDQUFBVixHQUFBLElBQUFVLENBQUEsQ0FBQUMsR0FBQSxJQUFBUCxNQUFBLENBQUFDLGNBQUEsQ0FBQUosQ0FBQSxFQUFBTSxDQUFBLEVBQUFHLENBQUEsSUFBQVQsQ0FBQSxDQUFBTSxDQUFBLElBQUFkLENBQUEsQ0FBQWMsQ0FBQSxZQUFBTixDQUFBLGNBQUFSLENBQUEsRUFBQUcsQ0FBQSxJQUFBQSxDQUFBLENBQUFlLEdBQUEsQ0FBQWxCLENBQUEsRUFBQVEsQ0FBQSxHQUFBQSxDQUFBO0FBQUEsU0FBQVcsV0FBQWhCLENBQUEsRUFBQWlCLENBQUEsRUFBQXBCLENBQUEsV0FBQW9CLENBQUEsT0FBQUMsZ0JBQUEsYUFBQUQsQ0FBQSxPQUFBRSwyQkFBQSxhQUFBbkIsQ0FBQSxFQUFBb0IseUJBQUEsS0FBQUMsT0FBQSxDQUFBQyxTQUFBLENBQUFMLENBQUEsRUFBQXBCLENBQUEsWUFBQXFCLGdCQUFBLGFBQUFsQixDQUFBLEVBQUF1QixXQUFBLElBQUFOLENBQUEsQ0FBQU8sS0FBQSxDQUFBeEIsQ0FBQSxFQUFBSCxDQUFBO0FBQUEsU0FBQXVCLDBCQUFBLGNBQUFwQixDQUFBLElBQUF5QixPQUFBLENBQUFDLFNBQUEsQ0FBQUMsT0FBQSxDQUFBZCxJQUFBLENBQUFRLE9BQUEsQ0FBQUMsU0FBQSxDQUFBRyxPQUFBLGlDQUFBekIsQ0FBQSxhQUFBb0IseUJBQUEsWUFBQUEsMEJBQUEsYUFBQXBCLENBQUE7QUFBQSxTQUFBNEIsUUFBQS9CLENBQUEsRUFBQUUsQ0FBQSxRQUFBQyxDQUFBLEdBQUFRLE1BQUEsQ0FBQXFCLElBQUEsQ0FBQWhDLENBQUEsT0FBQVcsTUFBQSxDQUFBc0IscUJBQUEsUUFBQWIsQ0FBQSxHQUFBVCxNQUFBLENBQUFzQixxQkFBQSxDQUFBakMsQ0FBQSxHQUFBRSxDQUFBLEtBQUFrQixDQUFBLEdBQUFBLENBQUEsQ0FBQWMsTUFBQSxXQUFBaEMsQ0FBQSxXQUFBUyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQUUsQ0FBQSxFQUFBaUMsVUFBQSxPQUFBaEMsQ0FBQSxDQUFBaUMsSUFBQSxDQUFBVCxLQUFBLENBQUF4QixDQUFBLEVBQUFpQixDQUFBLFlBQUFqQixDQUFBO0FBQUEsU0FBQWtDLGNBQUFyQyxDQUFBLGFBQUFFLENBQUEsTUFBQUEsQ0FBQSxHQUFBb0MsU0FBQSxDQUFBQyxNQUFBLEVBQUFyQyxDQUFBLFVBQUFDLENBQUEsV0FBQW1DLFNBQUEsQ0FBQXBDLENBQUEsSUFBQW9DLFNBQUEsQ0FBQXBDLENBQUEsUUFBQUEsQ0FBQSxPQUFBNkIsT0FBQSxDQUFBcEIsTUFBQSxDQUFBUixDQUFBLE9BQUFxQyxPQUFBLFdBQUF0QyxDQUFBLFFBQUF1QyxnQkFBQSxhQUFBekMsQ0FBQSxFQUFBRSxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBUyxNQUFBLENBQUErQix5QkFBQSxHQUFBL0IsTUFBQSxDQUFBZ0MsZ0JBQUEsQ0FBQTNDLENBQUEsRUFBQVcsTUFBQSxDQUFBK0IseUJBQUEsQ0FBQXZDLENBQUEsS0FBQTRCLE9BQUEsQ0FBQXBCLE1BQUEsQ0FBQVIsQ0FBQSxHQUFBcUMsT0FBQSxXQUFBdEMsQ0FBQSxJQUFBUyxNQUFBLENBQUFDLGNBQUEsQ0FBQVosQ0FBQSxFQUFBRSxDQUFBLEVBQUFTLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQVYsQ0FBQSxFQUFBRCxDQUFBLGlCQUFBRixDQUFBLElBWnhDO0FBQ0E7QUFhQSxJQUFNNEMsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUVwQixJQUFNQyxjQUFjLEdBQUcsU0FBakJBLGNBQWNBLENBQUE7RUFBQSxPQUFTbEMsTUFBTSxDQUFDcUIsSUFBSSxDQUFDWSxTQUFTLENBQUMsQ0FBQ0osT0FBTyxDQUFDLFVBQUFNLEdBQUc7SUFBQSxPQUFJRixTQUFTLENBQUNFLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFBQSxFQUFDO0FBQUE7QUFFcEYsSUFBTUMsYUFBYSxHQUFHLFNBQWhCQSxhQUFhQSxDQUFBO0VBQUEsT0FBVTtJQUMzQkMsQ0FBQyxFQUNDQyxrQkFBTSxDQUFDQyxXQUFXLEtBQUtDLFNBQVMsR0FDNUJGLGtCQUFNLENBQUNDLFdBQVcsR0FDbEIsQ0FBQ0UsUUFBUSxDQUFDQyxlQUFlLElBQUlELFFBQVEsQ0FBQ0UsSUFBSSxDQUFDQyxVQUFVLElBQUlILFFBQVEsQ0FBQ0UsSUFBSSxFQUFFRSxVQUFVO0lBQ3hGQyxDQUFDLEVBQ0NSLGtCQUFNLENBQUNTLFdBQVcsS0FBS1AsU0FBUyxHQUM1QkYsa0JBQU0sQ0FBQ1MsV0FBVyxHQUNsQixDQUFDTixRQUFRLENBQUNDLGVBQWUsSUFBSUQsUUFBUSxDQUFDRSxJQUFJLENBQUNDLFVBQVUsSUFBSUgsUUFBUSxDQUFDRSxJQUFJLEVBQUVLO0VBQ2hGLENBQUM7QUFBQSxDQUFDO0FBRUYsSUFBTUMsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFpQkEsQ0FBQSxFQUFTO0VBQzlCLElBQUlSLFFBQVEsSUFBSUEsUUFBUSxDQUFDRSxJQUFJLEVBQzNCRixRQUFRLENBQUNFLElBQUksQ0FBQ08sZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUFDLGtCQUFRLEVBQUNqQixjQUFjLEVBQUUsR0FBRyxFQUFFO0lBQUNrQixPQUFPLEVBQUU7RUFBSSxDQUFDLENBQUMsQ0FBQztFQUM5RmQsa0JBQU0sQ0FBQ1ksZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUFDLGtCQUFRLEVBQUNqQixjQUFjLEVBQUUsRUFBRSxFQUFFO0lBQUNrQixPQUFPLEVBQUU7RUFBSSxDQUFDLENBQUMsQ0FBQztBQUNsRixDQUFDO0FBaUJNLElBQU1DLFdBQVcsR0FBQUMsT0FBQSxDQUFBRCxXQUFBLEdBQUcsU0FBZEEsV0FBV0EsQ0FBQUUsSUFBQSxFQUEwRTtFQUFBLElBQXJFQyxPQUFPLEdBQUFELElBQUEsQ0FBUEMsT0FBTztJQUFFQyxJQUFJLEdBQUFGLElBQUEsQ0FBSkUsSUFBSTtJQUFFQyxTQUFTLEdBQUFILElBQUEsQ0FBVEcsU0FBUztJQUFFQyxVQUFVLEdBQUFKLElBQUEsQ0FBVkksVUFBVTtJQUFFQyxPQUFPLEdBQUFMLElBQUEsQ0FBUEssT0FBTztFQUN4RSxJQUFPQyxTQUFTLEdBQTZCTCxPQUFPLENBQTdDSyxTQUFTO0lBQUVDLFVBQVUsR0FBaUJOLE9BQU8sQ0FBbENNLFVBQVU7SUFBRUMsV0FBVyxHQUFJUCxPQUFPLENBQXRCTyxXQUFXO0VBRXpDLElBQU1DLFVBQVUsR0FBR0YsVUFBVSxLQUFLdEIsU0FBUztFQUMzQyxJQUFNeUIsR0FBRyxHQUFBdkMsYUFBQTtJQUNQd0MsR0FBRyxFQUFFUCxVQUFVLENBQUNiLENBQUMsR0FBR1csSUFBSSxDQUFDUyxHQUFHLElBQUlMLFNBQVMsSUFBSSxDQUFDO0VBQUMsR0FDM0NHLFVBQVUsR0FDVjtJQUFDRyxJQUFJLEVBQUVSLFVBQVUsQ0FBQ3RCLENBQUMsR0FBR29CLElBQUksQ0FBQ1UsSUFBSSxJQUFJTCxVQUFVLElBQUksQ0FBQztFQUFDLENBQUMsR0FDcEQ7SUFBQ00sS0FBSyxFQUFFOUIsa0JBQU0sQ0FBQytCLFVBQVUsR0FBR1osSUFBSSxDQUFDVyxLQUFLLEdBQUdULFVBQVUsQ0FBQ3RCLENBQUMsSUFBSTBCLFdBQVcsSUFBSSxDQUFDO0VBQUMsQ0FBQyxDQUNoRjtFQUVELElBQU1PLFdBQVcsR0FBR04sVUFBVSxHQUFHLE1BQU0sR0FBRyxPQUFPO0VBRWpELElBQUlDLEdBQUcsQ0FBQ0ssV0FBVyxDQUFDLElBQUlMLEdBQUcsQ0FBQ0ssV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQzVDTCxHQUFHLENBQUNLLFdBQVcsQ0FBQyxHQUFHVixPQUFPO0VBQzVCLENBQUMsTUFBTSxJQUFJSyxHQUFHLENBQUNLLFdBQVcsQ0FBQyxJQUFJTCxHQUFHLENBQUNLLFdBQVcsQ0FBQyxHQUFHWixTQUFTLENBQUNhLEtBQUssR0FBR2pDLGtCQUFNLENBQUMrQixVQUFVLEVBQUU7SUFDckZKLEdBQUcsQ0FBQ0ssV0FBVyxDQUFDLEdBQUdoQyxrQkFBTSxDQUFDK0IsVUFBVSxHQUFHWCxTQUFTLENBQUNhLEtBQUssR0FBR1gsT0FBTztFQUNsRTtFQUVBLElBQUlLLEdBQUcsQ0FBQ0MsR0FBRyxHQUFHLENBQUMsRUFBRTtJQUNmRCxHQUFHLENBQUNDLEdBQUcsR0FBR04sT0FBTztFQUNuQixDQUFDLE1BQU0sSUFBSUssR0FBRyxDQUFDQyxHQUFHLEdBQUdSLFNBQVMsQ0FBQ2MsTUFBTSxHQUFHbEMsa0JBQU0sQ0FBQ21DLFdBQVcsRUFBRTtJQUMxRFIsR0FBRyxDQUFDQyxHQUFHLEdBQUc1QixrQkFBTSxDQUFDbUMsV0FBVyxHQUFHZixTQUFTLENBQUNjLE1BQU0sR0FBR1osT0FBTztFQUMzRDtFQUVBLE9BQU9LLEdBQUc7QUFDWixDQUFDO0FBRUQsSUFBSVMsZ0JBQVMsRUFBRTtFQUNiLElBQUlqQyxRQUFRLENBQUNFLElBQUksRUFBRTtJQUNqQk0saUJBQWlCLENBQUMsQ0FBQztFQUNyQixDQUFDLE1BQU07SUFDTFIsUUFBUSxDQUFDUyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRUQsaUJBQWlCLENBQUM7RUFDbEU7QUFDRjtBQUVBLElBQUkwQixpQkFBaUIsR0FBRyxDQUFDO0FBQ3pCLFNBQVNDLFNBQVNBLENBQUNDLEVBQUUsRUFBRTtFQUNyQkYsaUJBQWlCLElBQUksQ0FBQztFQUN0QixJQUFNRyxFQUFFLEdBQUdILGlCQUFpQjtFQUM1QjFDLFNBQVMsQ0FBQzZDLEVBQUUsQ0FBQyxHQUFHRCxFQUFFO0VBQ2xCLE9BQU87SUFBQSxPQUFNLE9BQU81QyxTQUFTLENBQUM2QyxFQUFFLENBQUM7RUFBQTtBQUNuQztBQUVBLElBQU1DLGlCQUFpQixHQUFHO0VBQ3hCQyxPQUFPLEVBQUU7SUFDUGQsR0FBRyxFQUFFLENBQUM7SUFDTkMsSUFBSSxFQUFFLENBQUM7SUFDUGMsTUFBTSxFQUFFLENBQUM7SUFDVGIsS0FBSyxFQUFFLE1BQU07SUFDYmMsTUFBTSxFQUFFLE1BQU07SUFDZHRCLE9BQU8sRUFBRTtFQUNYLENBQUM7RUFDRHVCLE9BQU8sRUFBRTtJQUNQZixLQUFLLEVBQUUsTUFBTTtJQUNiYyxNQUFNLEVBQUUsTUFBTTtJQUNkWCxLQUFLLEVBQUUsT0FBTztJQUNkQyxNQUFNLEVBQUUsT0FBTztJQUNmWSxlQUFlLEVBQUU7RUFDbkI7QUFDRixDQUFDO0FBRUQsSUFBTUMsVUFBVSxHQUFHLEVBQUU7QUFFckIsSUFBTUMsSUFBSSxHQUFHLFNBQVBBLElBQUlBLENBQUEsRUFBUztFQUNqQjtBQUNGLENBQUM7QUFrQ0QsSUFBTUMsZ0JBQWdCLEdBQUcsS0FBSztBQUFDLElBRXpCQyxRQUFRLDBCQUFBQyxVQUFBO0VBQUEsU0FBQUQsU0FBQTtJQUFBLElBQUFFLEtBQUE7SUFBQSxJQUFBQyxnQkFBQSxtQkFBQUgsUUFBQTtJQUFBLFNBQUFJLElBQUEsR0FBQWpFLFNBQUEsQ0FBQUMsTUFBQSxFQUFBaUUsSUFBQSxPQUFBQyxLQUFBLENBQUFGLElBQUEsR0FBQUcsSUFBQSxNQUFBQSxJQUFBLEdBQUFILElBQUEsRUFBQUcsSUFBQTtNQUFBRixJQUFBLENBQUFFLElBQUEsSUFBQXBFLFNBQUEsQ0FBQW9FLElBQUE7SUFBQTtJQUFBTCxLQUFBLEdBQUFsRixVQUFBLE9BQUFnRixRQUFBLEtBQUFRLE1BQUEsQ0FBQUgsSUFBQTtJQUFBLElBQUEvRCxnQkFBQSxhQUFBNEQsS0FBQSxXQWNKO01BQ056QixHQUFHLEVBQUUsSUFBSTtNQUNUZ0MsU0FBUyxFQUFFO0lBQ2IsQ0FBQztJQUFBLElBQUFuRSxnQkFBQSxhQUFBNEQsS0FBQSxpQkFFMENsRCxTQUFTO0lBQUEsSUFBQVYsZ0JBQUEsYUFBQTRELEtBQUEsZ0JBQ3ZDLEtBQUs7SUFBQSxJQUFBNUQsZ0JBQUEsYUFBQTRELEtBQUEsMEJBc0NSLElBQUFRLGdCQUFTLEVBQWlCLENBQUM7SUFBQSxJQUFBcEUsZ0JBQUEsYUFBQTRELEtBQUEsd0JBQzdCLElBQUFRLGdCQUFTLEVBQWlCLENBQUM7SUFFbkM7SUFBQSxJQUFBcEUsZ0JBQUEsYUFBQTRELEtBQUEsa0JBQ2UsWUFBTTtNQUNuQixJQUFJQSxLQUFBLENBQUtTLEtBQUssQ0FBQ0MsT0FBTyxJQUFJVixLQUFBLENBQUtXLE9BQU8sQ0FBQ0QsT0FBTyxFQUFFO1FBQzlDLElBQU0zQyxJQUFJLEdBQUdpQyxLQUFBLENBQUtXLE9BQU8sQ0FBQ0QsT0FBTyxDQUFDRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pELElBQU01QyxTQUFTLEdBQUdnQyxLQUFBLENBQUtTLEtBQUssQ0FBQ0MsT0FBTyxDQUFDRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQzVELElBQU0zQyxVQUFVLEdBQUd2QixhQUFhLENBQUMsQ0FBQztRQUNsQyxJQUFBbUUsV0FBQSxHQUFtRWIsS0FBQSxDQUFLYyxLQUFLO1VBQWpFM0MsU0FBUyxHQUFBMEMsV0FBQSxDQUFkckMsR0FBRztVQUFBdUMsZ0JBQUEsR0FBQUYsV0FBQSxDQUFhcEMsSUFBSTtVQUFFTCxVQUFVLEdBQUEyQyxnQkFBQSxjQUFHLENBQUMsR0FBQUEsZ0JBQUE7VUFBUzFDLFdBQVcsR0FBQXdDLFdBQUEsQ0FBbEJuQyxLQUFLO1FBRWxELElBQU1ILEdBQUcsR0FBR1osV0FBVyxDQUFDO1VBQ3RCRyxPQUFPLEVBQUU7WUFBQ0ssU0FBUyxFQUFUQSxTQUFTO1lBQUVDLFVBQVUsRUFBVkEsVUFBVTtZQUFFQyxXQUFXLEVBQVhBO1VBQVcsQ0FBQztVQUM3Q04sSUFBSSxFQUFKQSxJQUFJO1VBQ0pDLFNBQVMsRUFBVEEsU0FBUztVQUNUQyxVQUFVLEVBQVZBLFVBQVU7VUFDVkMsT0FBTyxFQUFFeUI7UUFDWCxDQUFDLENBQUM7UUFFRixJQUFJLENBQUMsSUFBQXFCLG1CQUFPLEVBQUN6QyxHQUFHLEVBQUV5QixLQUFBLENBQUtpQixLQUFLLENBQUMxQyxHQUFHLENBQUMsRUFBRTtVQUNqQ3lCLEtBQUEsQ0FBS2tCLFFBQVEsQ0FBQztZQUFDM0MsR0FBRyxFQUFIQTtVQUFHLENBQUMsQ0FBQztRQUN0QjtNQUNGO0lBQ0YsQ0FBQztJQUFBLE9BQUF5QixLQUFBO0VBQUE7RUFBQSxJQUFBbUIsVUFBQSxhQUFBckIsUUFBQSxFQUFBQyxVQUFBO0VBQUEsV0FBQXFCLGFBQUEsYUFBQXRCLFFBQUE7SUFBQXJELEdBQUE7SUFBQTRFLEtBQUEsRUEzREQsU0FBQUMsaUJBQWlCQSxDQUFBLEVBQUc7TUFDbEIsSUFBSSxDQUFDQyxVQUFVLEdBQUcsS0FBSztNQUN2QjtNQUNBLElBQUksQ0FBQ0MsV0FBVyxHQUFHdEMsU0FBUyxDQUFDLElBQUksQ0FBQ3VDLFlBQVksQ0FBQztNQUMvQyxJQUFJLENBQUNBLFlBQVksQ0FBQyxDQUFDO0lBQ3JCO0VBQUM7SUFBQWhGLEdBQUE7SUFBQTRFLEtBQUEsRUFFRCxTQUFBSyxrQkFBa0JBLENBQUNDLFNBQXdCLEVBQUU7TUFBQSxJQUFBQyxNQUFBO01BQzNDLElBQU1DLE9BQU8sR0FBRyxJQUFJLENBQUNmLEtBQUssQ0FBQ2dCLFFBQVEsSUFBSSxDQUFDSCxTQUFTLENBQUNHLFFBQVE7TUFDMUQsSUFBTUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDakIsS0FBSyxDQUFDZ0IsUUFBUSxJQUFJSCxTQUFTLENBQUNHLFFBQVE7TUFDM0QsSUFBSUQsT0FBTyxJQUFJRSxRQUFRLEVBQUU7UUFDdkJuRixrQkFBTSxDQUFDb0YscUJBQXFCLENBQUMsWUFBTTtVQUNqQyxJQUFJSixNQUFJLENBQUNMLFVBQVUsRUFBRTtVQUNyQkssTUFBSSxDQUFDVixRQUFRLENBQUM7WUFBQ1gsU0FBUyxFQUFFaEYsT0FBTyxDQUFDc0csT0FBTztVQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUM7TUFDSjtNQUVBLElBQUksQ0FBQ0osWUFBWSxDQUFDLENBQUM7SUFDckI7O0lBRUE7SUFDQTtJQUNBO0lBQ0E7RUFBQTtJQUFBaEYsR0FBQTtJQUFBNEUsS0FBQSxFQUNBLFNBQUFZLGlCQUFpQkEsQ0FBQSxFQUFHO01BQ2xCO01BQ0E7TUFDQTtJQUFBO0VBQ0Q7SUFBQXhGLEdBQUE7SUFBQTRFLEtBQUEsRUFFRCxTQUFBYSxvQkFBb0JBLENBQUEsRUFBRztNQUNyQixJQUFJLENBQUNYLFVBQVUsR0FBRyxJQUFJO01BQ3RCO01BQ0EsSUFBSSxDQUFDQyxXQUFXLENBQUMsQ0FBQztJQUNwQjtFQUFDO0lBQUEvRSxHQUFBO0lBQUE0RSxLQUFBLEVBMkJELFNBQUFjLE1BQU1BLENBQUEsRUFBZ0I7TUFBQSxJQUFBQyxNQUFBO01BQ3BCLElBQUFDLFlBQUEsR0FXSSxJQUFJLENBQUN2QixLQUFLO1FBQUF3QixxQkFBQSxHQUFBRCxZQUFBLENBVFpFLFNBQVM7UUFBVEEsU0FBUyxHQUFBRCxxQkFBQSxjQUFHekMsZ0JBQWdCLEdBQUF5QyxxQkFBQTtRQUM1QkUsYUFBYSxHQUFBSCxZQUFBLENBQWJHLGFBQWE7UUFDYlYsUUFBUSxHQUFBTyxZQUFBLENBQVJQLFFBQVE7UUFDUlcsT0FBTyxHQUFBSixZQUFBLENBQVBJLE9BQU87UUFHUEMsUUFBUSxHQUFBTCxZQUFBLENBQVJLLFFBQVE7UUFDUkMsVUFBVSxHQUFBTixZQUFBLENBQVZNLFVBQVU7UUFBQUMscUJBQUEsR0FBQVAsWUFBQSxDQUNWUSxVQUFVO1FBQVZBLFVBQVUsR0FBQUQscUJBQUEsY0FBRyxDQUFDLENBQUMsR0FBQUEscUJBQUE7TUFHakIsSUFBQUUsV0FBQSxHQUF5QixJQUFJLENBQUM3QixLQUFLO1FBQTVCVixTQUFTLEdBQUF1QyxXQUFBLENBQVR2QyxTQUFTO1FBQUVoQyxHQUFHLEdBQUF1RSxXQUFBLENBQUh2RSxHQUFHO01BRXJCLElBQU13RSxhQUFhLEdBQUEvRyxhQUFBLENBQUFBLGFBQUEsS0FDZHFELGlCQUFpQjtRQUNwQkMsT0FBTyxFQUFBdEQsYUFBQSxLQUNENkcsVUFBVSxDQUFDdkQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUM3QjtRQUNERyxPQUFPLEVBQUF6RCxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxLQUNGcUQsaUJBQWlCLENBQUNJLE9BQU8sR0FDeEJvRCxVQUFVLENBQUNwRCxPQUFPLElBQUksQ0FBQyxDQUFDO1VBQzVCO1VBQ0F1RCxNQUFNLEVBQUVSLGFBQWEsSUFBSTtRQUFJO01BQzlCLEVBQ0Y7TUFFRCxJQUFNUyxJQUFJLEdBQUdWLFNBQVM7TUFFdEIsb0JBQ0V6SixNQUFBLFlBQUFvSyxhQUFBLENBQUM1SixRQUFBLENBQUE2SixXQUFXLENBQUNDLFFBQVEsUUFDbEIsVUFBQUMsT0FBTztRQUFBLG9CQUNOdkssTUFBQSxZQUFBb0ssYUFBQSxDQUFDRCxJQUFJO1VBQUNLLEdBQUcsRUFBRWxCLE1BQUksQ0FBQ3pCO1FBQVEsR0FDckJtQixRQUFRLGdCQUNQaEosTUFBQSxZQUFBb0ssYUFBQSxDQUFDM0osV0FBQSxXQUFLLE1BQUFnSyxTQUFBO1VBQ0pDLFNBQVMsRUFBQztRQUFjLEdBQ3BCYixVQUFVO1VBQ2RjLFdBQVcsRUFBRSxLQUFNO1VBQ25CQyxNQUFNO1VBQ05DLEtBQUssRUFBRVosYUFBYztVQUNyQmEsY0FBYyxFQUFFLFNBQWhCQSxjQUFjQSxDQUFBLEVBQVE7WUFDcEI7WUFDQTtZQUNBLE9BQVFQLE9BQU8sSUFBSUEsT0FBTyxDQUFDM0MsT0FBTyxJQUFLM0QsUUFBUSxDQUFDRSxJQUFJO1VBQ3RELENBQUU7VUFDRjRHLGNBQWMsRUFBRXBCO1FBQVEsaUJBRXhCM0osTUFBQSxZQUFBb0ssYUFBQTtVQUNFTSxTQUFTLEVBQUMsa0JBQWtCO1VBQzVCL0csR0FBRyxFQUFDLE1BQU07VUFDVmtILEtBQUssRUFBQTNILGFBQUE7WUFDSDhILFFBQVEsRUFBRSxPQUFPO1lBQ2pCQyxPQUFPLEVBQUV4RCxTQUFTLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDMUJ5RCxVQUFVLEVBQUU1QixNQUFJLENBQUN0QixLQUFLLENBQUNtRCxLQUFLLENBQUNDLGNBQWM7WUFDM0NDLFNBQVMsRUFBRTVELFNBQVMsR0FBRyxLQUFLLEdBQUc7VUFBTSxHQUVsQ2hDLEdBQUc7UUFDTixnQkFFRnpGLE1BQUEsWUFBQW9LLGFBQUE7VUFDRUksR0FBRyxFQUFFbEIsTUFBSSxDQUFDM0IsS0FBTTtVQUNoQmtELEtBQUssRUFBRTtZQUNMRyxRQUFRLEVBQUUsVUFBVTtZQUNwQmQsTUFBTSxFQUFFUixhQUFhLEdBQUdBLGFBQWEsR0FBRyxDQUFDLEdBQUc7VUFDOUM7UUFBRSxHQUVERSxRQUNFLENBQ0YsQ0FDQSxDQUFDLEdBQ04sSUFDQSxDQUFDO01BQUEsQ0FFVyxDQUFDO0lBRTNCO0VBQUM7SUFBQWpHLEdBQUE7SUFBQTRFLEtBQUE7SUEvSkQ7SUFDQTtJQUNBO0lBQ0EsU0FBTytDLHdCQUF3QkEsQ0FBQSxFQUF3QjtNQUNyRCxPQUFPO1FBQUNDLFFBQVEsRUFBRTtNQUFJLENBQUM7SUFDekI7RUFBQztBQUFBLEVBTm9CQyxnQkFBUztBQUFBLElBQUFsSSxnQkFBQSxhQUExQjBELFFBQVEsa0JBUXlCO0VBQ25DeUMsU0FBUyxFQUFFMUMsZ0JBQWdCO0VBQzNCNEMsT0FBTyxFQUFFN0MsSUFBSTtFQUNicUUsS0FBSyxFQUFMQTtBQUNGLENBQUM7QUFBQSxJQUFBTSxRQUFBLEdBQUEzRyxPQUFBLGNBdUpZLElBQUE0RywyQkFBUyxFQUFDMUUsUUFBUSxDQUFDIiwiaWdub3JlTGlzdCI6W119
;