UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

360 lines (307 loc) 36.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.HexagonIdVisConfigs = exports.hexIdResolver = exports.hexIdAccessor = exports.hexIdRequiredColumns = exports.HEXAGON_ID_FIELDS = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); 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 _lodash = _interopRequireDefault(require("lodash.memoize")); var _baseLayer = _interopRequireDefault(require("../base-layer")); var _deck = require("deck.gl"); var _h3HexagonCellLayer = _interopRequireDefault(require("../../deckgl-layers/h3-hexagon-cell-layer/h3-hexagon-cell-layer")); var _h3Utils = require("./h3-utils"); var _h3HexagonLayerIcon = _interopRequireDefault(require("./h3-hexagon-layer-icon")); var _defaultSettings = require("../../constants/default-settings"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var HEXAGON_ID_FIELDS = { hex_id: ['hex_id', 'hexagon_id', 'h3_id'] }; exports.HEXAGON_ID_FIELDS = HEXAGON_ID_FIELDS; var hexIdRequiredColumns = ['hex_id']; exports.hexIdRequiredColumns = hexIdRequiredColumns; var hexIdAccessor = function hexIdAccessor(_ref) { var hex_id = _ref.hex_id; return function (d) { return d[hex_id.fieldIdx]; }; }; exports.hexIdAccessor = hexIdAccessor; var hexIdResolver = function hexIdResolver(_ref2) { var hex_id = _ref2.hex_id; return hex_id.fieldIdx; }; exports.hexIdResolver = hexIdResolver; var HexagonIdVisConfigs = { opacity: 'opacity', colorRange: 'colorRange', coverage: 'coverage', sizeRange: 'elevationRange', coverageRange: 'coverageRange', elevationScale: 'elevationScale', 'hi-precision': 'hi-precision' }; exports.HexagonIdVisConfigs = HexagonIdVisConfigs; function hexToRgb(hex) { var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); var r = parseInt(result[1], 16); var g = parseInt(result[2], 16); var b = parseInt(result[3], 16); return [r, g, b]; } var HexagonIdLayer = /*#__PURE__*/ function (_Layer) { (0, _inherits2["default"])(HexagonIdLayer, _Layer); function HexagonIdLayer(props) { var _this; (0, _classCallCheck2["default"])(this, HexagonIdLayer); _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(HexagonIdLayer).call(this, props)); _this.registerVisConfig(HexagonIdVisConfigs); _this.getHexId = (0, _lodash["default"])(hexIdAccessor, hexIdResolver); return _this; } (0, _createClass2["default"])(HexagonIdLayer, [{ key: "getDefaultLayerConfig", value: function getDefaultLayerConfig() { var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return _objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(HexagonIdLayer.prototype), "getDefaultLayerConfig", this).call(this, props), { // add height visual channel coverageField: null, coverageDomain: [0, 1], coverageScale: 'linear' }); } // TODO: fix complexity /* eslint-disable complexity */ }, { key: "formatLayerData", value: function formatLayerData(_, allData, filteredIndex, oldLayerData) { var _this2 = this; var opt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; var _this$config = this.config, colorScale = _this$config.colorScale, colorDomain = _this$config.colorDomain, colorField = _this$config.colorField, color = _this$config.color, columns = _this$config.columns, sizeField = _this$config.sizeField, sizeScale = _this$config.sizeScale, sizeDomain = _this$config.sizeDomain, coverageField = _this$config.coverageField, coverageScale = _this$config.coverageScale, coverageDomain = _this$config.coverageDomain, _this$config$visConfi = _this$config.visConfig, sizeRange = _this$config$visConfi.sizeRange, colorRange = _this$config$visConfi.colorRange, coverageRange = _this$config$visConfi.coverageRange; // color var cScale = colorField && this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(function (c) { return hexToRgb(c); })); // height var sScale = sizeField && this.getVisChannelScale(sizeScale, sizeDomain, sizeRange); // coverage var coScale = coverageField && this.getVisChannelScale(coverageScale, coverageDomain, coverageRange); var getHexId = this.getHexId(columns); if (!oldLayerData || oldLayerData.getHexId !== getHexId) { this.updateLayerMeta(allData, getHexId); } var data; if (oldLayerData && oldLayerData.data && opt.sameData && oldLayerData.getHexId === getHexId) { data = oldLayerData.data; } else { data = filteredIndex.reduce(function (accu, index, i) { var id = getHexId(allData[index]); var centroid = _this2.dataToFeature.centroids[index]; if (centroid) { accu.push({ // keep a reference to the original data index index: i, data: allData[index], id: id, centroid: centroid }); } return accu; }, []); } var getElevation = sScale ? function (d) { return _this2.getEncodedChannelValue(sScale, d.data, sizeField, 0); } : 0; var getColor = cScale ? function (d) { return _this2.getEncodedChannelValue(cScale, d.data, colorField); } : color; var getCoverage = coScale ? function (d) { return _this2.getEncodedChannelValue(coScale, d.data, coverageField, 0); } : 1; // const layerData = { return { data: data, getElevation: getElevation, getColor: getColor, getHexId: getHexId, getCoverage: getCoverage, hexagonVertices: this.dataToFeature.hexagonVertices, hexagonCenter: this.dataToFeature.hexagonCenter }; } /* eslint-enable complexity */ }, { key: "updateLayerMeta", value: function updateLayerMeta(allData, getHexId) { var hexagonVertices; var hexagonCenter; var centroids = {}; allData.forEach(function (d, index) { var id = getHexId(d); if (typeof id !== 'string' || !id.length) { return; } // find hexagonVertices // only need 1 instance of hexagonVertices if (!hexagonVertices) { hexagonVertices = id && (0, _h3Utils.getVertices)({ id: id }); hexagonCenter = id && (0, _h3Utils.getCentroid)({ id: id }); } // save a reference of centroids to dataToFeature // so we don't have to re calculate it again centroids[index] = (0, _h3Utils.getCentroid)({ id: id }); }); var bounds = this.getPointsBounds(Object.values(centroids), function (d) { return d; }); var lightSettings = this.getLightSettingsFromBounds(bounds); this.dataToFeature = { hexagonVertices: hexagonVertices, hexagonCenter: hexagonCenter, centroids: centroids }; this.updateMeta({ bounds: bounds, lightSettings: lightSettings }); } }, { key: "renderLayer", value: function renderLayer(_ref3) { var data = _ref3.data, idx = _ref3.idx, layerInteraction = _ref3.layerInteraction, objectHovered = _ref3.objectHovered, mapState = _ref3.mapState, interactionConfig = _ref3.interactionConfig; var zoomFactor = this.getZoomFactor(mapState); var eleZoomFactor = this.getElevationZoomFactor(mapState); var config = this.config, meta = this.meta; var visConfig = config.visConfig; var updateTriggers = { getColor: { color: config.color, colorField: config.colorField, colorRange: config.visConfig.colorRange, colorScale: config.colorScale }, getElevation: { sizeField: config.sizeField, sizeRange: config.visConfig.sizeRange }, getCoverage: { coverageField: config.coverageField, coverageRange: config.visConfig.coverageRange } }; return [new _h3HexagonCellLayer["default"](_objectSpread({}, layerInteraction, {}, data, { id: this.id, idx: idx, pickable: true, // coverage coverage: config.coverageField ? 1 : visConfig.coverage, // parameters parameters: { depthTest: Boolean(config.sizeField || mapState.dragRotate) }, // highlight autoHighlight: Boolean(config.sizeField), // elevation extruded: Boolean(config.sizeField), elevationScale: visConfig.elevationScale * eleZoomFactor, // color opacity: visConfig.opacity, // render lightSettings: meta.lightSettings, updateTriggers: updateTriggers }))].concat((0, _toConsumableArray2["default"])(this.isLayerHovered(objectHovered) && !config.sizeField ? [new _deck.GeoJsonLayer({ id: "".concat(this.id, "-hovered"), data: [(0, _h3Utils.idToPolygonGeo)(objectHovered)], getLineColor: config.highlightColor, lineWidthScale: 8 * zoomFactor })] : [])); } }, { key: "type", get: function get() { return 'hexagonId'; } }, { key: "name", get: function get() { return 'H3'; } }, { key: "requiredLayerColumns", get: function get() { return hexIdRequiredColumns; } }, { key: "layerIcon", get: function get() { // use hexagon layer icon for now return _h3HexagonLayerIcon["default"]; } }, { key: "visualChannels", get: function get() { return _objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(HexagonIdLayer.prototype), "visualChannels", this), { size: _objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(HexagonIdLayer.prototype), "visualChannels", this).size, { property: 'height' }), coverage: { property: 'coverage', field: 'coverageField', scale: 'coverageScale', domain: 'coverageDomain', range: 'coverageRange', key: 'coverage', channelScaleType: _defaultSettings.CHANNEL_SCALES.radius } }); } }], [{ key: "findDefaultLayerProps", value: function findDefaultLayerProps(_ref4) { var fields = _ref4.fields; var foundColumns = this.findDefaultColumnField(HEXAGON_ID_FIELDS, fields); if (!foundColumns || !foundColumns.length) { return null; } return foundColumns.map(function (columns) { return { isVisible: true, label: 'H3 Hexagon', columns: columns }; }); } }]); return HexagonIdLayer; }(_baseLayer["default"]); exports["default"] = HexagonIdLayer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvaDMtaGV4YWdvbi1sYXllci9oMy1oZXhhZ29uLWxheWVyLmpzIl0sIm5hbWVzIjpbIkhFWEFHT05fSURfRklFTERTIiwiaGV4X2lkIiwiaGV4SWRSZXF1aXJlZENvbHVtbnMiLCJoZXhJZEFjY2Vzc29yIiwiZCIsImZpZWxkSWR4IiwiaGV4SWRSZXNvbHZlciIsIkhleGFnb25JZFZpc0NvbmZpZ3MiLCJvcGFjaXR5IiwiY29sb3JSYW5nZSIsImNvdmVyYWdlIiwic2l6ZVJhbmdlIiwiY292ZXJhZ2VSYW5nZSIsImVsZXZhdGlvblNjYWxlIiwiaGV4VG9SZ2IiLCJoZXgiLCJyZXN1bHQiLCJleGVjIiwiciIsInBhcnNlSW50IiwiZyIsImIiLCJIZXhhZ29uSWRMYXllciIsInByb3BzIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRIZXhJZCIsImNvdmVyYWdlRmllbGQiLCJjb3ZlcmFnZURvbWFpbiIsImNvdmVyYWdlU2NhbGUiLCJfIiwiYWxsRGF0YSIsImZpbHRlcmVkSW5kZXgiLCJvbGRMYXllckRhdGEiLCJvcHQiLCJjb25maWciLCJjb2xvclNjYWxlIiwiY29sb3JEb21haW4iLCJjb2xvckZpZWxkIiwiY29sb3IiLCJjb2x1bW5zIiwic2l6ZUZpZWxkIiwic2l6ZVNjYWxlIiwic2l6ZURvbWFpbiIsInZpc0NvbmZpZyIsImNTY2FsZSIsImdldFZpc0NoYW5uZWxTY2FsZSIsImNvbG9ycyIsIm1hcCIsImMiLCJzU2NhbGUiLCJjb1NjYWxlIiwidXBkYXRlTGF5ZXJNZXRhIiwiZGF0YSIsInNhbWVEYXRhIiwicmVkdWNlIiwiYWNjdSIsImluZGV4IiwiaSIsImlkIiwiY2VudHJvaWQiLCJkYXRhVG9GZWF0dXJlIiwiY2VudHJvaWRzIiwicHVzaCIsImdldEVsZXZhdGlvbiIsImdldEVuY29kZWRDaGFubmVsVmFsdWUiLCJnZXRDb2xvciIsImdldENvdmVyYWdlIiwiaGV4YWdvblZlcnRpY2VzIiwiaGV4YWdvbkNlbnRlciIsImZvckVhY2giLCJsZW5ndGgiLCJib3VuZHMiLCJnZXRQb2ludHNCb3VuZHMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJsaWdodFNldHRpbmdzIiwiZ2V0TGlnaHRTZXR0aW5nc0Zyb21Cb3VuZHMiLCJ1cGRhdGVNZXRhIiwiaWR4IiwibGF5ZXJJbnRlcmFjdGlvbiIsIm9iamVjdEhvdmVyZWQiLCJtYXBTdGF0ZSIsImludGVyYWN0aW9uQ29uZmlnIiwiem9vbUZhY3RvciIsImdldFpvb21GYWN0b3IiLCJlbGVab29tRmFjdG9yIiwiZ2V0RWxldmF0aW9uWm9vbUZhY3RvciIsIm1ldGEiLCJ1cGRhdGVUcmlnZ2VycyIsIkgzSGV4YWdvbkNlbGxMYXllciIsInBpY2thYmxlIiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsIkJvb2xlYW4iLCJkcmFnUm90YXRlIiwiYXV0b0hpZ2hsaWdodCIsImV4dHJ1ZGVkIiwiaXNMYXllckhvdmVyZWQiLCJHZW9Kc29uTGF5ZXIiLCJnZXRMaW5lQ29sb3IiLCJoaWdobGlnaHRDb2xvciIsImxpbmVXaWR0aFNjYWxlIiwiSDNIZXhhZ29uTGF5ZXJJY29uIiwic2l6ZSIsInByb3BlcnR5IiwiZmllbGQiLCJzY2FsZSIsImRvbWFpbiIsInJhbmdlIiwia2V5IiwiY2hhbm5lbFNjYWxlVHlwZSIsIkNIQU5ORUxfU0NBTEVTIiwicmFkaXVzIiwiZmllbGRzIiwiZm91bmRDb2x1bW5zIiwiZmluZERlZmF1bHRDb2x1bW5GaWVsZCIsImlzVmlzaWJsZSIsImxhYmVsIiwiTGF5ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVPLElBQU1BLGlCQUFpQixHQUFHO0FBQy9CQyxFQUFBQSxNQUFNLEVBQUUsQ0FBQyxRQUFELEVBQVcsWUFBWCxFQUF5QixPQUF6QjtBQUR1QixDQUExQjs7QUFJQSxJQUFNQyxvQkFBb0IsR0FBRyxDQUFDLFFBQUQsQ0FBN0I7OztBQUNB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O0FBQUEsZUFBSztBQUNsQzZFLFVBQUFBLFNBQVMsRUFBRSxJQUR1QjtBQUVsQ0MsVUFBQUEsS0FBSyxFQUFFLFlBRjJCO0FBR2xDOUUsVUFBQUEsT0FBTyxFQUFQQTtBQUhrQyxTQUFMO0FBQUEsT0FBeEIsQ0FBUDtBQUtEOzs7RUF0RHlDK0UscUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgbWVtb2l6ZSBmcm9tICdsb2Rhc2gubWVtb2l6ZSc7XG5cbmltcG9ydCBMYXllciBmcm9tICcuLi9iYXNlLWxheWVyJztcbmltcG9ydCB7R2VvSnNvbkxheWVyfSBmcm9tICdkZWNrLmdsJztcbmltcG9ydCBIM0hleGFnb25DZWxsTGF5ZXIgZnJvbSAnZGVja2dsLWxheWVycy9oMy1oZXhhZ29uLWNlbGwtbGF5ZXIvaDMtaGV4YWdvbi1jZWxsLWxheWVyJztcbmltcG9ydCB7Z2V0VmVydGljZXMsIGdldENlbnRyb2lkLCBpZFRvUG9seWdvbkdlb30gZnJvbSAnLi9oMy11dGlscyc7XG5pbXBvcnQgSDNIZXhhZ29uTGF5ZXJJY29uIGZyb20gJy4vaDMtaGV4YWdvbi1sYXllci1pY29uJztcbmltcG9ydCB7Q0hBTk5FTF9TQ0FMRVN9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuZXhwb3J0IGNvbnN0IEhFWEFHT05fSURfRklFTERTID0ge1xuICBoZXhfaWQ6IFsnaGV4X2lkJywgJ2hleGFnb25faWQnLCAnaDNfaWQnXVxufTtcblxuZXhwb3J0IGNvbnN0IGhleElkUmVxdWlyZWRDb2x1bW5zID0gWydoZXhfaWQnXTtcbmV4cG9ydCBjb25zdCBoZXhJZEFjY2Vzc29yID0gKHtoZXhfaWR9KSA9PiBkID0+IGRbaGV4X2lkLmZpZWxkSWR4XTtcbmV4cG9ydCBjb25zdCBoZXhJZFJlc29sdmVyID0gKHtoZXhfaWR9KSA9PiBoZXhfaWQuZmllbGRJZHg7XG5cbmV4cG9ydCBjb25zdCBIZXhhZ29uSWRWaXNDb25maWdzID0ge1xuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgY292ZXJhZ2U6ICdjb3ZlcmFnZScsXG4gIHNpemVSYW5nZTogJ2VsZXZhdGlvblJhbmdlJyxcbiAgY292ZXJhZ2VSYW5nZTogJ2NvdmVyYWdlUmFuZ2UnLFxuICBlbGV2YXRpb25TY2FsZTogJ2VsZXZhdGlvblNjYWxlJyxcbiAgJ2hpLXByZWNpc2lvbic6ICdoaS1wcmVjaXNpb24nXG59O1xuXG5mdW5jdGlvbiBoZXhUb1JnYihoZXgpIHtcbiAgY29uc3QgcmVzdWx0ID0gL14jPyhbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KSQvaS5leGVjKGhleCk7XG5cbiAgY29uc3QgciA9IHBhcnNlSW50KHJlc3VsdFsxXSwgMTYpO1xuICBjb25zdCBnID0gcGFyc2VJbnQocmVzdWx0WzJdLCAxNik7XG4gIGNvbnN0IGIgPSBwYXJzZUludChyZXN1bHRbM10sIDE2KTtcblxuICByZXR1cm4gW3IsIGcsIGJdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIZXhhZ29uSWRMYXllciBleHRlbmRzIExheWVyIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5yZWdpc3RlclZpc0NvbmZpZyhIZXhhZ29uSWRWaXNDb25maWdzKTtcbiAgICB0aGlzLmdldEhleElkID0gbWVtb2l6ZShoZXhJZEFjY2Vzc29yLCBoZXhJZFJlc29sdmVyKTtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnaGV4YWdvbklkJztcbiAgfVxuXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiAnSDMnO1xuICB9XG5cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCkge1xuICAgIHJldHVybiBoZXhJZFJlcXVpcmVkQ29sdW1ucztcbiAgfVxuXG4gIGdldCBsYXllckljb24oKSB7XG4gICAgLy8gdXNlIGhleGFnb24gbGF5ZXIgaWNvbiBmb3Igbm93XG4gICAgcmV0dXJuIEgzSGV4YWdvbkxheWVySWNvbjtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIudmlzdWFsQ2hhbm5lbHMsXG4gICAgICBzaXplOiB7XG4gICAgICAgIC4uLnN1cGVyLnZpc3VhbENoYW5uZWxzLnNpemUsXG4gICAgICAgIHByb3BlcnR5OiAnaGVpZ2h0J1xuICAgICAgfSxcbiAgICAgIGNvdmVyYWdlOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY292ZXJhZ2UnLFxuICAgICAgICBmaWVsZDogJ2NvdmVyYWdlRmllbGQnLFxuICAgICAgICBzY2FsZTogJ2NvdmVyYWdlU2NhbGUnLFxuICAgICAgICBkb21haW46ICdjb3ZlcmFnZURvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnY292ZXJhZ2VSYW5nZScsXG4gICAgICAgIGtleTogJ2NvdmVyYWdlJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMucmFkaXVzXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBmaW5kRGVmYXVsdExheWVyUHJvcHMoe2ZpZWxkc30pIHtcbiAgICBjb25zdCBmb3VuZENvbHVtbnMgPSB0aGlzLmZpbmREZWZhdWx0Q29sdW1uRmllbGQoSEVYQUdPTl9JRF9GSUVMRFMsIGZpZWxkcyk7XG4gICAgaWYgKCFmb3VuZENvbHVtbnMgfHwgIWZvdW5kQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmb3VuZENvbHVtbnMubWFwKGNvbHVtbnMgPT4gKHtcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGxhYmVsOiAnSDMgSGV4YWdvbicsXG4gICAgICBjb2x1bW5zXG4gICAgfSkpO1xuICB9XG5cbiAgZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzKSxcblxuICAgICAgLy8gYWRkIGhlaWdodCB2aXN1YWwgY2hhbm5lbFxuICAgICAgY292ZXJhZ2VGaWVsZDogbnVsbCxcbiAgICAgIGNvdmVyYWdlRG9tYWluOiBbMCwgMV0sXG4gICAgICBjb3ZlcmFnZVNjYWxlOiAnbGluZWFyJ1xuICAgIH07XG4gIH1cblxuICAvLyBUT0RPOiBmaXggY29tcGxleGl0eVxuICAvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG4gIGZvcm1hdExheWVyRGF0YShfLCBhbGxEYXRhLCBmaWx0ZXJlZEluZGV4LCBvbGRMYXllckRhdGEsIG9wdCA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgY29sb3JTY2FsZSxcbiAgICAgIGNvbG9yRG9tYWluLFxuICAgICAgY29sb3JGaWVsZCxcbiAgICAgIGNvbG9yLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHNpemVGaWVsZCxcbiAgICAgIHNpemVTY2FsZSxcbiAgICAgIHNpemVEb21haW4sXG4gICAgICBjb3ZlcmFnZUZpZWxkLFxuICAgICAgY292ZXJhZ2VTY2FsZSxcbiAgICAgIGNvdmVyYWdlRG9tYWluLFxuICAgICAgdmlzQ29uZmlnOiB7c2l6ZVJhbmdlLCBjb2xvclJhbmdlLCBjb3ZlcmFnZVJhbmdlfVxuICAgIH0gPSB0aGlzLmNvbmZpZztcblxuICAgIC8vIGNvbG9yXG4gICAgY29uc3QgY1NjYWxlID1cbiAgICAgIGNvbG9yRmllbGQgJiZcbiAgICAgIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKFxuICAgICAgICBjb2xvclNjYWxlLFxuICAgICAgICBjb2xvckRvbWFpbixcbiAgICAgICAgY29sb3JSYW5nZS5jb2xvcnMubWFwKGMgPT4gaGV4VG9SZ2IoYykpXG4gICAgICApO1xuXG4gICAgLy8gaGVpZ2h0XG4gICAgY29uc3Qgc1NjYWxlID1cbiAgICAgIHNpemVGaWVsZCAmJiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShzaXplU2NhbGUsIHNpemVEb21haW4sIHNpemVSYW5nZSk7XG5cbiAgICAvLyBjb3ZlcmFnZVxuICAgIGNvbnN0IGNvU2NhbGUgPVxuICAgICAgY292ZXJhZ2VGaWVsZCAmJiB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShjb3ZlcmFnZVNjYWxlLCBjb3ZlcmFnZURvbWFpbiwgY292ZXJhZ2VSYW5nZSk7XG5cbiAgICBjb25zdCBnZXRIZXhJZCA9IHRoaXMuZ2V0SGV4SWQoY29sdW1ucyk7XG5cbiAgICBpZiAoIW9sZExheWVyRGF0YSB8fCBvbGRMYXllckRhdGEuZ2V0SGV4SWQgIT09IGdldEhleElkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyTWV0YShhbGxEYXRhLCBnZXRIZXhJZCk7XG4gICAgfVxuXG4gICAgbGV0IGRhdGE7XG4gICAgaWYgKFxuICAgICAgb2xkTGF5ZXJEYXRhICYmXG4gICAgICBvbGRMYXllckRhdGEuZGF0YSAmJlxuICAgICAgb3B0LnNhbWVEYXRhICYmXG4gICAgICBvbGRMYXllckRhdGEuZ2V0SGV4SWQgPT09IGdldEhleElkXG4gICAgKSB7XG4gICAgICBkYXRhID0gb2xkTGF5ZXJEYXRhLmRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSBmaWx0ZXJlZEluZGV4LnJlZHVjZSgoYWNjdSwgaW5kZXgsIGkpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBnZXRIZXhJZChhbGxEYXRhW2luZGV4XSk7XG4gICAgICAgIGNvbnN0IGNlbnRyb2lkID0gdGhpcy5kYXRhVG9GZWF0dXJlLmNlbnRyb2lkc1tpbmRleF07XG5cbiAgICAgICAgaWYgKGNlbnRyb2lkKSB7XG4gICAgICAgICAgYWNjdS5wdXNoKHtcbiAgICAgICAgICAgIC8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGRhdGEgaW5kZXhcbiAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgZGF0YTogYWxsRGF0YVtpbmRleF0sXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIGNlbnRyb2lkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWNjdTtcbiAgICAgIH0sIFtdKTtcbiAgICB9XG5cbiAgICBjb25zdCBnZXRFbGV2YXRpb24gPSBzU2NhbGUgPyBkID0+XG4gICAgICB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoc1NjYWxlLCBkLmRhdGEsIHNpemVGaWVsZCwgMCkgOiAwO1xuXG4gICAgY29uc3QgZ2V0Q29sb3IgPSBjU2NhbGUgPyBkID0+XG4gICAgICB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoY1NjYWxlLCBkLmRhdGEsIGNvbG9yRmllbGQpIDogY29sb3I7XG5cbiAgICBjb25zdCBnZXRDb3ZlcmFnZSA9IGNvU2NhbGUgPyBkID0+XG4gICAgICB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoY29TY2FsZSwgZC5kYXRhLCBjb3ZlcmFnZUZpZWxkLCAwKSA6IDE7XG5cbiAgICAvLyBjb25zdCBsYXllckRhdGEgPSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGEsXG4gICAgICBnZXRFbGV2YXRpb24sXG4gICAgICBnZXRDb2xvcixcbiAgICAgIGdldEhleElkLFxuICAgICAgZ2V0Q292ZXJhZ2UsXG4gICAgICBoZXhhZ29uVmVydGljZXM6IHRoaXMuZGF0YVRvRmVhdHVyZS5oZXhhZ29uVmVydGljZXMsXG4gICAgICBoZXhhZ29uQ2VudGVyOiB0aGlzLmRhdGFUb0ZlYXR1cmUuaGV4YWdvbkNlbnRlclxuICAgIH07XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBjb21wbGV4aXR5ICovXG5cbiAgdXBkYXRlTGF5ZXJNZXRhKGFsbERhdGEsIGdldEhleElkKSB7XG4gICAgbGV0IGhleGFnb25WZXJ0aWNlcztcbiAgICBsZXQgaGV4YWdvbkNlbnRlcjtcbiAgICBjb25zdCBjZW50cm9pZHMgPSB7fTtcblxuICAgIGFsbERhdGEuZm9yRWFjaCgoZCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0SGV4SWQoZCk7XG4gICAgICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCAhaWQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGZpbmQgaGV4YWdvblZlcnRpY2VzXG4gICAgICAvLyBvbmx5IG5lZWQgMSBpbnN0YW5jZSBvZiBoZXhhZ29uVmVydGljZXNcbiAgICAgIGlmICghaGV4YWdvblZlcnRpY2VzKSB7XG4gICAgICAgIGhleGFnb25WZXJ0aWNlcyA9IGlkICYmIGdldFZlcnRpY2VzKHtpZH0pO1xuICAgICAgICBoZXhhZ29uQ2VudGVyID0gaWQgJiYgZ2V0Q2VudHJvaWQoe2lkfSlcbiAgICAgIH1cblxuICAgICAgLy8gc2F2ZSBhIHJlZmVyZW5jZSBvZiBjZW50cm9pZHMgdG8gZGF0YVRvRmVhdHVyZVxuICAgICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byByZSBjYWxjdWxhdGUgaXQgYWdhaW5cbiAgICAgIGNlbnRyb2lkc1tpbmRleF0gPSBnZXRDZW50cm9pZCh7aWR9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0UG9pbnRzQm91bmRzKE9iamVjdC52YWx1ZXMoY2VudHJvaWRzKSwgZCA9PiBkKTtcbiAgICBjb25zdCBsaWdodFNldHRpbmdzID0gdGhpcy5nZXRMaWdodFNldHRpbmdzRnJvbUJvdW5kcyhib3VuZHMpO1xuXG4gICAgdGhpcy5kYXRhVG9GZWF0dXJlID0ge2hleGFnb25WZXJ0aWNlcywgaGV4YWdvbkNlbnRlciwgY2VudHJvaWRzfTtcbiAgICB0aGlzLnVwZGF0ZU1ldGEoe2JvdW5kcywgbGlnaHRTZXR0aW5nc30pO1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIoe1xuICAgIGRhdGEsXG4gICAgaWR4LFxuICAgIGxheWVySW50ZXJhY3Rpb24sXG4gICAgb2JqZWN0SG92ZXJlZCxcbiAgICBtYXBTdGF0ZSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZ1xuICB9KSB7XG4gICAgY29uc3Qgem9vbUZhY3RvciA9IHRoaXMuZ2V0Wm9vbUZhY3RvcihtYXBTdGF0ZSk7XG4gICAgY29uc3QgZWxlWm9vbUZhY3RvciA9IHRoaXMuZ2V0RWxldmF0aW9uWm9vbUZhY3RvcihtYXBTdGF0ZSk7XG4gICAgY29uc3Qge2NvbmZpZywgbWV0YX0gPSB0aGlzO1xuICAgIGNvbnN0IHt2aXNDb25maWd9ID0gY29uZmlnO1xuXG4gICAgY29uc3QgdXBkYXRlVHJpZ2dlcnMgPSB7XG4gICAgICBnZXRDb2xvcjoge1xuICAgICAgICBjb2xvcjogY29uZmlnLmNvbG9yLFxuICAgICAgICBjb2xvckZpZWxkOiBjb25maWcuY29sb3JGaWVsZCxcbiAgICAgICAgY29sb3JSYW5nZTogY29uZmlnLnZpc0NvbmZpZy5jb2xvclJhbmdlLFxuICAgICAgICBjb2xvclNjYWxlOiBjb25maWcuY29sb3JTY2FsZVxuICAgICAgfSxcbiAgICAgIGdldEVsZXZhdGlvbjoge1xuICAgICAgICBzaXplRmllbGQ6IGNvbmZpZy5zaXplRmllbGQsXG4gICAgICAgIHNpemVSYW5nZTogY29uZmlnLnZpc0NvbmZpZy5zaXplUmFuZ2VcbiAgICAgIH0sXG4gICAgICBnZXRDb3ZlcmFnZToge1xuICAgICAgICBjb3ZlcmFnZUZpZWxkOiBjb25maWcuY292ZXJhZ2VGaWVsZCxcbiAgICAgICAgY292ZXJhZ2VSYW5nZTogY29uZmlnLnZpc0NvbmZpZy5jb3ZlcmFnZVJhbmdlXG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgSDNIZXhhZ29uQ2VsbExheWVyKHtcbiAgICAgICAgLi4ubGF5ZXJJbnRlcmFjdGlvbixcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgIGlkeCxcbiAgICAgICAgcGlja2FibGU6IHRydWUsXG5cbiAgICAgICAgLy8gY292ZXJhZ2VcbiAgICAgICAgY292ZXJhZ2U6IGNvbmZpZy5jb3ZlcmFnZUZpZWxkID8gMSA6IHZpc0NvbmZpZy5jb3ZlcmFnZSxcblxuICAgICAgICAvLyBwYXJhbWV0ZXJzXG4gICAgICAgIHBhcmFtZXRlcnM6IHtkZXB0aFRlc3Q6IEJvb2xlYW4oY29uZmlnLnNpemVGaWVsZCB8fCBtYXBTdGF0ZS5kcmFnUm90YXRlKX0sXG5cbiAgICAgICAgLy8gaGlnaGxpZ2h0XG4gICAgICAgIGF1dG9IaWdobGlnaHQ6IEJvb2xlYW4oY29uZmlnLnNpemVGaWVsZCksXG5cbiAgICAgICAgLy8gZWxldmF0aW9uXG4gICAgICAgIGV4dHJ1ZGVkOiBCb29sZWFuKGNvbmZpZy5zaXplRmllbGQpLFxuICAgICAgICBlbGV2YXRpb25TY2FsZTogdmlzQ29uZmlnLmVsZXZhdGlvblNjYWxlICogZWxlWm9vbUZhY3RvcixcblxuICAgICAgICAvLyBjb2xvclxuICAgICAgICBvcGFjaXR5OiB2aXNDb25maWcub3BhY2l0eSxcblxuICAgICAgICAvLyByZW5kZXJcbiAgICAgICAgbGlnaHRTZXR0aW5nczogbWV0YS5saWdodFNldHRpbmdzLFxuICAgICAgICB1cGRhdGVUcmlnZ2Vyc1xuICAgICAgfSksXG4gICAgICAuLi4odGhpcy5pc0xheWVySG92ZXJlZChvYmplY3RIb3ZlcmVkKSAmJiAhY29uZmlnLnNpemVGaWVsZFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIG5ldyBHZW9Kc29uTGF5ZXIoe1xuICAgICAgICAgICAgICBpZDogYCR7dGhpcy5pZH0taG92ZXJlZGAsXG4gICAgICAgICAgICAgIGRhdGE6IFtcbiAgICAgICAgICAgICAgICBpZFRvUG9seWdvbkdlbyhvYmplY3RIb3ZlcmVkKVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBnZXRMaW5lQ29sb3I6IGNvbmZpZy5oaWdobGlnaHRDb2xvcixcbiAgICAgICAgICAgICAgbGluZVdpZHRoU2NhbGU6IDggKiB6b29tRmFjdG9yXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSlcbiAgICBdO1xuICB9XG59XG4iXX0=