kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
229 lines (227 loc) • 30.1 kB
JavaScript
"use strict";
var _typeAnalyzer = require("type-analyzer");
var _constants = require("@kepler.gl/constants");
var _vectorTileUtils = require("./vector-tile-utils");
var _tileMetadata = require("../../../../test/fixtures/tile-metadata");
// SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
describe('getTileUrl', function () {
[{
name: 'empty string',
input: '',
expected: null
}, {
name: 'invalid URL',
input: '/foo/bar/baz.mvt',
expected: null
}, {
name: 'Valid URL, no placeholders',
input: 'http://www.example.com',
expected: 'http://www.example.com/{z}/{x}/{y}.pbf'
}, {
name: 'Valid URL, no placeholders, trailing slash',
input: 'http://www.example.com/',
expected: 'http://www.example.com/{z}/{x}/{y}.pbf'
}, {
name: 'Valid URL, placeholders',
input: 'http://www.example.com/{z}/{x}/{y}.pbf',
expected: 'http://www.example.com/{z}/{x}/{y}.pbf'
}, {
name: 'Valid URL, placeholders, mvt',
input: 'http://www.example.com/{z}/{x}/{y}.mvt',
expected: 'http://www.example.com/{z}/{x}/{y}.mvt'
}, {
name: 'Valid URL, placeholders, mvt, access token',
input: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt?access_token=sk.fobar.baz',
expected: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt?access_token=sk.fobar.baz'
}].forEach(function (_ref) {
var name = _ref.name,
input = _ref.input,
expected = _ref.expected;
test(name, function () {
expect((0, _vectorTileUtils.getTileUrl)(input)).toBe(expected);
});
});
});
describe('getMetaUrl', function () {
[{
name: 'empty string',
input: '',
expected: null
}, {
name: 'invalid URL',
input: '/foo/bar/baz.mvt',
expected: null
}, {
name: 'Valid URL, unknown domain',
input: 'http://www.example.com/some_tiles',
expected: 'http://www.example.com/some_tiles/metadata.json'
}, {
name: 'Valid URL, unknown domain, trailing slash',
input: 'http://www.example.com/some_tiles/',
expected: 'http://www.example.com/some_tiles/metadata.json'
}, {
name: 'Valid URL, Mapbox domain',
input: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt',
expected: 'https://api.mapbox.com/v4/spam.json'
}, {
name: 'Valid URL, placeholders, mvt, access token',
input: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt?access_token=sk.fobar.baz',
expected: 'https://api.mapbox.com/v4/spam.json?access_token=sk.fobar.baz'
}, {
name: 'Valid URL, placeholders, mvt, access token, published style version',
input: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt?style=mapbox://styles/user/styleId@00&access_token=pk.xxx.zzz',
expected: 'https://api.mapbox.com/v4/spam.json?style=mapbox://styles/user/styleId@00&access_token=pk.xxx.zzz'
}].forEach(function (_ref2) {
var name = _ref2.name,
input = _ref2.input,
expected = _ref2.expected;
test(name, function () {
expect((0, _vectorTileUtils.getMetaUrl)(input)).toBe(expected);
});
});
});
test('parseMetadata, metadata from MVTSource and Mapbox URL', function () {
expect((0, _vectorTileUtils.parseVectorMetadata)(_tileMetadata.MVT_METADATA, {
tileUrl: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt'
})).toEqual({
attributions: [],
metaJson: null,
bounds: [-180, -85, 180, 85],
center: [0, 0, 0],
maxZoom: 16,
minZoom: 0,
fields: [{
name: 'class',
id: 'class',
format: '',
filterProps: {
domain: [],
value: [],
type: 'multiSelect',
gpu: false
},
type: 'string',
analyzerType: 'STRING'
}],
name: 'Mapbox Streets v8',
description: ''
});
});
test('parseMetadata, PMTiles from PMTileSource', function () {
expect((0, _vectorTileUtils.parseVectorMetadata)(_tileMetadata.PMTILES_METADATA, {
tileUrl: 'https://4sq-studio-data-staging.s3.us-west-2.amazonaws.com/some_path/some_file.pmtiles'
})).toEqual({
attributions: [],
name: 'My Custom Tiles',
description: 'My Custom Tiles Description',
metaJson: null,
bounds: [-150.1122219, -51.8952777, 179.3577783, 69.6043747],
center: [14.0625, 50.7026397, 6],
maxZoom: 6,
minZoom: 0,
fields: [{
id: 'metric',
name: 'metric',
format: '',
type: _constants.ALL_FIELD_TYPES.real,
analyzerType: _typeAnalyzer.DATA_TYPES.FLOAT,
filterProps: {
domain: [-1, 10],
value: [-1, 10],
type: _constants.FILTER_TYPES.range,
typeOptions: [_constants.FILTER_TYPES.range],
gpu: true,
step: 0.01
}
}, {
id: 'continent',
name: 'continent',
format: '',
type: _constants.ALL_FIELD_TYPES.string,
analyzerType: _typeAnalyzer.DATA_TYPES.STRING,
filterProps: {
domain: ['Africa', 'Asia', 'Europe', 'North America', 'Oceania', 'South America'],
value: ['Africa', 'Asia', 'Europe', 'North America', 'Oceania', 'South America'],
type: _constants.FILTER_TYPES.multiSelect,
gpu: false
}
}]
});
});
test('parseMetadata, empty input', function () {
expect((0, _vectorTileUtils.parseVectorMetadata)({})).toEqual({
attributions: [],
name: '',
description: '',
metaJson: null,
bounds: null,
center: null,
maxZoom: null,
minZoom: null,
fields: []
});
expect((0, _vectorTileUtils.parseVectorMetadata)({}, {
tileUrl: 'http://xyz.api.here.com/some_id/tile/web/{z}_{x}_{y}.pbf'
})).toEqual({
attributions: [],
name: '',
description: '',
metaJson: null,
bounds: null,
center: null,
maxZoom: null,
minZoom: null,
fields: []
});
expect((0, _vectorTileUtils.parseVectorMetadata)({}, {
tileUrl: 'https://api.mapbox.com/v4/spam/{z}/{x}/{y}.mvt'
})).toEqual({
attributions: [],
name: '',
description: '',
metaJson: null,
bounds: null,
center: null,
maxZoom: null,
minZoom: null,
fields: []
});
});
describe('parseMetadata, bad cases', function () {
[{
name: 'empty string',
input: '',
expected: null
}, {
name: 'null',
input: null,
expected: null
}, {
name: 'undefined',
input: undefined,
expected: null
}, {
name: 'string',
input: 'spam',
expected: null
}].forEach(function (_ref3) {
var name = _ref3.name,
input = _ref3.input,
expected = _ref3.expected;
test(name, function () {
expect((0, _vectorTileUtils.parseVectorMetadata)(input)).toBe(expected);
});
});
});
describe('getTileUrl', function () {
test.each([['', null], ['foo', null], ['http', null], ['http://', null], ['https://', null], ['http://mytiles.com', 'http://mytiles.com/{z}/{x}/{y}.pbf'], ['https://mytiles.com', 'https://mytiles.com/{z}/{x}/{y}.pbf'], ['http://mytiles.com/', 'http://mytiles.com/{z}/{x}/{y}.pbf'], ['http://mytiles.com/foo', 'http://mytiles.com/foo/{z}/{x}/{y}.pbf'], ['http://mytiles.com/foo/', 'http://mytiles.com/foo/{z}/{x}/{y}.pbf'], ['https://mytiles.com/foo/bar.baz', 'https://mytiles.com/foo/bar.baz/{z}/{x}/{y}.pbf'], ['http://localhost', 'http://localhost/{z}/{x}/{y}.pbf'], ['http://localhost/', 'http://localhost/{z}/{x}/{y}.pbf'], ['http://localhost:8080', 'http://localhost:8080/{z}/{x}/{y}.pbf'], ['http://localhost:8080/', 'http://localhost:8080/{z}/{x}/{y}.pbf'], ['http://mytiles.com/foo/{z}/{x}/{y}.mvt', 'http://mytiles.com/foo/{z}/{x}/{y}.mvt']])('%s', function (input, expected) {
expect((0, _vectorTileUtils.getTileUrl)(input)).toEqual(expected);
});
});
describe('getMetaUrl', function () {
test.each([['', null], ['foo', null], ['http', null], ['http://', null], ['https://', null], ['http://mytiles.com', 'http://mytiles.com/metadata.json'], ['https://mytiles.com', 'https://mytiles.com/metadata.json'], ['http://mytiles.com/', 'http://mytiles.com/metadata.json'], ['http://mytiles.com/foo', 'http://mytiles.com/foo/metadata.json'], ['http://mytiles.com/foo/', 'http://mytiles.com/foo/metadata.json'], ['https://mytiles.com/foo/bar.baz', 'https://mytiles.com/foo/bar.baz/metadata.json'], ['http://localhost', 'http://localhost/metadata.json'], ['http://localhost/', 'http://localhost/metadata.json'], ['http://localhost:8080', 'http://localhost:8080/metadata.json'], ['http://localhost:8080/', 'http://localhost:8080/metadata.json'], ['http://mytiles.com/foo/{z}/{x}/{y}.mvt', 'http://mytiles.com/foo/metadata.json']])('%s', function (input, expected) {
expect((0, _vectorTileUtils.getMetaUrl)(input)).toEqual(expected);
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZUFuYWx5emVyIiwicmVxdWlyZSIsIl9jb25zdGFudHMiLCJfdmVjdG9yVGlsZVV0aWxzIiwiX3RpbGVNZXRhZGF0YSIsImRlc2NyaWJlIiwibmFtZSIsImlucHV0IiwiZXhwZWN0ZWQiLCJmb3JFYWNoIiwiX3JlZiIsInRlc3QiLCJleHBlY3QiLCJnZXRUaWxlVXJsIiwidG9CZSIsIl9yZWYyIiwiZ2V0TWV0YVVybCIsInBhcnNlTWV0YWRhdGEiLCJNVlRfTUVUQURBVEEiLCJ0aWxlVXJsIiwidG9FcXVhbCIsImF0dHJpYnV0aW9ucyIsIm1ldGFKc29uIiwiYm91bmRzIiwiY2VudGVyIiwibWF4Wm9vbSIsIm1pblpvb20iLCJmaWVsZHMiLCJpZCIsImZvcm1hdCIsImZpbHRlclByb3BzIiwiZG9tYWluIiwidmFsdWUiLCJ0eXBlIiwiZ3B1IiwiYW5hbHl6ZXJUeXBlIiwiZGVzY3JpcHRpb24iLCJQTVRJTEVTX01FVEFEQVRBIiwiQUxMX0ZJRUxEX1RZUEVTIiwicmVhbCIsIkRBVEFfVFlQRVMiLCJGTE9BVCIsIkZJTFRFUl9UWVBFUyIsInJhbmdlIiwidHlwZU9wdGlvbnMiLCJzdGVwIiwic3RyaW5nIiwiU1RSSU5HIiwibXVsdGlTZWxlY3QiLCJ1bmRlZmluZWQiLCJfcmVmMyIsImVhY2giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGlsZXNldC92ZWN0b3ItdGlsZS11dGlscy5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7REFUQV9UWVBFU30gZnJvbSAndHlwZS1hbmFseXplcic7XG5cbmltcG9ydCB7QUxMX0ZJRUxEX1RZUEVTLCBGSUxURVJfVFlQRVN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcblxuaW1wb3J0IHtnZXRUaWxlVXJsLCBnZXRNZXRhVXJsLCBwYXJzZVZlY3Rvck1ldGFkYXRhIGFzIHBhcnNlTWV0YWRhdGF9IGZyb20gJy4vdmVjdG9yLXRpbGUtdXRpbHMnO1xuaW1wb3J0IHtQTVRJTEVTX01FVEFEQVRBLCBNVlRfTUVUQURBVEF9IGZyb20gJy4uLy4uLy4uLy4uL3Rlc3QvZml4dHVyZXMvdGlsZS1tZXRhZGF0YSc7XG5cbmRlc2NyaWJlKCdnZXRUaWxlVXJsJywgKCkgPT4ge1xuICBbXG4gICAge25hbWU6ICdlbXB0eSBzdHJpbmcnLCBpbnB1dDogJycsIGV4cGVjdGVkOiBudWxsfSxcbiAgICB7bmFtZTogJ2ludmFsaWQgVVJMJywgaW5wdXQ6ICcvZm9vL2Jhci9iYXoubXZ0JywgZXhwZWN0ZWQ6IG51bGx9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdWYWxpZCBVUkwsIG5vIHBsYWNlaG9sZGVycycsXG4gICAgICBpbnB1dDogJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20nLFxuICAgICAgZXhwZWN0ZWQ6ICdodHRwOi8vd3d3LmV4YW1wbGUuY29tL3t6fS97eH0ve3l9LnBiZidcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdWYWxpZCBVUkwsIG5vIHBsYWNlaG9sZGVycywgdHJhaWxpbmcgc2xhc2gnLFxuICAgICAgaW5wdXQ6ICdodHRwOi8vd3d3LmV4YW1wbGUuY29tLycsXG4gICAgICBleHBlY3RlZDogJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20ve3p9L3t4fS97eX0ucGJmJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbGlkIFVSTCwgcGxhY2Vob2xkZXJzJyxcbiAgICAgIGlucHV0OiAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS97en0ve3h9L3t5fS5wYmYnLFxuICAgICAgZXhwZWN0ZWQ6ICdodHRwOi8vd3d3LmV4YW1wbGUuY29tL3t6fS97eH0ve3l9LnBiZidcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdWYWxpZCBVUkwsIHBsYWNlaG9sZGVycywgbXZ0JyxcbiAgICAgIGlucHV0OiAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS97en0ve3h9L3t5fS5tdnQnLFxuICAgICAgZXhwZWN0ZWQ6ICdodHRwOi8vd3d3LmV4YW1wbGUuY29tL3t6fS97eH0ve3l9Lm12dCdcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdWYWxpZCBVUkwsIHBsYWNlaG9sZGVycywgbXZ0LCBhY2Nlc3MgdG9rZW4nLFxuICAgICAgaW5wdXQ6ICdodHRwczovL2FwaS5tYXBib3guY29tL3Y0L3NwYW0ve3p9L3t4fS97eX0ubXZ0P2FjY2Vzc190b2tlbj1zay5mb2Jhci5iYXonLFxuICAgICAgZXhwZWN0ZWQ6ICdodHRwczovL2FwaS5tYXBib3guY29tL3Y0L3NwYW0ve3p9L3t4fS97eX0ubXZ0P2FjY2Vzc190b2tlbj1zay5mb2Jhci5iYXonXG4gICAgfVxuICBdLmZvckVhY2goKHtuYW1lLCBpbnB1dCwgZXhwZWN0ZWR9KSA9PiB7XG4gICAgdGVzdChuYW1lLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0VGlsZVVybChpbnB1dCkpLnRvQmUoZXhwZWN0ZWQpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnZ2V0TWV0YVVybCcsICgpID0+IHtcbiAgW1xuICAgIHtuYW1lOiAnZW1wdHkgc3RyaW5nJywgaW5wdXQ6ICcnLCBleHBlY3RlZDogbnVsbH0sXG4gICAge25hbWU6ICdpbnZhbGlkIFVSTCcsIGlucHV0OiAnL2Zvby9iYXIvYmF6Lm12dCcsIGV4cGVjdGVkOiBudWxsfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVmFsaWQgVVJMLCB1bmtub3duIGRvbWFpbicsXG4gICAgICBpbnB1dDogJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vc29tZV90aWxlcycsXG4gICAgICBleHBlY3RlZDogJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vc29tZV90aWxlcy9tZXRhZGF0YS5qc29uJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbGlkIFVSTCwgdW5rbm93biBkb21haW4sIHRyYWlsaW5nIHNsYXNoJyxcbiAgICAgIGlucHV0OiAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS9zb21lX3RpbGVzLycsXG4gICAgICBleHBlY3RlZDogJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vc29tZV90aWxlcy9tZXRhZGF0YS5qc29uJ1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbGlkIFVSTCwgTWFwYm94IGRvbWFpbicsXG4gICAgICBpbnB1dDogJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvc3BhbS97en0ve3h9L3t5fS5tdnQnLFxuICAgICAgZXhwZWN0ZWQ6ICdodHRwczovL2FwaS5tYXBib3guY29tL3Y0L3NwYW0uanNvbidcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdWYWxpZCBVUkwsIHBsYWNlaG9sZGVycywgbXZ0LCBhY2Nlc3MgdG9rZW4nLFxuICAgICAgaW5wdXQ6ICdodHRwczovL2FwaS5tYXBib3guY29tL3Y0L3NwYW0ve3p9L3t4fS97eX0ubXZ0P2FjY2Vzc190b2tlbj1zay5mb2Jhci5iYXonLFxuICAgICAgZXhwZWN0ZWQ6ICdodHRwczovL2FwaS5tYXBib3guY29tL3Y0L3NwYW0uanNvbj9hY2Nlc3NfdG9rZW49c2suZm9iYXIuYmF6J1xuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbGlkIFVSTCwgcGxhY2Vob2xkZXJzLCBtdnQsIGFjY2VzcyB0b2tlbiwgcHVibGlzaGVkIHN0eWxlIHZlcnNpb24nLFxuICAgICAgaW5wdXQ6XG4gICAgICAgICdodHRwczovL2FwaS5tYXBib3guY29tL3Y0L3NwYW0ve3p9L3t4fS97eX0ubXZ0P3N0eWxlPW1hcGJveDovL3N0eWxlcy91c2VyL3N0eWxlSWRAMDAmYWNjZXNzX3Rva2VuPXBrLnh4eC56enonLFxuICAgICAgZXhwZWN0ZWQ6XG4gICAgICAgICdodHRwczovL2FwaS5tYXBib3guY29tL3Y0L3NwYW0uanNvbj9zdHlsZT1tYXBib3g6Ly9zdHlsZXMvdXNlci9zdHlsZUlkQDAwJmFjY2Vzc190b2tlbj1way54eHguenp6J1xuICAgIH1cbiAgXS5mb3JFYWNoKCh7bmFtZSwgaW5wdXQsIGV4cGVjdGVkfSkgPT4ge1xuICAgIHRlc3QobmFtZSwgKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldE1ldGFVcmwoaW5wdXQpKS50b0JlKGV4cGVjdGVkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxudGVzdCgncGFyc2VNZXRhZGF0YSwgbWV0YWRhdGEgZnJvbSBNVlRTb3VyY2UgYW5kIE1hcGJveCBVUkwnLCAoKSA9PiB7XG4gIGV4cGVjdChcbiAgICBwYXJzZU1ldGFkYXRhKE1WVF9NRVRBREFUQSwge3RpbGVVcmw6ICdodHRwczovL2FwaS5tYXBib3guY29tL3Y0L3NwYW0ve3p9L3t4fS97eX0ubXZ0J30pXG4gICkudG9FcXVhbCh7XG4gICAgYXR0cmlidXRpb25zOiBbXSxcbiAgICBtZXRhSnNvbjogbnVsbCxcbiAgICBib3VuZHM6IFstMTgwLCAtODUsIDE4MCwgODVdLFxuICAgIGNlbnRlcjogWzAsIDAsIDBdLFxuICAgIG1heFpvb206IDE2LFxuICAgIG1pblpvb206IDAsXG4gICAgZmllbGRzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdjbGFzcycsXG4gICAgICAgIGlkOiAnY2xhc3MnLFxuICAgICAgICBmb3JtYXQ6ICcnLFxuICAgICAgICBmaWx0ZXJQcm9wczoge1xuICAgICAgICAgIGRvbWFpbjogW10sXG4gICAgICAgICAgdmFsdWU6IFtdLFxuICAgICAgICAgIHR5cGU6ICdtdWx0aVNlbGVjdCcsXG4gICAgICAgICAgZ3B1OiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgYW5hbHl6ZXJUeXBlOiAnU1RSSU5HJ1xuICAgICAgfVxuICAgIF0sXG4gICAgbmFtZTogJ01hcGJveCBTdHJlZXRzIHY4JyxcbiAgICBkZXNjcmlwdGlvbjogJydcbiAgfSk7XG59KTtcblxudGVzdCgncGFyc2VNZXRhZGF0YSwgUE1UaWxlcyBmcm9tIFBNVGlsZVNvdXJjZScsICgpID0+IHtcbiAgZXhwZWN0KFxuICAgIHBhcnNlTWV0YWRhdGEoUE1USUxFU19NRVRBREFUQSwge1xuICAgICAgdGlsZVVybDpcbiAgICAgICAgJ2h0dHBzOi8vNHNxLXN0dWRpby1kYXRhLXN0YWdpbmcuczMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20vc29tZV9wYXRoL3NvbWVfZmlsZS5wbXRpbGVzJ1xuICAgIH0pXG4gICkudG9FcXVhbCh7XG4gICAgYXR0cmlidXRpb25zOiBbXSxcbiAgICBuYW1lOiAnTXkgQ3VzdG9tIFRpbGVzJyxcbiAgICBkZXNjcmlwdGlvbjogJ015IEN1c3RvbSBUaWxlcyBEZXNjcmlwdGlvbicsXG4gICAgbWV0YUpzb246IG51bGwsXG4gICAgYm91bmRzOiBbLTE1MC4xMTIyMjE5LCAtNTEuODk1Mjc3NywgMTc5LjM1Nzc3ODMsIDY5LjYwNDM3NDddLFxuICAgIGNlbnRlcjogWzE0LjA2MjUsIDUwLjcwMjYzOTcsIDZdLFxuICAgIG1heFpvb206IDYsXG4gICAgbWluWm9vbTogMCxcbiAgICBmaWVsZHM6IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdtZXRyaWMnLFxuICAgICAgICBuYW1lOiAnbWV0cmljJyxcbiAgICAgICAgZm9ybWF0OiAnJyxcbiAgICAgICAgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWwsXG4gICAgICAgIGFuYWx5emVyVHlwZTogREFUQV9UWVBFUy5GTE9BVCxcbiAgICAgICAgZmlsdGVyUHJvcHM6IHtcbiAgICAgICAgICBkb21haW46IFstMSwgMTBdLFxuICAgICAgICAgIHZhbHVlOiBbLTEsIDEwXSxcbiAgICAgICAgICB0eXBlOiBGSUxURVJfVFlQRVMucmFuZ2UsXG4gICAgICAgICAgdHlwZU9wdGlvbnM6IFtGSUxURVJfVFlQRVMucmFuZ2VdLFxuICAgICAgICAgIGdwdTogdHJ1ZSxcbiAgICAgICAgICBzdGVwOiAwLjAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiAnY29udGluZW50JyxcbiAgICAgICAgbmFtZTogJ2NvbnRpbmVudCcsXG4gICAgICAgIGZvcm1hdDogJycsXG4gICAgICAgIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmcsXG4gICAgICAgIGFuYWx5emVyVHlwZTogREFUQV9UWVBFUy5TVFJJTkcsXG4gICAgICAgIGZpbHRlclByb3BzOiB7XG4gICAgICAgICAgZG9tYWluOiBbJ0FmcmljYScsICdBc2lhJywgJ0V1cm9wZScsICdOb3J0aCBBbWVyaWNhJywgJ09jZWFuaWEnLCAnU291dGggQW1lcmljYSddLFxuICAgICAgICAgIHZhbHVlOiBbJ0FmcmljYScsICdBc2lhJywgJ0V1cm9wZScsICdOb3J0aCBBbWVyaWNhJywgJ09jZWFuaWEnLCAnU291dGggQW1lcmljYSddLFxuICAgICAgICAgIHR5cGU6IEZJTFRFUl9UWVBFUy5tdWx0aVNlbGVjdCxcbiAgICAgICAgICBncHU6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH0pO1xufSk7XG5cbnRlc3QoJ3BhcnNlTWV0YWRhdGEsIGVtcHR5IGlucHV0JywgKCkgPT4ge1xuICBleHBlY3QocGFyc2VNZXRhZGF0YSh7fSkpLnRvRXF1YWwoe1xuICAgIGF0dHJpYnV0aW9uczogW10sXG4gICAgbmFtZTogJycsXG4gICAgZGVzY3JpcHRpb246ICcnLFxuICAgIG1ldGFKc29uOiBudWxsLFxuICAgIGJvdW5kczogbnVsbCxcbiAgICBjZW50ZXI6IG51bGwsXG4gICAgbWF4Wm9vbTogbnVsbCxcbiAgICBtaW5ab29tOiBudWxsLFxuICAgIGZpZWxkczogW11cbiAgfSk7XG5cbiAgZXhwZWN0KFxuICAgIHBhcnNlTWV0YWRhdGEoe30sIHt0aWxlVXJsOiAnaHR0cDovL3h5ei5hcGkuaGVyZS5jb20vc29tZV9pZC90aWxlL3dlYi97en1fe3h9X3t5fS5wYmYnfSlcbiAgKS50b0VxdWFsKHtcbiAgICBhdHRyaWJ1dGlvbnM6IFtdLFxuICAgIG5hbWU6ICcnLFxuICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICBtZXRhSnNvbjogbnVsbCxcbiAgICBib3VuZHM6IG51bGwsXG4gICAgY2VudGVyOiBudWxsLFxuICAgIG1heFpvb206IG51bGwsXG4gICAgbWluWm9vbTogbnVsbCxcbiAgICBmaWVsZHM6IFtdXG4gIH0pO1xuXG4gIGV4cGVjdChwYXJzZU1ldGFkYXRhKHt9LCB7dGlsZVVybDogJ2h0dHBzOi8vYXBpLm1hcGJveC5jb20vdjQvc3BhbS97en0ve3h9L3t5fS5tdnQnfSkpLnRvRXF1YWwoe1xuICAgIGF0dHJpYnV0aW9uczogW10sXG4gICAgbmFtZTogJycsXG4gICAgZGVzY3JpcHRpb246ICcnLFxuICAgIG1ldGFKc29uOiBudWxsLFxuICAgIGJvdW5kczogbnVsbCxcbiAgICBjZW50ZXI6IG51bGwsXG4gICAgbWF4Wm9vbTogbnVsbCxcbiAgICBtaW5ab29tOiBudWxsLFxuICAgIGZpZWxkczogW11cbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3BhcnNlTWV0YWRhdGEsIGJhZCBjYXNlcycsICgpID0+IHtcbiAgW1xuICAgIHtuYW1lOiAnZW1wdHkgc3RyaW5nJywgaW5wdXQ6ICcnLCBleHBlY3RlZDogbnVsbH0sXG4gICAge25hbWU6ICdudWxsJywgaW5wdXQ6IG51bGwsIGV4cGVjdGVkOiBudWxsfSxcbiAgICB7bmFtZTogJ3VuZGVmaW5lZCcsIGlucHV0OiB1bmRlZmluZWQsIGV4cGVjdGVkOiBudWxsfSxcbiAgICB7bmFtZTogJ3N0cmluZycsIGlucHV0OiAnc3BhbScsIGV4cGVjdGVkOiBudWxsfVxuICBdLmZvckVhY2goKHtuYW1lLCBpbnB1dCwgZXhwZWN0ZWR9KSA9PiB7XG4gICAgdGVzdChuYW1lLCAoKSA9PiB7XG4gICAgICBleHBlY3QocGFyc2VNZXRhZGF0YShpbnB1dCBhcyBhbnkpKS50b0JlKGV4cGVjdGVkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2dldFRpbGVVcmwnLCAoKSA9PiB7XG4gIHRlc3QuZWFjaChbXG4gICAgWycnLCBudWxsXSxcbiAgICBbJ2ZvbycsIG51bGxdLFxuICAgIFsnaHR0cCcsIG51bGxdLFxuICAgIFsnaHR0cDovLycsIG51bGxdLFxuICAgIFsnaHR0cHM6Ly8nLCBudWxsXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbScsICdodHRwOi8vbXl0aWxlcy5jb20ve3p9L3t4fS97eX0ucGJmJ10sXG4gICAgWydodHRwczovL215dGlsZXMuY29tJywgJ2h0dHBzOi8vbXl0aWxlcy5jb20ve3p9L3t4fS97eX0ucGJmJ10sXG4gICAgWydodHRwOi8vbXl0aWxlcy5jb20vJywgJ2h0dHA6Ly9teXRpbGVzLmNvbS97en0ve3h9L3t5fS5wYmYnXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28nLCAnaHR0cDovL215dGlsZXMuY29tL2Zvby97en0ve3h9L3t5fS5wYmYnXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28vJywgJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28ve3p9L3t4fS97eX0ucGJmJ10sXG4gICAgWydodHRwczovL215dGlsZXMuY29tL2Zvby9iYXIuYmF6JywgJ2h0dHBzOi8vbXl0aWxlcy5jb20vZm9vL2Jhci5iYXove3p9L3t4fS97eX0ucGJmJ10sXG4gICAgWydodHRwOi8vbG9jYWxob3N0JywgJ2h0dHA6Ly9sb2NhbGhvc3Qve3p9L3t4fS97eX0ucGJmJ10sXG4gICAgWydodHRwOi8vbG9jYWxob3N0LycsICdodHRwOi8vbG9jYWxob3N0L3t6fS97eH0ve3l9LnBiZiddLFxuICAgIFsnaHR0cDovL2xvY2FsaG9zdDo4MDgwJywgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC97en0ve3h9L3t5fS5wYmYnXSxcbiAgICBbJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8nLCAnaHR0cDovL2xvY2FsaG9zdDo4MDgwL3t6fS97eH0ve3l9LnBiZiddLFxuICAgIFsnaHR0cDovL215dGlsZXMuY29tL2Zvby97en0ve3h9L3t5fS5tdnQnLCAnaHR0cDovL215dGlsZXMuY29tL2Zvby97en0ve3h9L3t5fS5tdnQnXVxuICBdKSgnJXMnLCAoaW5wdXQsIGV4cGVjdGVkKSA9PiB7XG4gICAgZXhwZWN0KGdldFRpbGVVcmwoaW5wdXQpKS50b0VxdWFsKGV4cGVjdGVkKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2dldE1ldGFVcmwnLCAoKSA9PiB7XG4gIHRlc3QuZWFjaChbXG4gICAgWycnLCBudWxsXSxcbiAgICBbJ2ZvbycsIG51bGxdLFxuICAgIFsnaHR0cCcsIG51bGxdLFxuICAgIFsnaHR0cDovLycsIG51bGxdLFxuICAgIFsnaHR0cHM6Ly8nLCBudWxsXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbScsICdodHRwOi8vbXl0aWxlcy5jb20vbWV0YWRhdGEuanNvbiddLFxuICAgIFsnaHR0cHM6Ly9teXRpbGVzLmNvbScsICdodHRwczovL215dGlsZXMuY29tL21ldGFkYXRhLmpzb24nXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbS8nLCAnaHR0cDovL215dGlsZXMuY29tL21ldGFkYXRhLmpzb24nXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28nLCAnaHR0cDovL215dGlsZXMuY29tL2Zvby9tZXRhZGF0YS5qc29uJ10sXG4gICAgWydodHRwOi8vbXl0aWxlcy5jb20vZm9vLycsICdodHRwOi8vbXl0aWxlcy5jb20vZm9vL21ldGFkYXRhLmpzb24nXSxcbiAgICBbJ2h0dHBzOi8vbXl0aWxlcy5jb20vZm9vL2Jhci5iYXonLCAnaHR0cHM6Ly9teXRpbGVzLmNvbS9mb28vYmFyLmJhei9tZXRhZGF0YS5qc29uJ10sXG4gICAgWydodHRwOi8vbG9jYWxob3N0JywgJ2h0dHA6Ly9sb2NhbGhvc3QvbWV0YWRhdGEuanNvbiddLFxuICAgIFsnaHR0cDovL2xvY2FsaG9zdC8nLCAnaHR0cDovL2xvY2FsaG9zdC9tZXRhZGF0YS5qc29uJ10sXG4gICAgWydodHRwOi8vbG9jYWxob3N0OjgwODAnLCAnaHR0cDovL2xvY2FsaG9zdDo4MDgwL21ldGFkYXRhLmpzb24nXSxcbiAgICBbJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8nLCAnaHR0cDovL2xvY2FsaG9zdDo4MDgwL21ldGFkYXRhLmpzb24nXSxcbiAgICBbJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28ve3p9L3t4fS97eX0ubXZ0JywgJ2h0dHA6Ly9teXRpbGVzLmNvbS9mb28vbWV0YWRhdGEuanNvbiddXG4gIF0pKCclcycsIChpbnB1dCwgZXhwZWN0ZWQpID0+IHtcbiAgICBleHBlY3QoZ2V0TWV0YVVybChpbnB1dCkpLnRvRXF1YWwoZXhwZWN0ZWQpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOztBQUdBLElBQUFBLGFBQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLGdCQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxhQUFBLEdBQUFILE9BQUE7QUFSQTtBQUNBOztBQVNBSSxRQUFRLENBQUMsWUFBWSxFQUFFLFlBQU07RUFDM0IsQ0FDRTtJQUFDQyxJQUFJLEVBQUUsY0FBYztJQUFFQyxLQUFLLEVBQUUsRUFBRTtJQUFFQyxRQUFRLEVBQUU7RUFBSSxDQUFDLEVBQ2pEO0lBQUNGLElBQUksRUFBRSxhQUFhO0lBQUVDLEtBQUssRUFBRSxrQkFBa0I7SUFBRUMsUUFBUSxFQUFFO0VBQUksQ0FBQyxFQUNoRTtJQUNFRixJQUFJLEVBQUUsNEJBQTRCO0lBQ2xDQyxLQUFLLEVBQUUsd0JBQXdCO0lBQy9CQyxRQUFRLEVBQUU7RUFDWixDQUFDLEVBQ0Q7SUFDRUYsSUFBSSxFQUFFLDRDQUE0QztJQUNsREMsS0FBSyxFQUFFLHlCQUF5QjtJQUNoQ0MsUUFBUSxFQUFFO0VBQ1osQ0FBQyxFQUNEO0lBQ0VGLElBQUksRUFBRSx5QkFBeUI7SUFDL0JDLEtBQUssRUFBRSx3Q0FBd0M7SUFDL0NDLFFBQVEsRUFBRTtFQUNaLENBQUMsRUFDRDtJQUNFRixJQUFJLEVBQUUsOEJBQThCO0lBQ3BDQyxLQUFLLEVBQUUsd0NBQXdDO0lBQy9DQyxRQUFRLEVBQUU7RUFDWixDQUFDLEVBQ0Q7SUFDRUYsSUFBSSxFQUFFLDRDQUE0QztJQUNsREMsS0FBSyxFQUFFLDBFQUEw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