kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
258 lines (256 loc) • 44.1 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.neighborRequiredColumns = exports.neighborOptionalColumns = exports.lineVisConfigs = exports.lineRequiredColumns = exports.linePosAccessor = exports.lineOptionalColumns = exports.lineColumnLabels = exports.geoarrowRequiredColumns = exports["default"] = exports.COLUMN_MODE_POINTS = exports.COLUMN_MODE_NEIGHBORS = exports.COLUMN_MODE_GEOARROW = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
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 _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extensions = require("@deck.gl/extensions");
var _deckglArrowLayers = require("@kepler.gl/deckgl-arrow-layers");
var _deckglLayers = require("@kepler.gl/deckgl-layers");
var _lineLayerIcon = _interopRequireDefault(require("./line-layer-icon"));
var _arcLayer = _interopRequireDefault(require("../arc-layer/arc-layer"));
var _constants = require("@kepler.gl/constants");
var _utils = require("@kepler.gl/utils");
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 _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; }
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 lineRequiredColumns = exports.lineRequiredColumns = ['lat0', 'lng0', 'lat1', 'lng1'];
var lineOptionalColumns = exports.lineOptionalColumns = ['alt0', 'alt1'];
var neighborRequiredColumns = exports.neighborRequiredColumns = ['lat', 'lng', 'neighbors'];
var neighborOptionalColumns = exports.neighborOptionalColumns = ['alt'];
var geoarrowRequiredColumns = exports.geoarrowRequiredColumns = ['geoarrow0', 'geoarrow1'];
var lineColumnLabels = exports.lineColumnLabels = {
lat0: 'arc.lat0',
lng0: 'arc.lng0',
lat1: 'arc.lat1',
lng1: 'arc.lng1',
alt0: 'line.alt0',
alt1: 'line.alt1'
};
var lineVisConfigs = exports.lineVisConfigs = {
opacity: 'opacity',
thickness: 'thickness',
colorRange: 'colorRange',
sizeRange: 'strokeWidthRange',
targetColor: 'targetColor',
elevationScale: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.elevationScale), {}, {
defaultValue: 1
})
};
var COLUMN_MODE_POINTS = exports.COLUMN_MODE_POINTS = 'points';
var COLUMN_MODE_NEIGHBORS = exports.COLUMN_MODE_NEIGHBORS = 'neighbors';
var COLUMN_MODE_GEOARROW = exports.COLUMN_MODE_GEOARROW = 'geoarrow';
var SUPPORTED_COLUMN_MODES = [{
key: COLUMN_MODE_POINTS,
label: 'Points',
requiredColumns: lineRequiredColumns,
optionalColumns: lineOptionalColumns
}, {
key: COLUMN_MODE_NEIGHBORS,
label: 'Point and Neighbors',
requiredColumns: neighborRequiredColumns,
optionalColumns: neighborOptionalColumns
}, {
key: COLUMN_MODE_GEOARROW,
label: 'Geoarrow Points',
requiredColumns: geoarrowRequiredColumns
}];
var brushingExtension = new _extensions.BrushingExtension();
var arrowCPUFilterExtension = new _deckglLayers.FilterArrowExtension();
var linePosAccessor = exports.linePosAccessor = function linePosAccessor(_ref, columnMode) {
var lat0 = _ref.lat0,
lng0 = _ref.lng0,
lat1 = _ref.lat1,
lng1 = _ref.lng1,
alt0 = _ref.alt0,
alt1 = _ref.alt1,
lat = _ref.lat,
lng = _ref.lng,
alt = _ref.alt,
geoarrow0 = _ref.geoarrow0,
geoarrow1 = _ref.geoarrow1;
return function (dc) {
switch (columnMode) {
case COLUMN_MODE_GEOARROW:
return function (d) {
var start = dc.valueAt(d.index, geoarrow0.fieldIdx);
var end = dc.valueAt(d.index, geoarrow1.fieldIdx);
return [start.get(0), start.get(1), 0, end.get(2), end.get(3), 0];
};
case COLUMN_MODE_NEIGHBORS:
return function (d) {
var startPos = (0, _utils.maybeHexToGeo)(dc, d, lat, lng);
// only return source point if columnMode is COLUMN_MODE_NEIGHBORS
return [startPos ? startPos[0] : dc.valueAt(d.index, lng.fieldIdx), startPos ? startPos[1] : dc.valueAt(d.index, lat.fieldIdx), (alt === null || alt === void 0 ? void 0 : alt.fieldIdx) > -1 ? dc.valueAt(d.index, alt.fieldIdx) : 0];
};
default:
// COLUMN_MODE_POINTS
return function (d) {
// lat or lng column could be hex column
// we assume string value is hex and try to convert it to geo lat lng
var startPos = (0, _utils.maybeHexToGeo)(dc, d, lat0, lng0);
var endPos = (0, _utils.maybeHexToGeo)(dc, d, lat1, lng1);
return [startPos ? startPos[0] : dc.valueAt(d.index, lng0.fieldIdx), startPos ? startPos[1] : dc.valueAt(d.index, lat0.fieldIdx), alt0 && alt0.fieldIdx > -1 ? dc.valueAt(d.index, alt0.fieldIdx) : 0, endPos ? endPos[0] : dc.valueAt(d.index, lng1.fieldIdx), endPos ? endPos[1] : dc.valueAt(d.index, lat1.fieldIdx), alt1 && (alt1 === null || alt1 === void 0 ? void 0 : alt1.fieldIdx) > -1 ? dc.valueAt(d.index, alt1.fieldIdx) : 0];
};
}
};
};
var LineLayer = exports["default"] = /*#__PURE__*/function (_ArcLayer) {
function LineLayer(props) {
var _this;
(0, _classCallCheck2["default"])(this, LineLayer);
_this = _callSuper(this, LineLayer, [props]);
_this.registerVisConfig(lineVisConfigs);
_this.getPositionAccessor = function (dataContainer) {
return linePosAccessor(_this.config.columns, _this.config.columnMode)(dataContainer);
};
return _this;
}
(0, _inherits2["default"])(LineLayer, _ArcLayer);
return (0, _createClass2["default"])(LineLayer, [{
key: "type",
get: function get() {
return 'line';
}
}, {
key: "layerIcon",
get: function get() {
return _lineLayerIcon["default"];
}
}, {
key: "columnLabels",
get: function get() {
return lineColumnLabels;
}
}, {
key: "columnPairs",
get: function get() {
return this.defaultLinkColumnPairs;
}
}, {
key: "supportedColumnModes",
get: function get() {
return SUPPORTED_COLUMN_MODES;
}
}, {
key: "visualChannels",
get: function get() {
var visualChannels = _superPropGet(LineLayer, "visualChannels", this, 1);
return _objectSpread(_objectSpread({}, visualChannels), {}, {
sourceColor: _objectSpread(_objectSpread({}, visualChannels.sourceColor), {}, {
accessor: 'getColor'
})
});
}
}, {
key: "renderLayer",
value: function renderLayer(opts) {
var data = opts.data,
gpuFilter = opts.gpuFilter,
objectHovered = opts.objectHovered,
interactionConfig = opts.interactionConfig,
dataset = opts.dataset;
var layerProps = {
widthScale: this.config.visConfig.thickness * _constants.PROJECTED_PIXEL_SIZE_MULTIPLIER,
elevationScale: this.config.visConfig.elevationScale
};
var updateTriggers = _objectSpread({
getPosition: this.config.columns,
getFilterValue: gpuFilter.filterValueUpdateTriggers,
getFiltered: this.filteredIndexTrigger
}, this.getVisualChannelUpdateTriggers());
var defaultLayerProps = this.getDefaultDeckLayerProps(opts);
var hoveredObject = this.hasHoveredObject(objectHovered);
var useArrowLayer = Boolean(this.geoArrowVector0);
var LineLayerClass = _deckglLayers.EnhancedLineLayer;
var experimentalPropOverrides = {};
if (useArrowLayer) {
LineLayerClass = _deckglArrowLayers.GeoArrowArcLayer;
experimentalPropOverrides = {
data: dataset.dataContainer.getTable(),
getSourcePosition: this.geoArrowVector0,
getTargetPosition: this.geoArrowVector1
};
}
return [
// base layer
new LineLayerClass(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, defaultLayerProps), this.getBrushingExtensionProps(interactionConfig, 'source_target')), data), experimentalPropOverrides), layerProps), {}, {
updateTriggers: updateTriggers,
extensions: [].concat((0, _toConsumableArray2["default"])(defaultLayerProps.extensions), [brushingExtension], (0, _toConsumableArray2["default"])(useArrowLayer ? [arrowCPUFilterExtension] : [])),
_subLayerProps: {
'geo-arrow-arc-layer': {
type: _deckglLayers.EnhancedLineLayer
}
}
}))].concat((0, _toConsumableArray2["default"])(hoveredObject ? [new _deckglLayers.EnhancedLineLayer(_objectSpread(_objectSpread(_objectSpread({}, this.getDefaultHoverLayerProps()), layerProps), {}, {
data: [hoveredObject],
getColor: this.config.highlightColor,
getTargetColor: this.config.highlightColor,
getWidth: data.getWidth
}))] : []));
}
}, {
key: "getLegendVisualChannels",
value: function getLegendVisualChannels() {
var _channels$sourceColor;
var channels = this.visualChannels;
if ((_channels$sourceColor = channels.sourceColor) !== null && _channels$sourceColor !== void 0 && _channels$sourceColor.field && this.config[channels.sourceColor.field]) {
// Remove targetColor to avoid duplicate legend
channels = _objectSpread({}, channels);
delete channels.targetColor;
}
return channels;
}
}], [{
key: "findDefaultLayerProps",
value: function findDefaultLayerProps(_ref2) {
var _ref2$fieldPairs = _ref2.fieldPairs,
fieldPairs = _ref2$fieldPairs === void 0 ? [] : _ref2$fieldPairs;
if (fieldPairs.length < 2) {
return {
props: []
};
}
var defaultAltColumn = {
value: null,
fieldIdx: -1,
optional: true
};
var props = {
// connect the first two point layer with line
// TODO: fill default columns by parsing supported_column_modes
columns: {
lat0: fieldPairs[0].pair.lat,
lng0: fieldPairs[0].pair.lng,
alt0: fieldPairs[0].pair.altitude ? _objectSpread(_objectSpread({}, defaultAltColumn), fieldPairs[0].pair.altitude) : _objectSpread({}, defaultAltColumn),
lat1: fieldPairs[1].pair.lat,
lng1: fieldPairs[1].pair.lng,
alt1: fieldPairs[1].pair.altitude ? _objectSpread(_objectSpread({}, defaultAltColumn), fieldPairs[1].pair.altitude) : _objectSpread({}, defaultAltColumn),
lat: _objectSpread({}, defaultAltColumn),
lng: _objectSpread({}, defaultAltColumn),
alt: _objectSpread({}, defaultAltColumn),
neighbors: _objectSpread({}, defaultAltColumn),
geoarrow0: _objectSpread({}, defaultAltColumn),
geoarrow1: _objectSpread({}, defaultAltColumn)
},
label: "".concat(fieldPairs[0].defaultName, " -> ").concat(fieldPairs[1].defaultName, " line"),
isVisible: false
};
return {
props: [props]
};
}
}]);
}(_arcLayer["default"]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXh0ZW5zaW9ucyIsInJlcXVpcmUiLCJfZGVja2dsQXJyb3dMYXllcnMiLCJfZGVja2dsTGF5ZXJzIiwiX2xpbmVMYXllckljb24iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX2FyY0xheWVyIiwiX2NvbnN0YW50cyIsIl91dGlscyIsIl9jYWxsU3VwZXIiLCJ0IiwibyIsImUiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwiX3N1cGVyUHJvcEdldCIsInIiLCJwIiwiX2dldDIiLCJvd25LZXlzIiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImxpbmVSZXF1aXJlZENvbHVtbnMiLCJleHBvcnRzIiwibGluZU9wdGlvbmFsQ29sdW1ucyIsIm5laWdoYm9yUmVxdWlyZWRDb2x1bW5zIiwibmVpZ2hib3JPcHRpb25hbENvbHVtbnMiLCJnZW9hcnJvd1JlcXVpcmVkQ29sdW1ucyIsImxpbmVDb2x1bW5MYWJlbHMiLCJsYXQwIiwibG5nMCIsImxhdDEiLCJsbmcxIiwiYWx0MCIsImFsdDEiLCJsaW5lVmlzQ29uZmlncyIsIm9wYWNpdHkiLCJ0aGlja25lc3MiLCJjb2xvclJhbmdlIiwic2l6ZVJhbmdlIiwidGFyZ2V0Q29sb3IiLCJlbGV2YXRpb25TY2FsZSIsIkxBWUVSX1ZJU19DT05GSUdTIiwiZGVmYXVsdFZhbHVlIiwiQ09MVU1OX01PREVfUE9JTlRTIiwiQ09MVU1OX01PREVfTkVJR0hCT1JTIiwiQ09MVU1OX01PREVfR0VPQVJST1ciLCJTVVBQT1JURURfQ09MVU1OX01PREVTIiwia2V5IiwibGFiZWwiLCJyZXF1aXJlZENvbHVtbnMiLCJvcHRpb25hbENvbHVtbnMiLCJicnVzaGluZ0V4dGVuc2lvbiIsIkJydXNoaW5nRXh0ZW5zaW9uIiwiYXJyb3dDUFVGaWx0ZXJFeHRlbnNpb24iLCJGaWx0ZXJBcnJvd0V4dGVuc2lvbiIsImxpbmVQb3NBY2Nlc3NvciIsIl9yZWYiLCJjb2x1bW5Nb2RlIiwibGF0IiwibG5nIiwiYWx0IiwiZ2VvYXJyb3cwIiwiZ2VvYXJyb3cxIiwiZGMiLCJkIiwic3RhcnQiLCJ2YWx1ZUF0IiwiaW5kZXgiLCJmaWVsZElkeCIsImVuZCIsImdldCIsInN0YXJ0UG9zIiwibWF5YmVIZXhUb0dlbyIsImVuZFBvcyIsIkxpbmVMYXllciIsIl9BcmNMYXllciIsInByb3BzIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRQb3NpdGlvbkFjY2Vzc29yIiwiZGF0YUNvbnRhaW5lciIsImNvbmZpZyIsImNvbHVtbnMiLCJfaW5oZXJpdHMyIiwiX2NyZWF0ZUNsYXNzMiIsIkxpbmVMYXllckljb24iLCJkZWZhdWx0TGlua0NvbHVtblBhaXJzIiwidmlzdWFsQ2hhbm5lbHMiLCJzb3VyY2VDb2xvciIsImFjY2Vzc29yIiwidmFsdWUiLCJyZW5kZXJMYXllciIsIm9wdHMiLCJkYXRhIiwiZ3B1RmlsdGVyIiwib2JqZWN0SG92ZXJlZCIsImludGVyYWN0aW9uQ29uZmlnIiwiZGF0YXNldCIsImxheWVyUHJvcHMiLCJ3aWR0aFNjYWxlIiwidmlzQ29uZmlnIiwiUFJPSkVDVEVEX1BJWEVMX1NJWkVfTVVMVElQTElFUiIsInVwZGF0ZVRyaWdnZXJzIiwiZ2V0UG9zaXRpb24iLCJnZXRGaWx0ZXJWYWx1ZSIsImZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnMiLCJnZXRGaWx0ZXJlZCIsImZpbHRlcmVkSW5kZXhUcmlnZ2VyIiwiZ2V0VmlzdWFsQ2hhbm5lbFVwZGF0ZVRyaWdnZXJzIiwiZGVmYXVsdExheWVyUHJvcHMiLCJnZXREZWZhdWx0RGVja0xheWVyUHJvcHMiLCJob3ZlcmVkT2JqZWN0IiwiaGFzSG92ZXJlZE9iamVjdCIsInVzZUFycm93TGF5ZXIiLCJnZW9BcnJvd1ZlY3RvcjAiLCJMaW5lTGF5ZXJDbGFzcyIsIkVuaGFuY2VkTGluZUxheWVyIiwiZXhwZXJpbWVudGFsUHJvcE92ZXJyaWRlcyIsIkdlb0Fycm93QXJjTGF5ZXIiLCJnZXRUYWJsZSIsImdldFNvdXJjZVBvc2l0aW9uIiwiZ2V0VGFyZ2V0UG9zaXRpb24iLCJnZW9BcnJvd1ZlY3RvcjEiLCJnZXRCcnVzaGluZ0V4dGVuc2lvblByb3BzIiwiZXh0ZW5zaW9ucyIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJfc3ViTGF5ZXJQcm9wcyIsInR5cGUiLCJnZXREZWZhdWx0SG92ZXJMYXllclByb3BzIiwiZ2V0Q29sb3IiLCJoaWdobGlnaHRDb2xvciIsImdldFRhcmdldENvbG9yIiwiZ2V0V2lkdGgiLCJnZXRMZWdlbmRWaXN1YWxDaGFubmVscyIsIl9jaGFubmVscyRzb3VyY2VDb2xvciIsImNoYW5uZWxzIiwiZmllbGQiLCJmaW5kRGVmYXVsdExheWVyUHJvcHMiLCJfcmVmMiIsIl9yZWYyJGZpZWxkUGFpcnMiLCJmaWVsZFBhaXJzIiwiZGVmYXVsdEFsdENvbHVtbiIsIm9wdGlvbmFsIiwicGFpciIsImFsdGl0dWRlIiwibmVpZ2hib3JzIiwiZGVmYXVsdE5hbWUiLCJpc1Zpc2libGUiLCJBcmNMYXllciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saW5lLWxheWVyL2xpbmUtbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcblxuaW1wb3J0IHtCcnVzaGluZ0V4dGVuc2lvbn0gZnJvbSAnQGRlY2suZ2wvZXh0ZW5zaW9ucyc7XG5cbmltcG9ydCB7R2VvQXJyb3dBcmNMYXllcn0gZnJvbSAnQGtlcGxlci5nbC9kZWNrZ2wtYXJyb3ctbGF5ZXJzJztcbmltcG9ydCB7RmlsdGVyQXJyb3dFeHRlbnNpb259IGZyb20gJ0BrZXBsZXIuZ2wvZGVja2dsLWxheWVycyc7XG5pbXBvcnQge0VuaGFuY2VkTGluZUxheWVyfSBmcm9tICdAa2VwbGVyLmdsL2RlY2tnbC1sYXllcnMnO1xuaW1wb3J0IExpbmVMYXllckljb24gZnJvbSAnLi9saW5lLWxheWVyLWljb24nO1xuaW1wb3J0IHtWaXN1YWxDaGFubmVsfSBmcm9tICcuLi9iYXNlLWxheWVyJztcbmltcG9ydCBBcmNMYXllciwge0FyY0xheWVyQ29uZmlnfSBmcm9tICcuLi9hcmMtbGF5ZXIvYXJjLWxheWVyJztcbmltcG9ydCB7TEFZRVJfVklTX0NPTkZJR1MsIFBST0pFQ1RFRF9QSVhFTF9TSVpFX01VTFRJUExJRVJ9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIENvbG9yUmFuZ2UsXG4gIE1lcmdlLFxuICBSR0JDb2xvcixcbiAgVmlzQ29uZmlnQ29sb3JSYW5nZSxcbiAgVmlzQ29uZmlnQ29sb3JTZWxlY3QsXG4gIFZpc0NvbmZpZ051bWJlcixcbiAgVmlzQ29uZmlnUmFuZ2UsXG4gIExheWVyQ29sdW1uXG59IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtkZWZhdWx0IGFzIEtlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZSwgbWF5YmVIZXhUb0dlb30gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmV4cG9ydCB0eXBlIExpbmVMYXllclZpc0NvbmZpZ1NldHRpbmdzID0ge1xuICBvcGFjaXR5OiBWaXNDb25maWdOdW1iZXI7XG4gIHRoaWNrbmVzczogVmlzQ29uZmlnTnVtYmVyO1xuICBjb2xvclJhbmdlOiBWaXNDb25maWdDb2xvclJhbmdlO1xuICBzaXplUmFuZ2U6IFZpc0NvbmZpZ1JhbmdlO1xuICB0YXJnZXRDb2xvcjogVmlzQ29uZmlnQ29sb3JTZWxlY3Q7XG4gIGVsZXZhdGlvblNjYWxlOiBWaXNDb25maWdOdW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBMaW5lTGF5ZXJDb2x1bW5zQ29uZmlnID0ge1xuICAvLyBDT0xVTU5fTU9ERV9QT0lOVFMgcmVxdWlyZWQgY29sdW1uc1xuICBsYXQwOiBMYXllckNvbHVtbjtcbiAgbG5nMDogTGF5ZXJDb2x1bW47XG4gIGxhdDE6IExheWVyQ29sdW1uO1xuICBsbmcxOiBMYXllckNvbHVtbjtcbiAgYWx0MD86IExheWVyQ29sdW1uO1xuICBhbHQxPzogTGF5ZXJDb2x1bW47XG5cbiAgLy8gQ09MVU1OX01PREVfTkVJR0hCT1JTIHJlcXVpcmVkIGNvbHVtbnNcbiAgbGF0OiBMYXllckNvbHVtbjtcbiAgbG5nOiBMYXllckNvbHVtbjtcbiAgYWx0OiBMYXllckNvbHVtbjtcbiAgbmVpZ2hib3JzOiBMYXllckNvbHVtbjtcblxuICAvLyBDT0xVTU5fTU9ERV9HRU9BUlJPV1xuICBnZW9hcnJvdzA6IExheWVyQ29sdW1uO1xuICBnZW9hcnJvdzE6IExheWVyQ29sdW1uO1xufTtcblxuZXhwb3J0IHR5cGUgTGluZUxheWVyVmlzQ29uZmlnID0ge1xuICBjb2xvclJhbmdlOiBDb2xvclJhbmdlO1xuICBvcGFjaXR5OiBudW1iZXI7XG4gIHNpemVSYW5nZTogW251bWJlciwgbnVtYmVyXTtcbiAgdGFyZ2V0Q29sb3I6IFJHQkNvbG9yO1xuICB0aGlja25lc3M6IG51bWJlcjtcbiAgZWxldmF0aW9uU2NhbGU6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIExpbmVMYXllckNvbmZpZyA9IE1lcmdlPFxuICBBcmNMYXllckNvbmZpZyxcbiAge2NvbHVtbnM6IExpbmVMYXllckNvbHVtbnNDb25maWc7IHZpc0NvbmZpZzogTGluZUxheWVyVmlzQ29uZmlnfVxuPjtcblxuZXhwb3J0IGNvbnN0IGxpbmVSZXF1aXJlZENvbHVtbnM6IFsnbGF0MCcsICdsbmcwJywgJ2xhdDEnLCAnbG5nMSddID0gW1xuICAnbGF0MCcsXG4gICdsbmcwJyxcbiAgJ2xhdDEnLFxuICAnbG5nMSdcbl07XG5leHBvcnQgY29uc3QgbGluZU9wdGlvbmFsQ29sdW1uczogWydhbHQwJywgJ2FsdDEnXSA9IFsnYWx0MCcsICdhbHQxJ107XG5leHBvcnQgY29uc3QgbmVpZ2hib3JSZXF1aXJlZENvbHVtbnMgPSBbJ2xhdCcsICdsbmcnLCAnbmVpZ2hib3JzJ107XG5leHBvcnQgY29uc3QgbmVpZ2hib3JPcHRpb25hbENvbHVtbnMgPSBbJ2FsdCddO1xuZXhwb3J0IGNvbnN0IGdlb2Fycm93UmVxdWlyZWRDb2x1bW5zID0gWydnZW9hcnJvdzAnLCAnZ2VvYXJyb3cxJ107XG5cbmV4cG9ydCBjb25zdCBsaW5lQ29sdW1uTGFiZWxzID0ge1xuICBsYXQwOiAnYXJjLmxhdDAnLFxuICBsbmcwOiAnYXJjLmxuZzAnLFxuICBsYXQxOiAnYXJjLmxhdDEnLFxuICBsbmcxOiAnYXJjLmxuZzEnLFxuICBhbHQwOiAnbGluZS5hbHQwJyxcbiAgYWx0MTogJ2xpbmUuYWx0MSdcbn07XG5cbmV4cG9ydCBjb25zdCBsaW5lVmlzQ29uZmlnczoge1xuICBvcGFjaXR5OiAnb3BhY2l0eSc7XG4gIHRoaWNrbmVzczogJ3RoaWNrbmVzcyc7XG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJztcbiAgc2l6ZVJhbmdlOiAnc3Ryb2tlV2lkdGhSYW5nZSc7XG4gIHRhcmdldENvbG9yOiAndGFyZ2V0Q29sb3InO1xuICBlbGV2YXRpb25TY2FsZTogVmlzQ29uZmlnTnVtYmVyO1xufSA9IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICB0aGlja25lc3M6ICd0aGlja25lc3MnLFxuICBjb2xvclJhbmdlOiAnY29sb3JSYW5nZScsXG4gIHNpemVSYW5nZTogJ3N0cm9rZVdpZHRoUmFuZ2UnLFxuICB0YXJnZXRDb2xvcjogJ3RhcmdldENvbG9yJyxcbiAgZWxldmF0aW9uU2NhbGU6IHtcbiAgICAuLi5MQVlFUl9WSVNfQ09ORklHUy5lbGV2YXRpb25TY2FsZSxcbiAgICBkZWZhdWx0VmFsdWU6IDFcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IENPTFVNTl9NT0RFX1BPSU5UUyA9ICdwb2ludHMnO1xuZXhwb3J0IGNvbnN0IENPTFVNTl9NT0RFX05FSUdIQk9SUyA9ICduZWlnaGJvcnMnO1xuZXhwb3J0IGNvbnN0IENPTFVNTl9NT0RFX0dFT0FSUk9XID0gJ2dlb2Fycm93JztcbmNvbnN0IFNVUFBPUlRFRF9DT0xVTU5fTU9ERVMgPSBbXG4gIHtcbiAgICBrZXk6IENPTFVNTl9NT0RFX1BPSU5UUyxcbiAgICBsYWJlbDogJ1BvaW50cycsXG4gICAgcmVxdWlyZWRDb2x1bW5zOiBsaW5lUmVxdWlyZWRDb2x1bW5zLFxuICAgIG9wdGlvbmFsQ29sdW1uczogbGluZU9wdGlvbmFsQ29sdW1uc1xuICB9LFxuICB7XG4gICAga2V5OiBDT0xVTU5fTU9ERV9ORUlHSEJPUlMsXG4gICAgbGFiZWw6ICdQb2ludCBhbmQgTmVpZ2hib3JzJyxcbiAgICByZXF1aXJlZENvbHVtbnM6IG5laWdoYm9yUmVxdWlyZWRDb2x1bW5zLFxuICAgIG9wdGlvbmFsQ29sdW1uczogbmVpZ2hib3JPcHRpb25hbENvbHVtbnNcbiAgfSxcbiAge1xuICAgIGtleTogQ09MVU1OX01PREVfR0VPQVJST1csXG4gICAgbGFiZWw6ICdHZW9hcnJvdyBQb2ludHMnLFxuICAgIHJlcXVpcmVkQ29sdW1uczogZ2VvYXJyb3dSZXF1aXJlZENvbHVtbnNcbiAgfVxuXTtcblxuY29uc3QgYnJ1c2hpbmdFeHRlbnNpb24gPSBuZXcgQnJ1c2hpbmdFeHRlbnNpb24oKTtcbmNvbnN0IGFycm93Q1BVRmlsdGVyRXh0ZW5zaW9uID0gbmV3IEZpbHRlckFycm93RXh0ZW5zaW9uKCk7XG5cbmV4cG9ydCBjb25zdCBsaW5lUG9zQWNjZXNzb3IgPVxuICAoXG4gICAge1xuICAgICAgbGF0MCxcbiAgICAgIGxuZzAsXG4gICAgICBsYXQxLFxuICAgICAgbG5nMSxcbiAgICAgIGFsdDAsXG4gICAgICBhbHQxLFxuICAgICAgbGF0LFxuICAgICAgbG5nLFxuICAgICAgYWx0LFxuICAgICAgZ2VvYXJyb3cwLFxuICAgICAgZ2VvYXJyb3cxXG4gICAgfTogTGluZUxheWVyQ29sdW1uc0NvbmZpZyxcbiAgICBjb2x1bW5Nb2RlXG4gICkgPT5cbiAgKGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKSA9PiB7XG4gICAgc3dpdGNoIChjb2x1bW5Nb2RlKSB7XG4gICAgICBjYXNlIENPTFVNTl9NT0RFX0dFT0FSUk9XOlxuICAgICAgICByZXR1cm4gZCA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPSBkYy52YWx1ZUF0KGQuaW5kZXgsIGdlb2Fycm93MC5maWVsZElkeCk7XG4gICAgICAgICAgY29uc3QgZW5kID0gZGMudmFsdWVBdChkLmluZGV4LCBnZW9hcnJvdzEuZmllbGRJZHgpO1xuICAgICAgICAgIHJldHVybiBbc3RhcnQuZ2V0KDApLCBzdGFydC5nZXQoMSksIDAsIGVuZC5nZXQoMiksIGVuZC5nZXQoMyksIDBdO1xuICAgICAgICB9O1xuICAgICAgY2FzZSBDT0xVTU5fTU9ERV9ORUlHSEJPUlM6XG4gICAgICAgIHJldHVybiBkID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFydFBvcyA9IG1heWJlSGV4VG9HZW8oZGMsIGQsIGxhdCwgbG5nKTtcbiAgICAgICAgICAvLyBvbmx5IHJldHVybiBzb3VyY2UgcG9pbnQgaWYgY29sdW1uTW9kZSBpcyBDT0xVTU5fTU9ERV9ORUlHSEJPUlNcblxuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBzdGFydFBvcyA/IHN0YXJ0UG9zWzBdIDogZGMudmFsdWVBdChkLmluZGV4LCBsbmcuZmllbGRJZHgpLFxuICAgICAgICAgICAgc3RhcnRQb3MgPyBzdGFydFBvc1sxXSA6IGRjLnZhbHVlQXQoZC5pbmRleCwgbGF0LmZpZWxkSWR4KSxcbiAgICAgICAgICAgIGFsdD8uZmllbGRJZHggPiAtMSA/IGRjLnZhbHVlQXQoZC5pbmRleCwgYWx0LmZpZWxkSWR4KSA6IDBcbiAgICAgICAgICBdO1xuICAgICAgICB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gQ09MVU1OX01PREVfUE9JTlRTXG4gICAgICAgIHJldHVybiBkID0+IHtcbiAgICAgICAgICAvLyBsYXQgb3IgbG5nIGNvbHVtbiBjb3VsZCBiZSBoZXggY29sdW1uXG4gICAgICAgICAgLy8gd2UgYXNzdW1lIHN0cmluZyB2YWx1ZSBpcyBoZXggYW5kIHRyeSB0byBjb252ZXJ0IGl0IHRvIGdlbyBsYXQgbG5nXG4gICAgICAgICAgY29uc3Qgc3RhcnRQb3MgPSBtYXliZUhleFRvR2VvKGRjLCBkLCBsYXQwLCBsbmcwKTtcbiAgICAgICAgICBjb25zdCBlbmRQb3MgPSBtYXliZUhleFRvR2VvKGRjLCBkLCBsYXQxLCBsbmcxKTtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgc3RhcnRQb3MgPyBzdGFydFBvc1swXSA6IGRjLnZhbHVlQXQoZC5pbmRleCwgbG5nMC5maWVsZElkeCksXG4gICAgICAgICAgICBzdGFydFBvcyA/IHN0YXJ0UG9zWzFdIDogZGMudmFsdWVBdChkLmluZGV4LCBsYXQwLmZpZWxkSWR4KSxcbiAgICAgICAgICAgIGFsdDAgJiYgYWx0MC5maWVsZElkeCA+IC0xID8gZGMudmFsdWVBdChkLmluZGV4LCBhbHQwLmZpZWxkSWR4KSA6IDAsXG4gICAgICAgICAgICBlbmRQb3MgPyBlbmRQb3NbMF0gOiBkYy52YWx1ZUF0KGQuaW5kZXgsIGxuZzEuZmllbGRJZHgpLFxuICAgICAgICAgICAgZW5kUG9zID8gZW5kUG9zWzFdIDogZGMudmFsdWVBdChkLmluZGV4LCBsYXQxLmZpZWxkSWR4KSxcbiAgICAgICAgICAgIGFsdDEgJiYgYWx0MT8uZmllbGRJZHggPiAtMSA/IGRjLnZhbHVlQXQoZC5pbmRleCwgYWx0MS5maWVsZElkeCkgOiAwXG4gICAgICAgICAgXTtcbiAgICAgICAgfTtcbiAgICB9XG4gIH07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpbmVMYXllciBleHRlbmRzIEFyY0xheWVyIHtcbiAgZGVjbGFyZSB2aXNDb25maWdTZXR0aW5nczogTGluZUxheWVyVmlzQ29uZmlnU2V0dGluZ3M7XG4gIGRlY2xhcmUgY29uZmlnOiBMaW5lTGF5ZXJDb25maWc7XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyVmlzQ29uZmlnKGxpbmVWaXNDb25maWdzKTtcbiAgICB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IgPSAoZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT5cbiAgICAgIGxpbmVQb3NBY2Nlc3Nvcih0aGlzLmNvbmZpZy5jb2x1bW5zLCB0aGlzLmNvbmZpZy5jb2x1bW5Nb2RlKShkYXRhQ29udGFpbmVyKTtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnbGluZSc7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBMaW5lTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IGNvbHVtbkxhYmVscygpIHtcbiAgICByZXR1cm4gbGluZUNvbHVtbkxhYmVscztcbiAgfVxuXG4gIGdldCBjb2x1bW5QYWlycygpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0TGlua0NvbHVtblBhaXJzO1xuICB9XG5cbiAgZ2V0IHN1cHBvcnRlZENvbHVtbk1vZGVzKCkge1xuICAgIHJldHVybiBTVVBQT1JURURfQ09MVU1OX01PREVTO1xuICB9XG5cbiAgZ2V0IHZpc3VhbENoYW5uZWxzKCkge1xuICAgIGNvbnN0IHZpc3VhbENoYW5uZWxzID0gc3VwZXIudmlzdWFsQ2hhbm5lbHM7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZpc3VhbENoYW5uZWxzLFxuICAgICAgc291cmNlQ29sb3I6IHtcbiAgICAgICAgLi4udmlzdWFsQ2hhbm5lbHMuc291cmNlQ29sb3IsXG4gICAgICAgIGFjY2Vzc29yOiAnZ2V0Q29sb3InXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBmaW5kRGVmYXVsdExheWVyUHJvcHMoe2ZpZWxkUGFpcnMgPSBbXX06IEtlcGxlclRhYmxlKToge1xuICAgIHByb3BzOiB7Y29sb3I/OiBSR0JDb2xvcjsgY29sdW1uczogTGluZUxheWVyQ29sdW1uc0NvbmZpZzsgbGFiZWw6IHN0cmluZ31bXTtcbiAgfSB7XG4gICAgaWYgKGZpZWxkUGFpcnMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIHtwcm9wczogW119O1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRBbHRDb2x1bW4gPSB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgb3B0aW9uYWw6IHRydWV9O1xuICAgIGNvbnN0IHByb3BzOiB7Y29sdW1uczogTGluZUxheWVyQ29sdW1uc0NvbmZpZzsgbGFiZWw6IHN0cmluZzsgaXNWaXNpYmxlOiBib29sZWFufSA9IHtcbiAgICAgIC8vIGNvbm5lY3QgdGhlIGZpcnN0IHR3byBwb2ludCBsYXllciB3aXRoIGxpbmVcbiAgICAgIC8vIFRPRE86IGZpbGwgZGVmYXVsdCBjb2x1bW5zIGJ5IHBhcnNpbmcgc3VwcG9ydGVkX2NvbHVtbl9tb2Rlc1xuICAgICAgY29sdW1uczoge1xuICAgICAgICBsYXQwOiBmaWVsZFBhaXJzWzBdLnBhaXIubGF0LFxuICAgICAgICBsbmcwOiBmaWVsZFBhaXJzWzBdLnBhaXIubG5nLFxuICAgICAgICBhbHQwOiBmaWVsZFBhaXJzWzBdLnBhaXIuYWx0aXR1ZGVcbiAgICAgICAgICA/IHsuLi5kZWZhdWx0QWx0Q29sdW1uLCAuLi5maWVsZFBhaXJzWzBdLnBhaXIuYWx0aXR1ZGV9XG4gICAgICAgICAgOiB7Li4uZGVmYXVsdEFsdENvbHVtbn0sXG4gICAgICAgIGxhdDE6IGZpZWxkUGFpcnNbMV0ucGFpci5sYXQsXG4gICAgICAgIGxuZzE6IGZpZWxkUGFpcnNbMV0ucGFpci5sbmcsXG4gICAgICAgIGFsdDE6IGZpZWxkUGFpcnNbMV0ucGFpci5hbHRpdHVkZVxuICAgICAgICAgID8gey4uLmRlZmF1bHRBbHRDb2x1bW4sIC4uLmZpZWxkUGFpcnNbMV0ucGFpci5hbHRpdHVkZX1cbiAgICAgICAgICA6IHsuLi5kZWZhdWx0QWx0Q29sdW1ufSxcbiAgICAgICAgbGF0OiB7Li4uZGVmYXVsdEFsdENvbHVtbn0sXG4gICAgICAgIGxuZzogey4uLmRlZmF1bHRBbHRDb2x1bW59LFxuICAgICAgICBhbHQ6IHsuLi5kZWZhdWx0QWx0Q29sdW1ufSxcbiAgICAgICAgbmVpZ2hib3JzOiB7Li4uZGVmYXVsdEFsdENvbHVtbn0sXG4gICAgICAgIGdlb2Fycm93MDogey4uLmRlZmF1bHRBbHRDb2x1bW59LFxuICAgICAgICBnZW9hcnJvdzE6IHsuLi5kZWZhdWx0QWx0Q29sdW1ufVxuICAgICAgfSxcbiAgICAgIGxhYmVsOiBgJHtmaWVsZFBhaXJzWzBdLmRlZmF1bHROYW1lfSAtPiAke2ZpZWxkUGFpcnNbMV0uZGVmYXVsdE5hbWV9IGxpbmVgLFxuICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgIH07XG5cbiAgICByZXR1cm4ge3Byb3BzOiBbcHJvcHNdfTtcbiAgfVxuXG4gIHJlbmRlckxheWVyKG9wdHMpIHtcbiAgICBjb25zdCB7ZGF0YSwgZ3B1RmlsdGVyLCBvYmplY3RIb3ZlcmVkLCBpbnRlcmFjdGlvbkNvbmZpZywgZGF0YXNldH0gPSBvcHRzO1xuXG4gICAgY29uc3QgbGF5ZXJQcm9wcyA9IHtcbiAgICAgIHdpZHRoU2NhbGU6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy50aGlja25lc3MgKiBQUk9KRUNURURfUElYRUxfU0laRV9NVUxUSVBMSUVSLFxuICAgICAgZWxldmF0aW9uU2NhbGU6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5lbGV2YXRpb25TY2FsZVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHtcbiAgICAgIGdldFBvc2l0aW9uOiB0aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgZ2V0RmlsdGVyVmFsdWU6IGdwdUZpbHRlci5maWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzLFxuICAgICAgZ2V0RmlsdGVyZWQ6IHRoaXMuZmlsdGVyZWRJbmRleFRyaWdnZXIsXG4gICAgICAuLi50aGlzLmdldFZpc3VhbENoYW5uZWxVcGRhdGVUcmlnZ2VycygpXG4gICAgfTtcbiAgICBjb25zdCBkZWZhdWx0TGF5ZXJQcm9wcyA9IHRoaXMuZ2V0RGVmYXVsdERlY2tMYXllclByb3BzKG9wdHMpO1xuICAgIGNvbnN0IGhvdmVyZWRPYmplY3QgPSB0aGlzLmhhc0hvdmVyZWRPYmplY3Qob2JqZWN0SG92ZXJlZCk7XG5cbiAgICBjb25zdCB1c2VBcnJvd0xheWVyID0gQm9vbGVhbih0aGlzLmdlb0Fycm93VmVjdG9yMCk7XG5cbiAgICBsZXQgTGluZUxheWVyQ2xhc3M6IHR5cGVvZiBFbmhhbmNlZExpbmVMYXllciB8IHR5cGVvZiBHZW9BcnJvd0FyY0xheWVyID0gRW5oYW5jZWRMaW5lTGF5ZXI7XG4gICAgbGV0IGV4cGVyaW1lbnRhbFByb3BPdmVycmlkZXM6IHtcbiAgICAgIGRhdGE/OiBhcnJvdy5UYWJsZTtcbiAgICAgIGdldFNvdXJjZVBvc2l0aW9uPzogYXJyb3cuVmVjdG9yO1xuICAgICAgZ2V0VGFyZ2V0UG9zaXRpb24/OiBhcnJvdy5WZWN0b3I7XG4gICAgfSA9IHt9O1xuXG4gICAgaWYgKHVzZUFycm93TGF5ZXIpIHtcbiAgICAgIExpbmVMYXllckNsYXNzID0gR2VvQXJyb3dBcmNMYXllcjtcbiAgICAgIGV4cGVyaW1lbnRhbFByb3BPdmVycmlkZXMgPSB7XG4gICAgICAgIGRhdGE6IGRhdGFzZXQuZGF0YUNvbnRhaW5lci5nZXRUYWJsZSgpLFxuICAgICAgICBnZXRTb3VyY2VQb3NpdGlvbjogdGhpcy5nZW9BcnJvd1ZlY3RvcjAsXG4gICAgICAgIGdldFRhcmdldFBvc2l0aW9uOiB0aGlzLmdlb0Fycm93VmVjdG9yMVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAgLy8gYmFzZSBsYXllclxuICAgICAgbmV3IExpbmVMYXllckNsYXNzKHtcbiAgICAgICAgLi4uZGVmYXVsdExheWVyUHJvcHMsXG4gICAgICAgIC4uLnRoaXMuZ2V0QnJ1c2hpbmdFeHRlbnNpb25Qcm9wcyhpbnRlcmFjdGlvbkNvbmZpZywgJ3NvdXJjZV90YXJnZXQnKSxcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgLi4uZXhwZXJpbWVudGFsUHJvcE92ZXJyaWRlcyxcbiAgICAgICAgLi4ubGF5ZXJQcm9wcyxcbiAgICAgICAgdXBkYXRlVHJpZ2dlcnMsXG4gICAgICAgIGV4dGVuc2lvbnM6IFtcbiAgICAgICAgICAuLi5kZWZhdWx0TGF5ZXJQcm9wcy5leHRlbnNpb25zLFxuICAgICAgICAgIGJydXNoaW5nRXh0ZW5zaW9uLFxuICAgICAgICAgIC4uLih1c2VBcnJvd0xheWVyID8gW2Fycm93Q1BVRmlsdGVyRXh0ZW5zaW9uXSA6IFtdKVxuICAgICAgICBdLFxuICAgICAgICBfc3ViTGF5ZXJQcm9wczoge1xuICAgICAgICAgICdnZW8tYXJyb3ctYXJjLWxheWVyJzoge1xuICAgICAgICAgICAgdHlwZTogRW5oYW5jZWRMaW5lTGF5ZXJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgLy8gaG92ZXIgbGF5ZXJcbiAgICAgIC4uLihob3ZlcmVkT2JqZWN0XG4gICAgICAgID8gW1xuICAgICAgICAgICAgbmV3IEVuaGFuY2VkTGluZUxheWVyKHtcbiAgICAgICAgICAgICAgLi4udGhpcy5nZXREZWZhdWx0SG92ZXJMYXllclByb3BzKCksXG4gICAgICAgICAgICAgIC4uLmxheWVyUHJvcHMsXG4gICAgICAgICAgICAgIGRhdGE6IFtob3ZlcmVkT2JqZWN0XSxcbiAgICAgICAgICAgICAgZ2V0Q29sb3I6IHRoaXMuY29uZmlnLmhpZ2hsaWdodENvbG9yLFxuICAgICAgICAgICAgICBnZXRUYXJnZXRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAgICAgICAgIGdldFdpZHRoOiBkYXRhLmdldFdpZHRoXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSlcbiAgICBdO1xuICB9XG5cbiAgZ2V0TGVnZW5kVmlzdWFsQ2hhbm5lbHMoKSB7XG4gICAgbGV0IGNoYW5uZWxzOiB7W2tleTogc3RyaW5nXTogVmlzdWFsQ2hhbm5lbH0gPSB0aGlzLnZpc3VhbENoYW5uZWxzO1xuICAgIGlmIChjaGFubmVscy5zb3VyY2VDb2xvcj8uZmllbGQgJiYgdGhpcy5jb25maWdbY2hhbm5lbHMuc291cmNlQ29sb3IuZmllbGRdKSB7XG4gICAgICAvLyBSZW1vdmUgdGFyZ2V0Q29sb3IgdG8gYXZvaWQgZHVwbGljYXRlIGxlZ2VuZFxuICAgICAgY2hhbm5lbHMgPSB7Li4uY2hhbm5lbHN9O1xuICAgICAgZGVsZXRlIGNoYW5uZWxzLnRhcmdldENvbG9yO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbHM7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBS0EsSUFBQUEsV0FBQSxHQUFBQyxPQUFBO0FBRUEsSUFBQUMsa0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGFBQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLGNBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQUVBLElBQUFLLFNBQUEsR0FBQUQsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFNLFVBQUEsR0FBQU4sT0FBQTtBQVlBLElBQUFPLE1BQUEsR0FBQVAsT0FBQTtBQUF1RSxTQUFBUSxXQUFBQyxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxXQUFBRCxDQUFBLE9BQUFFLGdCQUFBLGFBQUFGLENBQUEsT0FBQUcsMkJBQUEsYUFBQUosQ0FBQSxFQUFBSyx5QkFBQSxLQUFBQyxPQUFBLENBQUFDLFNBQUEsQ0FBQU4sQ0FBQSxFQUFBQyxDQUFBLFlBQUFDLGdCQUFBLGFBQUFILENBQUEsRUFBQVEsV0FBQSxJQUFBUCxDQUFBLENBQUFRLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBRSxDQUFBO0FBQUEsU0FBQUcsMEJBQUEsY0FBQUwsQ0FBQSxJQUFBVSxPQUFBLENBQUFDLFNBQUEsQ0FBQUMsT0FBQSxDQUFBQyxJQUFBLENBQUFQLE9BQUEsQ0FBQUMsU0FBQSxDQUFBRyxPQUFBLGlDQUFBVixDQUFBLGFBQUFLLHlCQUFBLFlBQUFBLDBCQUFBLGFBQUFMLENBQUE7QUFBQSxTQUFBYyxjQUFBZCxDQUFBLEVBQUFFLENBQUEsRUFBQWEsQ0FBQSxFQUFBZCxDQUFBLFFBQUFlLENBQUEsT0FBQUMsS0FBQSxpQkFBQWQsZ0JBQUEsaUJBQUFGLENBQUEsR0FBQUQsQ0FBQSxDQUFBVyxTQUFBLEdBQUFYLENBQUEsR0FBQUUsQ0FBQSxFQUFBYSxDQUFBLGNBQUFkLENBQUEsYUFBQUQsQ0FBQSxXQUFBZ0IsQ0FBQSxDQUFBUCxLQUFBLENBQUFNLENBQUEsRUFBQWYsQ0FBQSxPQUFBZ0IsQ0FBQTtBQUFBLFNBQUFFLFFBQUFoQixDQUFBLEVBQUFhLENBQUEsUUFBQWYsQ0FBQSxHQUFBbUIsTUFBQSxDQUFBQyxJQUFBLENBQUFsQixDQUFBLE9BQUFpQixNQUFBLENBQUFFLHFCQUFBLFFBQUFwQixDQUFBLEdBQUFrQixNQUFBLENBQUFFLHFCQUFBLENBQUFuQixDQUFBLEdBQUFhLENBQUEsS0FBQWQsQ0FBQSxHQUFBQSxDQUFBLENBQUFxQixNQUFBLFdBQUFQLENBQUEsV0FBQUksTUFBQSxDQUFBSSx3QkFBQSxDQUFBckIsQ0FBQSxFQUFBYSxDQUFBLEVBQUFTLFVBQUEsT0FBQXhCLENBQUEsQ0FBQXlCLElBQUEsQ0FBQWhCLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBQyxDQUFBLFlBQUFELENBQUE7QUFBQSxTQUFBMEIsY0FBQXhCLENBQUEsYUFBQWEsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFmLENBQUEsV0FBQTJCLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRyxPQUFBLENBQUFDLE1BQUEsQ0FBQW5CLENBQUEsT0FBQTZCLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBNUIsQ0FBQSxFQUFBYSxDQUFBLEVBQUFmLENBQUEsQ0FBQWUsQ0FBQSxTQUFBSSxNQUFBLENBQUFZLHlCQUFBLEdBQUFaLE1BQUEsQ0FBQWEsZ0JBQUEsQ0FBQTlCLENBQUEsRUFBQWlCLE1BQUEsQ0FBQVkseUJBQUEsQ0FBQS9CLENBQUEsS0FBQWtCLE9BQUEsQ0FBQUMsTUFBQSxDQUFBbkIsQ0FBQSxHQUFBNkIsT0FBQSxXQUFBZCxDQUFBLElBQUFJLE1BQUEsQ0FBQWMsY0FBQSxDQUFBL0IsQ0FBQSxFQUFBYSxDQUFBLEVBQUFJLE1BQUEsQ0FBQUksd0JBQUEsQ0FBQXZCLENBQUEsRUFBQWUsQ0FBQSxpQkFBQWIsQ0FBQSxJQXpCdkU7QUFDQTtBQXFFTyxJQUFNZ0MsbUJBQXFELEdBQUFDLE9BQUEsQ0FBQUQsbUJBQUEsR0FBRyxDQUNuRSxNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sRUFDTixNQUFNLENBQ1A7QUFDTSxJQUFNRSxtQkFBcUMsR0FBQUQsT0FBQSxDQUFBQyxtQkFBQSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztBQUM5RCxJQUFNQyx1QkFBdUIsR0FBQUYsT0FBQSxDQUFBRSx1QkFBQSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUM7QUFDM0QsSUFBTUMsdUJBQXVCLEdBQUFILE9BQUEsQ0FBQUcsdUJBQUEsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUN2QyxJQUFNQyx1QkFBdUIsR0FBQUosT0FBQSxDQUFBSSx1QkFBQSxHQUFHLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztBQUUxRCxJQUFNQyxnQkFBZ0IsR0FBQUwsT0FBQSxDQUFBSyxnQkFBQSxHQUFHO0VBQzlCQyxJQUFJLEVBQUUsVUFBVTtFQUNoQkMsSUFBSSxFQUFFLFVBQVU7RUFDaEJDLElBQUksRUFBRSxVQUFVO0VBQ2hCQyxJQUFJLEVBQUUsVUFBVTtFQUNoQkMsSUFBSSxFQUFFLFdBQVc7RUFDakJDLElBQUksRUFBRTtBQUNSLENBQUM7QUFFTSxJQUFNQyxjQU9aLEdBQUFaLE9BQUEsQ0FBQVksY0FBQSxHQUFHO0VBQ0ZDLE9BQU8sRUFBRSxTQUFTO0VBQ2xCQyxTQUFTLEVBQUUsV0FBVztFQUN0QkMsVUFBVSxFQUFFLFlBQVk7RUFDeEJDLFNBQVMsRUFBRSxrQkFBa0I7RUFDN0JDLFdBQVcsRUFBRSxhQUFhO0VBQzFCQyxjQUFjLEVBQUEzQixhQUFBLENBQUFBLGFBQUEsS0FDVDRCLDRCQUFpQixDQUFDRCxjQUFjO0lBQ25DRSxZQUFZLEVBQUU7RUFBQztBQUVuQixDQUFDO0FBRU0sSUFBTUMsa0JBQWtCLEdBQUFyQixPQUFBLENBQUFxQixrQkFBQSxHQUFHLFFBQVE7QUFDbkMsSUFBTUMscUJBQXFCLEdBQUF0QixPQUFBLENBQUFzQixxQkFBQSxHQUFHLFdBQVc7QUFDekMsSUFBTUMsb0JBQW9CLEdBQUF2QixPQUFBLENBQUF1QixvQkFBQSxHQUFHLFVBQVU7QUFDOUMsSUFBTUMsc0JBQXNCLEdBQUcsQ0FDN0I7RUFDRUMsR0FBRyxFQUFFSixrQkFBa0I7RUFDdkJLLEtBQUssRUFBRSxRQUFRO0VBQ2ZDLGVBQWUsRUFBRTVCLG1CQUFtQjtFQUNwQzZCLGVBQWUsRUFBRTNCO0FBQ25CLENBQUMsRUFDRDtFQUNFd0IsR0FBRyxFQUFFSCxxQkFBcUI7RUFDMUJJLEtBQUssRUFBRSxxQkFBcUI7RUFDNUJDLGVBQWUsRUFBRXpCLHVCQUF1QjtFQUN4QzBCLGVBQWUsRUFBRXpCO0FBQ25CLENBQUMsRUFDRDtFQUNFc0IsR0FBRyxFQUFFRixvQkFBb0I7RUFDekJHLEtBQUssRUFBRSxpQkFBaUI7RUFDeEJDLGVBQWUsRUFBRXZCO0FBQ25CLENBQUMsQ0FDRjtBQUVELElBQU15QixpQkFBaUIsR0FBRyxJQUFJQyw2QkFBaUIsQ0FBQyxDQUFDO0FBQ2pELElBQU1DLHVCQUF1QixHQUFHLElBQUlDLGtDQUFvQixDQUFDLENBQUM7QUFFbkQsSUFBTUMsZUFBZSxHQUFBakMsT0FBQSxDQUFBaUMsZUFBQSxHQUMxQixTQURXQSxlQUFlQSxDQUFBQyxJQUFBLEVBZXhCQyxVQUFVO0VBQUEsSUFaUjdCLElBQUksR0FBQTRCLElBQUEsQ0FBSjVCLElBQUk7SUFDSkMsSUFBSSxHQUFBMkIsSUFBQSxDQUFKM0IsSUFBSTtJQUNKQyxJQUFJLEdBQUEwQixJQUFBLENBQUoxQixJQUFJO0lBQ0pDLElBQUksR0FBQXlCLElBQUEsQ0FBSnpCLElBQUk7SUFDSkMsSUFBSSxHQUFBd0IsSUFBQSxDQUFKeEIsSUFBSTtJQUNKQyxJQUFJLEdBQUF1QixJQUFBLENBQUp2QixJQUFJO0lBQ0p5QixHQUFHLEdBQUFGLElBQUEsQ0FBSEUsR0FBRztJQUNIQyxHQUFHLEdBQUFILElBQUEsQ0FBSEcsR0FBRztJQUNIQyxHQUFHLEdBQUFKLElBQUEsQ0FBSEksR0FBRztJQUNIQyxTQUFTLEdBQUFMLElBQUEsQ0FBVEssU0FBUztJQUNUQyxTQUFTLEdBQUFOLElBQUEsQ0FBVE0sU0FBUztFQUFBLE9BSWIsVUFBQ0MsRUFBMEIsRUFBSztJQUM5QixRQUFRTixVQUFVO01BQ2hCLEtBQUtaLG9CQUFvQjtRQUN2QixPQUFPLFVBQUFtQixDQUFDLEVBQUk7VUFDVixJQUFNQyxLQUFLLEdBQUdGLEVBQUUsQ0FBQ0csT0FBTyxDQUFDRixDQUFDLENBQUNHLEtBQUssRUFBRU4sU0FBUyxDQUFDTyxRQUFRLENBQUM7VUFDckQsSUFBTUMsR0FBRyxHQUFHTixFQUFFLENBQUNHLE9BQU8sQ0FBQ0YsQ0FBQyxDQUFDRyxLQUFLLEVBQUVMLFNBQVMsQ0FBQ00sUUFBUSxDQUFDO1VBQ25ELE9BQU8sQ0FBQ0gsS0FBSyxDQUFDSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUVMLEtBQUssQ0FBQ0ssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRUQsR0FBRyxDQUFDQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUVELEdBQUcsQ0FBQ0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDO01BQ0gsS0FBSzFCLHFCQUFxQjtRQUN4QixPQUFPLFVBQUFvQixDQUFDLEVBQUk7VUFDVixJQUFNTyxRQUFRLEdBQUcsSUFBQUMsb0JBQWEsRUFBQ1QsRUFBRSxFQUFFQyxDQUFDLEVBQUVOLEdBQUcsRUFBRUMsR0FBRyxDQUFDO1VBQy9DOztVQUVBLE9BQU8sQ0FDTFksUUFBUSxHQUFHQSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUdSLEVBQUUsQ0FBQ0csT0FBTyxDQUFDRixDQUFDLENBQUNHLEtBQUssRUFBRVIsR0FBRyxDQUFDUyxRQUFRLENBQUMsRUFDMURHLFFBQVEsR0FBR0EsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHUixFQUFFLENBQUNHLE9BQU8sQ0FBQ0YsQ0FBQyxDQUFDRyxLQUFLLEVBQUVULEdBQUcsQ0FBQ1UsUUFBUSxDQUFDLEVBQzFELENBQUFSLEdBQUcsYUFBSEEsR0FBRyx1QkFBSEEsR0FBRyxDQUFFUSxRQUFRLElBQUcsQ0FBQyxDQUFDLEdBQUdMLEVBQUUsQ0FBQ0csT0FBTyxDQUFDRixDQUFDLENBQUNHLEtBQUssRUFBRVAsR0FBRyxDQUFDUSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQzNEO1FBQ0gsQ0FBQztNQUNIO1FBQ0U7UUFDQSxPQUFPLFVBQUFKLENBQUMsRUFBSTtVQUNWO1VBQ0E7VUFDQSxJQUFNTyxRQUFRLEdBQUcsSUFBQUMsb0JBQWEsRUFBQ1QsRUFBRSxFQUFFQyxDQUFDLEVBQUVwQyxJQUFJLEVBQUVDLElBQUksQ0FBQztVQUNqRCxJQUFNNEMsTUFBTSxHQUFHLElBQUFELG9CQUFhLEVBQUNULEVBQUUsRUFBRUMsQ0FBQyxFQUFFbEMsSUFBSSxFQUFFQyxJQUFJLENBQUM7VUFDL0MsT0FBTyxDQUNMd0MsUUFBUSxHQUFHQSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUdSLEVBQUUsQ0FBQ0csT0FBTyxDQUFDRixDQUFDLENBQUNHLEtBQUssRUFBRXRDLElBQUksQ0FBQ3VDLFFBQVEsQ0FBQyxFQUMzREcsUUFBUSxHQUFHQSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUdSLEVBQUUsQ0FBQ0csT0FBTyxDQUFDRixDQUFDLENBQUNHLEtBQUssRUFBRXZDLElBQUksQ0FBQ3dDLFFBQVEsQ0FBQyxFQUMzRHBDLElBQUksSUFBSUEsSUFBSSxDQUFDb0MsUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHTCxFQUFFLENBQUNHLE9BQU8sQ0FBQ0YsQ0FBQyxDQUFDRyxLQUFLLEVBQUVuQyxJQUFJLENBQUNvQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQ25FSyxNQUFNLEdBQUdBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBR1YsRUFBRSxDQUFDRyxPQUFPLENBQUNGLENBQUMsQ0FBQ0csS0FBSyxFQUFFcEMsSUFBSSxDQUFDcUMsUUFBUSxDQUFDLEVBQ3ZESyxNQUFNLEdBQUdBLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBR1YsRUFBRSxDQUFDRyxPQUFPLENBQUNGLENBQUMsQ0FBQ0csS0FBSyxFQUFFckMsSUFBSSxDQUFDc0MsUUFBUSxDQUFDLEVBQ3ZEbkMsSUFBSSxJQUFJLENBQUFBLElBQUksYUFBSkEsSUFBSSx1QkFBSkEsSUFBSSxDQUFFbUMsUUFBUSxJQUFHLENBQUMsQ0FBQyxHQUFHTCxFQUFFLENBQUNHLE9BQU8sQ0FBQ0YsQ0FBQyxDQUFDRyxLQUFLLEVBQUVsQyxJQUFJLENBQUNtQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQ3JFO1FBQ0gsQ0FBQztJQUNMO0VBQ0YsQ0FBQztBQUFBO0FBQUMsSUFFaUJNLFNBQVMsR0FBQXBELE9BQUEscUNBQUFxRCxTQUFBO0VBSTVCLFNBQUFELFVBQVlFLEtBQUssRUFBRTtJQUFBLElBQUFDLEtBQUE7SUFBQSxJQUFBQyxnQkFBQSxtQkFBQUosU0FBQTtJQUNqQkcsS0FBQSxHQUFBM0YsVUFBQSxPQUFBd0YsU0FBQSxHQUFNRSxLQUFLO0lBRVhDLEtBQUEsQ0FBS0UsaUJBQWlCLENBQUM3QyxjQUFjLENBQUM7SUFDdEMyQyxLQUFBLENBQUtHLG1CQUFtQixHQUFHLFVBQUNDLGFBQXFDO01BQUEsT0FDL0QxQixlQUFlLENBQUNzQixLQUFBLENBQUtLLE1BQU0sQ0FBQ0MsT0FBTyxFQUFFTixLQUFBLENBQUtLLE1BQU0sQ0FBQ3pCLFVBQVUsQ0FBQyxDQUFDd0IsYUFBYSxDQUFDO0lBQUE7SUFBQyxPQUFBSixLQUFBO0VBQ2hGO0VBQUMsSUFBQU8sVUFBQSxhQUFBVixTQUFBLEVBQUFDLFNBQUE7RUFBQSxXQUFBVSxhQUFBLGFBQUFYLFNBQUE7SUFBQTNCLEdBQUE7SUFBQXVCLEdBQUEsRUFFRCxTQUFBQSxJQUFBLEVBQVc7TUFDVCxPQUFPLE1BQU07SUFDZjtFQUFDO0lBQUF2QixHQUFBO0lBQUF1QixHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFnQjtNQUNkLE9BQU9nQix5QkFBYTtJQUN0QjtFQUFDO0lBQUF2QyxHQUFBO0lBQUF1QixHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFtQjtNQUNqQixPQUFPM0MsZ0JBQWdCO0lBQ3pCO0VBQUM7SUFBQW9CLEdBQUE7SUFBQXVCLEdBQUEsRUFFRCxTQUFBQSxJQUFBLEVBQWtCO01BQ2hCLE9BQU8sSUFBSSxDQUFDaUIsc0JBQXNCO0lBQ3BDO0VBQUM7SUFBQXhDLEdBQUE7SUFBQXVCLEdBQUEsRUFFRCxTQUFBQSxJQUFBLEVBQTJCO01BQ3pCLE9BQU94QixzQkFBc0I7SUFDL0I7RUFBQztJQUFBQyxHQUFBO0lBQUF1QixHQUFBLEVBRUQsU0FBQUEsSUFBQSxFQUFxQjtNQUNuQixJQUFNa0IsY0FBYyxHQUFBdkYsYUFBQSxDQUFBeUUsU0FBQSw0QkFBdUI7TUFDM0MsT0FBQTdELGFBQUEsQ0FBQUEsYUFBQSxLQUNLMkUsY0FBYztRQUNqQkMsV0FBVyxFQUFBNUUsYUFBQSxDQUFBQSxhQUFBLEtBQ04yRSxjQUFjLENBQUNDLFdBQVc7VUFDN0JDLFFBQVEsRUFBRTtRQUFVO01BQ3JCO0lBRUw7RUFBQztJQUFBM0MsR0FBQTtJQUFBNEMsS0FBQSxFQXNDRCxTQUFBQyxXQUFXQSxDQUFDQyxJQUFJLEVBQUU7TUFDaEIsSUFBT0MsSUFBSSxHQUEwREQsSUFBSSxDQUFsRUMsSUFBSTtRQUFFQyxTQUFTLEdBQStDRixJQUFJLENBQTVERSxTQUFTO1FBQUVDLGFBQWEsR0FBZ0NILElBQUksQ0FBakRHLGFBQWE7UUFBRUMsaUJBQWlCLEdBQWFKLElBQUksQ0FBbENJLGlCQUFpQjtRQUFFQyxPQUFPLEdBQUlMLElBQUksQ0FBZkssT0FBTztNQUVqRSxJQUFNQyxVQUFVLEdBQUc7UUFDakJDLFVBQVUsRUFBRSxJQUFJLENBQUNsQixNQUFNLENBQUNtQixTQUFTLENBQUNqRSxTQUFTLEdBQUdrRSwwQ0FBK0I7UUFDN0U5RCxjQUFjLEVBQUUsSUFBSSxDQUFDMEMsTUFBTSxDQUFDbUIsU0FBUyxDQUFDN0Q7TUFDeEMsQ0FBQztNQUVELElBQU0rRCxjQUFjLEdBQUExRixhQUFBO1FBQ2xCMkYsV0FBVyxFQUFFLElBQUksQ0FBQ3RCLE1BQU0sQ0FBQ0MsT0FBTztRQUNoQ3NCLGNBQWMsRUFBRVYsU0FBUyxDQUFDVyx5QkFBeUI7UUFDbkRDLFdBQVcsRUFBRSxJQUFJLENBQUNDO01BQW9CLEdBQ25DLElBQUksQ0FBQ0MsOEJBQThCLENBQUMsQ0FBQyxDQUN6QztNQUNELElBQU1DLGlCQUFpQixHQUFHLElBQUksQ0FBQ0Msd0JBQXdCLENBQUNsQixJQUFJLENBQUM7TUFDN0QsSUFBTW1CLGFBQWEsR0FBRyxJQUFJLENBQUNDLGdCQUFnQixDQUFDakIsYUFBYSxDQUFDO01BRTFELElBQU1rQixhQUFhLEdBQUdySCxPQUFPLENBQUMsSUFBSSxDQUFDc0gsZUFBZSxDQUFDO01BRW5ELElBQUlDLGNBQWtFLEdBQUdDLCtCQUFpQjtNQUMxRixJQUFJQyx5QkFJSCxHQUFHLENBQUMsQ0FBQztNQUVOLElBQUlKLGFBQWEsRUFBRTtRQUNqQkUsY0FBYyxHQUFHRyxtQ0FBZ0I7UUFDakNELHlCQUF5QixHQUFHO1VBQzFCeEIsSUFBSSxFQUFFSSxPQUFPLENBQUNqQixhQUFhLENBQUN1QyxRQUFRLENBQUMsQ0FBQztVQUN0Q0MsaUJBQWlCLEVBQUUsSUFBSSxDQUFDTixlQUFlO1VBQ3ZDTyxpQkFBaUIsRUFBRSxJQUFJLENBQUNDO1FBQzFCLENBQUM7TUFDSDtNQUVBO01BQ0U7TUFDQSxJQUFJUCxjQUFjLENBQUF2RyxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxDQUFBQSxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxLQUNiaUcsaUJBQWlCLEdBQ2pCLElBQUksQ0FBQ2MseUJBQXlCLENBQUMzQixpQkFBaUIsRUFBRSxlQUFlLENBQUMsR0FDbEVILElBQUksR0FDSndCLHlCQUF5QixHQUN6Qm5CLFVBQVU7UUFDYkksY0FBYyxFQUFkQSxjQUFjO1FBQ2RzQixVQUFVLEtBQUFDLE1BQUEsS0FBQUMsbUJBQUEsYUFDTGpCLGlCQUFpQixDQUFDZSxVQUFVLElBQy9CMUUsaUJBQWlCLE9BQUE0RSxtQkFBQSxhQUNiYixhQUFhLEdBQUcsQ0FBQzdELHVCQUF1QixDQUFDLEdBQUcsRUFBRSxFQUNuRDtRQUNEMkUsY0FBYyxFQUFFO1VBQ2QscUJBQXFCLEVBQUU7WUFDckJDLElBQUksRUFBRVo7VUFDUjtRQUNGO01BQUMsRUFDRixDQUFDLEVBQUFTLE1BQUEsS0FBQUMsbUJBQUEsYUFFRWYsYUFBYSxHQUNiLENBQ0UsSUFBSUssK0JBQWlCLENBQUF4RyxhQUFBLENBQUFBLGFBQUEsQ0FBQUEsYUFBQSxLQUNoQixJQUFJLENBQUNxSCx5QkFBeUIsQ0FBQyxDQUFDLEdBQ2hDL0IsVUFBVTtRQUNiTCxJQUFJLEVBQUUsQ0FBQ2tCLGFBQWEsQ0FBQztRQUNyQm1CLFFBQVEsRUFBRSxJQUFJLENBQUNqRCxNQUFNLENBQUNrRCxjQUFjO1FBQ3BDQyxjQUFjLEVBQUUsSUFBSSxDQUFDbkQsTUFBTSxDQUFDa0QsY0FBYztRQUMxQ0UsUUFBUSxFQUFFeEMsSUFBSSxDQUFDd0M7TUFBUSxFQUN4QixDQUFDLENBQ0gsR0FDRCxFQUFFO0lBRVY7RUFBQztJQUFBdkYsR0FBQTtJQUFBNEMsS0FBQSxFQUVELFNBQUE0Qyx1QkFBdUJBLENBQUEsRUFBRztNQUFBLElBQUFDLHFCQUFBO01BQ3hCLElBQUlDLFFBQXdDLEdBQUcsSUFBSSxDQUFDakQsY0FBYztNQUNsRSxJQUFJLENBQUFnRCxxQkFBQSxHQUFBQyxRQUFRLENBQUNoRCxXQUFXLGNBQUErQyxxQkFBQSxlQUFwQkEscUJBQUEsQ0FBc0JFLEtBQUssSUFBSSxJQUFJLENBQUN4RCxNQUFNLENBQUN1RCxRQUFRLENBQUNoRCxXQUFXLENBQUNpRCxLQUFLLENBQUMsRUFBRTtRQUMxRTtRQUNBRCxRQUFRLEdBQUE1SCxhQUFBLEtBQU80SCxRQUFRLENBQUM7UUFDeEIsT0FBT0EsUUFBUSxDQUFDbEcsV0FBVztNQUM3QjtNQUNBLE9BQU9rRyxRQUFRO0lBQ2pCO0VBQUM7SUFBQTFGLEdBQUE7SUFBQTRDLEtBQUEsRUFuSEQsU0FBT2dELHFCQUFxQkEsQ0FBQUMsS0FBQSxFQUUxQjtNQUFBLElBQUFDLGdCQUFBLEdBQUFELEtBQUEsQ0FGNEJFLFVBQVU7UUFBVkEsVUFBVSxHQUFBRCxnQkFBQSxjQUFHLEVBQUUsR0FBQUEsZ0JBQUE7TUFHM0MsSUFBSUMsVUFBVSxDQUFDL0gsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN6QixPQUFPO1VBQUM2RCxLQUFLLEVBQUU7UUFBRSxDQUFDO01BQ3BCO01BRUEsSUFBTW1FLGdCQUFnQixHQUFHO1FBQUNwRCxLQUFLLEVBQUUsSUFBSTtRQUFFdkIsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUFFNEUsUUFBUSxFQUFFO01BQUksQ0FBQztNQUNwRSxJQUFNcEUsS0FBMkUsR0FBRztRQUNsRjtRQUNBO1FBQ0FPLE9BQU8sRUFBRTtVQUNQdkQsSUFBSSxFQUFFa0gsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDRyxJQUFJLENBQUN2RixHQUFHO1VBQzVCN0IsSUFBSSxFQUFFaUgsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDRyxJQUFJLENBQUN0RixHQUFHO1VBQzVCM0IsSUFBSSxFQUFFOEcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDRyxJQUFJLENBQUNDLFFBQVEsR0FBQXJJLGFBQUEsQ0FBQUEsYUFBQSxLQUN6QmtJLGdCQUFnQixHQUFLRCxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNHLElBQUksQ0FBQ0MsUUFBUSxJQUFBckksYUFBQSxLQUNoRGtJLGdCQUFnQixDQUFDO1VBQ3pCakgsSUFBSSxFQUFFZ0gsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDRyxJQUFJLENBQUN2RixHQUFHO1VBQzVCM0IsSUFBSSxFQUFFK0csVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDRyxJQUFJLENBQUN0RixHQUFHO1VBQzVCMUIsSUFBSSxFQUFFNkcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDRyxJQUFJLENBQUNDLFFBQVEsR0FBQXJJLGFBQUEsQ0FBQUEsYUFBQSxLQUN6QmtJLGdCQUFnQixHQUFLRCxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNHLElBQUksQ0FBQ0MsUUFBUSxJQUFBckksYUFBQSxLQUNoRGtJLGdCQUFnQixDQUFDO1VBQ3pCckYsR0FBRyxFQUFBN0MsYUFBQSxLQUFNa0ksZ0JBQWdCLENBQUM7VUFDMUJwRixHQUFHLEVBQUE5QyxhQUFBLEtBQU1rSSxnQkFBZ0IsQ0FBQztVQUMxQm5GLEdBQUcsRUFBQS9DLGFBQUEsS0FBTWtJLGdCQUFnQixDQUFDO1VBQzFCSSxTQUFTLEVBQUF0SSxhQUFBLEtBQU1rSSxnQkFBZ0IsQ0FBQztVQUNoQ2xGLFNBQVMsRUFBQWhELGFBQUEsS0FBTWtJLGdCQUFnQixDQUFDO1VBQ2hDakYsU0FBUyxFQUFBakQsYUFBQSxLQUFNa0ksZ0JBQWdCO1FBQ2pDLENBQUM7UUFDRC9GLEtBQUssS0FBQThFLE1BQUEsQ0FBS2dCLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ00sV0FBVyxVQUFBdEIsTUFBQSxDQUFPZ0IsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDTSxXQUFXLFVBQU87UUFDMUVDLFNBQVMsRUFBRTtNQUNiLENBQUM7TUFFRCxPQUFPO1FBQUN6RSxLQUFLLEVBQUUsQ0FBQ0EsS0FBSztNQUFDLENBQUM7SUFDekI7RUFBQztBQUFBLEVBN0VvQzBFLG9CQUFRIiwiaWdub3JlTGlzdCI6W119
;