kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
234 lines (232 loc) • 42.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.HISTOGRAM_MASK_MODE = void 0;
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _d3Scale = require("d3-scale");
var _d3Color = require("d3-color");
var _d3Array = require("d3-array");
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _templateObject, _templateObject2, _templateObject3; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
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; }
// clipping mask constants
var HISTOGRAM_MASK_MODE = exports.HISTOGRAM_MASK_MODE = {
NoMask: 0,
Mask: 1,
MaskWithOverlay: 2
};
var HISTOGRAM_MASK_BGCOLOR = '#FFFFFF';
var HISTOGRAM_MASK_FGCOLOR = '#000000';
var histogramStyle = {
highlightW: 0.7,
unHighlightedW: 0.4
};
var HistogramWrapper = _styledComponents["default"].svg(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n overflow: visible;\n"])));
var HistogramMaskRect = _styledComponents["default"].rect(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n fill: ", ";\n"])), function (props) {
return props.theme.panelBackground;
});
var HistogramBreakLine = _styledComponents["default"].g(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n stroke: ", ";\n stroke-width: 1px;\n transform: translate(0, 0);\n"])), function (props) {
return props.theme.histogramBreakLineColor;
});
var BarUnmemoized = _styledComponents["default"].rect(function (_ref) {
var theme = _ref.theme,
inRange = _ref.inRange,
isOverlay = _ref.isOverlay,
color = _ref.color;
return "\n ".concat(isOverlay ? "fill: ".concat(color !== null && color !== void 0 ? color : theme.histogramOverlayColor, ";") : inRange ? "fill: ".concat(color !== null && color !== void 0 ? color : theme.histogramFillInRange, ";") : "fill: ".concat(color ? (0, _d3Color.hcl)(color).darker() : theme.histogramFillOutRange, ";"), "\n");
});
var Bar = /*#__PURE__*/_react["default"].memo(BarUnmemoized);
Bar.displayName = 'Bar';
var isBarInRange = function isBarInRange(bar, index, list, filterDomain, filterValue) {
// first
// if x0 <= domain[0] and current value[0] wasn't changed from the original domain
var x0Condition = index === 0 ? bar.x0 <= filterDomain[0] && filterDomain[0] === filterValue[0] : false;
// Last
// if x1 >= domain[1] and current value[1] wasn't changed from the original domain
var x1Condition = index === list.length - 1 ? bar.x1 >= filterDomain[1] && filterDomain[1] === filterValue[1] : false;
return (x0Condition || bar.x0 >= filterValue[0]) && (x1Condition || bar.x1 <= filterValue[1]);
};
function HistogramPlotFactory() {
var HistogramPlot = function HistogramPlot(_ref2) {
var width = _ref2.width,
height = _ref2.height,
histogramsByGroup = _ref2.histogramsByGroup,
colorsByGroup = _ref2.colorsByGroup,
_ref2$isMasked = _ref2.isMasked,
isMasked = _ref2$isMasked === void 0 ? HISTOGRAM_MASK_MODE.NoMask : _ref2$isMasked,
_ref2$countProp = _ref2.countProp,
countProp = _ref2$countProp === void 0 ? 'count' : _ref2$countProp,
margin = _ref2.margin,
isRanged = _ref2.isRanged,
range = _ref2.range,
value = _ref2.value,
brushComponent = _ref2.brushComponent,
breakLines = _ref2.breakLines;
var undefinedToZero = function undefinedToZero(x) {
return x ? x : 0;
};
var groupKeys = (0, _react.useMemo)(function () {
return Object.keys(histogramsByGroup)
// only keep non-empty groups
.filter(function (key) {
var _histogramsByGroup$ke;
return ((_histogramsByGroup$ke = histogramsByGroup[key]) === null || _histogramsByGroup$ke === void 0 ? void 0 : _histogramsByGroup$ke.length) > 0;
});
}, [histogramsByGroup]);
var domain = (0, _react.useMemo)(function () {
var _min, _max;
return range !== null && range !== void 0 ? range : [(_min = (0, _d3Array.min)(groupKeys, function (key) {
return histogramsByGroup[key][0].x0;
})) !== null && _min !== void 0 ? _min : 0, (_max = (0, _d3Array.max)(groupKeys, function (key) {
return histogramsByGroup[key][histogramsByGroup[key].length - 1].x1;
})) !== null && _max !== void 0 ? _max : 0];
}, [range, histogramsByGroup, groupKeys]);
var barWidth = (0, _react.useMemo)(function () {
if (groupKeys.length === 0) return 0;
// find histogramsByGroup with max number of bins
var maxGroup = groupKeys.reduce(function (accu, key, _idx) {
if (histogramsByGroup[key].length > accu.length) {
return histogramsByGroup[key];
}
return accu;
}, histogramsByGroup[groupKeys[0]]);
// find the bin for measuring step
var stdBinIdx = maxGroup.length > 1 ? 1 : 0;
var xStep = maxGroup[stdBinIdx].x1 - maxGroup[stdBinIdx].x0;
var maxBins = (domain[1] - domain[0]) / xStep;
if (!maxBins) return 0;
return width / maxBins / (isMasked ? 1 : groupKeys.length);
}, [histogramsByGroup, domain, groupKeys, width, isMasked]);
var x = (0, _react.useMemo)(function () {
return (0, _d3Scale.scaleLinear)().domain(domain).range([barWidth, width]);
}, [domain, width, barWidth]);
var y = (0, _react.useMemo)(function () {
return (0, _d3Scale.scaleLinear)().domain([0, Math.max(Number((0, _d3Array.max)(groupKeys, function (key) {
return (0, _d3Array.max)(histogramsByGroup[key], function (d) {
return d[countProp];
});
})), 1)]).range([0, height]);
}, [histogramsByGroup, groupKeys, height, countProp]);
if (groupKeys.length === 0) {
return null;
}
var maskedHistogram = function maskedHistogram() {
return /*#__PURE__*/_react["default"].createElement(HistogramWrapper, {
width: width,
height: height,
style: {
margin: "".concat(margin.top, "px ").concat(margin.right, "px ").concat(margin.bottom, "px ").concat(margin.left, "px")
}
}, /*#__PURE__*/_react["default"].createElement("defs", null, /*#__PURE__*/_react["default"].createElement("mask", {
id: "histogram-mask"
}, /*#__PURE__*/_react["default"].createElement("rect", {
x: "0",
y: "0",
width: width,
height: height + margin.bottom,
fill: HISTOGRAM_MASK_BGCOLOR
}), /*#__PURE__*/_react["default"].createElement("g", {
key: "filtered-bins",
className: "histogram-bars"
}, histogramsByGroup.filteredBins.map(function (bar, idx, list) {
var inRange = isBarInRange(bar, idx, list, domain, value);
var wRatio = inRange ? histogramStyle.highlightW : histogramStyle.unHighlightedW;
return /*#__PURE__*/_react["default"].createElement(Bar, {
isOverlay: false,
inRange: inRange,
color: HISTOGRAM_MASK_FGCOLOR,
key: "mask-".concat(idx),
height: y(bar[countProp]),
width: barWidth * wRatio,
x: x(bar.x0) + barWidth * (1 - wRatio) / 2,
y: height - y(bar[countProp])
});
})))), /*#__PURE__*/_react["default"].createElement("g", {
transform: "translate(0,0)"
}, /*#__PURE__*/_react["default"].createElement(HistogramMaskRect, {
x: "0",
y: "0",
width: "100%",
height: height + margin.bottom,
mask: "url(#histogram-mask)"
})), isMasked === HISTOGRAM_MASK_MODE.MaskWithOverlay && /*#__PURE__*/_react["default"].createElement("g", {
key: "bins",
transform: "translate(0,0)",
className: "overlay-histogram-bars"
}, histogramsByGroup.bins.map(function (bar, idx, list) {
var filterBar = histogramsByGroup.filteredBins[idx];
var maskHeight = filterBar ? y(bar[countProp]) - y(filterBar[countProp]) : y(bar[countProp]);
var inRange = isBarInRange(bar, idx, list, domain, value);
var wRatio = inRange ? histogramStyle.highlightW : histogramStyle.unHighlightedW;
return /*#__PURE__*/_react["default"].createElement(Bar, {
inRange: inRange,
isOverlay: true,
key: "bar-".concat(idx),
height: maskHeight,
width: barWidth * wRatio,
x: x(bar.x0) + barWidth * (1 - wRatio) / 2,
y: height - y(bar[countProp])
});
})), /*#__PURE__*/_react["default"].createElement(HistogramBreakLine, null, (breakLines !== null && breakLines !== void 0 ? breakLines : []).map(function (pos, idx) {
return /*#__PURE__*/_react["default"].createElement("path", {
key: "mask-line-".concat(idx),
strokeDasharray: "4,4",
d: "M".concat(pos, ", 0 l0 100")
});
})), /*#__PURE__*/_react["default"].createElement("g", {
transform: "translate(".concat(isRanged ? 0 : barWidth / 2, ", 0)")
}, brushComponent));
};
return isMasked ? maskedHistogram() : /*#__PURE__*/_react["default"].createElement(HistogramWrapper, {
width: width,
height: height,
style: {
margin: "".concat(margin.top, "px ").concat(margin.right, "px ").concat(margin.bottom, "px ").concat(margin.left, "px")
}
}, /*#__PURE__*/_react["default"].createElement("g", null, groupKeys.map(function (key, i) {
return /*#__PURE__*/_react["default"].createElement("g", {
key: key,
className: "histogram-bars"
}, histogramsByGroup[key].map(function (bar, idx, list) {
var inRange = isBarInRange(bar, idx, list, domain, value);
var wRatio = inRange ? histogramStyle.highlightW : histogramStyle.unHighlightedW;
var startX = x(undefinedToZero(bar.x0)) + barWidth * i + barWidth * (1 - wRatio) / 2;
if (startX > 0 && startX + barWidth * histogramStyle.unHighlightedW <= width) {
return /*#__PURE__*/_react["default"].createElement(Bar, {
isOverlay: false,
inRange: inRange,
color: colorsByGroup === null || colorsByGroup === void 0 ? void 0 : colorsByGroup[key],
key: "bar-".concat(idx),
height: y(bar[countProp]),
width: barWidth * wRatio,
x: startX,
rx: 1,
ry: 1,
y: height - y(bar[countProp])
});
}
return null;
}));
})), /*#__PURE__*/_react["default"].createElement("g", {
transform: "translate(".concat(isRanged ? 0 : barWidth / 2, ", 0)")
}, brushComponent));
};
var HistogramPlotWithGroups = function HistogramPlotWithGroups(props) {
var groups = (0, _react.useMemo)(function () {
return props.histogramsByGroup ? Object.keys(props.histogramsByGroup) : null;
}, [props.histogramsByGroup]);
if (!(groups !== null && groups !== void 0 && groups.length)) {
return null;
}
return /*#__PURE__*/_react["default"].createElement(HistogramPlot, props);
};
return HistogramPlotWithGroups;
}
var _default = exports["default"] = HistogramPlotFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfZDNTY2FsZSIsIl9kM0NvbG9yIiwiX2QzQXJyYXkiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkhJU1RPR1JBTV9NQVNLX01PREUiLCJleHBvcnRzIiwiTm9NYXNrIiwiTWFzayIsIk1hc2tXaXRoT3ZlcmxheSIsIkhJU1RPR1JBTV9NQVNLX0JHQ09MT1IiLCJISVNUT0dSQU1fTUFTS19GR0NPTE9SIiwiaGlzdG9ncmFtU3R5bGUiLCJoaWdobGlnaHRXIiwidW5IaWdobGlnaHRlZFciLCJIaXN0b2dyYW1XcmFwcGVyIiwic3R5bGVkIiwic3ZnIiwiX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbDIiLCJIaXN0b2dyYW1NYXNrUmVjdCIsInJlY3QiLCJwcm9wcyIsInRoZW1lIiwicGFuZWxCYWNrZ3JvdW5kIiwiSGlzdG9ncmFtQnJlYWtMaW5lIiwiZyIsImhpc3RvZ3JhbUJyZWFrTGluZUNvbG9yIiwiQmFyVW5tZW1vaXplZCIsIl9yZWYiLCJpblJhbmdlIiwiaXNPdmVybGF5IiwiY29sb3IiLCJjb25jYXQiLCJoaXN0b2dyYW1PdmVybGF5Q29sb3IiLCJoaXN0b2dyYW1GaWxsSW5SYW5nZSIsImhjbCIsImRhcmtlciIsImhpc3RvZ3JhbUZpbGxPdXRSYW5nZSIsIkJhciIsIlJlYWN0IiwibWVtbyIsImRpc3BsYXlOYW1lIiwiaXNCYXJJblJhbmdlIiwiYmFyIiwiaW5kZXgiLCJsaXN0IiwiZmlsdGVyRG9tYWluIiwiZmlsdGVyVmFsdWUiLCJ4MENvbmRpdGlvbiIsIngwIiwieDFDb25kaXRpb24iLCJsZW5ndGgiLCJ4MSIsIkhpc3RvZ3JhbVBsb3RGYWN0b3J5IiwiSGlzdG9ncmFtUGxvdCIsIl9yZWYyIiwid2lkdGgiLCJoZWlnaHQiLCJoaXN0b2dyYW1zQnlHcm91cCIsImNvbG9yc0J5R3JvdXAiLCJfcmVmMiRpc01hc2tlZCIsImlzTWFza2VkIiwiX3JlZjIkY291bnRQcm9wIiwiY291bnRQcm9wIiwibWFyZ2luIiwiaXNSYW5nZWQiLCJyYW5nZSIsInZhbHVlIiwiYnJ1c2hDb21wb25lbnQiLCJicmVha0xpbmVzIiwidW5kZWZpbmVkVG9aZXJvIiwieCIsImdyb3VwS2V5cyIsInVzZU1lbW8iLCJrZXlzIiwiZmlsdGVyIiwia2V5IiwiX2hpc3RvZ3JhbXNCeUdyb3VwJGtlIiwiZG9tYWluIiwiX21pbiIsIl9tYXgiLCJtaW4iLCJtYXgiLCJiYXJXaWR0aCIsIm1heEdyb3VwIiwicmVkdWNlIiwiYWNjdSIsIl9pZHgiLCJzdGRCaW5JZHgiLCJ4U3RlcCIsIm1heEJpbnMiLCJzY2FsZUxpbmVhciIsInkiLCJNYXRoIiwiTnVtYmVyIiwiZCIsIm1hc2tlZEhpc3RvZ3JhbSIsImNyZWF0ZUVsZW1lbnQiLCJzdHlsZSIsInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCIsImlkIiwiZmlsbCIsImNsYXNzTmFtZSIsImZpbHRlcmVkQmlucyIsIm1hcCIsImlkeCIsIndSYXRpbyIsInRyYW5zZm9ybSIsIm1hc2siLCJiaW5zIiwiZmlsdGVyQmFyIiwibWFza0hlaWdodCIsInBvcyIsInN0cm9rZURhc2hhcnJheSIsInN0YXJ0WCIsInJ4IiwicnkiLCJIaXN0b2dyYW1QbG90V2l0aEdyb3VwcyIsImdyb3VwcyIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1vbi9oaXN0b2dyYW0tcGxvdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7UmVhY3RFbGVtZW50LCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge3NjYWxlTGluZWFyfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQge2hjbH0gZnJvbSAnZDMtY29sb3InO1xuaW1wb3J0IHttaW4sIG1heH0gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCB7Qmluc30gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5cbi8vIGNsaXBwaW5nIG1hc2sgY29uc3RhbnRzXG5leHBvcnQgY29uc3QgSElTVE9HUkFNX01BU0tfTU9ERSA9IHtcbiAgTm9NYXNrOiAwLFxuICBNYXNrOiAxLFxuICBNYXNrV2l0aE92ZXJsYXk6IDJcbn07XG5jb25zdCBISVNUT0dSQU1fTUFTS19CR0NPTE9SID0gJyNGRkZGRkYnO1xuY29uc3QgSElTVE9HUkFNX01BU0tfRkdDT0xPUiA9ICcjMDAwMDAwJztcblxuY29uc3QgaGlzdG9ncmFtU3R5bGUgPSB7XG4gIGhpZ2hsaWdodFc6IDAuNyxcbiAgdW5IaWdobGlnaHRlZFc6IDAuNFxufTtcblxuY29uc3QgSGlzdG9ncmFtV3JhcHBlciA9IHN0eWxlZC5zdmdgXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuYDtcblxuY29uc3QgSGlzdG9ncmFtTWFza1JlY3QgPSBzdHlsZWQucmVjdGBcbiAgZmlsbDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmR9O1xuYDtcblxuY29uc3QgSGlzdG9ncmFtQnJlYWtMaW5lID0gc3R5bGVkLmdgXG4gIHN0cm9rZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5oaXN0b2dyYW1CcmVha0xpbmVDb2xvcn07XG4gIHN0cm9rZS13aWR0aDogMXB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTtcbmA7XG5cbnR5cGUgQmFyVHlwZSA9IHtcbiAgaW5SYW5nZTogYm9vbGVhbjtcbiAgaXNPdmVybGF5OiBib29sZWFuO1xufTtcbmNvbnN0IEJhclVubWVtb2l6ZWQgPSBzdHlsZWQucmVjdDxCYXJUeXBlPihcbiAgKHt0aGVtZSwgaW5SYW5nZSwgaXNPdmVybGF5LCBjb2xvcn0pID0+IGBcbiAgJHtcbiAgICBpc092ZXJsYXlcbiAgICAgID8gYGZpbGw6ICR7Y29sb3IgPz8gdGhlbWUuaGlzdG9ncmFtT3ZlcmxheUNvbG9yfTtgXG4gICAgICA6IGluUmFuZ2VcbiAgICAgID8gYGZpbGw6ICR7Y29sb3IgPz8gdGhlbWUuaGlzdG9ncmFtRmlsbEluUmFuZ2V9O2BcbiAgICAgIDogYGZpbGw6ICR7Y29sb3IgPyBoY2woY29sb3IpLmRhcmtlcigpIDogdGhlbWUuaGlzdG9ncmFtRmlsbE91dFJhbmdlfTtgXG4gIH1cbmBcbik7XG5jb25zdCBCYXIgPSBSZWFjdC5tZW1vKEJhclVubWVtb2l6ZWQpO1xuQmFyLmRpc3BsYXlOYW1lID0gJ0Jhcic7XG5cbmNvbnN0IGlzQmFySW5SYW5nZSA9IChcbiAgYmFyOiB7eDA6IG51bWJlcjsgeDE6IG51bWJlcn0sXG4gIGluZGV4OiBudW1iZXIsXG4gIGxpc3Q6IGFueVtdLFxuICBmaWx0ZXJEb21haW46IGFueVtdLFxuICBmaWx0ZXJWYWx1ZTogYW55W11cbikgPT4ge1xuICAvLyBmaXJzdFxuICAvLyBpZiB4MCA8PSBkb21haW5bMF0gYW5kIGN1cnJlbnQgdmFsdWVbMF0gd2Fzbid0IGNoYW5nZWQgZnJvbSB0aGUgb3JpZ2luYWwgZG9tYWluXG4gIGNvbnN0IHgwQ29uZGl0aW9uID1cbiAgICBpbmRleCA9PT0gMCA/IGJhci54MCA8PSBmaWx0ZXJEb21haW5bMF0gJiYgZmlsdGVyRG9tYWluWzBdID09PSBmaWx0ZXJWYWx1ZVswXSA6IGZhbHNlO1xuICAvLyBMYXN0XG4gIC8vIGlmIHgxID49IGRvbWFpblsxXSBhbmQgY3VycmVudCB2YWx1ZVsxXSB3YXNuJ3QgY2hhbmdlZCBmcm9tIHRoZSBvcmlnaW5hbCBkb21haW5cbiAgY29uc3QgeDFDb25kaXRpb24gPVxuICAgIGluZGV4ID09PSBsaXN0Lmxlbmd0aCAtIDFcbiAgICAgID8gYmFyLngxID49IGZpbHRlckRvbWFpblsxXSAmJiBmaWx0ZXJEb21haW5bMV0gPT09IGZpbHRlclZhbHVlWzFdXG4gICAgICA6IGZhbHNlO1xuICByZXR1cm4gKHgwQ29uZGl0aW9uIHx8IGJhci54MCA+PSBmaWx0ZXJWYWx1ZVswXSkgJiYgKHgxQ29uZGl0aW9uIHx8IGJhci54MSA8PSBmaWx0ZXJWYWx1ZVsxXSk7XG59O1xuXG5leHBvcnQgdHlwZSBIaXN0b2dyYW1NYXNrTW9kZVR5cGUgPSB7XG4gIE5vTWFzazogbnVtYmVyO1xuICBNYXNrOiBudW1iZXI7XG4gIE1hc2tXaXRoT3ZlcmxheTogbnVtYmVyO1xufTtcblxuaW50ZXJmYWNlIEhpc3RvZ3JhbVBsb3RQcm9wcyB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBtYXJnaW46IHt0b3A6IG51bWJlcjsgYm90dG9tOiBudW1iZXI7IGxlZnQ6IG51bWJlcjsgcmlnaHQ6IG51bWJlcn07XG4gIGlzUmFuZ2VkPzogYm9vbGVhbjtcbiAgdmFsdWU6IG51bWJlcltdO1xuICBpc01hc2tlZD86IG51bWJlcjtcbiAgYnJ1c2hDb21wb25lbnQ/OiBSZWFjdEVsZW1lbnQ7XG4gIGhpc3RvZ3JhbXNCeUdyb3VwOiBCaW5zO1xuICBjb2xvcnNCeUdyb3VwPzogbnVsbCB8IHtbZGF0YUlkOiBzdHJpbmddOiBzdHJpbmd9O1xuICBjb3VudFByb3A/OiBzdHJpbmc7XG4gIHJhbmdlPzogbnVtYmVyW107XG4gIGJyZWFrTGluZXM/OiBudW1iZXJbXTtcbn1cblxuZnVuY3Rpb24gSGlzdG9ncmFtUGxvdEZhY3RvcnkoKSB7XG4gIGNvbnN0IEhpc3RvZ3JhbVBsb3QgPSAoe1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBoaXN0b2dyYW1zQnlHcm91cCxcbiAgICBjb2xvcnNCeUdyb3VwLFxuICAgIGlzTWFza2VkID0gSElTVE9HUkFNX01BU0tfTU9ERS5Ob01hc2ssXG4gICAgY291bnRQcm9wID0gJ2NvdW50JyxcbiAgICBtYXJnaW4sXG4gICAgaXNSYW5nZWQsXG4gICAgcmFuZ2UsXG4gICAgdmFsdWUsXG4gICAgYnJ1c2hDb21wb25lbnQsXG4gICAgYnJlYWtMaW5lc1xuICB9OiBIaXN0b2dyYW1QbG90UHJvcHMpID0+IHtcbiAgICBjb25zdCB1bmRlZmluZWRUb1plcm8gPSAoeDogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiAoeCA/IHggOiAwKTtcbiAgICBjb25zdCBncm91cEtleXMgPSB1c2VNZW1vKFxuICAgICAgKCkgPT5cbiAgICAgICAgT2JqZWN0LmtleXMoaGlzdG9ncmFtc0J5R3JvdXApXG4gICAgICAgICAgLy8gb25seSBrZWVwIG5vbi1lbXB0eSBncm91cHNcbiAgICAgICAgICAuZmlsdGVyKGtleSA9PiBoaXN0b2dyYW1zQnlHcm91cFtrZXldPy5sZW5ndGggPiAwKSxcbiAgICAgIFtoaXN0b2dyYW1zQnlHcm91cF1cbiAgICApO1xuXG4gICAgY29uc3QgZG9tYWluID0gdXNlTWVtbyhcbiAgICAgICgpID0+XG4gICAgICAgIHJhbmdlID8/IFtcbiAgICAgICAgICBtaW4oZ3JvdXBLZXlzLCBrZXkgPT4gaGlzdG9ncmFtc0J5R3JvdXBba2V5XVswXS54MCkgPz8gMCxcbiAgICAgICAgICBtYXgoZ3JvdXBLZXlzLCBrZXkgPT4gaGlzdG9ncmFtc0J5R3JvdXBba2V5XVtoaXN0b2dyYW1zQnlHcm91cFtrZXldLmxlbmd0aCAtIDFdLngxKSA/PyAwXG4gICAgICAgIF0sXG4gICAgICBbcmFuZ2UsIGhpc3RvZ3JhbXNCeUdyb3VwLCBncm91cEtleXNdXG4gICAgKTtcblxuICAgIGNvbnN0IGJhcldpZHRoID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICBpZiAoZ3JvdXBLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICAvLyBmaW5kIGhpc3RvZ3JhbXNCeUdyb3VwIHdpdGggbWF4IG51bWJlciBvZiBiaW5zXG4gICAgICBjb25zdCBtYXhHcm91cCA9IGdyb3VwS2V5cy5yZWR1Y2UoKGFjY3UsIGtleSwgX2lkeCkgPT4ge1xuICAgICAgICBpZiAoaGlzdG9ncmFtc0J5R3JvdXBba2V5XS5sZW5ndGggPiBhY2N1Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBoaXN0b2dyYW1zQnlHcm91cFtrZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1O1xuICAgICAgfSwgaGlzdG9ncmFtc0J5R3JvdXBbZ3JvdXBLZXlzWzBdXSk7XG5cbiAgICAgIC8vIGZpbmQgdGhlIGJpbiBmb3IgbWVhc3VyaW5nIHN0ZXBcbiAgICAgIGNvbnN0IHN0ZEJpbklkeCA9IG1heEdyb3VwLmxlbmd0aCA+IDEgPyAxIDogMDtcbiAgICAgIGNvbnN0IHhTdGVwID0gbWF4R3JvdXBbc3RkQmluSWR4XS54MSAtIG1heEdyb3VwW3N0ZEJpbklkeF0ueDA7XG4gICAgICBjb25zdCBtYXhCaW5zID0gKGRvbWFpblsxXSAtIGRvbWFpblswXSkgLyB4U3RlcDtcbiAgICAgIGlmICghbWF4QmlucykgcmV0dXJuIDA7XG4gICAgICByZXR1cm4gd2lkdGggLyBtYXhCaW5zIC8gKGlzTWFza2VkID8gMSA6IGdyb3VwS2V5cy5sZW5ndGgpO1xuICAgIH0sIFtoaXN0b2dyYW1zQnlHcm91cCwgZG9tYWluLCBncm91cEtleXMsIHdpZHRoLCBpc01hc2tlZF0pO1xuXG4gICAgY29uc3QgeCA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiBzY2FsZUxpbmVhcigpLmRvbWFpbihkb21haW4pLnJhbmdlKFtiYXJXaWR0aCwgd2lkdGhdKSxcbiAgICAgIFtkb21haW4sIHdpZHRoLCBiYXJXaWR0aF1cbiAgICApO1xuXG4gICAgY29uc3QgeSA9IHVzZU1lbW8oXG4gICAgICAoKSA9PlxuICAgICAgICBzY2FsZUxpbmVhcigpXG4gICAgICAgICAgLmRvbWFpbihbXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgICAgIE51bWJlcihtYXgoZ3JvdXBLZXlzLCBrZXkgPT4gbWF4KGhpc3RvZ3JhbXNCeUdyb3VwW2tleV0sIGQgPT4gZFtjb3VudFByb3BdKSkpLFxuICAgICAgICAgICAgICAxXG4gICAgICAgICAgICApXG4gICAgICAgICAgXSlcbiAgICAgICAgICAucmFuZ2UoWzAsIGhlaWdodF0pLFxuICAgICAgW2hpc3RvZ3JhbXNCeUdyb3VwLCBncm91cEtleXMsIGhlaWdodCwgY291bnRQcm9wXVxuICAgICk7XG5cbiAgICBpZiAoZ3JvdXBLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbWFza2VkSGlzdG9ncmFtID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEhpc3RvZ3JhbVdyYXBwZXJcbiAgICAgICAgICB3aWR0aD17d2lkdGh9XG4gICAgICAgICAgaGVpZ2h0PXtoZWlnaHR9XG4gICAgICAgICAgc3R5bGU9e3ttYXJnaW46IGAke21hcmdpbi50b3B9cHggJHttYXJnaW4ucmlnaHR9cHggJHttYXJnaW4uYm90dG9tfXB4ICR7bWFyZ2luLmxlZnR9cHhgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgPG1hc2sgaWQ9XCJoaXN0b2dyYW0tbWFza1wiPlxuICAgICAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgICAgIHg9XCIwXCJcbiAgICAgICAgICAgICAgICB5PVwiMFwiXG4gICAgICAgICAgICAgICAgd2lkdGg9e3dpZHRofVxuICAgICAgICAgICAgICAgIGhlaWdodD17aGVpZ2h0ICsgbWFyZ2luLmJvdHRvbX1cbiAgICAgICAgICAgICAgICBmaWxsPXtISVNUT0dSQU1fTUFTS19CR0NPTE9SfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZyBrZXk9XCJmaWx0ZXJlZC1iaW5zXCIgY2xhc3NOYW1lPVwiaGlzdG9ncmFtLWJhcnNcIj5cbiAgICAgICAgICAgICAgICB7aGlzdG9ncmFtc0J5R3JvdXAuZmlsdGVyZWRCaW5zLm1hcCgoYmFyLCBpZHgsIGxpc3QpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluUmFuZ2UgPSBpc0JhckluUmFuZ2UoYmFyLCBpZHgsIGxpc3QsIGRvbWFpbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qgd1JhdGlvID0gaW5SYW5nZVxuICAgICAgICAgICAgICAgICAgICA/IGhpc3RvZ3JhbVN0eWxlLmhpZ2hsaWdodFdcbiAgICAgICAgICAgICAgICAgICAgOiBoaXN0b2dyYW1TdHlsZS51bkhpZ2hsaWdodGVkVztcbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxCYXJcbiAgICAgICAgICAgICAgICAgICAgICBpc092ZXJsYXk9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgIGluUmFuZ2U9e2luUmFuZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I9e0hJU1RPR1JBTV9NQVNLX0ZHQ09MT1J9XG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtgbWFzay0ke2lkeH1gfVxuICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD17eShiYXJbY291bnRQcm9wXSl9XG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9e2JhcldpZHRoICogd1JhdGlvfVxuICAgICAgICAgICAgICAgICAgICAgIHg9e3goYmFyLngwKSArIChiYXJXaWR0aCAqICgxIC0gd1JhdGlvKSkgLyAyfVxuICAgICAgICAgICAgICAgICAgICAgIHk9e2hlaWdodCAtIHkoYmFyW2NvdW50UHJvcF0pfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPC9tYXNrPlxuICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICA8ZyB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMCwwKVwiPlxuICAgICAgICAgICAgPEhpc3RvZ3JhbU1hc2tSZWN0XG4gICAgICAgICAgICAgIHg9XCIwXCJcbiAgICAgICAgICAgICAgeT1cIjBcIlxuICAgICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgICBoZWlnaHQ9e2hlaWdodCArIG1hcmdpbi5ib3R0b219XG4gICAgICAgICAgICAgIG1hc2s9XCJ1cmwoI2hpc3RvZ3JhbS1tYXNrKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgICB7aXNNYXNrZWQgPT09IEhJU1RPR1JBTV9NQVNLX01PREUuTWFza1dpdGhPdmVybGF5ICYmIChcbiAgICAgICAgICAgIDxnIGtleT1cImJpbnNcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoMCwwKVwiIGNsYXNzTmFtZT1cIm92ZXJsYXktaGlzdG9ncmFtLWJhcnNcIj5cbiAgICAgICAgICAgICAge2hpc3RvZ3JhbXNCeUdyb3VwLmJpbnMubWFwKChiYXIsIGlkeCwgbGlzdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckJhciA9IGhpc3RvZ3JhbXNCeUdyb3VwLmZpbHRlcmVkQmluc1tpZHhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hc2tIZWlnaHQgPSBmaWx0ZXJCYXJcbiAgICAgICAgICAgICAgICAgID8geShiYXJbY291bnRQcm9wXSkgLSB5KGZpbHRlckJhcltjb3VudFByb3BdKVxuICAgICAgICAgICAgICAgICAgOiB5KGJhcltjb3VudFByb3BdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpblJhbmdlID0gaXNCYXJJblJhbmdlKGJhciwgaWR4LCBsaXN0LCBkb21haW4sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCB3UmF0aW8gPSBpblJhbmdlID8gaGlzdG9ncmFtU3R5bGUuaGlnaGxpZ2h0VyA6IGhpc3RvZ3JhbVN0eWxlLnVuSGlnaGxpZ2h0ZWRXO1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8QmFyXG4gICAgICAgICAgICAgICAgICAgIGluUmFuZ2U9e2luUmFuZ2V9XG4gICAgICAgICAgICAgICAgICAgIGlzT3ZlcmxheT17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAga2V5PXtgYmFyLSR7aWR4fWB9XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD17bWFza0hlaWdodH1cbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9e2JhcldpZHRoICogd1JhdGlvfVxuICAgICAgICAgICAgICAgICAgICB4PXt4KGJhci54MCkgKyAoYmFyV2lkdGggKiAoMSAtIHdSYXRpbykpIC8gMn1cbiAgICAgICAgICAgICAgICAgICAgeT17aGVpZ2h0IC0geShiYXJbY291bnRQcm9wXSl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICl9XG4gICAgICAgICAgPEhpc3RvZ3JhbUJyZWFrTGluZT5cbiAgICAgICAgICAgIHsoYnJlYWtMaW5lcyA/PyBbXSkubWFwKChwb3MsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxwYXRoIGtleT17YG1hc2stbGluZS0ke2lkeH1gfSBzdHJva2VEYXNoYXJyYXk9XCI0LDRcIiBkPXtgTSR7cG9zfSwgMCBsMCAxMDBgfSAvPlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9IaXN0b2dyYW1CcmVha0xpbmU+XG4gICAgICAgICAgPGcgdHJhbnNmb3JtPXtgdHJhbnNsYXRlKCR7aXNSYW5nZWQgPyAwIDogYmFyV2lkdGggLyAyfSwgMClgfT57YnJ1c2hDb21wb25lbnR9PC9nPlxuICAgICAgICA8L0hpc3RvZ3JhbVdyYXBwZXI+XG4gICAgICApO1xuICAgIH07XG5cbiAgICByZXR1cm4gaXNNYXNrZWQgPyAoXG4gICAgICBtYXNrZWRIaXN0b2dyYW0oKVxuICAgICkgOiAoXG4gICAgICA8SGlzdG9ncmFtV3JhcHBlclxuICAgICAgICB3aWR0aD17d2lkdGh9XG4gICAgICAgIGhlaWdodD17aGVpZ2h0fVxuICAgICAgICBzdHlsZT17e21hcmdpbjogYCR7bWFyZ2luLnRvcH1weCAke21hcmdpbi5yaWdodH1weCAke21hcmdpbi5ib3R0b219cHggJHttYXJnaW4ubGVmdH1weGB9fVxuICAgICAgPlxuICAgICAgICA8Zz5cbiAgICAgICAgICB7Z3JvdXBLZXlzLm1hcCgoa2V5LCBpKSA9PiAoXG4gICAgICAgICAgICA8ZyBrZXk9e2tleX0gY2xhc3NOYW1lPVwiaGlzdG9ncmFtLWJhcnNcIj5cbiAgICAgICAgICAgICAge2hpc3RvZ3JhbXNCeUdyb3VwW2tleV0ubWFwKChiYXIsIGlkeCwgbGlzdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluUmFuZ2UgPSBpc0JhckluUmFuZ2UoYmFyLCBpZHgsIGxpc3QsIGRvbWFpbiwgdmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgd1JhdGlvID0gaW5SYW5nZSA/IGhpc3RvZ3JhbVN0eWxlLmhpZ2hsaWdodFcgOiBoaXN0b2dyYW1TdHlsZS51bkhpZ2hsaWdodGVkVztcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydFggPVxuICAgICAgICAgICAgICAgICAgeCh1bmRlZmluZWRUb1plcm8oYmFyLngwKSkgKyBiYXJXaWR0aCAqIGkgKyAoYmFyV2lkdGggKiAoMSAtIHdSYXRpbykpIC8gMjtcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRYID4gMCAmJiBzdGFydFggKyBiYXJXaWR0aCAqIGhpc3RvZ3JhbVN0eWxlLnVuSGlnaGxpZ2h0ZWRXIDw9IHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8QmFyXG4gICAgICAgICAgICAgICAgICAgICAgaXNPdmVybGF5PXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICBpblJhbmdlPXtpblJhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPXtjb2xvcnNCeUdyb3VwPy5ba2V5XX1cbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e2BiYXItJHtpZHh9YH1cbiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9e3koYmFyW2NvdW50UHJvcF0pfVxuICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPXtiYXJXaWR0aCAqIHdSYXRpb31cbiAgICAgICAgICAgICAgICAgICAgICB4PXtzdGFydFh9XG4gICAgICAgICAgICAgICAgICAgICAgcng9ezF9XG4gICAgICAgICAgICAgICAgICAgICAgcnk9ezF9XG4gICAgICAgICAgICAgICAgICAgICAgeT17aGVpZ2h0IC0geShiYXJbY291bnRQcm9wXSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgdHJhbnNmb3JtPXtgdHJhbnNsYXRlKCR7aXNSYW5nZWQgPyAwIDogYmFyV2lkdGggLyAyfSwgMClgfT57YnJ1c2hDb21wb25lbnR9PC9nPlxuICAgICAgPC9IaXN0b2dyYW1XcmFwcGVyPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgSGlzdG9ncmFtUGxvdFdpdGhHcm91cHMgPSBwcm9wcyA9PiB7XG4gICAgY29uc3QgZ3JvdXBzID0gdXNlTWVtbyhcbiAgICAgICgpID0+IChwcm9wcy5oaXN0b2dyYW1zQnlHcm91cCA/IE9iamVjdC5rZXlzKHByb3BzLmhpc3RvZ3JhbXNCeUdyb3VwKSA6IG51bGwpLFxuICAgICAgW3Byb3BzLmhpc3RvZ3JhbXNCeUdyb3VwXVxuICAgICk7XG5cbiAgICBpZiAoIWdyb3Vwcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gPEhpc3RvZ3JhbVBsb3Qgey4uLnByb3BzfSAvPjtcbiAgfTtcblxuICByZXR1cm4gSGlzdG9ncmFtUGxvdFdpdGhHcm91cHM7XG59XG5leHBvcnQgZGVmYXVsdCBIaXN0b2dyYW1QbG90RmFjdG9yeTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUwsT0FBQTtBQUF1QyxJQUFBTSxlQUFBLEVBQUFDLGdCQUFBLEVBQUFDLGdCQUFBLEVBUHZDO0FBQ0E7QUFBQSxTQUFBQyx5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSx5QkFBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVgsd0JBQUFXLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSxnQkFBQUssT0FBQSxDQUFBTCxDQUFBLDBCQUFBQSxDQUFBLHNCQUFBQSxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFB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